2010年1月30日土曜日

Arduinoで2進数カウンタ

このエントリーをはてなブックマークに追加
Arduinoを購入しました.
Arduinoは,基板(マイコンボード)と開発環境で構成されたフィジカルコンピューティングシステムです.

特徴としてオープンソースハードウェアであることが挙げられます.

Arduinoには用途に応じて様々な種類のボードが用意されていますが,今回購入したのは,一通りの基本機能を搭載したArduino Duemilanoveです.
Amazonにて「Arduinoをはじめようキット」を4200円で買いました.
付属品はこんな感じ
 
※Arduinoは,USB経由で給電とプログラムの書き込みを行うのですが,この「Arduinoをはじめようキット」にはUSBケーブルがついてません!!(はじめようキットなのに・・・)
そのため,自分でB端子のUSBを用意する必要があります.

Arduino本体はこんな感じ
・USB端子
・電源プラグ
・デジタル入出力ポート×14
・3.3V電源
・5V電源
・アナログ入力ポート×6
・アナログ出力ポート×6
・リセットスイッチ(プログラムを初めから実行する)
・モニター用端子
 


開発環境のダウンロードは下記サイトから行えます.お使いのOSに合ったファイルをダウンロードしてください.
http://arduino.cc/en/Main/Software

Windowsの場合,arduino-00**.zipをダウンロードするかと思います.
展開してから,arduino.exeをダブルクリックしてください.これだけで実装環境の構築が終わりました.
※arduino.exeはJavaVM上で動作します.そのため,事前にJavaをインストールする必要があります.

プログラムの実行手順は下記の通りです.
1. プログラムを記述
2. エラーがないか確認(一番左のVerifyボタン)
3. アップロード(右から2番目のUploadボタン)
うまくアップロードできると,Arduinoが点滅します.
もし,アップロード時にエラーがでるようでしたら,デバイスマネージャにて,正しくデバドラがインストールされているか,また,接続されているCOMポートの番号と実装環境のTools->Serial Portで選択されているCOMポートの番号が一致しているかを確かめてください.

試しに,付属の光素子とスイッチを使用して光に反応する2進数カウンタを作ってみました.
ちょっとわかりにくいですが・・・



ソースはこちら
C-likeですね.define部分は接続した入出力ポートに合わせてください.
setup関数は一番初めに一度だけ実行される関数.loop関数はプログラムの本体となり,ここに記述されている内容が繰り返し実行されます.

#define LED3 8
#define LED2 7
#define LED1 6
#define BUTTON 9
#define INTERVAL 10
#define CDS 10

int count = 0;
int before_cds = LOW;

void setup(){
  pinMode(LED3, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(BUTTON, INPUT);
  pinMode(CDS, INPUT);
}
void check_count(){
  if((count & 4) == 4){
    digitalWrite(LED3, HIGH);
  } else {
    digitalWrite(LED3, LOW);
  }
  if((count & 2) == 2){
    digitalWrite(LED2, HIGH);
  } else {
    digitalWrite(LED2, LOW);
  }
  if((count & 1) == 1){
    digitalWrite(LED1, HIGH);
  } else {
    digitalWrite(LED1, LOW);
  }
}

void loop(){
  int cds_input = digitalRead(CDS);
  int button_input = digitalRead(BUTTON);
  delay(INTERVAL);
  
  if(cds_input != before_cds){
    before_cds = cds_input;
    if(cds_input == HIGH){
      count++;
    }
  }
  check_count();
  
  if( button_input == HIGH ){
    count = 0;
    check_count();
  }
}