Go Down

Topic: problema seriale (Read 4180 times) previous topic - next topic

sirmattia

Ho creato un programmino con Visual Basic in cui una barra fa scegliere un valore che viene inviato alla seriale di arduino. Solo che il led collegato con l'uscita pmw si accende solamente ma non cambia di luminosità. Qual'è il problema? Che i dati numerici non possono essere inviati tramite seriale senza prima convertirli in qualche tipo di stringa? Oppure devo inserire un timer in VB che ogni tot millisecondi manda sempre il valore tramite seriale?

yoshi93

Codice plz   XD.
Se usi la analogWrite() puoi usare la read() di arduino per prendere il byte in arrivo(valore tra 0 e 255 proprio come serve a te).
Potresti usare anche la parseInt() ma occhio ai separatori tra i numeri.


uwefed

Senza sketch e descrizione dei colelgamenti dei LED e odello Arduino che usi posso solo risponderti:
Sí puó essere.

Ciao Uwe

sirmattia

Allora, ho usato un atmega328 con il bootloader dell'arduino uno e ho inserito questo sketch:

Code: [Select]
int led = 6;
int tonalita = 0;

void setup() {
        Serial.begin(9600);
}

void loop() {

        if (Serial.available() > 0) {
         
                tonalita = Serial.read();

                analogWrite(led, tonalita);
        }
}


Il programma visual basic invece è come ho descritto, c'è una trackbar che restituisce un valore (da 0 a 255) che viene scritto sulla seriale, ogni decimo di secondo. La porta com è giusta.

Il problema è che una volta che muovo la barra il led (che appena inserito lo sketch è spento) si accende ma poi non cambia più luminosità in base al movimento ma resta fisso. Idee?

cyberhs

Perché non spedisci il valore della tonalità ricevuta al Serial Monitor?

yoshi93

Prova ad usare anche il serial monitor come interfaccia per verificare se è lo sketch (che mi sembra giusto) o il programma in VB.

sirmattia


Perché non spedisci il valore della tonalità ricevuta al Serial Monitor?


Perché la seriale può essere usata da un solo dispositivo alla volta e se il programmino è aperto (e quindi connesso con la COM) non mi fa aprire il monitor.

paulus1969

Mostra anche il codice Visual Basic, forse è lì che c'è qualcosa da sistemare.

nid69ita

#8
May 20, 2013, 09:12 am Last Edit: May 20, 2013, 09:19 am by nid69ita Reason: 1
1. anche se non dovrebbe essere necessario, comunque per pulizia sarebbe meglio settare il pinMode nella setup()
pinMode(led, OUTPUT);

2. come spedisci il dato da VB?   un singolo byte da 0-255   o il valore come stringa (esempio 123 come "123" e perciò 3 byte=49-50-51) ?
Secondo me:
in VB6 usando il controllo MsComm  spedisci con il comando MSCom3.Output = text        ma anche la output si aspetta una stringa, perciò
un valore da variabile numerica lo converte in stringa.       MSCom3.Output = MyScroll.Value       123->"123"
In VB6 dovresti provare      MSCom3.Output = Chr$(MyScroll.Value)       123->carattere in tabella ascii 123 perciò un byte
my name is IGOR, not AIGOR

sirmattia

Il codice visual basic è questo:

Code: [Select]
    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        TrackBar1.Minimum = 0
        TrackBar1.Maximum = 255
        Timer1.Start()

    End Sub

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        myport = IO.Ports.SerialPort.GetPortNames
        ComboBox1.Items.AddRange(myport)  'inserisco porte seriali disponibili in combobox1
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        SerialPort1.Close()
        SerialPort1.PortName = ComboBox1.Text
        SerialPort1.Open()
        ComboBox1.Enabled = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim i As Byte
        i = CByte(Val(TrackBar1.Value))  'converto la stringa in byte
        Label1.Text = i  'mostro il valore nella label1
        SerialPort1.Write(i)  'invio il valore alla seriale

    End Sub
End Class


All'inizio il programma non prevedeva la conversione da stringa a byte, ma vedendo che non funzionava ho aggiunto la conversione (anche se la Label1 mi mostra sempre il numero). Usando lettere dell'alfabeto (per altri programmi) funzionava benissimo (senza conversione) ma con i numeri non ci sono mai riuscito!

nid69ita

Secondo me quella conversione è inutile.  
Prendi un numero TrackBar1.Value, esempio 123
Lo converti in numero Val()    quindi hai 123
E poi obblighi VB a convertire 123->"123" e poi ancora in 123    con CByte()

http://msdn.microsoft.com/it-it/library/y2sxhat8.aspx
La SerialPort.Write si aspetta una stringa, perciò il byte viene convertito in stringa (sequenza di cifre) e sparerà "1" "2" e poi "3" se la cifra è 123

Se vuoi una sola cifra devi sostituire
i = CByte(Val(TrackBar1.Value))  
con
i = Chr(TrackBar1.Value)  'converto la stringa in byte          123=>"{"

my name is IGOR, not AIGOR

sirmattia

Ho provato ad aprire il monitor seriale (quindi senza applicazione VB) e a scrivere dei numeri da 0 a 255 e la situazione non cambia lo stesso...quindi il problema è nel sketch arduinico! ora la domanda è dov'è l'errore!

nid69ita

Stesso errore. Se tu scrivi sul monitor 123, stai scrivendo "1" "2" e "3"
Ovvero Arduino riceverà tre byte "1", "2" e "3"      ovvero i valori 49, 50 e 51

Se vuoi fare la prova devi scrivere un solo carattere il cui valore ascii è il valore che vuoi spedire. Ad esempio { => 123  
Purtroppo da tastiera non puoi provare tutti i valori.
Prova # => 35
Poi prova { => 123
poi con ± => 241    (questo non sò se il serial monitor dell'IDE lo prende)
my name is IGOR, not AIGOR

sirmattia

#13
May 20, 2013, 02:44 pm Last Edit: May 20, 2013, 02:52 pm by sirmattia Reason: 1
Ah ho capito! Infatti adesso ho usato la funzione chr come dicevi prima tu (prima l'avevo inserita male) ma sorge un'altro problema: arrivato ad un certo valore (corrisponde al simbolo €) il led non cambia più di valore, forse arduino non legge tutti i caratteri ascii che ha vb?

nid69ita

No, penso sia ora un problema elettronico.
Forse con quel valore hai già la massima luminosità del led.

P.S. quanto vale € ?
my name is IGOR, not AIGOR

Go Up