Scusate la mia ignoranza ma risolvo un problema e incappo in un altro, cioè sono riuscito a creare una void dove legge tramite ultrasuoni la distanza ma quando eseguo una if per il controllo se minore di 1400 non so il perchè ma non funziona... vi allego il listato per intero...
#include <Servo.h>
Servo Testa;
Servo servopin;
Servo servopin2;
long durata;
//------------------
int centerPos = 90;
int frontRightUp = 72;
int frontLeftUp = 108;
int backRightForward = 75;
int backLeftForward = 105;
void movesinistra()
{
servopin.write(frontRightUp);
servopin2.write(backLeftForward);
delay(125);
servopin.write(centerPos);
servopin2.write(centerPos);
delay(65);
servopin.write(frontRightUp);
servopin2.write(backLeftForward);
delay(125);
servopin.write(centerPos);
servopin2.write(centerPos);
delay(65);
}
//------------------
int angle2;
int triggerPort = 7; //uscita segnale trigger
int echoPort = 8;//ingresso echo
int angle;
int pulsewidth;
int conta = 0;
void servopulse(int servopin,int angle){
pulsewidth=(angle*11)+500;
digitalWrite (servopin,HIGH);
delayMicroseconds (pulsewidth);
digitalWrite (servopin,LOW);
delay (15);
}
void servopulse2(int servopin2,int angle){
pulsewidth=(angle*11)+500;
digitalWrite (servopin2,HIGH);
delayMicroseconds (pulsewidth);
digitalWrite (servopin2,LOW);
delay (15);
}
void ultrasonico()
{
digitalWrite( triggerPort, LOW ); //setta al livello logico 0 la porta trigger
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );//setta al livello logico 1 (5V) la porta trigger
delayMicroseconds( 10 ); //ritardo di 10 microsecondi
digitalWrite( triggerPort, LOW ); //setta al livello logico 0 la porta trigger
long duration = pulseIn( echoPort, HIGH ); //long variabili a 32bit, duration nome della variabile
// mette dentro duration il tempo che trascorre prima che echoPort diventa allo stato logico1
long r = 0.034 * duration / 2; //long variabili a 32bit, r nome della variabile
//mette dentro r
Serial.print( "durata: " ); //scrive sul monitor la scritta tra ""
Serial.print( duration ); //scrive sul monitor la la variabile tra()
Serial.print( " , " ); //scrive sul monitor la scritta tra ""
Serial.print( "distanza: " ); //scrive sul monitor la scritta tra ""
//dopo 38ms è fuori dalla portata del sensore, adesso fino a 50ms
if( duration > 50000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
delay( 10 );
durata==duration;
}
void setup()
{
Testa.attach(4);
servopin.attach(2);
servopin2.attach(3);
pinMode( triggerPort, OUTPUT );// triggerPort è una porta in uscita
pinMode( echoPort, INPUT ); // echoPort è una porta in ingresso
Serial.begin( 9600 ); //imposta la porta seriale del monitor a 9600
Serial.println( "Sensore ultrasuoni: "); //scrive sul monitor la scritta tra ""
}
void loop()
{
inizio:
conta=5;
cammina:
ultrasonico();
if (durata < 1400) {movesinistra();}
conta--;
servopin.write(72);
delay(300);
servopin2.write(105);
delay(300);
servopin.write(90);
delay(300);
servopin2.write(90);
delay(300);
servopin.write(108);
delay(300);
servopin2.write(75);
delay(300);
servopin.write(90);
delay(300);
servopin2.write(90);
delay(300);
if (conta==0) {goto testaa;}
else {goto cammina;}
testaa:
//-----------------------------------qui sotto gira la testa------------------------------
for (angle2=90; angle2>=0; angle2--){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
for (angle2=0; angle2<=45; angle2++){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
//-----------------------------
for (angle2=45; angle2<=90; angle2++){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
//-----------------------------
for (angle2=90; angle2<=135; angle2++){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
//-----------------------------
for (angle2=135; angle2<=178; angle2++){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
//-----------------------------
for (angle2=178; angle2>=90; angle2--){ //ciclo for che sposta l'angolo del servo
Testa.write(angle2);
delay(30);}
delay(2000);
//------------------------------
}
in pratica questo specie d'insetto cammina, appena trova un ostacolo sotto i 30cm circa deve girare a sinistra. Controllo dal monitor seriale che mi indica la distanza giusta, e capisco che non dovrebbe girare, invece gira sempre come se la variabile fosse sempre minore.
durata=duration;
come hai scritto tu la variabile durata non cambia mai,
comunque sarebbe stato meglio definire la variabile "duration " globale e utilizzare quest'ultima nell'if.
Non è possibile.
O una funzione è void e quindi non restituisce alcun parametro oppure è dichiarata in base al parametro che restituisce: int, byte, long, tipi custom, ecc.
A dire il vero, un modo anche con void ci sarebbe ma devi passare una parametro con puntatore.
Come ti ha detto Uwe, invece che dichiarare la funzione di tipo void, la dichiari del tipo di dato che vuoi restituire.
Poi usi "return" per uscire.
Oppure usi una variabile globale: puoi modificarla in qualunque funzione del tuo programma ed il suo valore lo puoi leggere da qualunque funzione.
PS:
devi prendere l'abitudine di indentare per bene il codice, perché così non è molto leggibile...
fai un piacere a te stesso, perché lo mantieni meglio, ma anche agli altri che lo devono leggere per aiutarti
Grazie per i consigli, e scusate se non mi esprimo in modo corretto. Il mio problema di fondo è che provengo dall'assembler, li con 30 istruzioni penavi ma riuscivo a fare molte cose, chiamavo con call una routine e con return ritornavo nel main del programma avendo modificato una variabile o altro. Adesso mi trovo immerso nel codice C e non riesco a capire le sintassi da applicare per risolvere il mio "problema". Quello che mi serviva adesso era capire come costruire una void o routine (esempio questo dell'ultrasuoni) da chiamare durante l'esecuzione del void loop, e memorizzare dentro una variabile (long) il valore da poter interrogare con if nel void loop.
Grazie.
Nella sezione Megatopic c'è un Topic con "LINK UTILI".
Li dentro, oltre a collegamenti per l'elettronica di base, trovi anche collegamenti relativi a guide al linguaggio C.
Se hai già basi di programmazione in Assembler non dovresti avere molte difficoltà ad imparare un nuovo linguaggio.
Grazie per i consigli! Sono riuscito a risolvere i problemi per ottenere il calcolo delle variabili, adesso mi è sorto u altro problema, Come devo comparare 5 varibili? cioè ho 5 variabili con all'interno 5 valori e devo sapere dove si trova il valore maggiore. Ho pensato di annidare più if e else ma mi confondo come fare, inizio così:
Io in pratica leggo 5 distanze e poi devo far girare questo robot nella direzione più lontana, quindi devo capire di queste 5 variabili quella più grande! sapendo quella più grande essempio se è la prima gli faccio fare 2 cicli di rotazione, così il robot si gira a destra di circa 90 gradi se è la seconda variabile 1 ciclo di rotazione così ruota a destra di 45 gradi, se è la terza cammina dritto se è la quarta gira di 45 gradi a sinistra se è la quinta gira a sinistra di 90 gradi. =( =( =(
Potresti anche affrontare la cosa in altro modo forse meno intuitivo.
I 5 dati li metti in un array, scrivi una funzione che esegue la ricerca del valore maggiore che una volta trovato ritorna il valore dell'indice. L'indice lo usa in un costrutto switch (index) case 1: ecc
La ricerca del valore maggiore in un array sarebbe più rapida se i dati fossero messi in ordine, se non
lo sono (perché magari cambiano molto spesso come in questo caso) la ricerca è sì più lenta ma con solo 5 valori non dovrebbe creare problemi al robot.
In effetti di robotica non ci capisco nulla magari c'è già una soluzione collaudata, ma non lo conosco.