Aiuto con il codice ( Comunicazione tra arduino e seriale)

Ciao ragazzi, sto cercando di far comunicare arduino con il seriale attraverso visual basic. Questo è il codice che ho scritto:

const int ledPin13 = 13;      // the pin that the LED is attached to
const int ledPin12 = 12; 

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
}
void loop() {
  byte brightness;
  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();

      if (brightness = 13) {
      
      digitalWrite(ledPin13,HIGH);
      delay(500);
      digitalWrite(ledPin13,LOW);
      delay(500);
      
    } else if (brightness = 12){
     
      digitalWrite(ledPin12,HIGH);
      delay(500);
      digitalWrite(ledPin12,LOW);
      delay(500);
     }

  }
  }

Il punto è che vorrei che quando invio 13 al seriale mi si accenda il led sul pin 13 e quando invio 12 il led sul pin 12 appunto. Ma non va, qualsiasi cifra invio lampeggia solo il led sul pin 13. Mi sapreste dare una mano?? grazie

In che modo lo invii il "13" o il "12" via seriale? Occhio a mandare effettivamente 12 e 13 e non la loro conversione ascii (che fra l'altro sono due byte".

Janos:
In che modo lo invii il "13" o il "12" via seriale? Occhio a mandare effettivamente 12 e 13 e non la loro conversione ascii (che fra l'altro sono due byte".

Si lo invio tramite il Serial monitor. Ma cosa intendi nel mandare la conversione ascii?

Se te invii, tramite il serial monitor, 12 non mandi il numero 12 ma mandi la conversione ascii dell'1 e poi la conversione ascii del 2.

I calcolatori sanno lavorare solo con numeri, quindi anche le lettere sono convertite in numeri. A, ad esempio, è il numero 64. Il carattere "1" in ascii è 49. Inviando dal serial monitor il 12 non mandi il numero 12 ma mandi i numeri 49 e 50. Ti consiglio di dare un'occhiata su google e wikipedia. ASCII - Wikipedia

Janos:
Se te invii, tramite il serial monitor, 12 non mandi il numero 12 ma mandi la conversione ascii dell'1 e poi la conversione ascii del 2.

I calcolatori sanno lavorare solo con numeri, quindi anche le lettere sono convertite in numeri. A, ad esempio, è il numero 64. Il carattere "1" in ascii è 49. Inviando dal serial monitor il 12 non mandi il numero 12 ma mandi i numeri 49 e 50. Ti consiglio di dare un'occhiata su google e wikipedia. ASCII - Wikipedia

Capisco che mando il codice sbagliato, ma non capisco come posso mandare quello giusto. Come posso fare ??
Oppure cè qualche comando per mandargli un codice in binario, deciamle o altro ??

Col serial monitor puoi solo inviare codifiche ascii. Puoi, per esempio, riconoscere la sequenza dei caratteri 1 e 2. Un qualcosa del genere:

char carattere_precedente; //dichiarala fuori dal loop, così che sia una variabile globale
char carattere_attuale; //dichiarala fuori dal loop, così che sia una variabile globale

if (Serial.available()) {
carattere_attuale = Serial.read();
if (carattere_precedente == '1' && carattere_attuale == '2') {
digitalWrite(12,HIGH);
}
carattere_precedente = carattere_attuale;
}

RxxK:
Ciao ragazzi, sto cercando di far comunicare arduino con il seriale attraverso visual basic. Questo è il codice che ho scritto:

const int ledPin13 = 13;      // the pin that the LED is attached to

const int ledPin12 = 12;

void setup()
{
 // initialize the serial communication:
 Serial.begin(9600);
 // initialize the ledPin as an output:
 pinMode(ledPin13, OUTPUT);
 pinMode(ledPin12, OUTPUT);
}
void loop() {
 byte brightness;
 // check if data has been sent from the computer:
 if (Serial.available()) {
   // read the most recent byte (which will be from 0 to 255):
   brightness = Serial.read();

if (brightness = 13) {
     
     digitalWrite(ledPin13,HIGH);
     delay(500);
     digitalWrite(ledPin13,LOW);
     delay(500);
     
   } else if (brightness = 12){
   
     digitalWrite(ledPin12,HIGH);
     delay(500);
     digitalWrite(ledPin12,LOW);
     delay(500);
    }

}
 }




**Il punto è che vorrei che quando invio 13 al seriale mi si accenda il led sul pin 13 e quando invio 12 il led sul pin 12 appunto. Ma non va, qualsiasi cifra invio lampeggia solo il led sul pin 13. Mi sapreste dare una mano?? grazie**

Non só se il problema é solo il "=" al posto del "==" nel IF oppure anche se mani "1","3" o "13".
Ciao Uwe

Oppure c'è qualche comando per mandargli un codice in binario, decimale o altro ??

La classe VB che implementa la gestione delle porte seriali dovrebbe avere un metodo tipo write() che permette di specificare "esattamente" i byte da inviare, cioè senza alcuna conversione.

Bhe, sicuramente dentro gli if ci vuole == invece di =... :sweat_smile:

@Rxxk:
la questione è presto spiegata. Sulla seriale viaggiano singoli byte. Se tu spedisci un numero contenuto in una stringa, esempio "13", in realtà tu spedisci un byte contenente il codice ASCII di 1, che è 49, ed un byte di valore 51 che è il codice ASCII di 3. Lato Arduino devi quindi leggere i singoli byte e ricostruire il numero a mano. Una soluzione è spedire dal computer una variabile di tipo byte contenente il valore 13, che viaggerà come byte 13 e lo leggerai come 13 all'arrivo. Ricorda che Serial.read() non restituisce tutto quello che è arrivato sulla seriale ma solo il 1° byte disponibile nel buffer di ricezione.

Cerca nel forum, l'argomento è stato trattato tante volte, si tratta di fare una ricerca sulla trasmissione seriale, su come ricostruire i dati che viaggiano sulla seriale ecc.. Non ho link a discussioni sottomano ma non dovrebbe essere difficile trovare ciò che ti sto citando.

Ah, attento a quel che dice Uwe: in C l'uguaglianza è "==", non "=" come in Visual Basic. Questo succede quando si mescolano 2 sorgenti scritti in 2 linguaggi differenti :wink:

http://arduino.cc/en/Reference/If

leo72:
@Rxxk:
la questione è presto spiegata. Sulla seriale viaggiano singoli byte. Se tu spedisci un numero contenuto in una stringa, esempio "13", in realtà tu spedisci un byte contenente il codice ASCII di 1, che è 49, ed un byte di valore 51 che è il codice ASCII di 3. Lato Arduino devi quindi leggere i singoli byte e ricostruire il numero a mano. Una soluzione è spedire dal computer una variabile di tipo byte contenente il valore 13, che viaggerà come byte 13 e lo leggerai come 13 all'arrivo. Ricorda che Serial.read() non restituisce tutto quello che è arrivato sulla seriale ma solo il 1° byte disponibile nel buffer di ricezione.

Cerca nel forum, l'argomento è stato trattato tante volte, si tratta di fare una ricerca sulla trasmissione seriale, su come ricostruire i dati che viaggiano sulla seriale ecc.. Non ho link a discussioni sottomano ma non dovrebbe essere difficile trovare ciò che ti sto citando.

Ah, attento a quel che dice Uwe: in C l'uguaglianza è "==", non "=" come in Visual Basic. Questo succede quando si mescolano 2 sorgenti scritti in 2 linguaggi differenti :wink:

@leo72 ho capito il problema, cercherò di risolvere presto e nel caso avrò qualche altro problema mi farò risentire :stuck_out_tongue:
@uwefed e @Janos grazie per il vostro aiuto !!

Mi dispiace ragazzi ma proprio non riesco a realizzare il codice per comunicare dal seriale con arduino. Non sapreste aiutarmi ? magari conoscete qualche codice già realizzato. Io ho tentato in tutti i modi, ma a quanto pare sono incapace :stuck_out_tongue: grazie.

allora dacci il codice attuale e spiega bene cosa mandi sulla seriale al Arduino.
Ciao Uwe

uwefed:
allora dacci il codice attuale e spiega bene cosa mandi sulla seriale al Arduino.
Ciao Uwe

@uwefed Allora ricomincio dal mio primo codice:

const int ledPin13 = 13;      
const int ledPin12 = 12; 

void setup()
{
 
  Serial.begin(9600);

  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
}
void loop() {
  
  byte brightness;

  if (Serial.available()) {

    brightness = Serial.read();

      if (brightness == 13) {
      
      digitalWrite(ledPin13,HIGH);
      delay(500);
      digitalWrite(ledPin13,LOW);
      delay(500);
      
      } else if (brightness == 12){
     
      digitalWrite(ledPin12,HIGH);
      delay(500);
      digitalWrite(ledPin12,LOW);
      delay(500);
      }
   }
}

come puoi vedere ho settato il byte brightness uguale al Serial.read, poi nel if ho chiesto che se brightness fosse uguale a 13 si accenda il led sul pin 13. Poi sul Serial Monitor appunto invio 13, ma come mi avete spiegato a quanto pare invio in ascii il corrispondente di 1 e poi del 3. Quindi dovrei ricoscruire questo dato in qualche modo immagino. Ma non ho idea di come si faccia e non trovo nessuna guida. Grazie

Stavo anche leggendo dello shiftIn, mi può risultare utile ??

Il mio reply #9 ti spiegava il problema.
O spedisci un valore di tipo byte dal computer oppure spedisci una stringa e lato Arduino la leggi carattere per carattere e poi ne estrai il numero risultante.

RxxK:
come puoi vedere ho settato il byte brightness uguale al Serial.read, poi nel if ho chiesto che se brightness fosse uguale a 13 si accenda il led sul pin 13. Poi sul Serial Monitor appunto invio 13, ma come mi avete spiegato a quanto pare invio in ascii il corrispondente di 1 e poi del 3. Quindi dovrei ricoscruire questo dato in qualche modo immagino. Ma non ho idea di come si faccia e non trovo nessuna guida. Grazie

Appunto, è questo il problema. Ma di come ricostruire i dati letti da seriale se ne è parlato tante volte.
Ad esempio uno è questo:
http://arduino.cc/forum/index.php/topic,89421.0.html

RxxK:
come puoi vedere ho settato il byte brightness uguale al Serial.read, poi nel if ho chiesto che se brightness fosse uguale a 13 si accenda il led sul pin 13. Poi sul Serial Monitor appunto invio 13, ma come mi avete spiegato a quanto pare invio in ascii il corrispondente di 1 e poi del 3. Quindi dovrei ricoscruire questo dato in qualche modo immagino. Ma non ho idea di come si faccia e non trovo nessuna guida. Grazie

const int ledPin13 = 13;      
const int ledPin12 = 12;
char carattere_precedente = 0;

void Setup() {
  Serial.begin(9600);
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    char carattere_attuale = Serial.Read();
    If ((carattere_attuale == '3') & (carattere_precedente == '1')) {
    ............... //Quello che devi fare
    }
    carattere_precedente = carattere_attuale;
  }
}