Pages: [1]   Go Down
Author Topic: Processing-Arduino-analogWrite  (Read 868 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti  smiley
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??

Code:
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
Code:
arduino.analogWrite(6, 255);
con
Code:
arduino.digitalWrite(6, 255);
funziona perfettamente con tutti i led provati.....
Dove può essere il problema??
Grazie a tutti  smiley
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prova di eliminare la funzione floor in:
 
Code:
temp = floor(map(arduino.analogRead(kn[i]), 0, 1023, 0, 255));
Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10454
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

WTF??????  smiley-eek
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  smiley-wink
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10454
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-money smiley-money smiley-money
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  smiley-lol
Logged

Pages: [1]   Go Up
Jump to: