2015/10/13

加速度センサ(ADXL345)を使ったWi-Fiラジコン・コントローラ

加速度センサ(ADXL345)を使ったWi-Fiラジコンカーのコントローラを作りました。
スマホを使えない幼児向けのコントローラになります。
ESP-WROOM-02にI2Cで3軸加速度センサ(ADXL345)を接続します。
コントローラからWi-Fi AP(SoftAP)モードのラジコンカーに接続し、UDPパケットで左右のモータの速度制御データを送信します。
UDPパケットをiOSCの形式に合わせることでラジコンカー側の変更を不要にします。
このコントローラをおもちゃの「魔法の杖」とか「おきあがりこぼし」などに組込めば面白いかと・・・(^-^;

操作方法

操作の方法

これを使って操作してみました。

コントローラ全体

コントローラ全体

ベースボードとCPUボード

ベースボードとCPUボード

ベースボードの背面

ベースボードの背面

ラジコン・コントローラ回路図

ラジコン・コントローラ回路図

送信機ソースコード(main)

送信機ソースコード(ADXL345)


この記事へのトラックバック URL :

    Trackbacks:0

    コメント:10

  1. 初めまして、何時も楽しく拝見させて頂いてます。
    70歳を過ぎた工作好きの爺さんParadiseと申します。

    私は以前より、スマホを使わずにESP8266のUDP通信にてROBOTSを制御
    したいと考えてましたが、何せプログラムが超初心者で自分でスケッチを書く事が出来ません。

    受信回路の方はアンドロイドスマホから上手く制御出来てますが、送信回路の方が上手く働きません。ADXL345は働いてるようですが、DATAを送信できてないようで、原因の特定が出来ていません。

    お忙しいと思いますが、時間の有る時で結構ですのでご教示をお願いします。

    以下にシリアルモニターのデータの一部を添付しましたので宜しくお願いします。

    ADXL345 OK
    Connecting to ESPCar
    …..
    WiFi connected
    IP address: 192.168.4.2
    Starting UDP
    Local port:10000
    stat=0
    12 0 – 1
    11 1 – 2
    途中省略
    11 0 – 21
    stat=1
    12 0 = 64 64
    13 2 = 64 64

    また、この送信機が上手く完成したら、加速度センサーを任天堂Wiiヌンチャクのジョイスティック(I2C信号出力)に替えて操作出来れば使い易いと考えてます。(構想だけですが!)

    長くなりましたが、宜しくお願い致します。

  2. Paradise様
    ===
    ADXL345 OK
    Connecting to ESPCar
    …..
    WiFi connected
    IP address: 192.168.4.2
    Starting UDP
    Local port:10000
    stat=0
    12 0 – 1
    11 1 – 2
    途中省略
    11 0 – 21
    stat=1
    12 0 = 64 64
    13 2 = 64 64
    ===
    提示されたログ内容には異常な点はありません。
    「stat=0」から「stat=1」までは、コントローラが水平状態になるのを待っているログです。
    「stat=1」が表示された以降、コントローラーの傾斜度に応じた左右のモーターの回転指示を送出します。
    「12 0 = 64 64」では、傾きが少ないために回転指示は「64=静止」です。
    回転指示値は、0 から 127 で 0=最大逆方向回転、64=静止、127=最大正方向回転としています。
    「13 2 = 64 64」以降のログをご確認ください。

    また、「stat=0」から「stat=1」までの間は、ラジコンカー側のLED(ヘッドライトのつもり(^-^;)が速い点滅をします。
    この点滅は、UDPパケットで「ON」と「OFF」を交互に送出しています、この点滅が始まることでラジコンカーとコントローラーのWi-Fi通信が確立されてUDPパケットが送出されていることが確認できます。
    解決しない場合は、再度ご連絡ください。

  3. gojiさま、早々のご返事有難うございます。

    今朝から再度テストを行いました。
    先ず、「13 2 = 64 64」以降は角度に応じた数値の変化を確認出来ていましたが、書くのを怠りお申し訳ありません。

    「stat=0」から「stat=1」までの間のラジコンカー側のヘッドライトの点滅がしないので、この辺り(UDP送信)に何か問題があるようです。

    スケッチコ-ドのコピーですが、前にADXL345のソースコードを、後にmainのソースコードを配置しましたが、手順に問題ないでしょうか?。

    お忙しところを申し訳ありませんが、アドバイスをお願い致します。

  4. Paradise様
    投稿したソースコードで再実験しましたが、問題は見つけられませんでした。
    受信側にデバッグコードを書いて、受信できていないのか、受信した内容が期待している形式と異なっていないかをチェックするしかないかと思います。

    「前にADXL345のソースコードを、後にmainのソースコードを配置」
    問題ないと思いますが、私は下の画像のようにしています。
    (▼ボタンをクリックで「新規タブ」を選択するとタブが増やせます)

    ArduinoSub


  5. gojiさま、お手数をお掛けして申し訳ありません。

    今朝から注文してたWroom-02が届いたので送信回路、受信回路共に作り替えてテストしましたが、結果は同じでした。
    最初に送信側から受信側に対してATコマンドでのssid, passのやり取りやlocalPortの取得、その後のStarting UDPまではOKのようですが、データーの受信が出来ません。

    gojiさまのアドバイスのように受信側にデバッグコードを書いて、受信できていないのか、受信形式等をチェックするしかないようですが、情けないことにソフトウェアが素人なのでデバッグコードが書けず、本日はここで止まってしまいました。

    何か良い方法が有ればアドバイスをお願い致します。
    ご無理を言って申し訳ありません。 by Paradise

  6. Paradise様

    「ESP-WROOM-02 Wi-Fiラジコンカー」にある受信側のソースコード「ESP8966CAr.ino」にデバッグコードを書き加えてみてください。

    元のソースコード(83行目から)

    元のコードを下記のように書き換える(83行目から)

  7. gojiさま、ご親切なアドバイス有難うございます。

    このプリント文はアンドロイド版受信コードに入ってたので使ってました。
    スマホから受信するとシリアルモニターにDATAが表示されるのですが、送信機からの信号が入りませんでした。
    私はESP8266のソース書き込みに自作のNodeMcuを使ってるので、次の方法を試してみました。(ArduinoIDE1.6.8を使用)
    マイコンボードの選択箇所のDebug PortをSerialにDebug LevelをWiFiに設定して受信側ソースコードの書き込みを実行すると、シリアルモニターにWiFiの受信状況が表示されました。
    その結果、スマホからの受信モニターは次の通りです。
    AP IP address:1992.168.4.1
    Starting UDP
    Local port:10000
    wifi evt:7
    add 1
    aid 1
    station: 00:1e:ad:8b:96:ab join, AD = 1
    wifi evt:5
    wifi evt:7
    F=0, C=0,L=110,R=109
    とDATAがシリアルモニターに表示されます。
    次にESP8266送信機からの受信モニターでは
    AP IP address:1992.168.4.1
    Starting UDP
    Local port:10000
    wifi evt:7
    err already associad!
    station: 18:fe:34:ee:5d:db Leave, AD = 1
    rm 1
    wifi evt: 6
    wifi evt: 7
    add 1
    aid 1
    station: 18:fe:34:ee:5d:db join, AD = 1
    wifi evt: 6
    wifi evt: 7
    とモニターされ、先にLeaveが出るのでjoinしてもタイミングの遅れにより受信できないのではと考えます。
    受信機側でjoinを確認後、受信動作をスタートするようにすれば受信できるのではと考えますが、Loopの最初にそのコードを記述する方法が判りません。暫く試行錯誤してみたいと思います。

    余談ですが、先に教えて頂いたArduinoIDEのマルチタブはVer1.6.7のバグでScopeエラーが出て使えなかったのですが、3日前にリリースされたVer.1.6.8でバグが解消されて使えるようになりました。

    長文になりましたが、初心者の私にお付き合い頂きまして感謝いたします。有難うございました、今後ともよろしくお願い致します。

  8. gojiさま、先に送りました文章に一部誤りがありました。
    AD = 1をAID = 1に訂正します。
    宜しくお願いします。

  9. gojiさま、お忙しい処を何度もすみません。
    その後色々調べましたが、エラーの原因が判ってきました。
    しかし、老人の頭では対処方法が判りません!
    受信機側シリアルモニターのエラーコードを記します。
    AP IP address: 192.168.4.1
    Starting UDP
    Local port: 10000
    wifi evt: 7
    add 1
    aid 1
    station: 18:fe:34:ee:5b:db join, AID = 1
    wifi evt: 5
    Fatal exception 2(InstructionRetchErrorCause):
    epc1=0x3ffe8ff8, epc2=0x00000000, epc3=0x00000000, excvaddr=0x3ffe8ff8, depc=0x00000000

    Exception (2):
    epc1=0x3ffe8ff8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffe8ff8 depc=0x00000000

    ctx: sys
    sp: 3ffffe00 end: 3fffffb0 offset: 01a0

    >>>stack>>>
    3fffffa0: 3ffe8ff8 40000f49 3fffdab0 40000f49
    <<<stack<<<

    ets Jan 8 2013,rst cause:2, boot mode:(3,7)

    load 0x4010f000, len 1264, room 16
    tail 0
    chksum 0x0f
    csum 0x0f
    ~ld
    ご無理を言って申し訳ありませんが、このコードで原因が特定できるようでしたら、対処方法をお教え下さい。

  10. gojiさま、暫くぶりです。
    その後、UDP通信のテストを続けてましたが、子機と繋がらない原因がWROOM-02にあることが判りました。
    10個買って正常なのが3個しかないのには驚きました。ただ、ATモードでは問題なくUARTモードで問題が起きますが、1個だけファームウエアーを書き換えたらOKなのが有りました。Webで検索しても不良品の情報が無いのが気になります。
    私は、ニンテンドウのWiiヌンチャクにWROOM-02を組み込みUDP通信が出来るようになりましたが、この過程で不良品に気付きました。 以上、報告を兼ねてのお便りでしたが、これにて失礼します。有難うございました。

Leave a comment