Analog data logger... non funziona?!?

Ho trovato nonmiricordodove un sorgente per memorizzare dati sulla SD card, che contiene questo codice:

  for (uint8_t ia = 0; ia < SENSOR_COUNT; ia++) {
    uint16_t data = analogRead(ia);
    file.print(';');    
    file.print(data);
#if ECHO_TO_SERIAL
    Serial.print(';');   
    Serial.print(data);
    Serial.print(";");
#endif //ECHO_TO_SERIAL
  }

Le costanti A0…A5 che valori hanno? Da 0 a 5? Questo sorgente mi dà risultati bislacchi, mettendo un segnale nel pin A0 leggo “roba” anche su A1 e A2… come mai? Come devo inizializzare i pin analogici per leggere correttamente una tensione inferiore a 5V?

jumpjack: Le costanti A0..A5 che valori hanno? Da 0 a 5?

no, sono 14, 15, 16 etc..

jumpjack: Questo sorgente mi dà risultati bislacchi, mettendo un segnale nel pin A0 leggo "roba" anche su A1 e A2... come mai?

i pin non collegati fanno da antenna verso le correnti esterne. se metti un sensore sul pin A0, esso influenzerà anche gli altri pin, anche per un motivo di come lavora l'ADC. Non è un problema, se vuoi leggere 0 quando non c'è nulla collegato, devi mettere delle resistenze di pull-down, ad esempio 10k tra il pin e GND.

jumpjack: Come devo inizializzare i pin analogici per leggere correttamente una tensione inferiore a 5V?

se sai che la tensione non supera un certo valore, per esempio 3.3V, allora colleghi il pin 3.3V a "AREF", e poi nel setup del codice metti analogReference(EXTERNAL); in pratica l'ADC confronterà la tensione in ingresso con la tensione su AREF, permettendoti di sfruttare tutti e 10 i bit di precisione. Però se tenti di leggere una tensione superiore a quella di AREF, rischi di bruciare il micro. Di default viene usate la tensione di 5V, ma puoi settare anche una tesnione generata internamente di 1,5V se non erro, oppure una a tuo piacere MINORE o uguale a 5V sul pin AREF

lesto:

jumpjack: Le costanti A0..A5 che valori hanno? Da 0 a 5?

no, sono 14, 15, 16 etc..

Dove vengono dichiarati? E quindi il mio sorgente... cosa diavolo legge?!?

nella libreria wprogram.pde, è una libreria di sistema dell'arduino che viene linkata di nascosto :)

il tuo programma legge il sensore, se non collegato l'inquinamento elettrostatico circostante. per esempio, se fai la lettura di un pin analogico e avvicini la mano, verrai rilevato!

@lesto: il riferimento interno è 1,1V.

@jumpjack: sono costanti dichiarate in uno dei file del core di Arduino. nel file WProgram.h (non .pde ;) )

lesto: il tuo programma legge il sensore,

no, legge "qualcos'altro", visto che legge il pin 0 invece del 14. Immagino sia il pin digitale 0... che letto in ananlogico non so proprio cosa possa dare, visto che comunque non mi dà un valore 0 o 1023 ma valori vari... Boh?

sono costanti dichiarate in uno dei file del core di Arduino. nel file WProgram.h (non .pde smiley-wink )

Giusto, grazie.

lesto:

jumpjack: Le costanti A0..A5 che valori hanno? Da 0 a 5?

no, sono 14, 15, 16 etc..

Tecnicamente se lo vuoi usare come I/O digitale è indifferente scrivere A0 o 14.

In "pins_arduino.h" è definito come:

const static uint8_t A0 = 14;

[quote author=Federico Vanzati link=topic=76596.msg581034#msg581034 date=1319703842]

lesto:

jumpjack: Le costanti A0..A5 che valori hanno? Da 0 a 5?

no, sono 14, 15, 16 etc..

Tecnicamente se lo vuoi usare come I/O digitale è indifferente scrivere A0 o 14.

In "pins_arduino.h" è definito come:

const static uint8_t A0 = 14;

[/quote] Sì, ma il sorgente del cavolo che ho trovato io faceva un ciclo di analogRead(indice) con "indice" da 0 a TOT! Quindi non leggeva gli analogici, forse leggeva i digitali.

esattto, leggeva i digitali... non chiedermi cosa potesse succedere internamente

State facendo casino, però. Avevate quasi confuso anche me. XD

Quando si fa una analogRead il pin viene sempre inteso essere ANALOGICO. Quindi analogRead(0) non legge sul pin digitale 0 bensì sul pin analogico 0. Da qui

Parameters pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

quindi se faccio analogRead(A0) che succede? uff che casino :astonished:

lesto: quindi se faccio analogRead(A0) che succede? uff che casino :astonished:

Ho dovuto aprire il file wiring_analog.c per trovare la risposta: :D

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#else
    if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

Quindi se si chiama con un valore superiore a 13, semplicemente sottrae 14. Così A0 che equivale a 14 dà come pin per la lettura l'analogico 0. E tutto torna.

immagino che la stessa cosa succeda col mega. a posto :)

Certo:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

questi sono i 2 chip delle Mega :D