Pages: [1]   Go Down
Author Topic: aiutino con serial.read() ?  (Read 453 times)
0 Members and 1 Guest are viewing this topic.
Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, ho interfacciato una form in vb con il seriale di arduino, però ho un piccolo problema:
Code:
#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-grin
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 28
Posts: 5515
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non so se cambi molto però a volte mi ha imbrogliato ...
l'assegnazione di s...
prova così....
Code:
#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);
   } 
  }
}
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21877
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao sciorty

Code:
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:
if (Serial.read() == 'l' && s < -1){
é sbagliato. Se vuoi limitare il valore tra 0 e 180 devi scrivere:
Code:
if (valore == 'l' && s >= 0){
Il codice giusto é:
Code:
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
 
Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi stimo smiley-grin
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: