Scambio dati Arduino-Visual Basic

Ciao a tutti,

ho iniziato a smanettare un pò con il kit di arduino e visual basic 2008 e seguendo un tutorial trovato in rete sono riuscito ad effettuare uno scambio di dati nonstante non sia un esperto di VB (quasi non ci credo :astonished:). Il mio progetto "lato arduino" è molto semplice: c'è un motore collegato ad un pulsante e un led collegato ad un pin impostato come uscita. Quando premo il pulsante il motore parte e il led si accende. In VB ho una textbox nella quale scrivo "acceso" o "spento", due pulsanti di start e stop e una casellina che diventa verde quando il motore parte. Il programma funziona ma la mia domanda è come funziona lo scambio di dati seriale tra Arduino-VB? Nel senso se io ho 10 pulsanti in VB, dal lato arduino come faccio ad associare 10 variabili a questi pulsanti? La prima cosa che mi è venuta in mente è che posso dichiarare un intero che può assumere valori da 1 a 10 e quindi a seconda del numero che vado a scrivere in VB so anche di quale pulsante si tratta. Siccome sono a lavoro non l'ho provato. In ogni caso questo è un esempio stupido ma se dovessi scambiare tanti dati tra cui anche stringhe penso che la cosa diventi molto complicata. Qualcuno mi potrebbe chiarire come funziona lo scambio dati attraverso seriale?

Grazie

Puoi usare una semplice connessione seriale creandoti un protocollo personalizzato ricordando che Arduino legge un carattere alla volta. Quindi la funzione di lettura dovrà prevedere un ciclo che andrà a leggere tutti i dati inviati (uno per uno) e poi li interpreta. Oppure puoi utilizzare la libreria firmata --> http://www.firmata.org/wiki/Main_Page e --> http://www.acraigie.com/programming/firmatavb/default.html

Poco fa ho letto da qualche parte nel forum quello che mi hai appena detto.
Quindi arduino legge un byte per volta ciò significa che dovrei crearmi un array di elementi e gestirli una volta ricevuti.
I due link che mi hai postato sembrano davvero interessanti, appena posso farò dei test.
Intanto grazie

Sto provando a smanettare con la libreria firmata ma non riesco a farla funzionare :cold_sweat: In pratica ho aperto l'esempio in VB e ho cambiato il numero della porta e il BaudRate. Riesco ad andare in RUN senza errori ma non capisco come interpretarlo anche perchè non succede nulla. Ad esempio ho un pulsante che mi fa partire il motore. Quando clicco il pulsante dovrei vedere che si accende il led in VB relativo al pulsante che ho premuto? Inoltre nel mio progetto ho collegato il pin 9 ad un motore (comandato come PWM) se provo in VB a regolare il pwm con lo slider fa 'cose strane' :fearful: se ad esempio lo sposto tutto a destra a volte succede (non sempre) che l'uscita va a 0 :astonished: Mi aiutate a capire meglio il suo utilizzo per favore? Inoltre nel programma arduino bisogna includere la libreria firmata.h?

Si la libreria firmata deve essere inclusa anche nello sketch di Arduino con il dovuto codice di controllo, ci sono degli esempi qui --> http://arduino.cc/en/Reference/Firmata e nei link precedentemente riportati.

nagy se vedi sul sito di firmata c'e' l'applicativo da far girare lato pc, mentre su arduino carichi lo sketch firmata. non ti serve piu' nulla per farla funzionare. Ua volta che hai visto che il tutto funziona puoi pensare a come scrivere il sw visualbasic, ma lo sketch lato arduino lo puoi lasciare sempre uguale

Ho capito :roll_eyes: Domani proverò di nuovo a smanettarci. Credetemi oggi stavo impazzendo per cercare di passare più valori misti da arduino a VB spero domani di riuscire a fare un passo avanti :)

Ragazzi scusate ma ancora non ci sono riuscito :roll_eyes: In pratica ho scaricato in arduino lo sketch StandardFirmata ed ho aperto l'esempio di firmata in VB. Tuttavia non riesco a capire cosa dovrebbe succedere dato che non vedo nulla che cambia. Comunque tralasciando per un momento firmata ho continuato sui miei passi e cioè facendo un progettino in VB mio. Da arduino riesco ad inviare un paio di segnali analogici e uno digitale riuscendo a gestirli in VB quindi piano piano sto capendo come fare per raccogliere i dati dalla seriale. Tuttavia resta il problema inverso e cioè se invio un solo carattere da VB ad arduino tutto ok riesco a manipolarlo ma se invio una stringa non riesco a farlo funzionare. Vi posto una parte del codice magari è più chiaro. La stringa che invio da VB è dstrp

CODICE ARDUINO

...
char inData[20];
index = 0;
...
...
if(Serial.read()=='d'){start=1;}
  while(Serial.available()>0 && start){
       inData[index] += Serial.read();
       index++;
       if(Serial.read()=='p'){start=0; index=0;}
    }
  if(inData=="str"){remoto=1;}

CODICE VB2008

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        SerialPort1.Write("dstrp")
    End Sub

Ho provato anche a modificare l'IF sostituendo inData=="str" con inData=="dstr" Suggerimenti?

Ciao,
ti allego il codice che ho usato per leggere (lato Arduino) una stringa in arrivo.
Non è “farina del mio sacco” e l’ho copiato chissà dove.

Spero ti sia di aiuto.

Un saluto,
Tredipunta.

char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void loop()
{

if(Comp(“set”)==0){
Serial.println(“arrivato”);
}
}

char Comp(char* This) {
index = 0;
while (Serial.available() > 0) // Don’t read unless
// there you know there is data
{
if(index < 19) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = ‘\0’; // Null terminate the string
}
}

if (strcmp(inData,This) == 0) {
for (int i=0;i<19;i++) {
inData*=0;*

  • }*
  • index=0;*
  • return(0);*
  • }*
  • else {*
  • return(1);*
  • }*
    }

Ho fatto una prima prova inserendo questo codice ma niente ancora. Ho sostituito "set" con "str" ma proprio non ne vuole sapere non fa quello che io dico =( Ma non mi arrendo continuo a smanettare sul codice che mi hai postato :)

Io in VB apro la porta così:

Private Sub InitPortComunication()

With SerialPort1 .BaudRate = 9600 .PortName = "COM1" .Parity = IO.Ports.Parity.None .DataBits = 8 .StopBits = IO.Ports.StopBits.One '.ReceivedBytesThreshold = 4 End With SerialPort1.Open() SerialPort1.DiscardInBuffer()

End Sub

ed eseguo il write nella stessa tua modalità SerialPort1.Write("set")

No saprei cos'altro (nel codice) possa dar fastidio....

Ciao, Tredipunta.

Grazie per le info, tra un pò faccio delle prove. Appena posso ti faccio sapere :)

Ciao ragazzi, dunque ho fatto una serie di prove e il problema per cui non riesco a manipolare le stringhe che ricevo in arduino è perchè mi arrivano vuote! Infatti se apro il serial monitor e scrivo una stringa riesco ad utilizzare per il mio scopo. Se invece la scrivo da VB con il Serial.write non arriva :roll_eyes: La porta in VB la apro così

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Close()
        SerialPort1.PortName = "COM24"
        SerialPort1.Open()
    End Sub

Suggerimenti?

purtroppo non conosco VB, pero', scusa se insisto, almno fai la prova con firmata, per capire se e' tutto ok Non scaricare l'esempio VB, ma proprio l'applicativo per windows, linux, quello che vuoi tu.

Non devi scrivere nulla, lato arduino carichi lo sketch firmata, e lato pc lanci l'applicativo .exe cosi' fai due cose positive, testi HW e vedi visivamente cosa fa firmata, magari dandoti spunti per l'applicazione tua.

Testato innanzitutto voglio ringraziarti per la tua immensa pazienza :)

Dunque ho scaricato lo sketch FirmataStandard in arduino, ho aperto in VB il progetto Firmata e ho impostato la mia porta seriale, ho lanciato il programma, ho provato a impostare a ON il bit numero 2 al quale è collegato un relè, ho abilitato il secondo ingresso analogico dove è collegata una fotoresistenza. Questo è quello che vedo

https://docs.google.com/file/d/0B2Jycjwk1eZKYmM0VDVSNk90M28/edit

o io o tu, o forse entrambi, siamo in ferie.
Non riusciamo a capirci :slight_smile:

Firmata lo puoi usare SENZA Visual basic, l’applicativo lato PC e’ gia’ esistente, rileggi cio’ che ho scritto.
Ciao

inoltre il tuo link googledocs non e’ pubblico, quindi non posso vederlo

Eccomi di nuovo scusate il ritardo :) Hai ragione scusa ho interpretato male il tuo messaggio precedente. Ho fatto la prova scaricando in arduino Firmata e lanciando l'applicativo firmata_test.exe, risultato..... funziona! :) Adesso i punti sono due:

1) Ho rifatto il mio codice per la comunicazione con VB partendo dall'inizio perchè avevo creato un pò di confusione a furia di smanettare :P utilizzando come codice definitivo questo (non creato da me ho solo fatto una piccola modifica):

void serialEvent()
{
  while (Serial.available())
  {
    
    char cmd = (char)Serial.read();

    if (cmd == '{')
    { 
      cmdData="";
      index=1;
      startOfLine = true;
    }

    if (cmd == '}')
    { 
      endOfLine = true;
    }

    if (startOfLine && cmd != '{'  && cmd != '}')
    {
      //Serial.print("Send command");
      cmdData += cmd;
      index++;
    }

    if (startOfLine && endOfLine)
    { 
      startOfLine = false;
      endOfLine = false;
      cmdData.toCharArray(inData, index);
      cmdData += '\r';

     // Serial.println(inData);

      
    }
  }
}

2) Se volessi proseguire con firmata e VB quale deve essere il prossimo passo avendo constatato che l'applicativo funziona? Cioè io in arduino ho il codice del mio progetto, a questo devo includere anche quello di firmata ma in che modo lo devo incorporare o utilizzare? devo includere una nuova scheda e aggiungere il codice FirmataStandard per poi richiamarlo nella scheda principale o basta aggiungere include "Firmata.h"?