Pages: [1] 2   Go Down
Author Topic: Aiuto con il codice ( Comunicazione tra arduino e seriale)  (Read 933 times)
0 Members and 1 Guest are viewing this topic.
Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
« Last Edit: March 18, 2012, 08:41:22 am by RxxK » Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ??
« Last Edit: March 18, 2012, 03:49:37 pm by RxxK » Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

Code:
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
« Last Edit: March 18, 2012, 06:37:15 pm by uwefed » Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

@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  smiley-wink
Logged


Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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  smiley-wink
@leo72 ho capito il problema, cercherò di risolvere presto e nel caso avrò qualche altro problema mi farò risentire smiley-razz
@uwefed e @Janos grazie per il vostro aiuto !!
Logged

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

@uwefed Allora ricomincio dal mio primo codice:
Code:
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
« Last Edit: March 24, 2012, 07:27:53 am by RxxK » Logged

Pages: [1] 2   Go Up
Jump to: