Go Down

Topic: Chiedo aiuto: robot schizzinoso. (Read 589 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy