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