Chiedo aiuto: robot schizzinoso.

Ave :slight_smile:
Perdonatemi ma è il primo listato che scrivo, in vita mia intendo, quindi abbiate pietà di me :smiley:

Ho creato questo robottino schizzinoso che si allontana quando si cerca di avvicinarlo. Ho usato due sensori Sharp e due servi futaba, quindi molto, molto spartano. Ovviamente non funziona nulla, so che dipende dai valori analogici che ho preso e sbattuto così come sono venuti, e so che il codice è un orrore tremendo, ma se poteste darmi una mano a farlo funzionare, ve ne sarei davvero grati :smiley:

Ecco lo schifocodice.

#include <Servo.h> 
 
Servo ruotasx;  // Definisce servo sinistro
Servo ruotadx;  // Definisce servo destro
 
int ssxpos = 0;    // variabile per definire posizione iniziale servo sx
int sdxpos = 0;    // variabile per definire posizione iniziale servo dx
int eyesx = 2;     // input occhio sinistro
int eyedx = 3;      // input occhio destro
int eyesxval = 0;    // definisce valore iniziale sensore sinistro
int eyedxval = 0;    // definisce valore iniziale sensore destro

 
void setup() 
{ 
  ruotasx.attach(6);  // collega il servo sinistro al pin 6
  ruotadx.attach(5);  // collega il servo destro al pin 5
} 
 
void loop() {

eyesxval = analogRead(eyesx);                          // legge valore sensore occhio sinistro
{ 
  for(eyesxval = 0; eyesxval < 90; eyesxval += 1)      // muove il servo sinistro in base al valore del sensore
  {                                  
    ruotasx.write(eyesxval);                           // dice al servo di spostarsi nella posizione "eyesxval"
    delay(15);                                         // attende 15 ms che il servo raggiunga la posizione
  } 
delay(500);
}

eyedxval = analogRead(eyedx);                          // legge valore sensore occhio destro
{ 
  for(eyedxval = 0; eyedxval < 90; eyedxval += 1)      // muove il servo destro in base al valore del sensore
  {                                  
    ruotadx.write(eyedxval);                           // dice al servo di spostarsi nella posizione "eyedxval" 
    delay(15);                                         // attende 15 ms che il servo raggiunga la posizione
  } 
delay(500);
}
}

Ebbene, non fa assolutamente nulla :smiley:
Chiedo pertanto umilmente aiuto, ma tanto umilmente, perchè sto deprimendomi in un modo considerevole… :’( :’(

Ma.... come prima cosa ti direi di mettere qualche debug...

Se il robottino è collegato al PC inizializza la seriale e manda dei Serial.println che ti facciano capire quando sei entrato in una funzione... Dopo lo stringa eyesxval = analogRead(eyesx); per esempio, puoi dare un bel Serial.println(eyesxval, DEC); e visualizzare il valore sul Monitor del IDE.

Se il robottino non è connesso al PC ma va con alimentazione esterna, al posto del serial print metti un LED che si accende per più o meno tempo a seconda di quali sono i valori.... Così ti rendi conto se il codice che hai scritto viene preso in considerazione o meno.

Successivamente quello che noto è che manda una IF Mi spiego: dopo la lettura del sensore, come fa il robottino a capire se qualcuno si avvina o meno? Nel senso.. io non conosco il sensore ma dopo eyesxval = analogRead(eyesx); io inizierei con qualcosa del tipo: if(eyesxval >= xx){ //dove xx è un valore intero ruotasx.write(eyesxval); delay(15); }

Inoltre ti consiglio di fare la lettura dei due sensori contemporaneamente e analogamente per quanto riguarda le ruote altimenti il robottino gira su se stesso in alternanza....

altra cosa: hai scritto tutto il codice in una volta sola? se si, ti consiglio vivamente di fare un passetto alla volta, tipo vedere se riesci a muovere i servo, vedere se riesci a leggere i sensori, ecc ecc..

C’erano un paio di graffe di troppo… e senza debug serial non si va da nessuna parte!

prova così:

#include <Servo.h>

Servo ruotasx;  // Definisce servo sinistro
Servo ruotadx;  // Definisce servo destro

int ssxpos = 0;    // variabile per definire posizione iniziale servo sx
int sdxpos = 0;    // variabile per definire posizione iniziale servo dx
int eyesx = 2;     // input occhio sinistro
int eyedx = 3;      // input occhio destro
int eyesxval = 0;    // definisce valore iniziale sensore sinistro
int eyedxval = 0;    // definisce valore iniziale sensore destro


void setup() {
  Serial.begin(9600); // DEBUG
  
  ruotasx.attach(6);  // collega il servo sinistro al pin 6
  ruotadx.attach(5);  // collega il servo destro al pin 5
}

void loop() {
  
  eyesxval = analogRead(eyesx);                          // legge valore sensore occhio sinistro
  
  for(eyesxval = 0; eyesxval < 90; eyesxval += 1) {      // muove il servo sinistro in base al valore del sensore
    ruotasx.write(eyesxval);                  // dice al servo di spostarsi nella posizione "eyesxval"
    Serial.print("SX Position: ");      // serial DEBUG
    Serial.print(eyesxval);                  // serial DEBUG
    delay(15);                                         // attende 15 ms che il servo raggiunga la posizione
  }
  
  delay(500);

  eyedxval = analogRead(eyedx);                          // legge valore sensore occhio destro

  for(eyedxval = 0; eyedxval < 90; eyedxval += 1) {      // muove il servo destro in base al valore del sensore
    ruotadx.write(eyedxval);                           // dice al servo di spostarsi nella posizione "eyedxval"
    Serial.print("SX Position: ");      // serial DEBUG
    Serial.print(eyesxval);                  // serial DEBUG
    delay(15);                                         // attende 15 ms che il servo raggiunga la posizione
  }
  
  delay(500);
  
}

Dopo un sacco di tempo ho trovato qualche minuto per rimettere mano al codice e fare una piccola ma sostanziale modifica al botolo, ringraziando vivamente chi mi ha aiutato col codice: il debug è stato findamentale per sapere a quanto settare l’IF del sensore, già, IL sensore, perchè uno dei due sharp è risultato difettoso… ma vabbè :slight_smile:
Ora il botolo riconosce gli ostacoli, torna un pelino indietro, si gira e riparte… non fate caso ai commenti, alle 5 del mattino è così… :smiley:

// Programma di navigazione con riconoscimento
// ostacoli e variazioni zen sul tema dell'amore

#include <Servo.h> 

Servo ruotadx;        // crea un oggetto relativo alla ruota destra
Servo ruotasx;        // crea un oggetto relativo alla ruota sinistra

int potpin = 5;       // setta pin a cui è collegato il segnale del sensore di distanza
int val;              // definisce variabile legata alla distanza rilevata
int val2;             // questo non serve a niente ma era gratis...
void setup() 
{ 
  Serial.begin(9600); // inizializzazione seriale per debuggare valore distanza
  ruotasx.attach(9);  // indica che la ruota sinistra è collegata al pin 9 
  ruotadx.attach(10); // e che la ruota destra al pin 10 (almeno credo)
} 

void loop() 
{ 
  val = analogRead(potpin);            // legge il valore rilevato dal sensore di distanza
  Serial.println(val, DEC);            // stampa a cideo il valore letto in scala decimale
  if (val <= 200) {                    // se il valore letto è inferiore o uguale a 200
    ruotadx.write(0);                  // fa girare in avanti ruota destra
    ruotasx.write(180);                // e indietro la sinistra, facendo avanzare il botolo
    delay(15);                         // aspetta Godot
  }

  else {                               // altrimenti... (altrimenti cosa? eh? mi spacchi la faccia? eh? EH???)
    delay(250);                        // Godot si dev'essere perso
    ruotadx.write(180);                // inverte direzione ruota destra...
    ruotasx.write(0);                  // ...e sinistra per tornare un po' indietro
    delay(500);                        // no comment here... :P
    ruotadx.write(0);                  // si gira su se stesso
    ruotasx.write(0);                  // come sopra
    delay(200);
  }

}

Ragazzi, per cortesia, usando la libreria servo che valore devo indicare ad arduino per fermare i servi?
180 e 0 vanno avanti e indietro, 90 va indietro uguale…

On a continuous rotation servo, this will set the speed 
of the servo (with 0 being full-speed in one direction, 180 
being full speed in the other, and a value near 90 being no 
movement).

con me non pare funzionare… i miei servi futaba nn reagiscono :stuck_out_tongue:

Il codice, non commentato, è il seguente:

// Programma di navigazione con mantenimento posizione
// 
#include <Servo.h>

Servo ruotadx;        // crea un oggetto relativo alla ruota destra
Servo ruotasx;        // crea un oggetto relativo alla ruota sinistra

int potpin = 2;       // setta pin a cui è collegato il segnale del sensore di distanza
int val;              // definisce variabile legata alla distanza rilevata
int val2;             // questo non serve a niente ma era gratis...
void setup()
{
  Serial.begin(9600); // inizializzazione seriale per debuggare valore distanza
  ruotasx.attach(9);  // indica che la ruota sinistra è collegata al pin 9
  ruotadx.attach(10); // e che la ruota destra al pin 10 (almeno credo)
}

void loop()
{
  val = analogRead(potpin);            // legge il valore rilevato dal sensore di distanza
  Serial.println(val, DEC);            // stampa a video il valore letto in scala decimale
  if (val <= 200) {
    ruotadx.write(0);
    ruotasx.write(180);      
    delay(15);      }            

    
val = analogRead(potpin);
    if (201 <= val <= 299) {                   
    ruotadx.write(90);            
    ruotasx.write(90);            
    delay(15);      }
     
val = analogRead(potpin);
    if (val >= 300) {
    ruotadx.write(180);            
    ruotasx.write(0);            
    delay(15);      

 delay(500) ;
 
  
  }
}

Grazie :slight_smile:

anche io sto facendo a pugni con un mini robot. ma i miei sono sostanzialmente problemi hardware. :( :( :(

puoi postare un video? sono curioso.