アルドゥイーノ・アーデュイーノ (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 まで |
- 電源とクロック
使用する電源電圧に応じて、安全に稼働する周波数の範囲が変化します。詳しくは--- ATmega168P技術資料(PDF,英語)を見てください。

- ブートローダ
AVRマイコンのプログラム用フラッシュメモリの一部(Boot Program Section)にプログラムを書き込む命令(SPM : Store Program Memory)を仕込むことができます。
そのプログラムをブートローダというようです。
ブートローダがあることによって、比較的容易にマイコンにプログラムを書き込むことができます。書き込むプログラムはフラッシュメモリーの別の部分(Application Flash Memory Section)に書き込まれます。
- ヒューズ(Fuse : 発音はフューズのはずだけど、ヒューズと書くのが習わしらしい。)
※ ヒューズビットという表現もありますが、マニュアルにはヒューズバイトとなっています。
8bit(=1byte)をセットで設定する必要があるからでしょうか。
AVR マイコンの機能を変化させるためのスイッチとして使われます。
(多くの人には通じないでしょうけど、昔の EPSON のパソコンのディップスイッチのようなもののようです。)
ブートローダとは別に書き込む必要があります。
失敗すると、元に戻すのに苦労する場合があるので、慎重にセットする必要があります。
Arduino でどのようなヒューズがセットされているかは、arduino-0017/hardware/board.txt の中に書いてあります。
以下の情報は ATmega168P に基づいています。ATmega328 は若干違うので注意!
- 上位ヒューズ(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 | | ※1 |
CKSEL3 | 3 | クロックの指定 | ※2 |
CKSEL2 | 2 | | ※2 |
CKSEL1 | 1 | | ※2 |
CKSEL0 | 0 | | ※2 |
※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 | 不使用 | |
| 6 | 不使用 | |
| 5 | 不使用 | |
| 4 | 不使用 | |
| 3 | 不使用 | |
BOOTSZ1 | 2 | ブートローダのサイズを決める | ※1 |
BOOTSZ0 | 1 | | ※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 分)。ブートローダの大きさはある程度大きいのでこれにする。
- ロックビット(Lock Bit)
応用プログラム領域の書き込みをできなくしたり(BLB0)、
ブートローダ領域の書き込みをできなくしたり(BLB1)、
場合によってはヒューズの書き込みも含めて禁止(LB)
します。
名称 | ビット番号 | 意味 | Default の値 |
| | | |
| 7 | 不使用 | |
| 6 | 不使用 | |
BLB12 | 5 | ブートローダセクションへのアクセス | ※1 |
BLB11 | 4 | | ※1 |
BLB02 | 3 | アプリケーションセクションへのアクセス | ※2 |
BLB01 | 2 | | ※2 |
LB2 | 1 | フラッシュメモリ・EEPROMへのアクセス | ※3 |
LB1 | 0 | | ※3 |
※ 1 | BLB12:1 の設定 : ブートローダセクションの読み書きについて |
| |
1 1 | ロックしない |
1 0 | SPMによる書き込みを禁止する。 |
0 1 | アプリケーションからのLPM(Load Program Memory)によって読むことを禁止。 |
0 0 | SPM(Store Program Memory)もアプリケーションからのLPM(Load Program Memory)も禁止。 |
※ ブートローダを書き込むときは"11"がよい。ブートローダを書き込んだ後は"00"でブートローダを守る。
※ 2 | BLB02:1 の設定 : アプリケーションセクションの読み書きについて |
| |
1 1 | ロックしない |
1 0 | SPMによる書き込みを禁止する。 |
0 1 | ブートローダからのLPM(Load Program Memory)によって読むことを禁止。 |
0 0 | SPM(Store Program Memory)もブートローダからのLPM(Load Program Memory)も禁止。 |
※ ブートローダから変更したいので設定する必要ない。 "11"でよい。
※ 3 | LB2:1 の設定 : フラッシュメモリとEEPROMについて |
| |
1 1 | ロックしない |
1 0 | プログラミングを禁止する。 |
0 0 | プログラミングも確かめ(Verify)も禁止する。 |
※ 設定する必要ない。 "11"でよい。
board.txt によると、Arduino で設定しているのは、次の2通りのようです。
0x0F(ブートローダ領域への書き込み読み取りを禁止)
0x3F(一切禁止しない)
- パソコンとの通信
- ハードウェア
パソコンからマイコン(ここの場合、ATmega168P)にプログラムを送り込みます。その時に、どのように通信するかというと、古式ゆかしいシリアル通信(RS232C)を使うのがマイコン側の標準的な仕様のようです。ここでは USB を介して通信しますので、USB と シリアル通信との間の変換が必要になります。大人の科学の Japaninoでは、CP2102 というチップを使って、また、Arduino Duemilanove では FTDI のチップを使ってこれを実現しています。
自作Arduino 互換について書いたもののうち、Duemilanoveタイプは FTDI を使っています。
しかし、これを使わない方法もあります。USBasp という通信規約を使うと、直接マイコンと通信ができるために、中間の変換が不要になり、安く組むことができます。
自作Arduino 互換について書いたもののうち、USB直結タイプは USBasp を利用しています。
- ソフトウエア
FTDI にしろ、CP2102 にしろ、これを通して通信する場合にはそれぞれドライバが必要になります。また、最近のパソコンは RS232Cポートを持たないものが多くなりました。そこで、Windows に RS232C で通信できるようにドライバを組み込む必要がある場合があります。
USBasp を使う場合にもやはりドライバを組み込む必要があります。