豆腐とコンソメ

豆腐とコンソメ

もろもろのプログラム勉強記録

RaspBerryPiでラジコンをつくる(8):コントローラをつくる

tohutokonsome.hatenablog.com

とりあえず簡単なコントローラーができたので、日記がてら書きます!

ここでは、初歩的にPCのコンソール画面からキーボードで操作することを目標にやってみます。

全体図は以下になります。
f:id:konoemario:20170515231731j:plain:w500

コントローラ部分

キーボードから入力した値を、socket通信でRaspBerryPiZeroに連携します。
具体的には、以下の制御で動かそうと思います。

  • W:前進
  • S:後退
  • A:タイヤの向きを左に
  • D:タイヤの向きを右に

キーボード入力の値は、input関数なんかは

①キー入力
②Enter

という操作をしないといけなくて、煩わしいので以下の記事を参考(というかそのまま)にさせていただきました。
「termios」というpythonモジュールを使用することで、Enterを押さずして、1文字ずつ値を取得できます。

取得した文字は、取得するたびにsocket通信でRaspBerryPiに送信します。

※参考にさせていただいた記事
Pythonでキー入力を検出する(Enter無しで) - Qiita
Pythonによる通信処理 - Qiita

実際のコントローラーの制御は、以下の通りです。

legocarの制御(コントローラー)

そもそも、PC側にコントローラーを用意しなくても、RaspBerryPiにSSHでログインして、直接操作することも、もちろんできるんだけれども、せっかくなのでsocketで通信することにした。

ちなみに接続方式は、アドホックで接続しています。
ラズパイをアドホック接続で使用する - 豆腐とコンソメ

余談というか後で改善するところ

「termios」によるキーボード入力を検知する方法もよいのだけでども、キーボードイベントをもっと手軽に取得したかった。
(特定のキーをおしっぱにしている状態を検知するとか)

参考にさせていただいたサイトにもあるんだけれども、「msvcrt」モジュールが、どうやらそれっぽい。
ただ、Windowsでしか動かないみたいなので実装は見送った。

これ以外にも、pythonのゲームライブラリである「PyGame」やその後継?の「PySDL2」なんかも試したが、とりあえず「termios」で落ちるついた。
これ以外にも、ホットキーを割り当てるいい感じのモジュールがありそうだったので、検証しだい別途まとめます。


受信部分

今度はRaspBerryPi側に置くコードです。

以下の機能ごとにモジュールを作成しました。

  • クライアントのsocketのデータを取得してレゴカーを制御する機能に値を渡す。
  • 受け取ったデータをもとにレゴカーを制御する。

実際のコードは以下の通りです。

クライアントからの命令を受信して、レゴカーに渡す

レゴカーの制御

受信部分に関しての課題

  • アクセルとハンドルが並列で処理できるようにする
  • socket通信をもう少ししっかり学ぶ

blog.amedama.jp