アルドゥイーノ・アーデュイーノ (Arduino) †
電子工作は素人。だけど、Arduino を使ってみたいと思います。
以下、Arduino を使うまでの道筋を記録します。
同じような素人さん向けに参考になるように。
いくつかの基礎知識 †
素人ですので、不正確、場合によっては誤りの情報があるかと思います。
どうぞご指摘下さい。
- ATmega168P
Atmel 社の「ワンチップマイコン」です。
一つのチップの中に、CPU(中央演算処理装置)、メモリ、AD変換(アナログデジタル変換)機能などを詰め込んだものです。
仕様の一部を下に示します。(私たちが普通入手するPDIP パッケージ--2列に足が並んで出ているもの--について)
項目 | |
| |
EEPROM (電気的に消したりプログラムしたりでき、電源を落としても内容が保持されるメモリ) | 512 バイト |
SRAM (メインメモリ) | 1K バイト |
AD変換 (アナログデータをデジタルデータに変換する機能) | 6 チャンネル(6つデータをとれる), 10bit(0-1023 までの値として取得できる) |
IO (入出力に使えるピンの数) | 23 本 |
駆動電圧 | 2.7-5.5 V (ただし電圧が低いとクロックを下げる必要あり) |
周波数(クロック。1秒間に何回計算するか) | 20MHz まで |
- ブートローダ
AVRマイコンのプログラム用フラッシュメモリの一部に、プログラムを書き込んだり読み込んだりする機能を仕込むことができるようです。
そのプログラムをブートローダというようです。
- ヒューズ(Fuse : 発音はフューズのはずだけど、ヒューズと書くのが習わしらしい。)
※ ヒューズビットという表現もありますが、マニュアルにはヒューズバイトとなっています。
8bit(=1byte)をセットで設定する必要があるからでしょうか。
AVR マイコンの機能を変化させるためのスイッチとして使われます。
(多くの人には通じないでしょうけど、昔の EPSON のパソコンのディップスイッチのようなもののようです。)
ブートローダとは別に書き込む必要があります。
失敗すると、元に戻すのに苦労する場合があるので、慎重にセットする必要があります。
Arduino でどのようなヒューズがセットされているかは、arduino-0017/hardware/board.txt の中に書いてあります。
以下の情報は ATmega168P に基づいています。
- 上位ヒューズ(High Fuse)
リセットの扱いなど。
Diecimila, Duemilanove Nano w/ ATmega168 では 0xdd(11011101)です。
名称 | ビット番号 | 意味 | Default の値 |
| | | |
RSDIBL | 7 | 外部からのリセットを使用不可にする。これがゼロだと 1番ピン(PC6)も IO に使える。 | 1 (設定しない) |
DWEN | 6 | On-chip デバッグシステムを使えるようにする。消費電力の関係もあり、1にしておく。 | 1 (設定しない) |
SPIEN | 5 | シリアルプログラムとデータのダウンロードを可能にする。 | 0(設定している) |
WDTON | 4 | Watchdog Timer(内蔵のカウンタが決まった値に達したら中断かリセットする機能) をいつも On。 | 1 (設定しない) |
EESAVE | 3 | Chip Erase でも EEPROM を保持 | 1 (設定しない) |
BODLEVEL2 | 2 | BOD(Brown-Out:電圧低下 Detector)電圧低下を検知してシステムを保護・停止する。 | ※1 |
BODLEVEL1 | 1 | | ※1 |
BODLEVEL0 | 0 | | ※1 |
※1 | BODLEVEL 2:0 の設定について |
| |
111 | BOD を使わない ( Default ) |
110 | Vcc 2.5V用(?) に設定。1.8V 以下で停止 |
101 | Vcc 3.5V用(?) に設定。2.7V 以下で停止 |
100 | Vcc 5.0V用(?) に設定。4.3V 以下で停止 |
- 下位ヒューズ(Low Fuse)
分周(?)や、ATmega168Pを駆動する周波数をどこからとるかによって変えます。
Diecimila, Duemilanove Nano w/ ATmega168 では 0xff(11111111)です。
名称 | ビット番号 | 意味 | Default の値 |
| | | |
CKDIV8 | 7 | 周波数を1/8 にする。(8MHz → 1MHz ) | 0 (設定している) |
CKOUT | 6 | CLKO ピン(PB0, 14番)からクロックを出力する。他のデバイスを駆動するのに使える。 | 1 (設定していない) |
SUT1 | 5 | スタートアップタイムの指定 | ※1 |
SUT0 | 4 | | |
CKSEL3 | 3 | クロックの指定 | ※2 |
CKSEL2 | 2 | | |
CKSEL1 | 1 | | |
CKSEL0 | 0 | | |
※1 | SUT1:0 の設定について(ただし、CKSEL3:0 が 1111の場合) |
01 | リセットからの余分な遅れ : 14クロック (ただし、BOD を使う。) |
10 | リセットからの余分な遅れ : 14クロック + 4.1ms |
11 | リセットからの余分な遅れ : 14クロック + 65ms |
※2 | CKSEL3:0 の設定について |
0000 | External Clock Source(外部発振源?)を使う |
0010 | 内部 RC 発振回路 8( 7.3-8.1 )MHz を使う |
0011 | 内部 128kHz(low power で高精度に作られていない) を使う |
0100-1111 | 水晶発振 |
1111 | 水晶発振(8.0-16.0)MHz (12-22 pF のコンデンサを噛ませる) |
- 拡張ヒューズ(Extended Fuse)
Diecimila, Duemilanove Nano w/ ATmega168 では 0x00(00000000)です。
名称 | ビット番号 | 意味 | Default の値 |
| | | |
- | 7 | - | 1 |
- | 6 | - | 1 |
- | 5 | - | 1 |
- | 4 | - | 1 |
- | 3 | - | 1 |
BOOTSZ1 | 2 | ブートローダのサイズを決める | ※1 |
BOOTSZ0 | 1 | | |
BOOTRST | 0 | リセット信号が来たときに、ブートローダ領域に飛ぶ(?) | 1 (設定されていない) |
※ 1 | BOOTSZ1:0 の設定と168Pの場合のブートローダ領域の大きさ |
| |
1 1 | 0.25 Kbyte ( 128 ワード ) |
1 0 | 0.5 Kbyte ( 256 ワード ) |
0 1 | 1 Kbyte ( 512 ワード ) |
0 0 | 2 Kbyte ( 1024 ワード ) |
※ 00 なら 1024words( アドレス 0x1C00-0x1FFF までの 2KB 分)。ブートローダの大きさはある程度大きいのでこれにする。
- ロックビット
応用プログラム領域の書き込みをできなくしたり(BLB0)、
ブートローダ領域の書き込みをできなくしたり(BLB1)、
場合によってはヒューズの書き込みも含めて禁止(LB)
します。
board.txt によると、Arduino で設定しているのは、次の2通りのようです。
0x0F(ブートローダ領域への書き込みを禁止)
0x3F(一切禁止しない)