Go Down

Topic: Chiedo aiuto: robot schizzinoso. (Read 558 times) previous topic - next topic

NetWorm

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

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 :D

Ecco lo schifocodice.

Code: [Select]

#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 :D
Chiedo pertanto umilmente aiuto, ma tanto umilmente, perchè sto deprimendomi in un modo considerevole... :'( :'(

nathanvi

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....

My blog:
http://zuccala.blogspot.com

msx

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..
http://msx80.blogspot.com/

bebbo

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

prova così:
Code: [Select]

#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);
 
}
imagination is the only weapon in the war against reality

NetWorm

#4
Apr 20, 2009, 03:03 pm Last Edit: Apr 20, 2009, 03:03 pm by networm Reason: 1
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è :)
Ora il botolo riconosce gli ostacoli, torna un pelino indietro, si gira e riparte... non fate caso ai commenti, alle 5 del mattino è così... :D

Code: [Select]
// 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);
 }

}

NetWorm

#5
Aug 15, 2009, 01:54 am Last Edit: Aug 15, 2009, 02:27 am by networm Reason: 1
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...

Code: [Select]
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 :P

Il codice, non commentato, è il seguente:
Code: [Select]
// 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 :)

Davide

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

puoi postare un video?
sono curioso.

Go Up