Pages: [1]   Go Down
Author Topic: Chiedo aiuto: robot schizzinoso.  (Read 529 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 489
Arduino addicted
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Ecco lo schifocodice.

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

Torino - Linux
Offline Offline
God Member
*****
Karma: 0
Posts: 522
Pigs on the wings!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 113
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Newbie
*
Karma: 0
Posts: 46
arduino lover
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

prova così:
Code:
#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);
  
}
Logged

imagination is the only weapon in the war against reality

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 489
Arduino addicted
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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è smiley
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-grin

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

}
« Last Edit: April 20, 2009, 08:03:41 am by networm » Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 489
Arduino addicted
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley-razz

Il codice, non commentato, è il seguente:
Code:
// 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 smiley
« Last Edit: August 14, 2009, 07:27:12 pm by networm » Logged

Forum Administrator
Torino, Italia
Offline Offline
Sr. Member
*****
Karma: 4
Posts: 386
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

anche io sto facendo a pugni con un mini robot.
ma i miei sono sostanzialmente problemi hardware.
 smiley-sad smiley-sad smiley-sad

puoi postare un video?
sono curioso.
Logged

Pages: [1]   Go Up
Jump to: