Come da titolo sto realizzando il mio primo robot con arduino mega,sono un principiante e ho un problema con il codice.
Il mio robot è un quadrupede,con un sendore di prossimità ad ultrasuoni che ruota e gli permette di osservare e calcolare la via migliore (il classico robot evita ostacoli).
ecco il codice:
#include <Servo.h>
#define grad_gir 15 //ogni volta che il robot manda in esecuzione la funzione gira (dx o sx), si muove di 15°
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo_sens;
int echoPin = 22;
int initPin = 23;
unsigned long pulseTime = 0;
unsigned long distance = 0;
int pos=90;
void setup()
{
myservo1.attach(2);
myservo2.attach(3);
myservo3.attach(4);
myservo4.attach(5);
myservo5.attach(8);
myservo6.attach(9);
myservo7.attach(10);
myservo8.attach(11);
myservo_sens.attach(12);
partenza(); //mette sutti i servo nella posizione di partenza
pinMode(initPin, OUTPUT);
pinMode(echoPin, INPUT);
delay(2000);
}
void loop()
{
distance=sens_pross();
if (distance<=10) pos_girare;
else camminare(); //procedura per camminare (fa un solo passo e verifica ancora se ci sono ostacoli)
delay(200);
}
void pos_girare()
{
unsigned long distanza=10000,angolo;
int volte=0;
while (pos <180) //ho fatto più cicli per muovere il servo per farlo sembrare piu naturale dato che parte da 90°
{
myservo_sens.write(pos);
delay(15);
if (sens_pross()<distanza)
{
distanza=sens_pross();
angolo=pos;
}
pos++;
}
while(pos>=1)
{
myservo_sens.write(pos);
delay(15);
if (sens_pross()<distanza)
{
distanza=sens_pross();
angolo=pos;
}
pos--;
}
while(pos < 90)
{
myservo_sens.write(pos);
delay(15);
if (sens_pross()<distanza)
{
distanza=sens_pross();
angolo=pos;
}
pos++;
}
if (angolo>90) //ho fatto 2 if per evitare che il calcolo di volte esca negativo
{
volte =(int)(angolo-90)/grad_gir; // calcola quante volte deve mandare in esecuzione la funzione gira_dx
for (int i=0;i<volte;i++) girare_dx();
}
if (angolo<90)
{
volte =(int)(90-angolo)/grad_gir;
for (int i=0;i<volte;i++) girare_sx();
}
}
unsigned long sens_pross() //calcolo della distanza (formula trovata in internet XD )
{
unsigned long d;
digitalWrite(initPin, HIGH);
delayMicroseconds(10);
digitalWrite(initPin, LOW);
pulseTime = pulseIn(echoPin, HIGH);
d = pulseTime/58;
return d;
}
non ho postato le procedure camminare,girare_dx e girare_sx perchè sono solo istruzioni per gestire i servo, sono certo che non ci siano errori.
Sò che il codice è diverso dagli altri per i robot evita ostacoli, ma volevo fare qualcosa di originare e personale.
Quando il robot viene attivato, cammina finche non si trova a 10cm da un ostacolo; davanti ad un qualsiasi ostacolo resta fermo senza fare niente (non si muove il servo che mantiene il sensore), sembra quasi che l'intera procedura pos_girare() non venga mai chiamata..... Cosa posso fare? (volevo inoltre sapere se esiste una specie di debug sul compilatore arduino per vedere che valori avevano le variabili durante l'esecuzione del programma)