Go Down

Topic: Scambio dati Arduino-Visual Basic (Read 12592 times) previous topic - next topic

nagy

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  :smiley-eek:). 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

PaoloP

#1
Jul 24, 2012, 12:17 pm Last Edit: Jul 24, 2012, 12:19 pm by PaoloP Reason: 1
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

nagy

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

nagy

Sto provando a smanettare con la libreria firmata ma non riesco a farla funzionare  :smiley-roll-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'  :smiley-eek-blue: se ad esempio lo sposto tutto a destra a volte succede (non sempre) che l'uscita va a 0  :smiley-eek:
Mi aiutate a capire meglio il suo utilizzo per favore?
Inoltre nel programma arduino bisogna includere la libreria firmata.h?

PaoloP

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.

testato

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
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nagy

Ho capito  :smiley-roll:
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  :)

nagy

Ragazzi scusate ma ancora non ci sono riuscito  :smiley-roll-blue:
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
Code: [Select]

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

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?

tredipunta

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

nagy

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

tredipunta

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.


nagy

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

nagy

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  :smiley-roll:
La porta in VB la apro così

Code: [Select]

  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?

testato

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.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nagy

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

Go Up