Same Shit Different Day

Arduino実験機1号~完成編

メール 印刷
ThumbnailArduino(公式サイト)を使って、プッシュボタンをArduinoに接続し、ボタンが押された数を集計すると言う単純な実験機を作る計画ですが、Arduinoに接続したボタンからFlashアプリに信号を送ることは前回の実験で成功しました。

プッシュボタンが押されたかどうかをArduinnoで判定、左のボタンが押されたら、”L”を、右だったら”R”をシリアルに出力、それをFlashアプリで受け取り、それぞれのカウンターの数値を繰り上げていけば完成です。

当初はテキストだけが画面に表示されるような単純なものを想定していましたが、せっかくなので見栄えも若干重視しながら作りこんでみました。

ボタンを押した時に、何らかのアニメーションやサウンド効果をつけることで、単純にボタンを押す動作でもそれなりに魅力的になります。

で、完成したのが下記のアプリケーションです。

Flash Test
※本物のボタンを押すと、画面のボタンも連動して動作
(クリックでSWFムービー再生:640KB)
プッシュボタンからの入力をFlashで受信するだけでは一方通行の通信になってしまうので、手元にあったRGB LEDを使って、Flashアプリから自由に色を変えられるような”おまけ”をつけてみました。

画面内にボタンをつけて、ボタンの色と同じ色にRGB LEDが光るようにします。

RGB LEDの色はArduinoのデジタル出力にPWM制御が用意されているので、それぞれ0~255(8ビット)の範囲で電圧出力を調整できます。

これを、赤、緑、青のそれぞれのLEDで行うことで、任意の色を作り出すことが可能です(実際にはそれっぽい色)。

Arduino側では、それぞれのピン(PWM)に0~255の値を設定するだけですが、FlashアプリからどのようなコードをArduinoに送るのかが問題です。

実は、Arduinoのシリアル出力からFlashアプリが受け取るのは任意のキャラクターで問題ないのですが、Flashアプリから”A”等を送ると、Arduino側ではコード変換されて受け取られます。

なので、”#FF0000”のような16進数のカラーコードを送っても、Arduino側ではきちんと解釈できません(コード変換を逆変換すればいいのでしょうが面倒です)。

そこで、Flashアプリからは16進数ではなく10進数のカラーコードをArduinoへ送ることにします。

例えば、赤なら”16711680”、青なら”255”です。

また、16進数であれば、文字数は必ず6桁に決まりますが、10進数の場合、色によって桁数が変わるので、カラーコードの最初と最後に特別な記号を付与して、カラーコードの最初と最後を認識できるようにします。

var colorCode:Array=new Array("^16711680$","^65280$","^255$");
function setColor(ui:uint) {
       socket.writeUTFBytes(colorCode[ui]);
       socket.flush();
}
Flashアプリ側はこんな感じでそれぞれの色をグローバルで定義し、”setColor(0)”のように呼び出せばOKです。

// Define Color code
#define START_COLOR_CHAR '^'
#define END_COLOR_CHAR '$'

// PWM control for LED
#define ledR 11
#define ledG 10
#define ledB 9

// Define variables
char serialMessage[8];
unsigned int readChar;
unsigned int count;
unsigned long color;
unsigned int r;
unsigned int g;
unsigned int b;
boolean readingSerial;

// Arduino
void setup() {
  readingSerial = false;
}

// Main Loop
void loop() {
  // Read Serial from Flash for RGB LED
  if (Serial.available() > 0 && !readingSerial) {
     char n=Serial.read();
     if (n == START_COLOR_CHAR) {
        serialReadColor();
     }
  }
}

// When serial receiving
void serialReadColor() {
  readingSerial = true;
  count = 0;
  initReading:
  if (Serial.available() > 0) {
    readChar = Serial.read();
    if (readChar == END_COLOR_CHAR || count == 8) {
      goto endReading;
    } else {
      serialMessage[count++] = readChar;
      goto initReading;
    }
  }
  goto initReading;
  endReading:
  readingSerial = false;
  serialMessage[count] = '\0';
  
  setColor(serialMessage);
}

void setColor(char* value) {
  // Convert Char* to Long
  color = atol(value);
  // Extract RGB
  r = color >> 16 & 0xFF;
  g = color >>  8 & 0xFF;
  b = color >>  0 & 0xFF;
  // Send values to analog pins
  analogWrite(ledR, r);
  analogWrite(ledG, g);
  analogWrite(ledB, b);
}
Arduino側では、こんな感じで受け取った10進数のカラーコードをそれぞれ8ビットずつ切り出してやれば、PWM制御で使用できる0~255の値になります。

あとは、それぞれのピンに出力してればOKです。

これで、Arduino側からの信号を受信することと、FlashアプリからArduinoへ信号を送信(この場合はRGB LEDの色を変更)することが可能になりました。

 
ホーム | がらくた紹介 | Arduino実験機1号~完成編

最新記事

人気記事