Arduino の種類と性能

通常の Arduino 入門書などでは、Arduino UNO を買ってきて LED を点滅させるところから始めますが、その前に気になるところを抑えておきます。
今回は、Arduino の歴史、種類、ブートローダと設定用ビットの解説です。

Arduino とは

Arduino(アルドゥイーノ)は、開発ソフトの「Arduino IDE」と、ハードとしての「Arduino」を合わせたオープンソースのセットです。

Arduino は、2005 年に北イタリアで、たった5人のグループから誕生しました。
当時、簡易な制御系を作成するための開発環境は大変高価だったため、安価に使用できるものを目指してオープンソースとして開発されました。

元々が制御用として作られたので、「Raspberry Pi」などと異なり OS 上でソフトが動くのではなく、単体で動作します。
ソフトウエアは、C++ を簡易化した独自の言語(Arduino では「スケッチ」と呼びます。)で動作します。
また、部品の製造会社や有志が、各種部品用の Arduino 用ライブラリや動作見本のスケッチを公開しているので、世に出回っているほとんどの部品を簡単につないで利用することが出来ます。

「Arduino」の名前は、開発者が利用していたバーの名前に由来するそうですが(西暦 1000 年頃の王様の名前だそうです。)、地名としても残っています。日本で言ったら「居酒屋 将門」みたいな感じかな?
気になる方はグーグル・マップで検索してみましょう。

Google Mapより

Arduinoの 種類

Arduino は、色々な種類のものが販売されています。
主要なものとしては、チップに「MICROCHIP」社のATmega328、ATmega2560、ATmega32U4、ATmega168 などを使用したものがあります。

Arduino cc の HP では、「Arduino Hardware」のページで、
・Nano Family
・MKR Family
・Classic Family
・Mega Family
の4種類に分類しています。(販売形態で分けていると思われる「Kits」を除く。)

Nano Family

「Nano Family」には、MCU に ATmega328 を使用した通常の「Arduino Nano」の他に、

名前MCU特徴
EveryATMega4809 Nano の後継機
33 IoTSAMD21u-blox NINA-W102 で Wi-Fi/Bluetooth が使用可能
RP2040 ConnecRP2040同じ
ESP32ESP32-S3u-blox NORA-W106 で Wi-Fi/Bluetooth が使用可能
33 BLE SensenRF528409軸センサ(IMU)、温湿度センサ、気圧センサ、マイク、ジェスチャー、色センサが搭載
33 BLEnRF528409軸センサ(IMU)搭載
Motor CarrierATSAMD11MP6522 モータドライバ搭載

があります。
(通常の Nano 以外は見たことがありません。)

MKR Family

「MKR Family」は、WiFi 機能搭載で IoT 用に作られた Arduino のシリーズです。
MCU には SAMD21 を、WiFi 用に u-blox NINA-W102 を搭載する他、リチウムイオン電池の充電回路を持っているので、充電池を直接基板に接続して利用できます。
(実物は見たことがありません。)

Classic Family

「Classic Family」には、有名な Ardino UNO シリーズが入っています。

名前MCU特徴
UNO R4 MinimaRA4M1UNO R3 の後継機
UNO R4 WiFiRA4M1Minima のWiFi機能付き
Uno Rev3ATmega328Pど定番の Arduino
LeonardoATmega32U4MCU に USB を内蔵
UNO Mini Limited EditionATmega328PUNO 販売16周年記念版で小型化
MicroATmega32U4Leonardo の小型版
ZeroSAMD21Atmel社と共同開発
UNO WiFi REV2ATmega4809UNO R3 に Wi-Fi と Bluetooth を追加

(UNO R3 と R4 以外は見たことがありません。)

手元にある Arduino の詳細

上では、色々な種類を紹介しましたが、実際に持っているのは「Arduino UNO R3」、「Arduino Nano」、「Arduino Mega2560」です。
(ATmega328P は ATmega328 の省エネタイプ)

NameArduino UNOArduino NanoMega 2560
MCUATmega328P
(28 pin DIP)
ATmega328P
(32 pin TQFP)
ATmega2560
USBUSB-BMini-B USBUSB-B
LEDピン131313
Digital I/O数141454
Analog入力数6816
PWMピン数6615
UART
I2C
SPI
I/O電圧5 V5 V5 V
入力電圧7-12 V7-12 V7-12 V
各I/OピンのDC電流20 mA20 mA20 mA
クロック16 MHz16 MHz16 MHz
USB CPUATmega16U2 16 MHzATmega16U2 16 MHz
SRAM2 kB2 kB8 kB
Flash32 kB32 kB256 kB
EEPROM1 kB1 kB4 kB
53.4 mm18 mm53.3 mm
長さ68.6 mm45 mm101.5 mm
重量25 g5 g37 g

Arduino UNO

(各図は Arduino cc の HP より)
Arduino UNO(「UNO」はイタリア語で1)は、Arduino ファミリの中でも一番良く見るタイプです。

Arduino cc の HP には、
「電子工作やプログラミングを始めるのに最適なボードです。最も堅牢なボードです。 UNO は、Arduino ファミリ全体で最も使用されているボードです。」
と書かれているので、最初に使用するには最適なハードだといえます。
開発も適宜行われているので、ブートローダも最新のものです。(他は少し旧型で2 kB程ですがUNOは最新で0.5 kB程度です。)

Arduino UNO R 4が販売されたので、UNO の歴史をまとめました。
Arduino UNO ボードの R1 から R4 までの変更の詳細については、以下をクリック。

Arduino Nano

Arduino Nano は、小型軽量で組み込みやブレッドボードで実験をするのに適した設計の小型のボードです。
開発時期の関係で、インターフェースが Mini-B USB コネクタなので、ケーブルの準備が面倒です。(互換機には USB Type-C 端子の Nano もあります。)

Arduino UNO は、MCU にDIP30 ピンの ATmega328P を使用していますが、Nano は見てのとおり表面実装の MCU が実装されています。この MCU は、32 ピンの TQFP タイプなので UNO よりピン数が 4 本多いです。
そこで、Nano はアナログ入力専用の A6 と A7 が追加されました。

Nano はブートローダが UNO より古いタイプなので、2 kB 程とサイズが大きいです。(その分ユーザ領域が少なくなります。)

Arduino Mega 2560

Arduino Mega 2560 は、チップに ATmega 2560 を用いており、54 個のデジタル入力/出力ピン (うち 15 個は PWM 出力として使用可能)、16 個のアナログ入力、4 個の UART (ハードウェア シリアル ポート)があります。その分、ボードが大きくなっています。

沢山の入出力ピンを使って、メカの制御に使おうと思って購入した Mega ですが、途中で UNO にボードを乗せる方向に変更したため、部品箱で長期睡眠(木星までコールドスリープ)中です。

プログラムとブートローダ

この後は、Arduino UNO に関する内容になります。

Arduino のプログラム

Arduino は、初心者でも簡単にプログラムが作れるように、開発で面倒なところを見せない作りになっています。
他のマイコンでは、外部に何か(センサなど)をつなぐ場合に、自分で部品のデータシートを入手して初期化などを行う必要があります。ところが、Arduino では部品メーカがライブラリとして準備してくれています。
ほとんどの部品は、型番で検索すればライブラリが手に入るので、スケッチ(プログラム)に組み込むだけで必要なアプリケーションがすぐに出来ます。ジグソーパズル(昔の電子ブロック)のようですね。

Arduinoのプログラム(スケッチ)の模式図

ブートローダ

コンピュータが動作するためには、ブートローダが必要です。
「Arduino UNO」として購入すれば、ATmega328P には Arduino のブートローダが書き込まれているので、特に気にしなくても大丈夫です。

自分で Arduino 互換機を作るときや、ブレッドボードで試作が終了して狭いところに組込むためにATmega328P 単体で Arduino として動作させるときにはブートローダの書き込みが必要です。

ブートローダは「C:\Users\…\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6」などの中にある「boards.txt」に細部が記載されています。

uno.name=Arduino Uno

~ 中略 ~

uno.upload.tool=avrdude
uno.upload.tool.default=avrdude
uno.upload.tool.network=arduino_ota
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048
uno.upload.speed=115200

uno.bootloader.tool=avrdude
uno.bootloader.tool.default=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0xFD
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard

boards.txt



ブートローダの実際のファイルは「C:\Users\…\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\bootloaders\optiboot」内の「optiboot_atmega328.hex」です。
このファイルを「Arduino IDE」で書き込みます。操作は「ツール」を選び「ブートローダを書き込む」を選択することで書き込みが行われます。

Arduino のブートローダは、使用可能な 32 kB のフラッシュメモリの最後尾に書き込まれます。(今まで先頭だと思っていました。)

ブートローダの模式図

Arduino UNO でアプリケーションを保存できるフラッシュ・メモリのサイズは 32 kB (32 768 バイト)です。その中で、ブートローダは 512 バイトと大変小さなものです。以前は 2 048 バイトありました(UNO 以外は現在も2 kB あるようです。)

私のような初心者が作成するスケッチは 32 kB の一部しか使用しませんが、参考にさせて頂く高度なスケッチの一部には Arduino UNO のフラッシュ・メモリをギリギリまで使用しているものがあり、Arduino Nano では動かない場合があります。

チップサイズは違いますが、Arduino Nano も UNO も同じタイプの MCU を使っているので、Nano に UNO のブートローダを書き込めばユーザーエリアの最大まで使うことが出来ます。
その手順は別記事に書いているので、以下をクリック

フューズバイト(Fuse bytes)

(この項目の内容は、MICROCHIP 社の「megaAVR Data Sheet」及び「Martyn Currey」氏の「Arduino / ATmega 328P fuse settings」を参照に記載しました。)

先程の「boards.txt」には、ATmega328P の起動時に必要なフューズバイトが設定されています。(ここでは、ATmega328 のデータシート P290 の「Fuse bytes」という記載に合わせて「フューズバイト」と呼びます。)(「boards.txt」の記載)
low_fuses=0xFF
high_fuses=0xDE
extended_fuses=0xFD
unlock_bits=0x3F
lock_bits=0x0F

ローバイト(Low Byte Fuse)

「low_fuses=0xFF」部分は、クロック設定について書かれています。

BitLow Fuse Byte説明標準値
7CKDIV8Divide clock by 80 (programmed)
6CKOUTClock output1 (unprogrammed)
5SUT1 5Select start-up time1 (unprogrammed)
4SUT0Select start-up time0 (programmed)
3CKSEL3Select Clock source0 (programmed)
2CKSEL2Select Clock source0 (programmed)
1CKSEL1Select Clock source1 (programmed)
0CKSEL0Select Clock source0 (programmed)

Bit0~3の「CKSEL」は Clock Selection で、内蔵発振器、外部クリスタル・セラミック発振子または外部信号源から選択できます。通常は、外部クリスタルの 16 MHz が選ばれます。

Bit4,5「SUT」は Start Up Time で、Arduino に電源を入れてすぐに発振器が安定するまでの時間調整が必要な場合に設定します。

Bit6の「CKOUT」(Clock Out) が「1」になると、PB0 にクロック信号がルーティングされます。

Bit7の「CKDIV8」が「1」になると、内蔵されている 8 MHz 発振器を8分周して 1 MHzにします。

ハイバイト(High Byte Fuse)

「high_fuses=0xDE」部分は、ウォッチドッグ タイマー、EEPROM の保存または消去、ブート ローダーの属性設定などについて設定します。

BitHigh Fuse Byte説明標準値
7RSTDISBL外部リセット禁止1 (unprogrammed)
6DWENデバッグWIRE ON1 (unprogrammed)
5SPIENシリアル・プログラムとデータ・ダウンロードON0 (programmed, SPI
programming enabled)
4WDTONウオッチドックタイマ常にON1 (unprogrammed)
3EESAVEEEPROMの内容を保持1 (unprogrammed), EEPROM
not reserved
2BOOTSZ1ブートサイズの設定0 (programmed)
1BOOTSZ0ブートサイズの設定0 (programmed)
0BOOTRSTリセットの選択1 (unprogrammed)

拡張ビット(Extended Fuse Bit)

「extended_fuses=0xFD」部分は、電圧低下検出レベル (BOD) を設定するために使用されます。

電圧が充分でないとチップの動作が不安定になります。Atmega328/328P は、少なくとも 4 V があれば、16 MHz で動作しますが、4 V を下回ると誤動作する可能性が高くなります。
チップの最小電圧レベルを設定できます。 電圧がこのレベルを下回るとリセットします。

BitExtended Fuse Byte説明標準値
7
6
5
4
3
2BODLEVEL2電圧低下検出レベル1 (unprogrammed)
1BODLEVEL1電圧低下検出レベル1 (unprogrammed)
0BODLEVEL0電圧低下検出レベル1 (unprogrammed)

ロックビット(Lock Bit)

「unlock_bits=0x3F」と「lock_bits=0x0F」の部分は、プログラム・メモリのアクセス制限用です。書き換えるとまずいようです。そのまま使います。

コメント