前にもちょろっとやったけど、それとは違うやつで。もうちょっと簡単に。
使ったハードウェアはこれ。
> 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にやらせようとするわけで、かなりブラックボックスにしちゃったかんじ。
さて、これで何作るかねー。
 
0 件のコメント:
コメントを投稿