スポンサーリンク

Arduino Nano Every のADC入力を増やす

Arduino Nano の後継として Arduino Nano Every が発表されてからもう2年くらいですね。
MCUが ATMega328P から ATMega4809 に変わり、安くなって性能も上がっているのですが、それほど使われてないですかね? レジスタ直叩きとかし始めると 328P との互換性が無いのがネックかも知れません。
でも ATMega4809 だから出来る事もあります。

と言う事で、ADC入力ピンを増やす例です。

注 : ATMega4809 ではなくピン数の少ない ATMega4808 を搭載した Arduino Nano Every の廉価版互換機も存在するようです。この手法は ATMega4809 でしか使用できません。

Arduino Nano では A0~A7 の 8本のピンをADC入力として使えますが、ATMega4809 では本来 16 本のピンを ADC 入力として使う事ができます。ただしその内の 1 本はピンとして引き出されていませんので、トータル 15 本のピンをA0~A14として使う事が可能です。

なお、A9 (D13) ピンは Arduino 内部で LED に繋がっているのでちゃんとは使えないかも知れません。

ソースは下の通り。A8~A14 に対して pinMode を入力にして、analogRead4809() を呼べば A0~A7 に対する analogRead() と同様にアナログ値を読む事ができます。括弧内の (AIN7) 等は 4809 のピン機能の名前です。

Arduino Nano ベースで作っていて ADC 入力の本数が足りない、と言う場合には便利かも知れないのでメモ。


/*    ARDUINO-NANO-EVERY ADC Pins
*
*             ___________________
* (AIN10) A9 |D13    |____|   D12| A10 (AIN9)
*            |3V3             D11| A11 (AIN8)
* (AIN7)  A8 |AREF(D39)       D10|
* (AIN3)     |A0  (D14)        D9|
* (AIN2)     |A1  (D15)        D8| A12 (AIN11)
* (AIN1)     |A2  (D16)        D7|
* (AIN0)     |A3  (D17)        D6| A13 (AIN14)
* (AIN12)    |A4  (D18)        D5|
* (AIN13)    |A5  (D19)        D4|
* (AIN4)     |A6  (D20)        D3| A14 (AIN15)
* (AIN5)     |A7  (D21)        D2|
*            |5V              GND|
*            |RES             RES|
*            |GND              RX|
*            |VIN              TX|
*             ~~~~~~~~~~~~~~~~~~~
*/

#define A8  (39)
#define A9  (13)
#define A10 (12)
#define A11 (11)
#define A12 (8)
#define A13 (6)
#define A14 (3)

int analogRead4809(int pin){
static uint8_t aintab[] = {15,0,0,14,0,11,0,0,8,9,10,3,2,1,0,12,13,4,5};
int ain = 0;
if(pin==39) ain = 7;
else if(pin>=3 && pin<22)
ain = aintab[pin-3];
if(ain==0)
return 0;
ADC0.MUXPOS = ain;
ADC0.COMMAND = 1;
while(!(ADC0.INTFLAGS & ADC_RESRDY_bm))
;
return ADC0.RES;
}

void setup() {
Serial.begin(9600);
pinMode(A8,INPUT);
pinMode(A9,INPUT);
pinMode(A10,INPUT);
}

void loop() {
int a8val = analogRead4809(A8);
Serial.print("A8 :");
Serial.println(a8val, DEC);

int a9val = analogRead4809(A9);
Serial.print("A9 :");
Serial.println(a9val, DEC);

int a10val = analogRead4809(A10);
Serial.print("A10 :");
Serial.println(a10val, DEC);

delay(1000);
}

未分類
スポンサーリンク