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 Mega2560」以外はATmega328なので、それらを中心に記載します。(ATmega328PはATmega328の省エネタイプ)

NameArduino UNOArduino NanoMega 2560
MCUATmega328PATmega328ATmega2560
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のHPより)
Arduino UNO(「UNO」はイタリア語で1)は、Arduinoファミリの中でも一番良く見るタイプです。

Arduinoの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よりピン数が2本多いです。
そこで、Nanoにはアナログ入力専用のA6とA7が追加されました。

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

Arduino Mega 2560

Arduino Mega 2560 は、チップにATmega2560を用いており、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」の部分は、プログラム・メモリのアクセス制限用です。書き換えるとまずいようです。そのまま使います。

コメント