Go Down

Topic: Aiuto con il codice ( Comunicazione tra arduino e seriale) (Read 1 time) previous topic - next topic

RxxK

Mar 18, 2012, 02:35 pm Last Edit: Mar 18, 2012, 02:41 pm by RxxK Reason: 1
Ciao ragazzi, sto cercando di far comunicare arduino con il seriale attraverso visual basic. Questo è il codice che ho scritto:

Code: [Select]
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

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

RxxK


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?

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. http://it.wikipedia.org/wiki/ASCII

RxxK

#4
Mar 18, 2012, 09:17 pm Last Edit: Mar 18, 2012, 09:49 pm by RxxK Reason: 1

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. http://it.wikipedia.org/wiki/ASCII

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

Janos

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

Quote

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

uwefed

#6
Mar 19, 2012, 12:22 am Last Edit: Mar 19, 2012, 12:37 am by uwefed Reason: 1

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

Code: [Select]
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

tuxduino

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

Janos

Bhe, sicuramente dentro gli if ci vuole == invece di =...  :smiley-sweat:

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

Janos


RxxK


@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  ;)

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

RxxK

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 :P grazie.

uwefed

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

RxxK

#14
Mar 24, 2012, 01:01 pm Last Edit: Mar 24, 2012, 01:27 pm by RxxK Reason: 1

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


@uwefed Allora ricomincio dal mio primo codice:
Code: [Select]
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

Go Up