[perl mac serial] Device::SerialPortでArduinoに信号を送る メモ

  • 投稿日:
  • by
  • カテゴリ:
perl Device::SerialPortを使ってArduinoに信号を送りBlinkMの色を変更してみる メモ

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


2. macに接続して、デバイスの位置を確認します
mac arduino usb
$  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"を送信してテストします
arduino blinkm

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