aiutino con serial.read() ?

Ciao, ho interfacciato una form in vb con il seriale di arduino, però ho un piccolo problema:

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

non so se cambi molto però a volte mi ha imbrogliato ...
l'assegnazione di s...
prova così....

#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);
   }  
  }
}

ratto93:

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

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.

Ciao sciorty

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

if (Serial.read() == 'l' && s < -1){

é sbagliato. Se vuoi limitare il valore tra 0 e 180 devi scrivere:

if (valore == 'l' && s >= 0){

Il codice giusto é:

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 :astonished:
Ciao Uwe

Vi stimo :smiley:

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