「Asterisk+Arduino」の版間の差分
ナビゲーションに移動
検索に移動
細 208.96.11.114 (会話) による編集を 121.3.16.104 による版へと差し戻しました。 |
|||
| 1行目: | 1行目: | ||
===ハードウェア=== | |||
Arduino Diecimilaを使います。Arduinoについては http://www.arduino.cc/ を参照してください。<br> | |||
日本国内では[http://www.switch-science.com/products/detail.php?product_id=3 スイッチサイエンス]( http://www.switch-science.com/ )、メカロボショップ( http://www.mecharoboshop.com/ )などから、3,000円くらいで購入できます。<br> | |||
ネギ振りに使用しているサーボモータは小型のものです。電源はUSBから取ります。<br> | |||
===スケッチ=== | ===スケッチ=== | ||
2010年5月27日 (木) 20:30時点における版
ハードウェア
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のパーミッションに注意してください。