Leggere un valore seriale e immetterlo in campo analogWrite()

Ciao a tutti, sto cercando di scrivere uno sketch che mi consenta di leggere un valore inviato per via seriale e riproporlo con funzione analoWrite() su un pin PWM di arduino.
Mi spiego nel dettaglio:
ho settato uno swipe in nodered su raspberry e ho settato la porta seriale dello stesso connessa con arduino. Con lo swipe faccio arrivare un valore da 0 a 255 ad un pin PWM di arduino al quale arriva una stringa ASCII (volendo posso far arrivare un valore binario). Il lato raspberry funziona correttamente in quanto effettivamente invia ciò che ho chiesto ad arduino. Il problema ce l'ho facendo leggere il valore ad arduino e scrivendo quel valore ricevuto poiché in uscita con il tester non ho un voltaggio coerente col valore che vado a trasmettere per via seriale. Sarebbe, e sicuramente è così dato che non sono molto bravo con la programmazione,come se il valore che vado a metere dentro analogWrite() non sia quello che invio per via seriale.
Ecco qui il codice per completezza:

int command = 6;
int valV = 0;
const unsigned int max_message_lenght = 12;

void setup() {
  pinMode (command, OUTPUT);
  Serial.begin (9600);
}

void loop() {

  while (Serial.available() > 0) {
    static char message[max_message_lenght];
    static unsigned int message_position = 0;
    char incomingByte = Serial.read();

    if (incomingByte != '\n' && message_position < max_message_lenght -1) {
      message[message_position] = incomingByte;
      message_position++;
    }
    else {
      message[message_position] = '\0';
      valV = atoi(message);
      analogWrite(command, valV);
      message_position = 0;
    }
  }
}

Cercando un po' in rete ho visto come far masticare ad arduino la stringa facendo leggere il messaggio posizione per posizione finché non c'è altro da leggere e trasformarla in un numero intero. Come si vede lo vado a mettere nel secondo campo di analogWrite.
Potrei magari semplificare il problema facendo inviare un valore binario per via seriale anzichè una stringa ma mi piacerebbe capire dove sta l'errore.
Spero di essere stato il più chiaro possibile.
Ringrazio in anticipo.

1 Like

NON ho esaminato il programma e quindi NON so se ci sono errori, ma ... tu sai come funziona un PWM? Perché non puoi aspettarti di trovarti una "tensione" come, ad esempio, quella in uscita da un DAC sul pin PWM, ma solo un onda quadra di ampiezza costante (5V), ma con duty-cycle variabile.

Guglielmo

... al limite, puoi mettere sull'uscita del pin PWM una "rete RC integratrice" in modo di approssimare un valore di tensione proporzionale al segnale PWM.

Prova a dare un'occhiata a QUESTO articolo ... :roll_eyes:

Guglielmo

Potresti pubblicare una tabella di ciò che ottieni?
P.s.: +1 per la chiarezza e la correttezza con cui scrivi. Grazie! :slight_smile:

Come dire... il mio problema era sul software... Comunque...Qualcosina so ma sicuramente mi aspetto che salgo di valore da 0 a 255 il voltaggio cresca di conseguenza cosa che invece non accade.. sembra invece che non sia correlato.. come se ci fosse un errore nel codice che alla fine non fa uscire il valore che immetto per via seriale... quindi se per caso metto 134 ho una "tensione" poi se salgo di valore magari 192 ottengo una "tensione" più bassa... quindi come dicevo non c'è correlazione aldilà della curva che mi posso aspettare non rispetta semplicemente il fatto che se cresce il valore la "tensione" cresce..

ma certo che sì.. la redigo quanto prima!
intanto ti ringrazio..

Ho risolto il problema che come immaginavo era lato software..
per rispondere a Datman semplicemente più aumentavo il numero da 0 a 255 e più il voltmetro rilevava valori verso i 5V, il massimo che ho ottenuto è stato 4,7V. Del resto avevo già fatto una prova inserendo manualmente il valore desiderato in analogWrite() e quello che dovevo comandare rispondeva come doveva, ossia se davo 255 andava pieno regime e se davo 0 era fermo.
Per gpb01 grazie mille per il tuo fondamentale contributo.
Per me potete chiudere.