Category : IoT

先日、最近話題のArduino(アルドゥイーノ)のワークショップへ参加してきました。
10年前電子工作をしていた時よりもずっと簡単に動くことがわかり、早速購入して何か作ってみることにしました。

ちなみにArduinoとは・・・

Arduino はスタンドアロン型のインタラクティブデバイス開発だけでなく、ホストコンピュータ上のソフトウェア(例えば、Adobe Flash、Processing、Max/MSP、Pure Data、SuperCollider)で制御することもできるワンボードマイコンの一種。オープンソースハードウェアでありハードウェア設計情報のEAGLEファイルは無料で公開されており、組み立て済みの基板を購入することもできるほか、誰でも自分の手で Arduino を組み立てることができる。

(引用:http://ja.wikipedia.org/wiki/Arduino

要するに初心者でも簡単に電子工作ができてしまうマイコンボードです。
“オープンソースのハーウェア” というのがなんともワクワクする響きですね。
ブレッドボードを使えばハンダ付けも不要で、とても低い敷居で始めることが出来ます。

購入したもの

今回は「Arduinoをはじめようキット」を購入しました。
Arduino本体のほか、可変抵抗、LED、ジャンパワイヤ、ブレッドボードなどの付属品がひと通りついてきます。

このキットは、オライリーの「Arduinoをはじめよう 第2版」に書かれている内容にぴったり合う部品が揃っています。勉強するにあたって「これだけ買っとけば大丈夫!」という安心感がありますね。本と一緒に購入しました。

無料のIDEがある

開発用ソフトウェアも無料です。Arduino – Software からIDEがダウンロードできます。
C言語+C++のいくつかの機能をサポートしているようです。C言語経験が無くても、何らかの他言語経験があれば全く問題なく理解できると思います。

これでハードとソフトの準備が整いました。

組んでみる、そして詰まる

お決まりのLチカや基本的なプログラミングを進めていく中、オライリーのExample05で詰まりました。2時間近く奮闘していたのでメモしておきます。
(「図の通りに」って書いてあるのに、回路図が無いじゃないですか・・・)

仕様

下記のような仕様で組めという例です。(たぶん)

  • スイッチを押すとLEDが光る/消える
  • スイッチを押し続けると、LEDの光量が増えたり減ったりする(消える -> ゆっくり点灯を繰り返す)
  • LEDの光量を記憶し、点灯 -> 消灯 -> 点灯 した際に前回の光量と同じになっている

↑ 奮闘した結果の回路図

↑ 組んだ写真

回路図はやっぱり手書きが良いですね!

本に載っているコードだと気持ちのよい動きではないため、Example05をアレンジしてみました。変更したのは下記の点です。

  • スイッチを押し続けた時、光量が増える->減る->増える、を繰り返す
  • 点灯/消灯を、スイッチの短いタップで行い、長押しの時に光量変化されるようにした
// ボタンを押すとLED点灯
// 離した後も点灯したまま
// バウンシングを解消する処理も入れる
// ボタンを押したままにすると明るさが変化

const int LED = 9;
const int BUTTON = 7;

int val = 0;      // 入力ピンの状態
int old_val = LOW;  // valの古い値を保持しておく変数
int state = 0;    // LEDの状態を保持(0ならオフ、1ならオン)

int brightness = 128;
int reverseFlag = false;
unsigned long startTime = 0;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON,INPUT);
  Serial.begin(9600);
}

void loop() {
  val = digitalRead(BUTTON); // ボタンが押されているかどうかの判定
  
  // LED消灯時から点灯時の初回のみ通る分岐
  if(val == HIGH && old_val == LOW) {
    state = 1 - state;
    startTime = millis();    // millisはArduinoの時計で、ボードがリセットされてからの時間をミリ秒で返す
                             // 最後にボタンが押された時間を記憶
    if(state == 1) {
      analogWrite(LED, brightness);
    }      
    delay(60);
  }
  
  if(val == HIGH && old_val == HIGH) {
    if(state == 1) {
      if((millis() - startTime) > 500) {

        if(brightness == 255) {
          reverseFlag = true;
        } else if(brightness == 0 ) {
          reverseFlag = false;
        }
        if(reverseFlag) { // reverseFlag true でリバース
          brightness--;
        } else {
          brightness++;
        }

        delay(10);
        analogWrite(LED, brightness);
        state = 1;
      }
    } else {
      if((millis() - startTime) < 500) {
        analogWrite(LED, 0);
      }
    }
  }
  
  old_val = val;
//  Serial.print(state);
}

雑なコードですが、思い通りの動きをするようになりました。
悩んで組んだコードや回路図で正常に動作した時、これまでやっていたWebのプログラミングとは一味違う感動があります。
次回はセンサーを利用した回路を試そうと思います。