Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装2
前回の説明ではサーボ位置情報をサーバーに伝える実装について説明しました。
クライアントからサーバーに情報を伝えるだけなので非同期っぽくなかったです。
今回はクライアントからサーバーにバッテリ電圧値をリクエストし、サーバーが応答する説明をします。
(RCB-01ではwebiopiからI2C通信でPIC32マイコンにリクエストし、マイコンが値を返し、サーバー(webiopi)がクライアントに値を返すしくみになっています。)
javascriptファイル rcb.jsに
webiopi().callMacro("getVoltage", [],cbgetVoltage);
と記述しています。
前回のサーボ位置情報を伝える関数は
webiopi().callMacro("ServoMove", [pwm0,pwm1,pwm2,pwm3]);
です。比較すると引数[]がなにもないのと、前回無かった cbgetVoltageがあります。
cbgetVoltageはコールバック関数といいます。
C言語で記述しましたが、以下のLengthを取得する関数で説明すると
getLength関数が終了するタイミングで値がもらえる。これが通常の関数の戻り値の処理です。
int length = getLength();
int getLength()
{
return 100;
}
これに対して上記のcbgetVoltageというコールバック関数を使用する場合は
クライアントが
webiopi().callMacro("getVoltage", [],cbgetVoltage);
を実行した後、サーバーからの応答が無くてもクライアントは動作が可能で、
そのうちサーバーから応答が来たら以下の処理をします。
function cbgetVoltage( macro, args, data )
{
batterydisp = data;
mtextBattery.innerHTML = "Battery Voltage " + data / 10 + "V";
}
これが非同期通信です。
rcb.pyには以下のマクロ関数が実装されてます。
@webiopi.macro
def getVoltage():
try:
voltage = bus.read_byte_data(address_pca9685,124)
voltage = bus.read_byte_data(address_pca9685,124)
# webiopi.debug("getVoltage : %s" % voltage)
except IOError:
pass
return voltage
解説すると、
try:
voltage = bus.read_byte_data(address_pca9685,124)
voltage = bus.read_byte_data(address_pca9685,124)
# webiopi.debug("getVoltage : %s" % voltage)
except IOError:
pass
は例外処理と言って、IOErrorの時は処理をパスしますよ。という意味です。
この処理があるので、ノイズ等でI2C通信ができなかった場合等に処理をパスするので
pythonが止まりません。なにしろpythonはエラーで即落ちますから。
またこの処理があるので、RCBerry SoftwareはRCB-01が無くても動きます。
動くという意味はWebUIを試せるという事です。
« Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装 | トップページ | マイティフロッグ スバルブラット »
「ラジコン 技術情報」カテゴリの記事
- 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 で作るラジコン webiopi Ajaxを使用した実装 | トップページ | マイティフロッグ スバルブラット »
コメント