Serial.read

Ciao a tutti
Sono alle prese con un rover che vorrei comandare da pc tramite python
pero' sto sbagliando qualcosa perchè se mando il valore 255 con il pc il led sul pin 13 non ne vuole sapere di accendersi

/** MultipleServos.pde (bare bones) **/  
 #define LED  13
   
 void setup() {  
   // open serial connection  
   Serial.begin(9600);
   pinMode(LED ,OUTPUT);  
 }  
   
 void loop() {  
     
     //read the first byte  
     lettura = Serial.read();  
     // if it's really the startbyte (255)  
     if (lettura == 255) {  
         analogWrite(LED,HIGH);
        
         
     }
    
 }

Il prog viene compilato regolarmente e qualdo invio da pc si vede i led de tx che lavora...

#!/usr/bin/env python  
   
import serial  
usbport = '/dev/ttyUSB0'  
ser = serial.Serial(usbport, 9600, timeout=1)
ser.write(255)

questo è l'acceno di script python
Non sono molto ferrato in programmazione quindi non infierite :slight_smile:

tutto cio' che mandi sulla seriale è ASCII quindi prima di usarlo come intero devi fare un casting a intero con il comando

int(lettura)

c'è pero' un altro errore nel tuo codice:

if (lettura == 255) {  
         analogWrite(LED,HIGH);
 }

Se vuoi che il led si accenda e basta senza agire sulla luminosità e l'hai collegato ad un pin digitale devi usare:

if (lettura == 255) {  
         digitalWrite(LED,HIGH);
 }

se invece vuoi agire sulla sua luminosità e hai collegato il led ad una porta analogica (pwm) allora potresti fare:

         analogWrite(LED,lettura);

in questo modo mandando una qualsiasi valore compreso tra 0 e 1023 dallo script potrai modulare la luminosità del led.

ciao

uccio ti correggo analogWrite con un valore da 0 a 255 e non da 0 a 1023

giusto! scusate :slight_smile:

Aggiungo un altro dettaglio.

Non è necessario il cast perche comunque i caratteri vengono gia passati come "numeri"

È invece fondamentale controllare che ci sia qualcosa da leggere usando Serial.available()

Non bisogna mai usare Serial.read() prima di aver controllato che il buffer contenga qualcosa

Have fun

Non ricordo precisamente, ma potresti aver bisogno anche di una chiamata tipo

ser.flushOutput()

in python

Facendo le varie prove (e mettendo insieme parti di codice prese qua e la :slight_smile: ) ho fatto confusione tra digital e analog :originariamente controllavo il pin 9 con il pwm per poter gestire una rampa di accelerazione per i motori,ma visto che non ci riuscivo ho provato con un digital senza cambiare la chiamata...
Ora provo a seguire i vostri consigli e vi faccio sapere
Grazie a tutti

Allora...spulciando in giro su una montagna di forum sono riuscito nel mio primo intento.
I comandi python dal pc verso arduino andavano bene cosi,mentre lo sketch l'ho modificato cosi e va

int LED = 13; // pin the LED is connected to
int  stato;        // blink rate stored in this variable

void setup()
{
  Serial.begin(9600); // Initialize serial port to send and receive at 9600 baud
  pinMode(LED, OUTPUT); // set this pin as output
}

void loop()
{
  if ( Serial.available()) // Check to see if at least one character is available
  {
    char lettura = Serial.read();
    if(lettura == '0') 
      digitalWrite(LED,HIGH);
    if(lettura=='1')
      digitalWrite(LED,LOW);    
            
    
  }
}

non ho pienamente chiaro a cosa serve char,se qualcuno me lo puo' spiegare imparo una cosa nuova :slight_smile:
Ora il prossimo passo è quello di gestire il pwm.
In particolare dovrei tenere il segnale al 50% (128) con un comando e con altri due comandi farlo andare a 0 oppure a 255...se qualcuno mi puo' dare degli spunti sono ben accetti
Ciao a tutti

char è un tipo di variabile. individua un carattere

if(lettura == '2')
      analogWrite(Pwm, 128);
if(lettura== '3')
      analogWrite(Pwm, 0);
if(lettura== '4')
      analogWrite(Pwm, 255);

basta aggiungere questo dove "Pwm" sta per il pin che vuoi usare
la variabile char indica un carattere quindi quei numeri 0,1,2,3,4 sono considerati come dei caratteri dal programma e non puoi usare il loro valore

cio' vuol dire che char è applicabile solo per singoli caratteri,cioè se invece di 0 e 1 avessi usato ,per esempio 'ciao' mi avrebbe restituito errore?giusto?
Grazie per l'esempio,stasera provo
Ciao

Bene !
Ho aggiustato ulteriormente il programma

int PWM = 9; // output in pwm
int valore=0;
void setup()
{
  Serial.begin(9600); // inizializzazione seriale
  pinMode(PWM, OUTPUT); // inposta pwm come out
}

void loop(){
  if ( Serial.available()) //controllo seriale disponibie
  {
    char lettura = Serial.read();
    if(lettura == '1') 
    {
      for(valore=128;valore<=255;valore+=5)
       {      
       analogWrite(PWM , valore);
       delay(10);
       }
    }        
    if (lettura=='0')
      analogWrite(PWM ,128);
      delay(10);
    if(lettura=='2')
    {
      for(valore=128;valore>=0;valore-=5)
       {
       analogWrite(PWM ,valore);
       delay(10); 
       }
    }       
  }
}

ho fatto in modo di avere due rampe per i due fronti del pwm :dato che dovra' pilotare due ponti con 4 motori piuttosto potenti ,evitero' picchi di assorbimento e slittamenti delle ruote.
ora devo aggiustare i comandi in modo da ottenere le marce av/ind e la rotazione nei due sensi.
Altra cosa sara' quella di portare la freq sui pin 9 e 10 a 8 khz per regolarizzare la rotazione dei motori.
Mi raccomando: io scrivo tutto per avere consigli eper avere conferma che non dico sciocchezze!
Ciao