RSS Twitter Facebook

2021/04/21 (2021年04月 のアーカイブ)

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);
}

Posted by g200kg : 2021/04/21 08:29:37