Go Down

Topic: Visualizzazione dati PC - Arduino seriale (Read 815 times) previous topic - next topic

Nightwist

Salve a tutti, sto tentando (con scarso successo) di realizzare un programma in Visual Basic che mi permetta di visualizzare il valore di alcuni dati di Arduino via seriale.
Utilizzo un modulo GY-521 per ottenere dati riguardanti giroscopio, accelerometro e temperatura vorrei mettere per esempio una Label che scriva la temperatura rilevata e due ProgressBar che indichino l'avanzamento o l'arretramento a seconda della grandezza delle variabili di accelerometro e giroscopio.
È possibile associare per esempio alla ProgressBar1 un valore, alla ProgressBar2 un altro e così via?
Avreste delle delucidazioni e dei chiarimenti per quanto riguarda il codice Visual Basic?

Cordiali saluti, grazie in anticipo!
Il ragionamento matematico può essere considerato piuttosto schematicamente come l'esercizio di una combinazione di due capacità, che possiamo chiamare intuizione e ingegnosità.

nid69ita

#1
Jun 11, 2016, 08:05 pm Last Edit: Jun 11, 2016, 08:09 pm by nid69ita
Secondo me non c'entra nulla quale linguaggio usi. Comunque fai comunicazione via seriale ed è la logica con cui devi passare e poi leggere (interpretare) i dati che è importante.
Devi tu stabilire quali dati passare e come riconoscerli e poi in VB in base al "protocollo" che ti sei inventato allora sai se il valore ricevuto deve andare su un controllo piuttosto che ad un altro.

Esempio  se quando leggi da A0 e da A1 dei valori analogici li vuoi in VB vedere rispettivamente su progress1 e progress2, dovrai in fase di spedizione mandare un "segnale" o carattere che dice cosa è quel valore.    Es. spedisci    "A0:0020#"          e poi    "A1:1012#"         
Un protocollo che invia per primi 2 char quale pin hai letto, poi 4 char per il valore e il # per sapere che hai finito.        Lato VB analizzi ciò che ricevi, se inizia con A1 sai che è un valore per Progress2
my name is IGOR, not AIGOR

qsecofr

è si infatti: è un problema di crearsi un mini-protocollo di comunicazione tra arduino e Vb. Poi con VB non avrai problemi a mostrare i dati: sarà il meno.
Dovrei avere un codice mooolto pasticciato che ho usato per fare una specie di ECG... l'arduino sparava il valore analogico sulla seriale interrotto da un crlf e vb ricomponeva il numero e lo piazzava nel grafico. Se vuoi te lo passo in qualche modo (asIs...)

Nightwist

Quel che uscirà sarà un programma molto grezzo e sporco, penso farò prima a utilizzare Processing, voi che dite?
Il ragionamento matematico può essere considerato piuttosto schematicamente come l'esercizio di una combinazione di due capacità, che possiamo chiamare intuizione e ingegnosità.

qsecofr

mah. Non è difficile neanche in vb. Io sinceramente processing l'ho installato una volta e non l'ho pressochè mai usato. Mentre Vb mi viene facile.... comunque son 3 righe in croce... di cui mezze commentate... forse la difficoltà maggiore, se vogliamo parlare di difficoltà è sul grafico che voleva 20000 letture. per te è più semplice perchè non ti serve la storicità dei dati.... basta che discrimini in base che so al primo carattere che invii...




Code: [Select]
Imports System.IO.Ports
Imports System.Threading

Public Class Form1
    Const mymax = 20000

    Dim Dati(mymax) As Integer
    Dim Puntatore As Integer



    Dim WithEvents COMport As New SerialPort
    Dim RXbyte As Byte


    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.


    End Sub

    Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMport.DataReceived
        ' RXbyte = COMport.ReadByte
        ' Me.Invoke(New MethodInvoker(AddressOf Display))
        'Me.TextBox1.Text = e.ToString

        Dim sp As SerialPort = CType(sender, SerialPort)
        Dim indata As String

        While sp.BytesToRead > 0
            indata = sp.ReadLine()
            If IsNumeric(indata) Then
                '    Console.WriteLine("Data Received:")
                '    Console.Write(indata)
                Puntatore = (Puntatore + 1)
                Puntatore = Puntatore Mod mymax

                Dati(Puntatore) = CInt(indata)

            End If

        End While


        ' Chart1.Series()

    End Sub



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        COMport.PortName = "COM6"
        COMport.BaudRate = 115200
        COMport.DtrEnable = True
        COMport.RtsEnable = True
        COMport.ReadBufferSize = 100
        COMport.Open()

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.Timer1.Enabled = Not Me.Timer1.Enabled
        Me.Button2.Text = Me.Timer1.Enabled

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Chart1.Series(0).Points.Clear()
        Dim punt As Integer
        punt = Puntatore
        For i As Integer = 0 To mymax - 1

            Chart1.Series(0).Points.AddXY(i, Dati((i + punt) Mod mymax))

        Next

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class




Code: [Select]
int sensorPin = A5;    // select the input pin for the potentiometer

void setup() {
  // declare the ledPin as an OUTPUT:
  Serial.begin(9600);

}

void loop() {
  // read the value from the sensor:
  int sensorValue;
  sensorValue = analogRead(A5);   
  Serial.println(sensorValue);
  delay(100);                 
}




qsecofr

tra l'altro mi sono accorto che avevo impostato 2 velocità diverse sulla seriale... chissà perchè funzionava lo stesso  :)

nid69ita

#6
Jun 12, 2016, 10:10 am Last Edit: Jun 12, 2016, 10:11 am by nid69ita
Quel che uscirà sarà un programma molto grezzo e sporco, penso farò prima a utilizzare Processing, voi che dite?
Che avrai, secondo me, le stesse difficoltà.
Grazie a @qsecorf, ma il codice che ti ha passato va bene per un solo dato.
Il tuo problema è distinguere cosa stai spedendo dal ricevitore.  Che il codice sia VB o Java (in Processing) sempre una logica nel protocollo di comunicazione dovrai crearti.
Il vantaggio di Processing è di essere multipiattaforma. VB only Windows. E forse di esempi con Processing/Arduino trovi più esempi in internet rispetto a VB/Arduino
my name is IGOR, not AIGOR

qsecofr

si be ho premesso che era molto naif... però è molto semplice anche creare un protocollo per altri dati:
Quando scrivi su arduino scrivi per esempio:
Code: [Select]
serial.print ("X");
serial.println(dato);
serial.print("Y");
serial.println(dato);


e da VB una volta letta la stringa fai un if stringa.startwith("X") then... if stringa.startwith("Y") then... eccetera.


Go Up