Ave
Perdonatemi ma è il primo listato che scrivo, in vita mia intendo, quindi abbiate pietà di me
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
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
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è
Ora il botolo riconosce gli ostacoli, torna un pelino indietro, si gira e riparte… non fate caso ai commenti, alle 5 del mattino è così…
// 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
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) ;
}
}