1. 写真のようにBlinkMをArduinoにつなぎます

2. macに接続して、デバイスの位置を確認します

$ ls /dev/*usbserial*
3. ArduinoでBlinkMの色を変更するプログラムを書きます
BlinkMのサイトからEXAMPLE CODEをダウンロードします。
ここでは、BlinkMのデータシートを読んでI2C通信をwireで実装するのは大変なのですが、
サンプルにあるBlinkM_funcs.hを利用するとその辺の事は何も考えず操作が可能です。
例えば、色を変更したいならアドレスと色番号を指定するだけで色を変更する事が可能です。
BlinkM_getRGBColor( blinkm_addr, &r,&g,&b);(*BlinkM_funcs.hのラインセンスには注意)
サンプルのBlinkMTesterを参考にして、
RGBの6桁をserialで送信すると色を変更するプログラムを書いてみます。
#include "Wire.h" #include "BlinkM_funcs.h" #define BLINKM_ARDUINO_POWERED 1 byte blinkm_addr = 0x00; char serInStr[30]; void setup() { if( BLINKM_ARDUINO_POWERED ) { BlinkM_beginWithPower(); } else { BlinkM_begin(); } Serial.begin(19200); // stop seq BlinkM_stopScript( blinkm_addr ); // set default color BlinkM_setRGB( blinkm_addr, 0xff,0xff,0xff); // white // fade time BlinkM_setFadeSpeed( blinkm_addr, 255); // change color BlinkM_fadeToRGB( blinkm_addr, 0xff,0x00,0x00); //red } void loop() { int num; if( readSerialString() ) { //Serial.println(serInStr); char* str = serInStr; num = atoi(str); byte a = toHex( str[0],str[1] ); byte b = toHex( str[2],str[3] ); byte c = toHex( str[4],str[5] ); BlinkM_fadeToRGB( blinkm_addr, a,b,c); } } #include <ctype.h> uint8_t toHex(char hi, char lo) { uint8_t b; hi = toupper(hi); if( isxdigit(hi) ) { if( hi > '9' ) hi -= 7; // software offset for A-F hi -= 0x30; // subtract ASCII offset b = hi<<4; lo = toupper(lo); if( isxdigit(lo) ) { if( lo > '9' ) lo -= 7; // software offset for A-F lo -= 0x30; // subtract ASCII offset b = b + lo; return b; } // else error } // else error return 0; } uint8_t readSerialString() { if(!Serial.available()) { return 0; } delay(10); int i = 0; while (Serial.available()) { serInStr[i] = Serial.read(); i++; } serInStr[i] = 0; return i; }スケッチをArduinoに送信してserial monitorで
"ff0000"を送信してテストします

4. perlからRGBを指定して色を変えてみます
Device::SerialPortを利用します。
これを使うと以下のような短いコードでシリアル接続が可能です。
#!/usr/bin/perl use strict; use Device::SerialPort; my $p = Device::SerialPort->new("/dev/tty.usbserial-A8004JhW"); $p->baudrate(19200); $p->databits(8); $p->parity("none"); # $p->stopbits(1); $p->write("ff0000");色が変わることが確認できました。
参考サイト
ArduinoとAnyEventを使って,モールス信号でSOS !
Arduino BlinkM I2C通信テスト part1
thingm :: an electronic product studio: BlinkM