「Asterisk+Arduino」の版間の差分

提供: VoIP-Info.jp
移動先: 案内検索
(新しいページ: ' ===スケッチ=== #include <Servo.h> Servo servo1; int servoPin = 10; int up = 60; int down = 15; void setup(){ servo1.attach(servoPin); servo1.write(down);...')
 
(「Asterisk+Arduino」を保護しました ([編集=管理者のみ許可] (無期限) [移動=管理者のみ許可] (無期限)))
 
(6人の利用者による、間の9版が非表示)
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>
  
 
===スケッチ===
 
===スケッチ===
 +
サーボモータはArduinoの10番ピンに接続します。<br>
 +
Arduinoは以下のようなプログラムで動作させます。シリアルポート(USB)から入力された数値(1~9)に応じてネギを振る回数が決まります。'u'が入力されると上の位置、'd'が入力されると下の位置で停止します。's'が入力されると1回だけネギを振ります。<br>
 
  #include <Servo.h>
 
  #include <Servo.h>
 
   
 
   
54行目: 60行目:
 
   }
 
   }
 
  }
 
  }
 +
===Asteriskからの制御===
 +
AsteriskからはSystem()でシェルをキックすることでシリアルポートに書き込みます。ArduinoはFDT社のUSB-シリアル変換チップを使用しているため、Linux上からでは/dev/ttyUSBXにみえます。<br>
 +
シリアルにデータを送るシェルは以下の通りです。<br>
 +
#!/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などに書き込むだけです。<br>
 +
Asterisk側からはextenで
 +
exten => 2,1,system(/var/lib/asterisk/negi.sh 2)
 +
のように引数をつけてシェルをキックすればネギを振ります。<br>
 +
なお、/dev/ttyUSBXのパーミッションに注意してください。<br>

2017年11月18日 (土) 17:52時点における最新版

ハードウェア

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のパーミッションに注意してください。