プッシュボタンが押されたかどうかをArduinnoで判定、左のボタンが押されたら、”L”を、右だったら”R”をシリアルに出力、それをFlashアプリで受け取り、それぞれのカウンターの数値を繰り上げていけば完成です。
当初はテキストだけが画面に表示されるような単純なものを想定していましたが、せっかくなので見栄えも若干重視しながら作りこんでみました。
ボタンを押した時に、何らかのアニメーションやサウンド効果をつけることで、単純にボタンを押す動作でもそれなりに魅力的になります。
で、完成したのが下記のアプリケーションです。
![]() ※本物のボタンを押すと、画面のボタンも連動して動作 (クリックでSWFムービー再生:640KB) |
画面内にボタンをつけて、ボタンの色と同じ色に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の色を変更)することが可能になりました。
| < 戻る | 次 > |
|---|




