Pin analogici come digitali

Salve. Ho necessità di usare A0-A1 come pin digitali per un encoder.
Se non sbaglio la denominazione dei pin dovrebbe essere 54 e 55.
E’ giusta la dichiarazione:

int encoder0PinA =54;
int encoder0PinB =55;

oppure è errata?

Grazie anticipate

Se non ci dici su che board è difficile risponderti ...

Per [u]Arduno UNO[/u] i pin sono :

#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)
#define PIN_A4   (18)
#define PIN_A5   (19)
#define PIN_A6   (20)
#define PIN_A7   (21)

static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;

... quindi ... non so dove hai preso i tuoi valori, ma per Arduino UNO sono errati.

Guglielmo

Chiamali semplicemente A0 e A1, almeno sei sicuro di non sbagliare ;).

Se invece ti riferisci ad [u]Arduino MEGA[/u], allora:

#define PIN_A0   (54)
#define PIN_A1   (55)
#define PIN_A2   (56)
#define PIN_A3   (57)
#define PIN_A4   (58)
#define PIN_A5   (59)
#define PIN_A6   (60)
#define PIN_A7   (61)
#define PIN_A8   (62)
#define PIN_A9   (63)
#define PIN_A10  (64)
#define PIN_A11  (65)
#define PIN_A12  (66)
#define PIN_A13  (67)
#define PIN_A14  (68)
#define PIN_A15  (69)

static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;
static const uint8_t A8 = PIN_A8;
static const uint8_t A9 = PIN_A9;
static const uint8_t A10 = PIN_A10;
static const uint8_t A11 = PIN_A11;
static const uint8_t A12 = PIN_A12;
static const uint8_t A13 = PIN_A13;
static const uint8_t A14 = PIN_A14;
static const uint8_t A15 = PIN_A15;

e quindi ... SI, su Arduino MEGA, A0 equivale a 54 e A1 a 55.

Guglielmo

Scusa...la board è Arduino DUE

Non credo che sulla DUE i pin analogici possano essere usati come digitali ... ... almeno NON stando al datasheet del SAM3X8E ARM Cortex-M3 ... se ne discuteva anche su un'altro thread.

Guarda lo schema a blocchi di pag. 6 ... i pin analogici vanno direttamente degli ADC e non come sui chip AVR su un commutatore (... che permette di usarli come I/O digitali) e su un multiplexer. Inoltre guarda la descrizione della funzionalità dei pin a pagina 9 e 12.

Guglielmo

Adesso ci guardo, ma da quando dici mi sembra che non possano essere utilizzati come digitali.
Grazie

Allora …
… preso dalla curiosità, ho tirato fuori una DUE ed ho fatto una banale prova :

void setup() {
  // put your setup code here, to run once:
  pinMode(A0, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  byte a;
  //
  a = digitalRead(A0);
  digitalWrite(13,a);
  delay(100);
}

… e, FUNZIONA :o :o :o

Ho provato anche gl altri input analogici, fino ad A11 e … funziona con tutti !

Buono a sapersi :grin:

Guglielmo

Ok, leggendo in modo più approfondito il datasheet si trovano, in effetti, le dovute informazioni ::slight_smile:

43.5.3 Analog Inputs
The analog input pins can be multiplexed with PIO lines. In this case, the assignment of the ADC input is automatically done as soon as the corresponding channel is enabled by writing the register ADC_CHER. By default, after reset, the PIO line is configured as input with its pull-up enabled and the ADC input is connected to the GND.

Cosa che è mostrata nella figura 43-1:

ScreenSnapz001.jpg

Quindi, SI, i pin analogici di Arduino DUE possono essere usati come pin digitali ;D

Guglielmo

Nel datasheet è anche presente un’altra utile tabella che mappa i pin analogici con il nome dei PORT di I/O …

Tabella 43-3 :
ScreenSnapz002.jpg
Guglielmo

Io stavo cercando di dirimere la questione guardando i sorgenti del core, ed effettivamente lì non c'è niente che impedisca di usare un pin analogico come digitale. Anzi, nella digitalWrite() c'è un check esplicito per vedere se il pin è in "modo analogico", nel qual caso viene effettuata una pinMode (x, INPUT). Comunque un test pratico toglie davvero ogni dubbio!

La tabella che hai linkato è poco utile, perché non si sa quale pin dell'ADC è effettivamente collegato a quale pin di Arduino. Trovo più utile quella reperibile nel codice qui: https://github.com/arduino/Arduino/blob/master/hardware/arduino/sam/variants/arduino_due_x/variant.cpp.

Comunque ribadisco che io chiamo i pin banalmente A0, A1, ecc. anche quando li uso come digitali, funzionano lo stesso. Del resto sulla scheda c'è scritto quello, ed è più immediato capire a quale pin fisico ci si riferisce, altirmenti bisogna mettersi a contare. Il fatto che si chiamino anche 54, 55, ecc. secondo me dovrebbe rimanere nascosto nel core.

SukkoPera:
La tabella che hai linkato è poco utile, perché non si sa quale pin dell’ADC è effettivamente collegato a quale pin di Arduino.

La tabella 43-3 è utile a chi … programma sul serio :smiling_imp: :smiley: :smiling_imp: :smiley: :smiling_imp:

Per tutti gli altri c’è … il .pdf allegato :grin: :grin: :grin:

Guglielmo

ArduinoDue.pdf (570 KB)

Ecco, quello è ottimo! :)

Stò rientrando in casa in questo momento e....non potevo sperare di più. Siete formidabili!!

Grazie a tutti