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
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();
**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.
@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: @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 @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 grazie.
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
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
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;
}
}