Asterisk+Arduino

2008年10月23日 (木) 17:03時点における121.3.16.104 (トーク)による版 (ハードウェア)

ハードウェア

Arduino Diecimilaを使います。Arduinoについては http://www.arduino.cc/ を参照してください。
日本国内ではスイッチサイエンス( http://www.switch-science.com/ )、メカロボショップ( http://www.mecharoboshop.com/ )などから、3,000円くらいで購入できます。
ネギ振りに使用しているサーボモータは小型のものです。電源はUSBから取ります。

スケッチ

サーボモータはArduinoの10番ピンに接続します。
Arduinoは以下のようなプログラムで動作させます。シリアルポート(USB)から入力された数値(1~9)に応じてネギを振る回数が決まります。'u'が入力されると上の位置、'd'が入力されると下の位置で停止します。's'が入力されると1回だけネギを振ります。

#include <Servo.h>

Servo servo1;

int servoPin = 10;
int up = 60;
int down = 15;

void setup(){
  servo1.attach(servoPin);
  servo1.write(down);
  
  Serial.begin(9600);
  Serial.print("OK");
}

void servo_loop(char ch)
{
  int i;
  
  servo1.write(down);
  
  for(i=0;i<(int)(ch -'0');i++){
    servo1.write(up);
    delay(150);
    servo1.write(down);
    delay(200);
  }
}

void loop(){
  if(Serial.available()) {
    char ch = Serial.read();
    
    switch(ch) {
      case '1'...'9':
        servo_loop(ch);
        break;
      case 'd':
        servo1.write(down);
        break;
      case 'u':
        servo1.write(up);
        break;
      case 's':
        servo1.write(down);
        servo1.write(up);
        delay(150);
        servo1.write(down);
        break;
      }
  }
}

Asteriskからの制御

AsteriskからはSystem()でシェルをキックすることでシリアルポートに書き込みます。ArduinoはFDT社のUSB-シリアル変換チップを使用しているため、Linux上からでは/dev/ttyUSBXにみえます。
シリアルにデータを送るシェルは以下の通りです。

#!/bin/sh

TTY="ttyUSB0"

if [ "$1" -lt "1" ]
then
    exit
fi

if [ "$1" -gt "9" ]
then
   exit
fi

stty -parenb -parodd cs8 -hupcl -cstopb -cread -clocal -crtscts < /dev/$TTY

echo $1 > /dev/$TTY

sttyでパラメータを設定した後、echo で引数を/dev/ttyUSB0などに書き込むだけです。
Asterisk側からはextenで

exten => 2,1,system(/var/lib/asterisk/negi.sh 2)

のように引数をつけてシェルをキックすればネギを振ります。
なお、/dev/ttyUSBXのパーミッションに注意してください。