Processing e analog input

Ciao a tutti, sto provando ad interfacciare arduino con processing e devo dire che l'unico problema riscontrato e stato quello delle librerie rxtx che non corrispondevano, comunque ho risolto installando la versione "RXTX-2.1-7".

Veniamo al dunque, dopo aver caricato lo sketch "standard_firmata" su arduino uno e le librerie "arduino" in processing ho provato l'esempio "analog_input" che restituisce una semplice interfaccia dove le entrate digitali sono rappresentate con dei quadrati e le entrate analogiche con dei cerchi che variano il loro diametro in base ad un segnale analogico.

Ho provato a collegare un potenziometro alla porta analogica 0 e lanciando il programma ho notato che tutti e sei i cerchi rispondono al potenziometro, questo comportamento mi sembra strano visto che ho collegato un solo potenziometro ad una sola entrata analogica, non dovrebbe rispondere un solo cerchio su sei ?

Ho provato anche con due potenziometri e a questo punto i sei cerchi si dividono, nel senso che 3 vengono comandati da un potenziometro e 3 dall'altro.

Il codice è il seguente:

import processing.serial.*;

import cc.arduino.*;

Arduino arduino;

color off = color(4, 79, 111);
color on = color(84, 145, 158);

void setup() {
  size(470, 280);
  arduino = new Arduino(this, Arduino.list()[1]);
  
  for (int i = 0; i <= 13; i++)
    arduino.pinMode(i, Arduino.INPUT);
}

void draw() {
  background(off);
  stroke(on);
  
  for (int i = 0; i <= 13; i++) {
    if (arduino.digitalRead(i) == Arduino.HIGH)
      fill(on);
    else
      fill(off);
      
    rect(420 - i * 30, 30, 20, 20);
  }
  
  for (int i = 0; i <= 5; i++) {
    ellipse(280 + i * 30, 240, arduino.analogRead(i) / 16, arduino.analogRead(i) / 16);
  }
}

Ho provato anche a non usare il ciclo for per iterare tutte le entrate analogiche ma solo una e con stupore ho notato che anche scrivendo "arduino.analogRead(0)" e non collegando nulla al pin analogico 0 se ce un potenziometro collegato a qualsiasi altro pin analogico ad esempio il 4 processing mi disegna comunque un cerchio che è possibile pilotare con il potenziometro.

In pratica non posso controllare singolarmente le entrate analogiche è come se il segnale venisse letto da tutte le porte analogiche insieme.

Spero di non aver fatto venire il mal di testa a qualcuno...

E' un comportamento normale o c'è qualcosa che non va ?

le porte analogiche non collegate sono molto sensibili, tanto che se ci fai caso si accorgono quando ti avvicini col dito (campo magnetico umano)

quindi probabilmente le porte lasciate libere vanno in "risonanza" con le porte vicine, insomma l'aria fa da resistenza ma non abbastanza da permettere alle porte di assumere lo stesso valore. nulla di grave, anzi utile per riconoscere la presenza di esserei viventi :slight_smile:

lesto:
utile per riconoscere la presenza di esserei viventi :slight_smile:

dici che è applicabile anche agli zombies?
:smiley:

Vabbe ho capito mi state prendendo per i fondelli !

no, un tizio lo usava per accorgersi se qualcuno toccava la merca da esposizione, se ti avvicinavi con la mano si accendeva una luce sotto il cartello "non toccare", facendolo risaltare

lesto:
le porte analogiche non collegate sono molto sensibili, tanto che se ci fai caso si accorgono quando ti avvicini col dito (campo magnetico umano)

Non é il campo magnetico umano ma l' effetto antenna umana catturi interferenze elettromagnetiche e cosí disturbi le entrate.

Per l' effetto letture fantasma su entrate vuote:

Il ATmega ha un solo convertitore ADC e un multiplexer a 8 (10) entrate tra il multiplexer e il convertitore c'é un circuito sample and hold ( un condensatore che viene caricato con la tensione dell'entrata analogica e poi prima del inizio della lettura staccata da essa). Cosí si evita che cambiamenti sulla tensione di entrata falsificano la lettura. Una volta caricato il condensatore, nella lettura di una entrata non usata non c'é tensione che potrebbe caricare o scaricare il condensatore percui resta ca sul valore della lettura precedente e il ADC da quasi lo stesso valore.

Ciao Uwe

Scusa ma se sto monitorando con la console il pin analog input A0 dove non ho collegato nulla e poi collego un potenziometro al pin analog A4, che non è in uso nello sketch, variando la resistenza sul potenziometro leggo sulla console i valori che vanno da 0 a 1023, capisco che ci siano delle "interferenze" ma un comportamento del genere mi sembra moooolto strano...

Hai mai provato ad usare processing con arduino ?

cerco di spiegarmi meglio, magari non mi sono espresso bene e avete frainteso:

  • su arduino c'è lo sketch standard firmata
  • il codice processing è il seguente:
import processing.serial.*;

import cc.arduino.*;

Arduino arduino;

void setup() {
  size(470, 280);
  arduino = new Arduino(this, Arduino.list()[1]);
  }

void draw() {
    
   println(arduino.analogRead(0));
  
}

Come potete vedere il codice è molto semplice non fa nient'altro che leggere in loop il valore analogico sul pin A0 e stamparlo a video, ora se collego un potenziometro sul pin A0 e vado a giocare con la manopola variando la resistenza, sulla console leggo i valori che vanno da 0 a 1023, e fin qui ci siamo.
Ora se stacco il potenziometro dal pin A0 e lo collego al pin A4 teoricamente non dovrei leggere nulla sulla console, anzi dovrei leggere sempre il valore 0 perchè sul pin A0 non c'è collegato più niente, invece accade che sulla console leggo comunque i valori del potenziometro lo stesso accade se colleglo quest'ultimo agli altri pin analog input.

Prova a dichiarare nel codice processing anche tutti gli altri pin e assegnali zero...
probabilmente legge tutte le porte per un qualche errore o di standard firmata o nella libreria arduino.cc

ulver85:
Scusa ma se sto monitorando con la console il pin analog input A0 dove non ho collegato nulla e poi collego un potenziometro al pin analog A4, che non è in uso nello sketch, variando la resistenza sul potenziometro leggo sulla console i valori che vanno da 0 a 1023, capisco che ci siano delle "interferenze" ma un comportamento del genere mi sembra moooolto strano...

Hai mai provato ad usare processing con arduino ?

Il ATmega é programmato a fare la conversioni in automatico senza dover far partire la conversione percui il multiplexer e il SDC funzionano di continuo e hai questo efetto di misure fantasma sempre.

Puoi eliminarle mettendo le entrate non usate a massa.
Ciao Uwe

Credo sia normale, come per l'ADC anche di circuito di Sample & Hold ce n'è uno solo, se ti metti a leggere un ingresso analogico a cui non c'è collegato niente, questo risente delle letture degli ingressi dove invece c'è collegato qualcosa di idoneo, non essendoci collegato niente, la capacità che c'è nel S&H non può nè caricarsi nè scaricarsi.

Ok, grazie a tutti, ho risolto con il consiglio di uwefed, ho collegato a massa uno dei pin non utilizzati e funziona.

Mi chiedevo se vale anche per i pin digitali visto che se ci passo un dito su anche loro cominciano a dare false letture, sempre nello sketch esempio analog_input si vedono i quadrati associati alle entrate digitali accendersi...

se ti piace, cerca anche sui post di gbm (o gdm, non ricordo) o sul suo sito 'gioblu', ha fatto un monitor grafico degli ingressi di arduino con processing, lo trovo molto utile.

Si ho visto il monitor grafico fatto con processing, appena ho tempo lo provo.
grazie

ulver85:
Ok, grazie a tutti, ho risolto con il consiglio di uwefed, ho collegato a massa uno dei pin non utilizzati e funziona.

Mi chiedevo se vale anche per i pin digitali visto che se ci passo un dito su anche loro cominciano a dare false letture, sempre nello sketch esempio analog_input si vedono i quadrati associati alle entrate digitali accendersi...

Per tutte le entrate non utilizzate é buona norma non laschairle aperte senza collegare niente.
La cosa piú semplice é dichiararli uscite oppure entrate e attivare la resistenza pullup.
Non so come vengono settate in automatico. penso come entrate senza pullup.
Ciao Uwe