前にもちょろっとやったけど、それとは違うやつで。もうちょっと簡単に。
使ったハードウェアはこれ。
> Arduino - ArduinoBoardProMini
http://www.arduino.cc/en/Main/ArduinoBoardProMini
中でも、こいつの場合は
・3.3V 8MHz ・5V 16MHzの2つあるわけだが、ここでは前者を選択した。
携帯することを考えるとバッテリーは少ないほうがいい。
▲買ってみたら、思った以上に小さくてびっくり。
なお、Arduino Pro miniの場合、単体ではプログラムを書き込む手段がないので、別売で以下のようなUSBによるシリアル通信用の機器もセットで買う必要がある。
3.3v, 5vで製品が違うので注意。
http://www.sparkfun.com/products/9873
まずやること。ハンダ付け。
見ての通り、買ってきたArduinoには足が無いので自分でピンヘッダをハンダ付けする。赤いのがシリアル通信用。これを接続した時に上にくるようにハンダ付けしないと、ブレッドボードにさしたときに困りるので注意。
次にやること。環境整備。
まずは通信ドライバー。> VCP Drivers
http://www.ftdichip.com/Drivers/VCP.htm
Windowsの64bitで、2.08.08を選択。
さらにコーディング、プログラムのアップロードを行うソフトArduino IDEが必要。
> Arduino - Software
http://arduino.cc/en/Main/Software
ここから、Windows版のArduino IDE、バージョン0022をDL。
ブレッドボードで回路制作とプログラミング。
Arduinoの本とかではよくスケッチとかっていってるみたい。回路はこんな感じ。
Resetボタンから向かって右側のVCCとGNDはそれぞれ電源の3.3V、GNDにつなげること。ここがArduinoの電源供給端子。
左側のGNDはシリアル通信用なので今回は関係ない。
構成は、以下のような感じ。
・7番ピン:スイッチ ・10-12番ピン:LEDで、以下のようなコーディング。
コーディングはArduino IDEで。
USB接続機器をPCに接続後、Arduino IDE起動。
まず行う設定は、以下の2つ。
・[Tools]-[Board] → Arduino Pro or Pro Mini (3.3v,8MHz) w/ATmega328 使用するArduinoを選択しておく。これがあっていないとハードにあった適切なコンパイルが されないので注意。 ・[Tools]-[Poot] → COM6 PCの環境によって違う。Windowsではたいてい5,6あたり。 そもそも、USB接続機器が認識できてないとCOM1しか表示されてないはずなので、 USB接続機器のほうがうまくいっているか確認すること。
使うのはArduinoIDE。見た目はほとんどC言語と同じ。
// スイッチで3パターンに変化するLEDx3の点灯
#define LED1 12
#define LED2 11
#define LED3 10
#define SW1 07
boolean sw1ValOld = 0;
boolean sw1Val = 0;
int state = 3;
int count = 0;
int init_port = B00000010;
void setup()
{
//こっちだとプログラムが重くなる
//pinMode(LED1, OUTPUT);
//pinMode(LED2, OUTPUT);
//pinMode(LED3, OUTPUT);
DDRB = DDRB | B00011100;
pinMode(SW1, INPUT);
}
void loop()
{
static int portb;
sw1Val = digitalRead(SW1);
// スイッチ判定(立ち上がりのみおk)
if( sw1Val == HIGH && sw1ValOld == LOW) {
state++;
if( state >= 3 ) state = 0;
delay(100); // チャタリング防止。値はテキトー
}
// 値更新
sw1ValOld = sw1Val;
switch(state) {
case 0:
//こっちだとプログラムが重くなる
//digitalWrite(LED1, HIGH);
//digitalWrite(LED2, HIGH);
//digitalWrite(LED3, HIGH);
PORTB = B00011100;
delay(1000);
PORTB = B00000000;
//こっちだとプログラムが重くなる
//digitalWrite(LED1, LOW);
//digitalWrite(LED2, LOW);
//digitalWrite(LED3, LOW);
delay(1000);
break;
case 1: // 全部点滅早く
//こっちだとプログラムが重くなる
//digitalWrite(LED1, HIGH);
//digitalWrite(LED2, HIGH);
//digitalWrite(LED3, HIGH);
PORTB = B00011100;
delay(500);
//こっちだとプログラムが重くなる
//digitalWrite(LED1, LOW);
//digitalWrite(LED2, LOW);
//digitalWrite(LED3, LOW);
PORTB = B00000000;
delay(500);
break;
case 2: // 1つずつずれる
count++;
if(count >= 3) {
count = 0;
portb = init_port;
}
//ビットシフト使う場合はこっちでやったほうが楽
portb = portb << 1;
PORTB = portb;
delay(1000);
}
}
Arduinoは、上記で使われているsetup関数でセットアップ、その後loop関数を繰り返し実行する。そのため、必要な初期化はsetupに、それ以外の処理の実態は全てloop関数内に書くことになる。
pinModeでピンに出力、入力をセット。
しかし、何度も使う場合は上記のように直接ポートに01を立てる方法の方が容量も負荷も小さくなることもある。
digitalReadでデジタル信号の受け取り、digitalWriteでデジタル信号の出力。
こちらも同様に、直接ポートをいじったほうがプログラム容量が小さくなる場合がある。
以下はコンパイル時に確認できるプログラムサイズ。

▲びふぉあ
↓

▲あふたぁ
多少ではあるが、改善が見られる。
マイコンの場合は、あまり容量の大きなプログラムは乗らないので、少しでも少なくすむようにすべきである。

▲Arduino IDEのインタフェース。三角形でVerify(コンパイル)。右から2つ目の→でUpload。
コンパイルが通ったら、UploadボダンでArduinoにプログラムアップロードする。
実験結果。
プログラムでは、7番ピンにさしたスイッチを押すたびにLEDの点灯ルールが変わるようにswitch case文を使って条件分岐を書いている。
スイッチは押すたびに1000msで点滅→500msで点滅→1つずつ点灯と点灯ルールが変更になる。
思った以上に簡単だった。
むしろ、アセンブリとかH8とか少しでもかんだことある人だったらヌルイぐらいである。
ポートの処理ですらAPIにやらせようとするわけで、かなりブラックボックスにしちゃったかんじ。
さて、これで何作るかねー。