Robot 4WD evita ostacoli aiuto per lo sketch

Salve ragazzi sono alle prese con il mio primo robottino e, dopo aver cercato esempi vari di sketch in rete che però non mi soddisfavano, ho cercato di fare da solo con le conoscenze che avevo.Posto qui lo sketch e se avete il tempo e la pazienza dateci un’occhiata, mi sembra fatto bene ma avrò commesso qualche errore perchè quando il robottino dovrebbe girare le ruote vanno per conto loro. Preciso che problemi hardware non ce ne sono sicuramente, ho provato anche singolarmente le singole funzioni e va tutto come dovrebbe. Perdonatemi se ci sono errori banali, sono un principiante ma ho molta voglia di fare e imparare :slight_smile:

#include <AFMotor.h>
#include <Servo.h>
AF_DCMotor Motor_Left_Front(4,MOTOR34_1KHZ);
AF_DCMotor Motor_Right_Front(3, MOTOR34_1KHZ);
AF_DCMotor Motor_Left_Rear(2, MOTOR12_1KHZ);
AF_DCMotor Motor_Right_Rear(1, MOTOR12_1KHZ);
const int trigger=14;
const int echo=15;
int left;
int frontLeft;
int front;
int frontRight;
int right;
int scelta;
int massimo;
const int distanzaMax = 30;
int distanza;
const int virata = 2000;
Servo testa;
int pwm;
int speed= 100;

void setup(){
testa.attach(9);
testa.write(90);

pwm=map(speed, 0, 100, 0, 255);

Motor_Left_Front.setSpeed(pwm);
Motor_Right_Front.setSpeed(pwm);
Motor_Left_Rear.setSpeed(pwm);
Motor_Right_Rear.setSpeed(pwm);

pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);

digitalWrite(trigger,LOW);

Serial.begin(9600);
}

void guardaIntorno(){
testa.write(135);
frontRight = watch();
delay(100);

testa.write(180);
right = watch();
delay(100);

testa.write(135);
frontRight = watch();
delay(100);

testa.write(90);
front = watch();
delay(100);

testa.write(45);
frontLeft = watch();
delay(100);

testa.write(0);
left = watch();
delay (100);

testa.write(45);
frontLeft = watch();
delay(100);

testa.write(90);
front = watch();
delay(300);
}

int watch(){
long howfar;
digitalWrite(trigger,LOW);
delayMicroseconds(5);
digitalWrite(trigger,HIGH);
delayMicroseconds(15);
digitalWrite(trigger,LOW);
howfar=pulseIn(echo,HIGH);
howfar=howfar*0.01657; //how far away is the object in cm
return round(howfar);
}

void stopmove(){
Motor_Left_Front.run(RELEASE);
Motor_Right_Front.run(RELEASE);
Motor_Left_Rear.run(RELEASE);
Motor_Right_Rear.run(RELEASE);
}

void go(){
Motor_Left_Front.run(FORWARD);
Motor_Right_Front.run(FORWARD);
Motor_Left_Rear.run(FORWARD);
Motor_Right_Rear.run(FORWARD);
}

void backwards(){
Motor_Left_Front.run(BACKWARD);
Motor_Right_Front.run(BACKWARD);
Motor_Left_Rear.run(BACKWARD);
Motor_Right_Rear.run(BACKWARD);
}
void turnleft(){
Motor_Left_Front.run(BACKWARD);
Motor_Right_Front.run(FORWARD);
Motor_Left_Rear.run(BACKWARD);
Motor_Right_Rear.run(FORWARD);
delay (virata);
}

void turnright(){
Motor_Left_Front.run(FORWARD);
Motor_Right_Front.run(BACKWARD);
Motor_Left_Rear.run(FORWARD);
Motor_Right_Rear.run(BACKWARD);
delay (virata);

}
int scegliere (){
front = massimo;
if (frontRight >= massimo) {
massimo = right;
}
if (right >= massimo) {massimo = right;}
if (frontLeft >= massimo) {massimo = frontLeft;}
if (left >= massimo) { massimo = left;}
return massimo;
}
void decidere () {
if (massimo = front) {
Serial.println(“dritto”);

go();
}
if (massimo = frontRight) {
Serial.println(“giro a destra”);

turnright();
delay(00);
}
if (massimo = right) {
Serial.println(“giro a destra”);

turnright();
delay(900);
}
if (massimo = frontLeft) {
Serial.println(“giro a sinistra”);
turnleft();
delay(0);
}
if (massimo = left) {
Serial.println(“giro a sinistra”);
turnleft();
delay(0);
}

}
void loop(){
go();
watch();
if (watch() <= distanzaMax){
stopmove();
guardaIntorno();
scegliere();
decidere();
delay(1000);
}
}

P.S. ci sono delle variabili in più che prevedevo di usare ma non ho più utilizzato, le ho lasciate lì per ogni eventuale modifica anche se sono consapevole occupino memoria.

Madonna mi sa che programmi in Java o qualcosa del genere perché per essere un programmino da debug ha più metodi/procedure questo programma che altro haha
Prova a fare un comunissimo test sulla libreria e sui singoli motori.
Considera che invertendo le connessioni dei motori in continua si cambia il verso.

Avevo preannunciato che le semplici funzioni vanno benissimo singolarmente, perciò escludo i problemi di connessioni di cavi e qualsiasi hardware... No so solo programmare Arduino , e non troppo bene ahah :smiley: Ho esagerato con questo sketch?

@Gian95,
ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice deve essere racchiuso nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.

Io mi sono già presentato tempo fa, e questo non è neanche il mio primo post... comunque controllo meglio il regolamento

no assolutamente non hai esagerato però per testare i componenti utilizza programmi sempici soprattutto all' inizio :slight_smile:

non è che il problema è che tutti i motori assieme assorbono troppa corrente? come li alimenti? quanto consumano?

gian95:
Io mi sono già presentato tempo fa, e questo non è neanche il mio primo post... comunque controllo meglio il regolamento

Col passaggio al nuovo forum c'è stato qualche problema con il conteggio dei post totali, nid69 ha visto che al momento ne avevi solo 1 ed ha messo il richiamo al regolamento. perdonalo, fa il cane da guarda con troppo impegno alle volte ;D

Insieme allo chassis è arrivato un pacco batterie da 4 AA, quindi sarebbero 6 volt. Io utilizzo pile ricaricabili perciò l'ho sostituito il pacco con uno da 6 pile, per alimentare la shield di controllo motori e di conseguenza i 4 motori. Mi sembra abbastanza. Ripeto, le singole funzioni, tutti i test motori vanno perfettamente il problema è nello sketch, più precisamente credo che sia da ricercare nella serie di if() per scegliere la direzione migliore. Avevo studiato all'università come trovare il massimo tra una serie di numeri e mi era venuto in mente di applicarlo al mio robottino . Vi ringrazio per l'aiuto (a me sarebbe venuto il mal di testa solo a vedere uno sketch postato così :grinning: ahah) però siccome è da un bel po' che ci sto sbattendo vorrei arrivare a una soluzione. Sto comunque continuando a testare tutte le funzioni e cercando di individuare il problema con la porta seriale.

ehmm no, 4 (o 6) batteria AA NON forniscono abbastanza CORRENTE (non tensione) per alimentare i motori tutti assieme; facile che il calo di tensione generato dalla mancanza di corrente faccia resettare arduino.

altra cosa è che quando tu muovi la "testa", devi metytere un delay per attendere che il motore vada in posizione! quindi in pratica stai mandando ai motori della testa mille comendi prima che riesca ad eseguirli, e poi ovviamente a causa di questo la wasth restuituisce valori a caso.

Il delay c'è... Ma sul serio non basta la corrente? :fearful: Non ho idea allora con cosa potrei alimentarlo... Per prendere qualche spunto su cosa acquistare stavo usando il libro "Costruire un robot con Arduino" di o'Reilly e anche lì l'alimentazione è con 5 pile AA. Comunque, cosa posso provare in alternativa?

Buongiorno a tutti!
Ti posso confermare che, come mi e' capitato spesso di verificare a mie spese e come potrai leggere piu' volte in giro per il web, la maggior parte dei problemi di "strani ed inspiegabili" comportamenti di sensori vari con arduino e' dovuta a corrente insufficiente.
Per questo robottino posso consigliarti di usare due pacchi di batterie: uno da 6 o, meglio, da 8 batterie da 1.2v per arduino (occhio ad usare il pin VIN e non 5v), ed un altro da 8x1.2v per alimentare soltanto i motori. L'unico servo ed il sonar li puoi alimentare con il PIN di +5v di arduino.
Un altro consiglio che mi sento di darti e' che ti conviene usare solo due ruote motrici e mettere una rotellina centrale girevole posteriore. In questo modo il robottino sara' piu' agile, assorbira' meno corrente e ti avanzeranno anche due ruote e due motori per farne un altro! :slight_smile:

Perché non consideri l'acquisto di una batteria Li-PO 2S da 7.4V 3.3Ah e relativo caricabatteria?

Con una sola batteria da 174g probabilmente puoi alimentare anche Arduino.