Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装
クライアント(iPad,iPhone等)、サーバー(RCB-01)間では以下のような情報通信が必要です。
1.サーボ位置情報の送信(クライアントから)
2.バッテリ電圧値の取得(サーバーから)
3.セットアップパラメータの送信(クライアントから)
4.保存されているセットアップ情報の送信(サーバーから)
通信にはAjax(Asynchronous JavaScript + XML)を用いています。非同期通信が特徴で、従来の同期通信の場合は
サーバーが処理を行っている間はクライアントは待ち状態となりますが、非同期通信の場合、クライアントは操作を継続できます。
Ajaxを実装するにはXMLHttpRequestオブジェクトを生成を行いますが、webiopiでは隠蔽されていて以下の手続きで実現します。
サーボ位置情報の送信について説明します。
javascriptファイル rcb.jsに
webiopi().callMacro("ServoMove", [pwm0,pwm1,pwm2,pwm3]);
という記述があります。これはwebiopiのユーザ定義ファイル(python)に下記のマクロ本体あります。
RCB-01ではrcb.pyというファイル名です。
/etc/webiopi/config
に
myscript = /usr/share/webiopi/hddocs/rcb.py
のように指定しています。
以下はrcb.pyに記述されているマクロ関数です。
@webiopi.macro
def ServoMove(pwm0,pwm1,pwm2,pwm3):
servopwm0 = int(pwm0)
servopwm1 = int(pwm1)
servopwm2 = int(pwm2)
servopwm3 = int(pwm3)
if servopwm0 <= NEUTRAL:
servopwm0 = NEUTRAL - int((NEUTRAL - servopwm0) * ServoMoveRangeCH1)
else:
servopwm0 = NEUTRAL + int((servopwm0 - NEUTRAL) * ServoMoveRangeCH1)
if servopwm1 <= NEUTRAL:
servopwm1 = NEUTRAL - int((NEUTRAL - servopwm1) * ServoMoveRangeCH2)
else:
servopwm1 = NEUTRAL + int((servopwm1 - NEUTRAL) * ServoMoveRangeCH2)
if servopwm2 <= NEUTRAL:
servopwm2 = NEUTRAL - int((NEUTRAL - servopwm2) * ServoMoveRangeCH3)
else:
servopwm2 = NEUTRAL + int((servopwm2 - NEUTRAL) * ServoMoveRangeCH3)
if servopwm3 <= NEUTRAL:
servopwm3 = NEUTRAL - int((NEUTRAL - servopwm3) * ServoMoveRangeCH4)
else:
servopwm3 = NEUTRAL + int((servopwm3 - NEUTRAL) * ServoMoveRangeCH4)
setPCA9685Duty4(0, 0, servopwm0, 0, servopwm1, 0, servopwm2 , 0, servopwm3)
ここまでです。
解説すると
servopwm0 = int(pwm0)
servopwm1 = int(pwm1)
servopwm2 = int(pwm2)
servopwm3 = int(pwm3)
でテキスト形式をintに変換します。
if servopwm0 <= NEUTRAL:
servopwm0 = NEUTRAL - int((NEUTRAL - servopwm0) * ServoMoveRangeCH1)
else:
servopwm0 = NEUTRAL + int((servopwm0 - NEUTRAL) * ServoMoveRangeCH1)
でサーボのパルス幅を計算し、
setPCA9685Duty4(0, 0, servopwm0, 0, servopwm1, 0, servopwm2 , 0, servopwm3)
でsetPCA9685Duty4をコールします。
setPCA9685Duty4関数は同一ファイルpcb.pyにあります。
def setPCA9685Duty4(channel, on1, off1, on2, off2, on3, off3 , on4, off4):
channelpos = 0x6 + 4*channel
data = [on1&0xFF, on1>>8, off1&0xFF, off1>>8,
on2&0xFF, on2>>8, off2&0xFF, off2>>8,
on3&0xFF, on3>>8, off3&0xFF, off3>>8,
on4&0xFF, on4>>8, off4&0xFF, off4>>8]
try:
bus.write_i2c_block_data(address_pca9685, channelpos, data)
except IOError:
pass
最初の引数channelは何chからのサーボ信号をセットするかを指定します。
この場合0chからセットするので、0を指定しています。
以上のように実装します。
« Raspberry Pi で作るラジコン タミヤ ホーネット 動画公開 | トップページ | Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装2 »
「ラジコン 技術情報」カテゴリの記事
- RCB-01 技術資料 リンク先まとめ(2022.06.18)
- Raspberry Pi で作るラジコン タミヤラジコンの説明書ダウンロード(2018.06.03)
- Raspberry Pi で作るラジコン Wifi到達距離を伸ばす8(2018.05.27)
- Raspberry Pi で作るラジコン RCB-01電源供給2(2018.05.27)
- Raspberry Pi で作るラジコン RCB-01電源供給(2018.05.22)
« Raspberry Pi で作るラジコン タミヤ ホーネット 動画公開 | トップページ | Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装2 »
コメント