お気に入り

  • ____
    RCB-01
無料ブログはココログ

« Raspberry Pi で作るラジコン タミヤ ホーネット 動画公開 | トップページ | Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装2 »

2017年10月16日 (月)

Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装

Blockdia_webiopi

RCB-01では送信機の代わりにiPad,iPhone等を使用します。専用アプリのインストールは必要なく、ブラウザを使用します。webiopiを使用して実現していますが、その方法について解説します。

クライアント(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 »

ラジコン 技術情報」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装:

« Raspberry Pi で作るラジコン タミヤ ホーネット 動画公開 | トップページ | Raspberry Pi で作るラジコン webiopi Ajaxを使用した実装2 »

最近のトラックバック

2025年3月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31