ここまで、マイコンボードとして主にArduino Uno、たまにArduino Pro Miniを使った説明をしてきました。Pro Miniは物理的に小さく、特に3.3V 8MHz版は消費電力も小さいというメリットがありますが、Unoは単にソケット(ピンヘッダーがはまる部分)がついている、DC入力端子・USB端子があるなど、少し便利な部分があるだけで、プロトタイプ(試作品)をつくる目的以外に対してメリットがありません。どちらも使っているプロセッサ自体は同じで、現在のスタンダードでいえば非力な部類に入るので、プロジェクトによっては限界があります。そこで、今回はいくつかの異なるタイプのArduinoと、互換性のあるマイコンボードを紹介します。詳細については検索すればいくらでも情報が手に入るので、あくまで地盤工学の目的(室内試験・原位置観測) の視点から紹介します。

 

① Arduino Uno

 Arduinoは皆これから始める、というベーシックな製品です。簡単なプロジェクトなら、プロトタイプのみならず、これで実用に供するものもつくれます。少しだけ便利(USBケーブルでPCにすぐつなげられる)で使いやすいという以上のメリットは特にありません。

 

マイコン:ATmega328P

電圧系:5V

フラッシュメモリ:32kB(うち0.5kBはブートローダ*)

SRAM:2kB

EEPROM:1kB

クロック:16 MHz

 

*ブートローダとは、スケッチをメモリに読み込むためのプログラムで、Arduinoのマイコンのメモリ中にあらかじめ書き込まれているものです。昔の電子工作は、PICなどのマイコンにスケッチを書き込むハードルが高かったのですが、Arduinoはメモリ内にブートローダを入れた状態で販売するため、USBでPCとつなぐだけでプログラミングが可能となったことで、素人でも扱えるようになった点が画期的、とのことです。

 

② Arduino Pro Mini

 第12回で紹介済み。3.3V 8MHz版と5V 16MHz版があります。シリアル-USB変換チップが載っていないので、PCとの接続のたびに変換モジュールを間にかませてやらないといけないものの、その分、単独使用時の消費電力が小さいという大きなメリットがあります。また、サイズも小さいため、フィールドへの実装に向いています。マイコンの性能は基本的にUnoと同じです。

 

マイコン:ATmega328P

電圧系:3.3V/5V

フラッシュメモリ:32kB(うち0.5kBはブートローダ)

SRAM:2kB

EEPROM:1kB

クロック:8/16 MHz

 

③ Arduino Mega

 Unoの拡張版的な立ち位置のボードで、Unoより少し物理的に長くなっています。メモリが大きく(Unoの8倍)、ピンの数(Unoがアナログ6、デジタル14に対してMegaアナログ16、デジタル54)も各段に多いのが特徴で、Unoよりも大きなプロジェクトをサポートできます。原位置観測用ロガーとして、様々なデジタルセンサーを接続する際に、多くのライブラリをインポートする必要があります。そうすると、Unoではフラッシュメモリの容量が厳しくなり、正常に動作しないことがあります。そういった際に、Megaを使えば互換性をほぼ保ったまま拡張することができます。また、アナログピンが多いので、外付けのアナログ-デジタル変換器(ADC:第8回参照)に加えて、16ch分のアナログセンサーの読みを10bit分解能とはいえ、(配線を分岐して)バックアップとしてこちらでも計測・記録しておくことができます。スケッチはほぼそのまま使えるのですが、例えばI2C(SDA・SCL)・SPI(CS、MOSI、MISO、CLK)のピンアサインはUnoとは異なるので、接続に注意が必要です。

 

マイコン:ATmega2560

電圧系:5V

フラッシュメモリ:256kB(うち8kBはブートローダ)

SRAM:8kB

EEPROM:4kB

クロック:16 MHz

 

④ Arduino Due

 Megaよりもさらに強力なボードで、Arduinoシリーズの中では珍しく、AVRではなくARMのマイコンを搭載しています。アナログピン12、デジタルピン54に加え、アナログ出力(DAC)ピンが2本あるのが特徴です(このブログではパルス幅変調:PWMについて説明していませんが、この2本はPWMではなく真のDACです)。また、他のほとんどのArduinoのアナログ入力は10bitですが、このモデルのみ12bitです。この分解能にひかれて、最初はデータロガーとしての使用を検討しましたが、マイコンのアーキテクチャが他のArduinoと異なることもあり、例えばenergy.hなどの一部のライブラリに互換性がなかったりするうえに、第8回で紹介した通り、外付けのADCモジュールを取り付ければアナログ分解能は解決する問題なので、結局のところ、このボードにそれほど大きなメリットを見出しませんでした。また、消費電力が格段に大きいです。一般に、あまり広く使われているという印象を持ちません(Arduino IDE 1.8.13をダウンロードしたら、もはやDueはデフォルトではボードマネージャにインストールされていませんでした)。

 

マイコン:AT91SAM3X8E

電圧系:3.3V

フラッシュメモリ:512kB

SRAM:96kB

クロック:84 MHz

 

⑤ Arduino Nano

 UNOとPro Miniの中間のような製品です。Pro Miniに近い大きさでコンパクトですが、シリアル-USB変換チップが載っていて、USBケーブルだけで接続できます。厳密にいうとUNOのコンパクト版ではなく、より古いArduino Duemilanoveという製品のコンパクト版のようですが、使った感じは、ほぼUNOが小さくなったものと思ってよさそうです。

 

マイコン:ATmega328P

電圧系:5V

フラッシュメモリ:32kB(うち0.5kBはブートローダ)

SRAM:2kB

EEPROM:1kB

クロック:16 MHz

 

⑥ Arduino Pro Micro

 Mini、NanoときてMicroなのでとてもまぎらわしい(しかも大きさがみな同じくらい)のですが、これはArduino Leonardoのコンパクト版です。これはATmega32u4というマイコンを使っているのが特徴で、シリアル-USB変換とメインのプロセッサが一体化したものです。詳しくは以下を読んでもらうと特徴がわかります。

http://trac.switch-science.com/wiki/Guide/ArduinoLeonardo

 何ができるかというと、PCでキーボードやマウスと同じようなHID(Human Interface Device)として認識させることができるので、このArduino Pro Microに入れたプログラムに基づいて、例えばWindows PC上でクリックや文字タイプを実行させることができます(例えば、10秒ごとに「R」キーを打つというプログラムを書いたPro MicroをPCに接続すると、PC上でアクティベートされているウィンドウに10秒ごとにRの文字が現れます)など。最初は、だから何、と思っていましたが、よく考えれば究極の自動化が可能で、既成のPCソフトウェアに対して、このArduino Pro Microにマウスの操作をさせて自動で使うなどできるようになります。これを用いたトリックを後の回で紹介したいと思います。その他の性能はUnoとほぼ同等です。

 

マイコン:ATmega32u4

電圧系:5V

フラッシュメモリ:32kB(うち4kBはブートローダ)

SRAM:2.5kB

EEPROM:1kB

クロック:16 MHz

 

⑦ ESP32

 ここ数年、Arduinoと並んで主流となりつつあるマイコン(ボード)です。中国のEspressif社が開発したもので、マイコン自体は700円くらい(ボード実装版は1000円強くらい)で購入できる安価なものですが、非常に多機能で、なんといってもWiFi・Bluetooth通信機能を内蔵しており、IoTデバイスの製作に適しているというのが人気の理由です。アナログ-デジタル変換(ADC)、デジタル-アナログ変換(DAC)、省電力機能なども充実しています。Arduinoとの互換性も高く、Arduino IDEにアドインするだけでそのままプログラミングできます。これを使った例も紹介していきます。実装ボードにはいくつかありますが、NodeMCU-32SとESP32-DevKitCの二種類(二規格)が主流になっています。この違いについては以下のサイトがわかりやすく説明しています:

https://qiita.com/usashirou/items/eb3f5a83dfc82c0ae17a

上記のサイトはブレッドボードで使いやすいボード幅ということでNodeMCU-32Sを推していますが、私の個人的な使用感では、DevKitCのほうが素直に感じました(Arduinoに近い感覚で使えました)。DevKitCと書いておらず、Dev Moduleなどと書いてある製品もありますが、基本的には同じものだと思います。基板上面のピン横にシルク(ピン番号やGNDなどの機能の記載)があるものがDevKitC系のことが多いようです。

 

マイコン:Xtensaデュアルコア32ビットLX6マイクロプロセッサ(ただし、シングルコア版のESP32Sあり)

メモリー:520KiB SRAM

電圧系:3.3V

クロック:160または240 MHz

 

⑧ Seeeduino Xiao

 最近初めて使ってみて、お気に入りのボードの一つです。Xiaoというのは中国語の「小」で、SeeeduinoというArduino UNOに似た互換ボードのコンパクト版です。ARM Cortex M0+を使ったもので、ピンの数は最小限しかないのですが、そこそこの能力があり、省電力モードでは消費電力は1.5mA程度と非常に小さくなります。何よりとても小さくシンプルで、かつ約600円程度と安いので、使い回しがききそうな製品です。USB端子がC-Typeなのが特徴的です。Arduino IDEのボードマネジャーからアドインを追加することでArduino IDEにてプログラム可能です。

 

マイコン:Arm Cortex-M0+ 32ビット

フラッシュメモリ:256 KB

電圧系:3.3V

SRAM:32 KB

クロック:48 MHz

 

⑨ Teensy 4.0

 マイコン界最速ともいわれ、AMR Cortex M7を使用しており、600MHz以上の圧倒的な高速クロック(クロックは自動的に変動するらしいです。オーバークロックも可能とのこと)を誇ります。マイコン界のイングヴェイ=マルムスティーンといえます。Arduino IDEの比較的新しいバージョン(1.8.11以降)であればアドインを使用してプログラムできます。まだほとんど使ったことがないので、使用感については何も書けませんが、高速な処理が必要な場合の切り札になるかもしれません。他のサイトではDigitalWrite(電圧出力)を高速で繰り返した例がありましたが、MHzオーダーの周波数までならファンクションジェネレータとしても使えるかもしれません。

 

マイコン:ARM Cortex-M7

フラッシュメモリ:2048K

電圧系:3.3V

RAM:1024 K

クロック:~600 MHz(変動)

 

消費電流

 上記は各種サイトから情報をまとめただけ(それに私見を加えた)なのですが、屋外での使用、あるいは屋内でもバッテリーによる駆動を考えた際、(消費)電流が気にかかります。そこで、それぞれのボードの電流をマルチメータ―での計測してみました。入力電圧は電圧レギュレータで落とされるので、ここで消費される電力もありますし、周波数変動型の場合はマイコンに処理させるプログラムに依存する部分もあるので、ここに記す値はおよそのものと思って下さい。また、同じ名前でも、メーカーの実装に依存する部分もあると思います(2種類のUnoの電流が異なることを第12回で示しました)。表中の「アイドリング時」とはdelay()を実行しているとき、(ディープ)スリープ時とは、選択できるスリープモードの中で最も深いものを選んだときです。

 

ボード

アイドリング時 (mA)

(ディープ)スリープ時 (mA)

Arduino Uno (AtMega16u2)

Arduino Uno (CH340)

48

63

33

48

Arduino Mega

54

10

Arduino Due

115

-*

Arduino Nano

24

5

Arduino Pro Mini 3.3V 8MHz

Arduino Pro Mini 5V 16MHz

5

16

1.5

3

Arduino Pro Micro

42

10

ESP32 (‘Dev Module’)

50

11

Seeeduino Xiao

14

1.5

Teensy 4.0

71

-*

*スリープは可能ですが、まだやり方を十分に理解していないので載せていません

 

 上の表は、5.0Vのバッテリーを使って計測したものです。5.0V系のボードにはVcc – GND間に直接、3.3V系のボードにはボード上のレギュレータを介して(Vin端子を通して)印加しています。参考までに、上記を計測するためのスケッチを示します。10秒間アイドリングした後、スリープモードに入ります(ESP32のみ、10秒たつとまたアイドリングに戻ります)。

 

AVR系ボード(Dueを除くArduino)

 

#include <Enerlib.h>

#include <avr/sleep.h>

#include <avr/power.h>

Energy energy;

 

void setup() {}

 

void loop()

{

  delay(10000);

  energy.PowerDown();

}

 

 

ESP32 Dev module

 

void setup() {}

 

void loop()

{

  delay(10000);

  esp_sleep_enable_timer_wakeup(10 * 1000 * 1000);  // wakeup every 10secs

  esp_deep_sleep_start();

}

 

 

Seeeduino Xiao

 

#include <EnergySaving.h>

EnergySaving nrgSave;

 

void setup()

{

  nrgSave.begin(WAKE_EXT_INTERRUPT, 8, dummy);  //standby setup for external interrupts

}

 

void loop()

{

  delay(10000);

  nrgSave.standby();  //now mcu goes in standby mode

}

 

void dummy(void)  //interrupt routine (isn't necessary to execute any tasks in this routine

{

}