Processing-Arduino-analogWrite

Ciao a tutti :slight_smile:
questa volta ho un problema con Processing....
Ho creato un progetto che con dei potenziometri e dei led e vorrei fare in modo che l'illuminazione dei led sia regolata dalla rotazione dei potenziometri.
Sull'Arduino ho caricato la standard firmata, e testando sia i potenziometri che i led funzionano
il problema sorge quando vado a provare a usare analogWrite su di un led, non funziona manco morto...
ho provato a mettere i led come OUTPUT oppure a cambiare il valore analogico ma niente non funziona....
Dove può essere il problema??

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

int[] kn = {0, 1, 2, 3, 4, 5};      //Potenziometri
int[] led = {3, 5, 6, 9, 10, 11};   //Led 

void setup() {
  arduino = new Arduino(this, Arduino.list()[1], 57600);
  for(int i = 0; i < led.length; i++) {
    arduino.pinMode(led[i], Arduino.OUTPUT);
  }
}

void draw() {
  ledPwm();
  //Test
  arduino.analogWrite(6, 255);
}

void ledPwm() {
  int temp;
  for(int i = 0; i < kn.length; i++) {
    temp = floor(map(arduino.analogRead(kn[i]), 0, 1023, 0, 255));
    print(temp + " ");
    //arduino.analogWrite(led[i], temp);
  }
  
  print("\n");
}

lo sketch legge correttamente i valori dei potenziometri e me li stampa a monitor, quindi li non è il problema
provando a sostituire

arduino.analogWrite(6, 255);

con

arduino.digitalWrite(6, 255);

funziona perfettamente con tutti i led provati.....
Dove può essere il problema??
Grazie a tutti :slight_smile:

prova di eliminare la funzione floor in:

 temp = floor(map(arduino.analogRead(kn[i]), 0, 1023, 0, 255));

Ciao Uwe

Ciao grazie della risposta, ma non è quello nonostante lo abbia provato.
il mio problema è sull'analogWrite e non sul input.
Altre idee?

uhmm potebbe essere che la funzione draw venga chiamata tropo spesso? prova a fare la chiamata solo una o due volte al secondo

WTF?????? :astonished:
Ha funzionato!!!!
Ma come mai?? la standard firmata ha dei delay nello sketch oppure è un problema di comunicazione seriale??
Comunque grazie mille, credo che mi servirà di lezione per i prossimi progetti :wink:

ha funzionanto la mia idea?
bhe la spiegazione è abbastanza semplice, però son partito da delle assunzioni.
allora, il draw sappiamo che molto probabilmente avvioene molto velocemente, a naso almeno 300 volte al secondo se la grafica è semplice e il pc regge almeno un minimo di grafica (anche senza accelerazione probabilmente, 1000 o più in casi di pc un pò spinti (sono i famosi FPS), di solito con una wait (differisce dal delay perchè lascia spazio ad altri thread/processi) li si limita a 60 al secondo, più che sufficianti per ingannare l'occhio umano.

sappiamo anche che il PWM non è altro che un seganle che si ripete circa 50 volte al secondo, con una durata di 0 e 1 proporzionale al valore immesso
ora assunzione: il PWM parte sempre con un segnale 0, ed ogni analogWrite riazzera l'interrupt.

quindi: il pwm partiva, ma prima che arrivasse il segnale di 1 cambiavi subito il timer resettando tutto. Invece la digital write è immediata
non solo, in realtà la seriale è lenta, quindi mentre scrivileggi possono avvenire centinaia di istruzioni lato arduino. bisognerebbe vedere firmdata come gestisce alcune situazioni
potrebbe anche darsi che draw venga chiamata di nuovo per forzare abbastanza fps... bel casino vero?

comunque un segreto:
si usa un thread per la graica (esiste di già, ed è sbagliato usarlo ANCHE per la logica... devono esserci delle variabili ATOMICHE oppure SINCRONIZZATE in condivisione col thread della logica.
Si complica il codice, ma in realtàò diventa molto più portabile e mantenibile

$) $) $)
Grazie mille della spiegazione, ho immaginato (dopo i test) che fosse un problema di fps che processing gestiva in modo veloce senza permettere di poter osservare cambiamenti.
Grazie ancora XD