Go Down

Topic: Problema con lo scambio di dati in seriale tra Arduino UNO e VisualBasic2010 (Read 975 times) previous topic - next topic

2000Diego

Salve a tutti, devo fare un progetto per la scuola che consiste in un braccio robot che scrive delle parole su una lavagna su cui è appoggiato. Ho finito il braccio e il programma per arduino e per controllarlo ho deciso di fare un'interfaccia in VB. Dato che in VB non avevo idea di come si potessero scambiare i dati in seriale ho trovato un programma su internet che metto allegato.
In teoria dovrebbe funzionare così:
Arduino dice che è pronto a ricevere delle istruzioni; VB comincia ad inviare dei numeri che significano dei comandi. E questo in teoria.
In realtà succede che VB invia un numero che gli dico io e arduino lo prende e fa tutto quello che deve fare per bene ma quando VB invia il secondo numero arduino non lo  riconosce come un istruzione e rimanda indietro "richiesta non valida" (adesso lo vedrete meglio nel codice che imposto qua sotto).
Non so proprio più come fare, dal monitor seriale del programma Arduino funziona alla grande ma quando i dati vengono scambiati con VB si blocca tutto dopo un'istruzione.

Codice Arduino UNO:  (semplificato con l'accensione e lo spegnimento di un led in modo che possiate vedere subito quello che succede)
Alla fine di ogni istruzione va messa una \ per dire ad arduino che quella istruzione è finita
Code: [Select]

#include <String.h>

   int val = 0;
   char carattere;
int baudrate = 9600;
String richiesta;

int led = 13;  //il pin del led è il 13

void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(baudrate);    //inizializza la seriale
  Serial.println("Pronto..."); //invia un messaggio per dire che è pronto
}

void loop() {
  if(Serial.available()){
   
    val = Serial.read();         //la variabile integer val diventa un numero ASCII
    carattere = val;             //Il numero ASCII diventa una lettera
     
    if(val != 92){
      richiesta = richiesta + carattere;  //le lettere si raggruppano tutte in una parola finché non viene trovata una backslash (numero ASCII 92) e il programma entra nell'IF
    }
   
   
      if(val == 92 || val == 0){
        Serial.println(richiesta);
       
        if(richiesta == "acceso"){ //qui se la scritta era "acceso\" accende il led
          digitalWrite(led, HIGH);
          Serial.println("Ho acceso il LED");
        }else if(richiesta == "spento"){   //qui se la scritta era "spento\" spegne il led
          digitalWrite(led, LOW);
          Serial.println("Ho spento il LED");
        }else{
          Serial.println("Richiesta non valida");  //se non si trovano scritte uguali il programma fa ritornare un errore
        }
       
        richiesta = "";
        val = 0;
        carattere = ' ';
      }
       
  }
}

nid69ita

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
my name is IGOR, not AIGOR

cyberhs

Vado a "naso": non è che le stringhe inviate dal VB terminano con CR+LF?

Se fosse così, lo sketch su Arduino non è in grado di intrpretare i due caratteri di controllo.

2000Diego

nid69ita grazie per avermelo detto ma io ho messo i tag, infatti a me viene uno spazio separato dal resto con dentro il codice, potrebbe essere un problema di visualizzazione sul tuo browser.

Rispondendo a cyberhs, non penso che sia quello perché quando scrivi qualcosa da VB e la mandi ad arduino, arduino rimanda indietro quello che hai scritto e la scritta mi ritorna giusta...

nid69ita

Prima di if(richiesta == comando) ...
hai una Serial.println(rihiesta);    la seconda volta cosa stampa ?

Se stampa un comando valido, prova a stampare prima dopo un carattere noto, esempio:

Code: [Select]
Serial.print(">");
Serial.print(richiesta);
Serial.println("<");


Per capire se la seconda volta al fondo di richiesta non ci siano caratteri in più (come forse ha intuito @cybers )
my name is IGOR, not AIGOR

Go Up