Rover C ProをRaspberryPiとObnizで動かしてみる(その1)

  • 2021.05.05
  • IoT
Rover C ProをRaspberryPiとObnizで動かしてみる(その1)

アメコミ好きな方ならその傍に出てくるガジェットに一度はワクワクした人も多いんじゃないでしょうか.
私もその一人です.
そこで現在、小型で自由自在に遠隔操作できるラジコンを制作しております.
狭かった門も開かれ手軽にガジェットが作れるこの時代、先人の知恵なども駆使していけばどうにか作ることができるんじゃないかと奮闘した過程をこれからこの場を使ってまとめていく予定です.(作業中のメモを備忘録としてブログにまとめていきます.)

仕様

スマホからRover C Proを遠隔操作します.
具体的にはサーバー経由でObnizを動かし、Rover C Proを接続したラズパイとBluetoothで接続します.
ラズパイとRover C ProはI2C通信でやり取りを行い、Obnizから受け取ったデータをラズパイ側で書込用に変換した値を元にRoverCが動き回ります.

また、屋外からだと状況が分からないのでカメラをラズパイかRover C Proに直接装備させ、FPS視点で操作できるようにもする予定です.

今回すべてやると長くなりすぎるので、まずはラズパイからRoverCを動かすとこまでをまとめていきます.

機材

今回の記事で扱うものを載せます.

Obniz:https://obniz.com/ja/products/obnizboard
Raspberry pi:zero:https://www.switch-science.com/catalog/3200/
Rover C Pro:https://www.switch-science.com/catalog/6617/

Rover C Proセット内容

本体、アーム(サーボモーター)、取り付け用ネジ等細かいパーツが付属.
箱も小さいが、内容もかなりシンプルです.

RoverC

本来はM5Stickを取り付けて動かすものですが、製造元ページ(https://docs.m5stack.com/#/en/hat/hat_roverc_pro)をみる感じ、I2Cで動かせるっぽいのでラズパイでも何とかなるはず.
ということでラズパイとワイヤーで無理やり繋いでみた↓

ラズパイと繋ぐ

Rover Cのピン配置はM5Stickと同じ(下記画像上部)です.
(以下から拝借)
https://lang-ship.com/reference/unofficial/M5StickC/

M5StickCピン配置

I2C(アイスクエアドシー)

デバイスを制御するマスター(今回の場合だとラズパイ)と、マスターからの指示で制御される側をスレーブ(RoverCPro)を繋ぐことでお互いにデータのやり取りが可能となるシリアル通信方式の一種.
データのやり取りを行うSDA(シリアルデータ)、通信のタイミングを測るSCL (シリアルクロック)、そして5V、GNDの4本を繋ぐことが基本となる.

ラズパイからスレーブ側のレジスタにデータを書き込むことでモーターを回したり、また、別の端末の話になるが温度センサーから温度を読み取ったりとできるみたい.概要だけ知ると簡単にできそうに思えてしまう.

また、繋ぐ際には識別用のI2Cアドレスも必要となる.ここのアドレスを指定することで対象の機器と通信ができる.
これはRover Cの製造元ページから「0x38」であることを確認したが、ラズパイからコマンドでも確認できるみたいなので、せっかくならこちらでも確認したいところ.

I2C

ラズパイからスレーブ側のI2Cアドレスを調べる

製造元のページからでも確認できそうだけど興味本位でやってみます.
「i2cdetect 1」で接続されているI2Cデバイスのアドレスが表示されます.(引数の1はラズパイのI2Cのチャンネル番号で固定です)

下記が実行結果です.「0x38」と「0x1a」が見つかりました.
前述の通り、モーター制御は「0x38」から行えます.「0x1a」は現時点では分かりません…

I2Cdetect

I2Cアドレスから更にレジスタを調べる

こちらも興味本位.
「i2cdump 1 0x38」で調べてみます.

i2cdump

上図の赤枠を見て、その足した合計がアドレスになります(上記だと21).
モーターは「0〜3」のアドレスを書き換えることで制御できます.
ちなみにサーボモーターは「10」と「11」で制御可能です.

実際に通信してみる

まずはモーターを動かしてみます.
ここからはラズパイ側でPythonで行っていきます.
結論から申し上げますと以下のコードで直接モーターを回すことができました.(-127~127の範囲で16進数指定)

また、以下のように書き込むことでサーボが制御できました.(0~180(16進数で00~b4)を指定)

以下の赤丸の所が「0x10」レジスタで制御できる端子です.

サーボ配線

とりあえずモーターの制御方法さえわかれば形にはできそうなので、ラズパイ4での検証はここまで.
あとはこちらのPC(vscode)でプログラムを書き、本番環境であるラズパイzeroにて動かし、まずは原型を作っていきたいです.(カメラなどはそのあと)

メカナムホイール

車輪に更に車輪がついています.
この4つのホイールの正転、逆転を組み合わせることで四方八方滑らかに動かすことが可能になります.

メカナムホイール

以下は旧型RoverC(https://docs.m5stack.com/#/en/hat/hat-roverc)の製造元ページからお借りしました.
各ホイールの動きに対する本体の進む方向がまとめられています.

roverc_hat

その他参考にしたサイトを以下に載せます
・メカナムホイール制御方法
https://qiita.com/coppercele/items/1596b7b9904eb4403191
・RoverC(旧型)
https://docs.m5stack.com/#/en/hat/hat-roverc

ファイルをラズパイ側に転送する

ラズパイzero単体で開発をするのは面倒なのでPCでプログラムを作ってからラズパイに送る形式としたい.
Macからラズパイへ送る場合は以下のようにscpコマンドで送る.

$ scp ファイルパス pi@ラズパイのアドレス:/home/pi/
(/home/piは送り先)

PC側のテキストエディターでプログラムを編集→ラズパイにscpコマンドで送信→以後はコマンド履歴から簡単に送れるのであまり手間もなくラズパイ側へ変更が反映できるようになる.
※ちなみにWindowsから送りたい場合はTeratermでSSH接続をした後、そのコマンドプロンプトに向かってファイルをドラッグ&ドロップするだけなので非常に簡単.

ラズパイで動かしてみる

まずはコードから.
こちらは公式のGithub(https://github.com/m5stack/M5StickC/blob/master/examples/KIT/JoyC_%26_RoverC/Remote/Remote.ino)とMoke Nakamura様(https://qiita.com/coppercele/items/1596b7b9904eb4403191)のコードを参考にしてPython向けに書いてみました.

前述したようにラズパイとRoverCを接続し、上記のコードをラズパイで実行することで動き始めます.
コード上のグローバル変数であるf,b,l,rが操作スティックの倒し具合(0.0〜1.0)をfloat型で持っています.
また、右左回転はrr,rlです.

これと 進む向きに対する左前、右前、左後、右後4つの車輪のエネルギーをまとめた「FORWARD」、「LEFT」、「BACKWARD」、[RIGHT」、「ROTATE_R」、[ROTATE_L」を組み合わせて進む向きとスピードを計算します.
以下に簡素ではありますが計算方法を図にしてみました。
図の通りだと、右前輪と左後輪を正転することで左斜め前に進めることがわかります.

メカナムホイール計算方法

前の方でも載せましたが、こちらの画像と比べると更にわかりやすいと思います.
(https://docs.m5stack.com/#/en/hat/hat-roverc)

roverc_hat

そしてこちらが実行結果です.
前進、左平行、後進、右平行、停止、右斜前、右斜後、左斜後、左斜前、右回転、左回転、停止の順番で動作する.

今回はRoverC搭載のバッテリーでこのように(運良く?)動かすことができたものの、これ以降はラズパイへの給電不足が原因かうまく動かなくなった.
なのでラズパイ用に別途バッテリーを準備した方が良さそう.

終わりに

今回はラズパイとRoverCでの検証のみとした.
ラズパイ用の外部電源はすぐには準備できないのでしばらくはUSBからの供給で賄う.
次回からはObnizから操作できるようにする予定です.