Go Down

Topic: aiutino con serial.read() ? (Read 474 times) previous topic - next topic

sciorty

Ciao, ho interfacciato una form in vb con il seriale di arduino, però ho un piccolo problema:
Code: [Select]
#include <Servo.h>
int s=90;
Servo servo1;

void setup(){
  Serial.begin(9600);
  servo1.attach(8);
  servo1.write(s);
}

void loop(){
  if (Serial.available() > 0){
   if (Serial.read()== 'r' && s<181){
    s+=1;
    servo1.write(s);
   }
   if (Serial.read() == 'l' && s < -1){
    s-=1;
    servo1.write(s);
   } 
  }
}


Il servo lo riesco a muovere solo in senso orario ('r'). La comunicazione tra vb e serial funziona perchè provando a mettere ad esempio solo il blocco 'l' e togliendo quello 'r' funziona, quindi il problema è di codice arduino.
Non so perchè ma sento che sia qualche errore sotto al mio naso :D

ratto93

non so se cambi molto però a volte mi ha imbrogliato ...
l'assegnazione di s...
prova così....
Code: [Select]
#include <Servo.h>
int s=90;
Servo servo1;

void setup(){
  Serial.begin(9600);
  servo1.attach(8);
  servo1.write(s);
}

void loop(){
  if (Serial.available() > 0){
   if (Serial.read()== 'r' && s<181){
    s=s+1;
    servo1.write(s);
   }
   if (Serial.read() == 'l' && s < -1){
    s=s-1;
    servo1.write(s);
   } 
  }
}
Se corri veloce come un fulmine, ti schianterai come un tuono.

sciorty



Niente. E' una cosa strana perchè se metto come primo controllo il blocco 'r' e dopo quello 'l' funziona solo con 'r', se li inverto non funziona nessuno dei due e se ne metto solo uno dei due funzionano ! In tutto questo il led rx si accende sempre come dovrebbe cioè sia quando invio 'r' che 'l'.
Ho provato anche ad inviarli manualmente sul serial ma non cambia niente..

leo72

Intanto c'è un problema logico nel tuo codice.
Ad ogni if prelevi un carattere dalla seriale per cui se il primo confronto non è giusto il 2° if non viene fatto con lo stesso carattere ma con una nuova lettura dalla seriale.
Devi memorizzare il valore in una variabile, in modo da poterla usare per i tuoi calcoli.


uwefed

Ciao sciorty

Code: [Select]

00 void loop(){
01  if (Serial.available() > 0){
02   if (Serial.read()== 'r' && s<181){
03    s+=1;
04    servo1.write(s);
05   }
06   if (Serial.read() == 'l' && s < -1){
07    s-=1;
08    servo1.write(s);
09   }  
10  }
11}


Se mandi "r RETURN" il servo si muove a destra e
se mandi "xl RETURN" dove x é qualisiai carattere differente da "r" il servo si muove a sinistra.

Analizziamo il codice insieme:

riga 01 controlli se uno o piú caratteri sono nel buffer della seriale.
riga 02 fino 05 leggi un carattere dalla seriale e controlli se é un "r" incrementi il valore e lo mandi al servo.
riga 06 fino 09 leggi un secondo carattere dalla seriale e controlli se é un "l" decrementi il valore e lo mandi al servo.  
L' errore é che devi memorizzare il valore letto dalla seriale e controllarlo se é un "r" o un "l".
inoltre
Code: [Select]
if (Serial.read() == 'l' && s < -1){
é sbagliato. Se vuoi limitare il valore tra 0 e 180 devi scrivere:
Code: [Select]
if (valore == 'l' && s >= 0){
Il codice giusto é:
Code: [Select]
void loop(){
 if (Serial.available() > 0){
  valore =Serial.read();
  if (valore == 'r' && s<181){
   s+=1;
   servo1.write(s);
  }
  if (valore == 'l' && s >= 0){
   s-=1;
   servo1.write(s);
  }  
 }
}


[edit] Leo sei stato piú veloce  :smiley-eek:
Ciao Uwe


sciorty


ketrono

ciao mi è piaciuto questo tuo codice di manovra di un servo l'ho caricato e funziona tutto però io il comando "r" o "l" lo do dal serial port del software arduino e il comando è in base alla quantità di lettere cioe se scrivo "rrrr" e invio il servo si muve di 4 "step". io vorrei farlo tipo tenendo premuto il tasto "frecciaSx" o "freccaDx" del pc è possibile? come faccio? premetto che mi sto avvicinando adesso al mondo arduino e programmazione.
Grazie e scusa il disturbo. :)

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview