Arduino problema a unire 2 codici

Buongiorno, e' la prima volta che scrivo e sono un autodidatta. Sto provando a unire 2 codici in uno, entrambi presi singolarmente funzionano ma provando a unirli mio scontro con un problema. Sto provando su Arduino UNO r4 wifi, scheda motore l298p, un servomotore, un sensore ad ultrasuoni e un lettore mp3 DFPlayer mini, vorrei scrivere uno codice che fa camminare ed evitare ostacoli a una macchina che nel frattempo faccia andare in loop la musica.

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include "Arduino.h"
#include "robot.h"
#include <Servo.h>
#define PIN_SERVO 9

SoftwareSerial ss(2, 3);  //RX, TX
DFRobotDFPlayerMini mp3;

int nfiles;
Servo myservo;

int rightDistance = 0;
int leftDistance = 0;
int middleDistance = 0;


void setup() {
  myservo.attach(PIN_SERVO);
  Serial.begin(9600);
  pinMode(Echo, INPUT);
  pinMode(Trig, OUTPUT);
  pinMode(INA, OUTPUT);
  pinMode(INB, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  stop();


  ss.begin(9600);
  delay(1000);

  if (!mp3.begin(ss)) {
    Serial.print("errore mp3");
    for (;;)
      ;
  }

  nfiles = mp3.readFileCounts();
  Serial.print(nfiles);
  mp3.volume(15);

  mp3.play(0);
}
int i = 0;
int MINDIST = 10;


void loop() {
  funzione1();
  funzione2();
}


void funzione1() {
  myservo.write(90);
  delay(500);
  middleDistance = Distance_test();

  if (middleDistance < MINDIST) {
    stop();
    delay(500);
    myservo.write(10);
    delay(1000);
    rightDistance = Distance_test();

    delay(500);
    myservo.write(90);
    delay(1000);
    myservo.write(170);
    delay(1000);
    leftDistance = Distance_test();

    delay(500);
    myservo.write(90);
    delay(1000);

    if (rightDistance > leftDistance) {
      right();
      delay(500);
    } else if (rightDistance < leftDistance) {
      left();
      delay(500);
    } else if ((rightDistance <= MINDIST) || (leftDistance <= MINDIST)) {
      back();
      delay(500);
    } else {
      forward();
    }

  } else {
    forward();
  }
}

void funzione2() {
  {
    int st = mp3.readState();
    if (st == 513) {
    } else if (st == 512) {
      delay(500);
      i++;
      if (i >= nfiles) i = 0;
      mp3.play(i);
    }
  }
}

Allego anche file robot.h

#define ENA 10
#define ENB 11
#define INA 12
#define INB 13
#define carSpeed 130
#define carStop 0

int Echo = 8;
int Trig = 7;

//funzioni per il moto
void forward() {
  analogWrite(ENA, carSpeed);
  analogWrite(ENB, carSpeed);
  digitalWrite(INA, LOW);
  digitalWrite(INB, LOW);
  Serial.println("Forward");
}

void back() {
  analogWrite(ENA, carSpeed);
  analogWrite(ENB, carSpeed);
  digitalWrite(INA, HIGH);
  digitalWrite(INB, HIGH);
  Serial.println("Back");
}

void left() {
  analogWrite(ENA, carSpeed);
  analogWrite(ENB, carStop);
  digitalWrite(INA, HIGH);
  digitalWrite(INB, LOW);
  Serial.println("Left");
}

void right() {
  analogWrite(ENA, carStop);
  analogWrite(ENB, carSpeed);
  digitalWrite(INA, LOW);
  digitalWrite(INB, HIGH);
  Serial.println("Right");
}

void stop() {
  analogWrite(ENA, carStop);
  analogWrite(ENB, carStop);
  Serial.println("Stop!");
}

//misura distanza
//Ultrasonic distance measurement Sub function
int Distance_test() {
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(20);
  digitalWrite(Trig, LOW);
  float Fdistance = pulseIn(Echo, HIGH);
  Fdistance = Fdistance / 58;
  return (int)Fdistance;
}

dopo che carico il codice sulla scheda, sul monitor seriale esce il messaggio errore mp3 e non funziona niente, ne i motori ne il servo ecc. Ripeto singolarmente i codici funzionano e quindi presumo che il cablaggio sia corretto, ho provato a separare le funzioni nel loop ma non ho risolto . il problema nasce quando unisco il codice del lettore mp3.
ringrazio anticipatamente tutti quelli che vorranno darmi una mano

Benvenuto. Mi sembra che prima devi imparare come funziona questo forum.
Solo in sezione italiano puoi scrivere in italiano. Everything else is english. Oltre quello devi leggere istruzioni come inserire codice...

Ho spostato tuo post a sezione piu adatta.

si e' vero non sono molto pratico con il forum, ho fatto inserisci ma lo ha caricato cosi.
come posso ricaricarlo meglio?

@dnlucio:

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, come richiesto al punto 7 del succitato regolamento, per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione e sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

@kmin:

Cortesemente lascia a noi moderatori l'intrvento, per i nuovi arrivati, in cui indichiamo cosa fare. :slight_smile:

Inoltre ... anche se sei un vecchio utente del forum ... purtroppo io non riesco a trovare il tuo post di presentazione :confused:, per cui, cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, che negli anni è piuttosto cambiato (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

1 Like

Va benissimo.

1 Like

grazie ora provo modificare e ripubblicare il tutto

buona sera spero che adesso sia più comprensibile. grazie per il consigli

1 Like

@dnlucio: ... manca sempre ... :wink:

Guglielmo

fatto e spero di aver fatto tutto.
grazie

1 Like

tornando al mio problema...il codice per il movimento in autonomia e per evitare gli ostacoli funzionano, il problema si presenta quando vado ad aggiungere il codice per il lettore mp3. Quello che non capisco e perché anche se il lettore mi da il messaggio di errore , smettono di funzionare anche i motori, il servo e gli ultrasuoni.
grazie a tutti anticipatamente

Perchè glielo chiedi…:wink: :

if (!mp3.begin(ss)) {
    Serial.print("errore mp3");
    for (;;)
      ;
  }

Se il lettore non si avvia entra in un loop infinito (quel for( ; ; ) ) e non prosegue oltre.

Ciao, Ale.

ciao ilguargua grazie per la risposta, come mi hai consigliato
ho cancellato il for (;;) ma ho risolto in parte. sul monitor seriale non esce più
il messaggio errore, anzi dice che il lettore e' pronto, ma continua a non funzionare sia il lettore che tutte le altre funzioni. vorrei cercare di capire come tenere separate tutte le funzioni, i motori e gli altri sensori dovrebbero funzionare a prescindere se va o non va la musica.

Se hai cambiato il codice è meglio se lo rialleghi nel messaggio, perchè ad esempio ciò che scrivi è incongruente con il codice che hai postato.

Ciao, Ale.

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include "Arduino.h"
#include "robot.h"
#include <Servo.h>
#define PIN_SERVO 9

SoftwareSerial ss(2, 3);  //RX, TX
DFRobotDFPlayerMini mp3;

int nfiles;
Servo myservo;

int rightDistance = 0;
int leftDistance = 0;
int middleDistance = 0;


void setup() {
  myservo.attach(PIN_SERVO);
  Serial.begin(9600);
  pinMode(Echo, INPUT);
  pinMode(Trig, OUTPUT);
  pinMode(INA, OUTPUT);
  pinMode(INB, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  stop();


  ss.begin(9600);
  delay(1000);

  if (!mp3.begin(ss)) {
    Serial.print("errore mp3");
    
  }

  nfiles = mp3.readFileCounts();
  Serial.print(nfiles);
  mp3.volume(15);

  mp3.play(0);
}
int i = 0;
int MINDIST = 10;


void loop() {
  funzione1();
  funzione2();
}


void funzione1() {
  myservo.write(90);
  delay(500);
  middleDistance = Distance_test();

  if (middleDistance < MINDIST) {
    stop();
    delay(500);
    myservo.write(10);
    delay(1000);
    rightDistance = Distance_test();

    delay(500);
    myservo.write(90);
    delay(1000);
    myservo.write(170);
    delay(1000);
    leftDistance = Distance_test();

    delay(500);
    myservo.write(90);
    delay(1000);

    if (rightDistance > leftDistance) {
      right();
      delay(500);
    } else if (rightDistance < leftDistance) {
      left();
      delay(500);
    } else if ((rightDistance <= MINDIST) || (leftDistance <= MINDIST)) {
      back();
      delay(500);
    } else {
      forward();
    }

  } else {
    forward();
  }
}

void funzione2() {
  
    int st = mp3.readState();
    if (st == 513) {
    } else if (st == 512) {
      delay(500);
      i++;
      if (i >= nfiles) i = 0;
      mp3.play(i);
    }
}

Continuo a non vedere dove il lettore “dice che è pronto”, stampa il corretto numero di files?

Comunque ti conviene aggiungere altri Serial.print() dopo ogni operazione, così da avere più chiaro cosa sta succedendo, es:

  nfiles = mp3.readFileCounts();
  Serial.print(F("Files trovati :"));
  Serial.println(nfiles);
  mp3.volume(15);
  Serial.println(F("Impostato volume a 15"));

  mp3.play(0);
  Serial.println(F("Play track 0"));

[...]

void funzione1() {
  Serial.println(F("Entrato in funzione1()"));
  myservo.write(90);
  delay(500);
  Serial.println(F("Mosso il servo a 90"));
  middleDistance = Distance_test();
  Serial.print(F("middleDistance = "));
  Serial.println(middleDistance);

  if (middleDistance < MINDIST) {
    Serial.println(F("middleDistance < MINDIST"));
    stop();
    delay(500);
    Serial.println(F("comando stop()"));
    myservo.write(10);
    delay(1000);
    Serial.println(F("Mosso il servo a 10"));
    rightDistance = Distance_test();
    Serial.print(F("rightDistance = "));
    Serial.println(rightDistance);
[etc]

Ciao, Ale.

ho provato ad aggiungere qualche Serial.print e riesce errore file trovati:-1 ma delle altre funzioni non mi da nessun messaggio

void funzione1() {
  Serial.println(F("Entrato in funzione1()"));
  myservo.write(90);
  delay(500);
  Serial.println(F("Mosso il servo a 90"));
  middleDistance = Distance_test();
  Serial.print(F("middleDistance = "));
  Serial.println(middleDistance);

  if (middleDistance < MINDIST) {
    Serial.println(F("middleDistance < MINDIST"));
    stop();
    delay(500);
    myservo.write(10);
    delay(1000);
    rightDistance = Distance_test();

Riesci a far funzionare l’mp3 da solo? Se carichi uno degli esempi della libreria funziona?

Non conosco la scheda che usi, ma leggendo qui vedo che dispone di una porta seriale hardware aggiuntiva (Serial1) usando i pin D0(RX) e D1(TX). Prova ad usare quella porta con un esempio minimalistico della libreria, se funziona poi sposti il codice.

Ciao, Ale.

ciao Ale si se carico lo sketch del mp3 funziona,

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include "Arduino.h"

SoftwareSerial ss(2, 3);  //RX, TX
DFRobotDFPlayerMini mp3;

int nfiles;
void setup() {
  ss.begin(9600);
  Serial.begin(9600);
  delay(1000);

  if (!mp3.begin(ss)) {
    Serial.print("errore mp3");
    for (;;);
      
  }

  nfiles = mp3.readFileCounts();
  Serial.print(nfiles);
  mp3.volume(15);

  mp3.play(0);
}
int i = 0;

void loop() {
  int st = mp3.readState();
  if (st == 513) {
  } else if (st == 512) {
    delay(500);
    i++;
    if (i >= nfiles) i = 0;
    mp3.play(i);
  }
}

anche se carico lo sketch dei motori, ultrasuoni e servo funzionano. il problema e quando allo sketch dei motori, servo e ultrasuoni vado ad aggiungere lo sketch del mp3.
per il cablaggio in entrambe le prove lascio tutto collegato e singolarmente funzionano. non vorrei che quando carico lo sketch dei motori sulla motorshield l298p mi si disattivino i pin del lettore mp3.

Per poter unire due programmi senza problemi, non devono fare temporizzazioni con i delay().