WebIOPi からの DC モーター制御 – Raspberry Pi でラジコン戦車 –


■WebIOPi からの DC モーター制御 – Raspberry Pi でラジコン戦車 –

[2018 年 4 月 30 日追記]
——————————————————-
Raspberry Pi を使い、

ブラウザから DC モーターやサーボモーターを操作して、

監視カメラ付きラジコンにする方法については、

Raspberry Pi でブラウザから操作できるラジコン戦車を作る!

にまとめたので、こちらを見ていただきたい。
——————————————————-
前回、コンソールから DC モーターを動かすことに成功した。

が、ラジコン戦車である以上、遠隔で操作できないと意味がない。

とはいえ、リモコンを別途作るのは大変。

よって、

ブラウザから操作できるライブ(監視)カメラを作る!

でやったのと同じ様に、

・WebIOPi を使ってブラウザ経由で操作する

という形を実現してみた。

具体的にやったことは、

・ライブ(監視)カメラと共用可能なブラウザ画面の作成

・python コードの作成

・動作確認

の三つ。

以下、それぞれ備忘録代わりに記載しておく。



■ブラウザの画面を作成する

既に、

ブラウザから操作できるライブ(監視)カメラを作る!

で、

・専用カメラモジュールからの画像表示

・パンチルトキットを動かすサーボモータ制御用ボタン

については作成していた。

サーボモータ制御用ボタンとしては、

上、下、左、右、に加えて真ん中に初期位置ボタン

の五つを十字ボタンのように配置していた。

ラジコン戦車の制御用としても、結局の所、

前進、後退、右転回、左転回、停止

の五つ。

ということで、結局はサーボモータ制御用ボタンを流用できる。

となれば、あとはボタンの配置位置を考えればよい。

私の場合は、

・スマホのブラウザをリモコン代わりにする

ということを想定している。

が、専用カメラモジュールからの映像を配置すると、

縦長ではどうしても各種操作用ボタンの配置に困る。

なので、あたかもゲームのコントローラーのように、

スマホを横にした状態で使うことを考え、ボタンを配置した。

具体的な html の内容は追って記載するが、

・body 部分を 1 行 3 列の table にする

・1 列目にラジコン戦車操作用ボタンの table を入れ子で配置

・2 列目は専用カメラモジュールの映像配置

・3 列目は監視カメラ操作用ボタンの table を入れ子で配置

という形にすることで、

・左側の十字ボタンで戦車の制御

・右側の十字ボタンでカメラの制御

・その結果である映像は真ん中でみる

ということを実現。

具体的にはこんな感じ。

DC モーターの制御をちゃんとやるために、

配線等を確認したかったこともあって、

一旦専用カメラモジュールやサーボモータ用の配線を

取っ払ってしまったため、真ん中の映像部分は未完。

ただ、これで一応思った通りの配置にはできた。

後はボタンの大きさをもうちょっと大きくしたいのだが、

まぁとりあえずはよしとしよう。



■python コードを作成する

画面は無事レイアウトできたので、

後は WebIOPi を使って、

ブラウザ上の操作に対応する python コードを作る必要がある。

最初は、

RaspberryPi3で作るラジコン
https://qiita.com/imcuddles/items/c05cbea95db1f7469fed

に記載のコードを使って実現してみた。

が、案の定と言ってはなんなのだが、全く動かない。

というのも、私の環境のせいだとは思うのだが、どうも、

・WebIOPi を使った PWM 信号の制御

が上手くいかないのだ。

が、そんなトラブルは、既にサーボモータ制御時に経験済である。

サーボモータ制御時には、pigpio を使うことで回避した。

ということで、今回も同様にすればよいはずである。

そう考え、早速、以前作ったサーボモーター制御用の

python コードに DC モーター制御用のコードを追加。

具体的には、

      # ラジコン戦車用パラメータ設定
      tank_right_f = 9
      tank_right_b = 11
      tank_left_f = 18
      tank_left_b = 17

で戦車の車輪に繋がっている DC モーターを

制御するための GPIO ピン番号を定義。

今回は、

・右車輪正回転(前進)制御が GPIO 9 番ピン
・右車輪逆回転(後退)制御が GPIO 11 番ピン
・左車輪正回転(前進)制御が GPIO 18 番ピン
・左車輪逆回転(後退)制御が GPIO 17 番ピン

としているため、このように定義している。

続いて、setup 関数部分に、

ラジコン戦車用の GPIO ピンを設定。

具体的には、ラジコン戦車用の各 GPIO ピンを

OUTPUT

に設定している。

      def setup():
      # 監視カメラ用 GPIO ピン設定
      GPIO.setFunction(pin_pan, GPIO.PWM)
      GPIO.setFunction(pin_tilt, GPIO.PWM)
      pi.set_servo_pulsewidth(pin_pan, pos_pan_def)
      pi.set_servo_pulsewidth(pin_tilt, pos_tilt_def)

      # ラジコン戦車用 GPIO ピン設定
      pi.set_mode(tank_right_f, pigpio.OUTPUT)  
      pi.set_mode(tank_right_b, pigpio.OUTPUT)  
      pi.set_mode(tank_left_f, pigpio.OUTPUT)  
      pi.set_mode(tank_left_b, pigpio.OUTPUT)  

なお、本コードの冒頭において、

      import webiopi
      import pigpio

      GPIO = webiopi.GPIO
      pi = pigpio.pi()

を定義していることに注意されたい。



必要な定義が終わったら、実際に動かすための関数を定義。

例えば、両輪を正回転させて戦車を前進させるための関数。

    @webiopi.macro
    def tfront():
      #前進
      pi.write(tank_right_f, 1)
      pi.write(tank_right_b, 0)
      pi.write(tank_left_f, 1)
      pi.write(tank_left_b, 0)

右車輪に割り当てた GPIO ピンのそれぞれに対して、

・tank_right_f ピンを 1
・tank_right_b ピンを 0

と設定することで、右車輪を正回転にしている。

と同時に、左車輪に関しても、同様に正回転にすることで、

・両輪を正回転させる

という形を実現し、前進させることができる。

これさえできれば、後は簡単。

右回転の場合は、

・右車輪を逆回転
・左車輪を正回転

とし、左回転の場合は、

・右車輪を正回転
・左車輪を逆回転

とすればよい。

後退は前進の逆の信号を入れればよい。

なお、停止の場合は、全部 0 でもよいが、

これだとどうもニュートラル状態になる様である。

なので、ちゃんと止めたいならば、

・全部 1 に設定する

方がよいと思われる。



■動作確認

上述の準備をした上で、WebIOPi のサービスを起動する。

なお、WebIOPi は、

・pigpiod が立ち上がっていないと、起動しない

という条件があるので、気をつけた方がよい。
*しばらく触ってなかったから忘れてた。

なので、

      root@raspi-03# pigpiod

として、pigpiod を立ち上げておき、

      root@raspi-03# /etc/init.d/webiopi start

で WebIOPi を起動させる。

その後、

http://localhost:8000

にアクセスし、ログインした後、

前述した画面で戦車側を動かしてみると、無事動いてくれた!

本当は動画で up したかったのだが、それはまた後日に。

なお、実際には、動かすまでにはちょっとトラブったりもした。

これも合わせて記載しておく。

1. WebIOPi が上手く起動しない

上述したとおり、

      root@raspi-03# /etc/init.d/webiopi start

とすると、OK というのが出るのだが、実際に

http://localhost:8000

にアクセスすると、繋がらない、という事象が発生した。

どういうことか?と思いつつ、

      root@raspi-03# service --status-all

で起動中のサービスを見て見たところ、

      [-] webiopi

となっていて、起動していなかった。
*起動していると、[-] の所は [+] となる。

なので、

      root@raspi-03# webiopi -c /etc/webiopi/config -d

としてデバッグモードで起動してみた。

すると、何だか python コードのエラーで落ちてた見たい。

python コードの方を修正してあげると、無事起動した。

2. 意図通りに動かない

WebIOPi の起動も無事に実行できたので、

ブラウザ上で前進ボタンを押してみた。

すると、右車輪だけは勢いよく回ってくれるのだが、

左車輪が反応しない。

おいまぢかー、と思いながら、左転回ボタンを押してみると、

ちょっとしてから左車輪側も正しくまわり始めた。

その後は前進、後退、右旋回、左旋回、停止のすべてが

正しく動いてくれた。

どうも、パワー不足のせいか、左側が弱い。

正しく動いた後も、左側の回転が右側に比べて若干遅い。

これだと直進せず若干左に曲がっていってしまいそう。

とはいえ、一応意図通りには動かせてそうなので、

とりあえずこのままで様子をみることにする。



■完成に向けて

取り合えずこれで、

・ブラウザから DC モーターを制御する

と言うところまでは無事出来たことになる。

なので、後やるべきこととしては、以下の物がある。

1. カメラ画像を出せるようにする

DC モーターが動かないと悩んでいた際、

配線を確認するために、一旦サーボモータ制御用配線を抜いている。

また、以前 サーボモーター制御用に使っていた

GPIO を、DC モーター制御用に使ったりしている。

なので、この状態から、再度サーボモータ制御用の

配線をやり直す必要がある。

多分そんなに苦労しないとは思うが、一応要注意か。

2. 車体を完成させる

今はとりあえず、各パーツを車体の板に載せてるだけ。

ギアボックス、ブレッドボード、ラズパイなどは、

全部固定されていない。

また、電池ボックスも載せきれていない。

なので、これらをちゃんと板の上に載せて、

固定化し、ラジコン戦車として動く形にしないといけない。

が、今今の状態を見ていると、

・板にすべてを載せるのはちょっと使い勝手がわるい

のではないか、と思っている。

というのも、電池を結構食うっぽいので、

電池交換はしやすい形にしたいが、

それだとラズパイの上に電池ボックスを載せる必要がある。

さらにいうと、ラズパイ自体の電源もいるので、

この辺を最適配置しないといけないが、結構難しそう。

だとすると、やっぱり、

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)
by カエレバ

 

を使って、二段組にしないと無理なような気がしてきた。

あと、モバイルバッテリーがないと、ラズパイの電源が取れない。

さらにいうと、DC モーターの電源も、電池だと切れることがあるので、

出来ればモバイルバッテリーから供給できるようにしたい。

そうなると、USB マイクロのインターフェースを

ブレッドボードにさせるような形にしないといけない。

追加購入となりそうだが、せっかくここまで出来ることがわかったので、

色々検討してみようと思う。



いやぁ、しかし長かったが、

なんとか意図通り動かせる所までやってきた。

後は車体を再構築してモバイルバッテリー買って、

WiFi アクセスポイント化

でやったように WiFi アクセスポイントにしてあげれば、

ローカルネットワークではあるが、

監視カメラ付きラジコン戦車

が出来上がるはずである。

このサイトのコンテンツとして、

Raspberry Pi で電子工作、

を掲げた時には、正直な所、

・自分ごときに本当にできるのか?

・どうせ途中で飽きるんじゃないの?

なんていう気持ちがあったのも事実。

また、

ブラウザから操作できるライブ(監視)カメラを作る!

を完成させた際にも、

・ここまでやればもう十分ではないか?

・また無理してハマるよりも、ここで終わっておけば?

などという弱気の虫が現れたのも事実。

が、

「たかがそれぐらい出来ずにどうする!」

となんとか自分を奮い立たせてここまできた。

予想通り諸々ハマったが、諦めずによかった。

最終的な感動は、車体を完成させて、実際に

ラジコンとして動かせるまで置いておこうと思うが、

目の前で意図通り DC モーターが動いてくれているのは、

本当に嬉しい限りである。

完成までもうちょっと!

気を抜かずに頑張って行きたい。


Copyright (c) 2017 Webmaster of this site All Rights Reserved.
カテゴリー: ブログ, ラズパイで電子工作 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください