Salve ho un problema con il codice di arduino, tramite u,'applicazione in vb.net creata da me invio una stringa formata dai valori rgb in seguenza separati da virgola, la stringa è ad esempio 100,255,0
La divido in arduino attraverso il codice ma quando imposto il valore la luminosità non cambia e non capisco il perchè...
Codice arduino
int ledrPin = 9;
int ledgPin = 10;
int ledbPin = 11;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledrPin, OUTPUT);
pinMode(ledgPin, OUTPUT);
pinMode(ledbPin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
int r = Serial.parseInt();
int g = Serial.parseInt();
int b = Serial.parseInt();
// Write the color to each pin using PWM and the value gathered above
analogWrite(ledrPin, r);
analogWrite(ledgPin, g);
analogWrite(ledbPin, b);
Serial.print("R=");
Serial.print(r);
Serial.print(" G=");
Serial.print(g);
Serial.print(" B=");
Serial.print(b);
}
}
cosa spedisci esattamente ? ovvero com'e' fatta la stringa che spedisci da vb ?
come hai fatto i collegamenti al led rgb ?
Presentato
Arduino è collegato tramite usb su COM3
spedisco tramite serialport.write(dati) la stringa contenente i 3 colori da 0 a 255 divisi da una virgola, cioè 255,255,255 per il bianco
per adesso sto usando 3 led diversi per fare una prova, comunque:
pin 9 --> meno led rosso -->resistenza 100ohm--> 5v
pin 10 --> meno led verde -->resistenza 100ohm--> 5v
pin 11 --> meno led blu -->resistenza 100ohm--> 5v
i comandi arrivano perchè se spengo o accendo solo, funziona, se invece uso il programma o anche da monitor seriale, mi scrive i caratteri nel monitor nel modo esatto ma non cambia niente
il problema non sono le uscite di arduino perchè le ho testate tutto con un led, un potenziometro e funzionavano benissimo
miky94x:
i comandi arrivano perchè se spengo o accendo solo, funziona, se invece uso il programma o anche da monitor seriale, mi scrive i caratteri nel monitor nel modo esatto ma non cambia niente
Provato al volo il tuo codice e funziona, ho verificato le uscite pwm col DSO e cambiano correttamente il duty cycle, ovviamente devi fornire valori compresi tra 0 e 255, p.e. introducendo da terminale seriale "128,128,128" i tre out vengono settati con il PWM al 50%.
astrobeed:
Provato al volo il tuo codice e funziona, ho verificato le uscite pwm col DSO e cambiano correttamente il duty cycle, ovviamente devi fornire valori compresi tra 0 e 255, p.e. introducendo da terminale seriale "128,128,128" i tre out vengono settati con il PWM al 50%.
Posso postare il software così provate anche voi? ho aggiunto una listbox per mostrare la stringa inviata ad arduino
Certo. L'errore è nel programma in VB, purtroppo hai inviato soltanto l'immagine del form quindi è impossibile sapere come hai scritto questo programma.
paulus1969:
Certo. L'errore è nel programma in VB, purtroppo hai inviato soltanto l'immagine del form quindi è impossibile sapere come hai scritto questo programma.
Mi sembra strano, il codice inviato è in quel formato comunque grazie
Provato anche il programmino sul pc, funziona però devi aggiungere una "," anche dopo il terzo valore altrimenti se li mandi rapidamente la parseInt interpreta due valori come attaccati invece di due valori singoli.
Quanto sopra per via del timeout di default per lo stream sulla seriale che è un secondo, senza divisore se due valori arrivano in meno di un secondo vengono interpretati come un valore a sei cifre.
In pratica Arduino invece di vedere 128.128.128 65.65.65 vede 128 128 12865 65 65 e questo causa il malfunzionamento del pwm.
astrobeed:
Provato anche il programmino sul pc, funziona però devi aggiungere una "," anche dopo il terzo valore altrimenti se li mandi rapidamente la parseInt interpreta due valori come attaccati invece di due valori singoli.
Quanto sopra per via del timeout di default per lo stream sulla seriale che è un secondo, senza divisore se due valori arrivano in meno di un secondo vengono interpretati come un valore a sei cifre.
In pratica Arduino invece di vedere 128.128.128 65.65.65 vede 128 128 12865 65 65 e questo causa il malfunzionamento del pwm.
Non si potrebbe inserire semplicemente un carattere alla fine per fargli capire che è finito l'input da impostare tramite pwm?
miky94x:
Non si potrebbe inserire semplicemente un carattere alla fine per fargli capire che è finito l'input da impostare tramite pwm?
Che metti una virgola o una carattere cambia poco, in tutti i casi la ParseInt ha bisogno di capire dove finisce il numero e se continui ad inviare numeri, senza separatore e senza far scadere il time out, li unisce tutti in un'unica cifra, in alternativa aggiungi il terminatore di stringa "0x00".
Per farla breve, la colpa è del programma windows che non formatta correttamente i dati
astrobeed:
Che metti una virgola o una carattere cambia poco, in tutti i casi la ParseInt ha bisogno di capire dove finisce il numero e se continui ad inviare numeri, senza separatore e senza far scadere il time out, li unisce tutti in un'unica cifra, in alternativa aggiungi il terminatore di stringa "0x00".
Per farla breve, la colpa è del programma windows che non formatta correttamente i dati
ok grazie di tutto, adesso ho corretto il programma ma c'è nè un'altra xD, non vorrei assillare ma mi imposta il valore e dopo più o meno un secondo ritornano tutti accesi al massimo, e poi mandando la stringa con alla fine il terminatore "0x00" tipo 255,255,2550x00 si spengono tutti tranne il blu, cioè l'ultimo, non è che imposta 2550? potrebbe esserci una soluzione? se riuscissi a mettere a posto il problema del valore 2550, potrei mettere un timer che ogni 10ms invia il valore
astrobeed:
0x00 è 0 in esadecimale, devi aggiungere un singolo byte che contiene 0 come valore reale e non "0" come valore Ascii dello 0.
avevo quel dubbio infatti ho aggiunto una lettera alla fine ed ora è tutto a posto, adesso arduino è collegato tramite usb ma nel caso fosse con un modulo bluetooth non dovrebbe cambiare no? cambio solo la porta COM e invio i dati alla stessa maniera, anche perchè ho fatto una app android che fa lo stesso lavoro del programma