通常の Arduino 入門書などでは、Arduino UNO を買ってきて LED を点滅させるところから始めますが、その前に気になるところを抑えておきます。
今回は、Arduino の歴史、種類、ブートローダと設定用ビットの解説です。
Arduino とは
Arduino(アルドゥイーノ)は、開発ソフトの「Arduino IDE」と、ハードとしての「Arduino」を合わせたオープンソースのセットです。
Arduino は、2005 年に北イタリアで、たった5人のグループから誕生しました。
当時、簡易な制御系を作成するための開発環境は大変高価だったため、安価に使用できるものを目指してオープンソースとして開発されました。
元々が制御用として作られたので、「Raspberry Pi」などと異なり OS 上でソフトが動くのではなく、単体で動作します。
ソフトウエアは、C++ を簡易化した独自の言語(Arduino では「スケッチ」と呼びます。)で動作します。
また、部品の製造会社や有志が、各種部品用の Arduino 用ライブラリや動作見本のスケッチを公開しているので、世に出回っているほとんどの部品を簡単につないで利用することが出来ます。
「Arduino」の名前は、開発者が利用していたバーの名前に由来するそうですが(西暦 1000 年頃の王様の名前だそうです。)、地名としても残っています。日本で言ったら「居酒屋 将門」みたいな感じかな?
気になる方はグーグル・マップで検索してみましょう。
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 | 特徴 |
Every | ATMega4809 | Nano の後継機 |
33 IoT | SAMD21 | u-blox NINA-W102 で Wi-Fi/Bluetooth が使用可能 |
RP2040 Connec | RP2040 | 同じ |
ESP32 | ESP32-S3 | u-blox NORA-W106 で Wi-Fi/Bluetooth が使用可能 |
33 BLE Sense | nRF52840 | 9軸センサ(IMU)、温湿度センサ、気圧センサ、マイク、ジェスチャー、色センサが搭載 |
33 BLE | nRF52840 | 9軸センサ(IMU)搭載 |
Motor Carrier | ATSAMD11 | MP6522 モータドライバ搭載 |
があります。
(通常の Nano 以外は見たことがありません。)
MKR Family
「MKR Family」は、WiFi 機能搭載で IoT 用に作られた Arduino のシリーズです。
MCU には SAMD21 を、WiFi 用に u-blox NINA-W102 を搭載する他、リチウムイオン電池の充電回路を持っているので、充電池を直接基板に接続して利用できます。
(実物は見たことがありません。)
Classic Family
「Classic Family」には、有名な Ardino UNO シリーズが入っています。
名前 | MCU | 特徴 |
UNO R4 Minima | RA4M1 | UNO R3 の後継機 |
UNO R4 WiFi | RA4M1 | Minima のWiFi機能付き |
Uno Rev3 | ATmega328P | ど定番の Arduino |
Leonardo | ATmega32U4 | MCU に USB を内蔵 |
UNO Mini Limited Edition | ATmega328P | UNO 販売16周年記念版で小型化 |
Micro | ATmega32U4 | Leonardo の小型版 |
Zero | SAMD21 | Atmel社と共同開発 |
UNO WiFi REV2 | ATmega4809 | UNO R3 に Wi-Fi と Bluetooth を追加 |
(UNO R3 と R4 以外は見たことがありません。)
手元にある Arduino の詳細
上では、色々な種類を紹介しましたが、実際に持っているのは MCU に ATmega328P を使用した「Arduino UNO R3」、「Arduino Nano」と、ATmega2560 を使用した「Arduino Mega2560」です。
(ATmega328P は ATmega328 の省エネタイプ)
Name | Arduino UNO | Arduino Nano | Mega 2560 |
MCU | ATmega328P (28 pin DIP) | ATmega328P (32 pin TQFP) | ATmega2560 |
USB | USB-B | Mini-B USB | USB-B |
LEDピン | 13 | 13 | 13 |
Digital I/O数 | 14 | 14 | 54 |
Analog入力数 | 6 | 8 | 16 |
PWMピン数 | 6 | 6 | 15 |
UART | ○ | ○ | ○ |
I2C | ○ | ○ | ○ |
SPI | ○ | ○ | ○ |
I/O電圧 | 5 V | 5 V | 5 V |
入力電圧 | 7-12 V | 7-12 V | 7-12 V |
各I/OピンのDC電流 | 20 mA | 20 mA | 20 mA |
クロック | 16 MHz | 16 MHz | 16 MHz |
USB CPU | ATmega16U2 16 MHz | ATmega16U2 16 MHz | |
SRAM | 2 kB | 2 kB | 8 kB |
Flash | 32 kB | 32 kB | 256 kB |
EEPROM | 1 kB | 1 kB | 4 kB |
幅 | 53.4 mm | 18 mm | 53.3 mm |
長さ | 68.6 mm | 45 mm | 101.5 mm |
重量 | 25 g | 5 g | 37 g |
Arduino UNO
(各図は Arduino cc の HP より)
Arduino UNO(「UNO」はイタリア語で1)は、Arduino ファミリの中でも一番良く見るタイプです。
Arduino cc の HP には、
「電子工作やプログラミングを始めるのに最適なボードです。最も堅牢なボードです。 UNO は、Arduino ファミリ全体で最も使用されているボードです。」
と書かれているので、最初に使用するには最適なハードだといえます。
開発も適宜行われているので、ブートローダも最新のものです。(他は少し旧型で2 kB程ですがUNOは最新で0.5 kB程度です。)
追記:Arduino UNO R4 が販売されたので、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 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=115200uno.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.hexuno.build.mcu=atmega328p
boards.txt
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard
ブートローダの実際のファイルは「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」部分は、クロック設定について書かれています。
Bit | Low Fuse Byte | 説明 | 標準値 |
7 | CKDIV8 | Divide clock by 8 | 0 (programmed) |
6 | CKOUT | Clock output | 1 (unprogrammed) |
5 | SUT1 5 | Select start-up time | 1 (unprogrammed) |
4 | SUT0 | Select start-up time | 0 (programmed) |
3 | CKSEL3 | Select Clock source | 0 (programmed) |
2 | CKSEL2 | Select Clock source | 0 (programmed) |
1 | CKSEL1 | Select Clock source | 1 (programmed) |
0 | CKSEL0 | Select Clock source | 0 (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 の保存または消去、ブート ローダーの属性設定などについて設定します。
Bit | High Fuse Byte | 説明 | 標準値 |
7 | RSTDISBL | 外部リセット禁止 | 1 (unprogrammed) |
6 | DWEN | デバッグWIRE ON | 1 (unprogrammed) |
5 | SPIEN | シリアル・プログラムとデータ・ダウンロードON | 0 (programmed, SPI programming enabled) |
4 | WDTON | ウオッチドックタイマ常にON | 1 (unprogrammed) |
3 | EESAVE | EEPROMの内容を保持 | 1 (unprogrammed), EEPROM not reserved |
2 | BOOTSZ1 | ブートサイズの設定 | 0 (programmed) |
1 | BOOTSZ0 | ブートサイズの設定 | 0 (programmed) |
0 | BOOTRST | リセットの選択 | 1 (unprogrammed) |
拡張ビット(Extended Fuse Bit)
「extended_fuses=0xFD」部分は、電圧低下検出レベル (BOD) を設定するために使用されます。
電圧が充分でないとチップの動作が不安定になります。Atmega328/328P は、少なくとも 4 V があれば、16 MHz で動作しますが、4 V を下回ると誤動作する可能性が高くなります。
チップの最小電圧レベルを設定できます。 電圧がこのレベルを下回るとリセットします。
Bit | Extended Fuse Byte | 説明 | 標準値 |
7 | – | ||
6 | – | ||
5 | – | ||
4 | – | ||
3 | – | ||
2 | BODLEVEL2 | 電圧低下検出レベル | 1 (unprogrammed) |
1 | BODLEVEL1 | 電圧低下検出レベル | 1 (unprogrammed) |
0 | BODLEVEL0 | 電圧低下検出レベル | 1 (unprogrammed) |
ロックビット(Lock Bit)
「unlock_bits=0x3F」と「lock_bits=0x0F」の部分は、プログラム・メモリのアクセス制限用です。書き換えるとまずいようです。そのまま使います。
コメント