Ciao sono nuovo del forum,
volevo sapere se qualcuno di voi sa come si interfaccia visual basic con arduino.
Nel mio progetto dovrei usare visual basic per controllare dei motori che muovono un braccio elettronico.
In pratica in visual basic ho 4 bottoni (su,giu,destra,sinistra) e in base a quello che clicco devo muovere il braccio con arduino.
Non conosco visual basic ma penso possa inviare dei comandi alla usb e tramote quella mandi i comandi ad arduino.
Usando la seriale.
Qualsiasi linguaggio, VB, Java, Php, etc. gestisce bene il collegamento seriale. Attraverso la seriale mandi comandi da e verso Arduino.
Comunque quale VB? VB6 o VB.NET ?
In VB6 hai un ocx per gestire la seriale (MsComm32.ocx), mentre in VB.NET c'e' la libreria System.IO.Ports
Ho scaricato visual basic 2010 non è possibile farlo con questa versione?
Se qualcuno ha il codice di un esempio di interfacciamento tra arduino e visual basic sarebbe ben accetto
Sono disponibili in rete dei componenti aggiuntivi per VB fatti apposta per Arduino (che utilizzano Firmata) che ho già testato e funzionano (Arduino UNO + VB 2010 Express) . Sono comodi perché permettono immediatamente di effettuare alcune semplici operazioni che fai normalmente con Arduino da VB. Il sito cui tempo fa avevo fatto riferimento, se non ricordo male, è questo: Arduino <> Firmata <> Visual Basic .NET
Purtroppo non posso dirti nulla di più perchè alla fine ho abbandonato l'idea di interfacciare Arduino e VB per questioni di tempo che manca...
Spero di esserti stato utille, ciao
Luca
Se vuoi evitare il firmware Firmata, ovvero un programma già scritto per Arduino, allora nel tuo programma Arduino dovrai stabilire con quali comandi colloquiare attraverso la seriale. Per la gestione della seriale da Arduino basta vedere la Serial nel reference Serial - Arduino Reference
Per la gestione della seriale da VB.NET puoi vedere questo, ma è complicatino il leggere i dati (scrivere è semplice).
http://www.me.umn.edu/courses/me2011/smartprodcourse/technotes/docs/serial-port-vb.pdf
Solo scrivere da VB: form semplice con un combobox e 2 bottoni alla cui pressione spedisci "A" oppure "B" sulla seriale. Logicamente lato Arduino dovrai leggere e fare qualcosa a seconda di cosa ricevi.
Imports System.IO.Ports
Public Class Form1
Dim SerialPort1 As New SerialPort
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim PortName As String
Dim a() = System.IO.Ports.SerialPort.GetPortNames() ' dichiara un array che si occupa della porte disponibili
SerialPort1.Close()
For Each PortName In a ' elenca le porte seriali disponibili
ComboBox1.Items.Add(PortName)
Next
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
InitPortComunication()
SerialPort1.Write("A")
SerialPort1.Close()
End Sub
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
InitPortComunication()
SerialPort1.Write("B")
SerialPort1.Close()
End Sub
Private Sub InitPortComunication()
With SerialPort1
.BaudRate = 9600
.DataBits = 8
.PortName = ComboBox1.Text '"COM1"
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None
.Encoding = System.Text.Encoding.Default 'very important!
End With
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
SerialPort1.DiscardInBuffer()
End Sub
End Class
Leggere i dati sembra semplice, basta usare SerialPort1.read, ma il problema è se vuoi leggere i dati senza sapere quando arrivano.
Dim buffer As Byte()
Dim offset As Integer
Dim count As Integer
Dim returnValue As Integer
returnValue = SerialPort1.Read(buffer, offset, count)
Esempio per ricevere dati (li visualizzo solo in un listbox) e spedisco 2 caratteri "A" oppure "B"
Imports System.IO.Ports 'Importa la libreria
Public Class Form1
Dim SP1 As New SerialPort
Dim SP1open As Boolean
Dim comBuffer As Byte()
Private Delegate Sub UpdateFormDelegate()
Private UpdateFormDelegate1 As UpdateFormDelegate
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim PortName As String
Dim a() = System.IO.Ports.SerialPort.GetPortNames() ' Dichiarare un Array che si occupa della porte disponibili
SP1.Close()
AddHandler SP1.DataReceived, AddressOf SP1_DataReceived
For Each PortName In a ' un ciclo si occuperà di aggiungere le porte disponibili nella combobox
ComboBox1.Items.Add(PortName) ' Test l'ho scelto io a caso
Next
End Sub
Private Sub BtnSendB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSendB.Click
If SP1open Then SP1.Write("B")
End Sub
Private Sub BtnSendA_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSendA.Click
If SP1open Then SP1.Write("A")
End Sub
Private Sub SP1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
Dim n As Integer = SP1.BytesToRead 'find number of bytes in buf
comBuffer = New Byte(n - 1) {} 're dimension storage buffer
SP1.Read(comBuffer, 0, n) 'read data from the buffer
Me.Invoke(UpdateFormDelegate1) 'call the delegate
End Sub
Private Sub UpdateDisplay()
' ricevo bytes, se invio 'A' oppure 65, ricevo 65
' chr(65) -> "A"
Dim sBuf As String = "", i As Integer
For i = 0 To comBuffer.Length - 1
sBuf = sBuf & Chr(comBuffer(i))
Next
ListBox1.Items.Add(sBuf)
End Sub
Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click
With SP1
.BaudRate = 9600
.DataBits = 8
.PortName = ComboBox1.Text '"COM1"
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Handshake = IO.Ports.Handshake.None
.Encoding = System.Text.Encoding.Default 'very important!
End With
Try
SP1.Open()
SP1open = True
Catch ex As Exception
MessageBox.Show(ex.Message)
SP1open = False
End Try
SP1.DiscardInBuffer()
End Sub
Private Sub BtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClose.Click
SP1.Close()
SP1open = False
End Sub
Allego una immagine della form di questo esempio.
Tieni conto che non avevo mai provato questo tipo di collegamento vb<->arduino, ho seguito la guida postata sopra al link. Ho provato non con Arduino ma con un secondo applicativo in vb6 attraverso una porta virtuale. Questo programma in VB.NET funziona ma io uso Visual Studio 2005. Spero funzioni in VS2010.
Grazie a tutti sono riuscito a far inviare i dati ad arduino ora il problema è che da arduino non riesco a convertire i dati ricevuti dal Serial.read().
Esempio di visual basic:
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
SerialPort1.Open()
SerialPort1.Write("0")
SerialPort1.Close()
End Sub
In arduino devo convertire quel "0" in una variabile int contenente 0
giorgio1994:
....
In arduino devo convertire quel "0" in una variabile int contenente 0
Finché parliamo solo dei caratteri numerici ("0".."9") la cosa è molto semplice ...
... in ASCII tutti i caratteri numerici stanno tra 0x30 e 0x39 ... se tu al carattere ricevuto sottrai 0x30 ottieni con una sola operazione un numero tra 0 e 9.
char myChar;
int myInt;
...
myInt = (int) (myChar - 0x30);
...
Non so se era questo che intendevi ...
Guglielmo
P.S. : Dato che i numeri che ottieni sono tra 0 e 9 ... invece dell'int puoi usare il byte e risparmaire memoria
giorgio1994:
In arduino devo convertire quel "0" in una variabile int contenente 0
Credo che la funzione atoi di C++ faccia al caso tuo.
Ho testato il codice (copia incolla) ma quando premo uno dei due tasti mi da errore "la porta è chiusa"
E non ho la più pallida idea del perchè, qualcuno mi potrebbe aiutare?
@Jok3r91: Intanto, essendo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ...
... poi, invece di riaprire un post del 2013 :o ... era meglio che aprivi un tuo nuovo thread e spiegavi esattamente cosa stai facendo, che Arduino hai, come lo hai collegato, ecc. ecc.
Guglielmo