M5CAMERAでラジコン戦車作ってみた〜【Part1: ハードウエア組み立て】
趣味でM5CAMERA使ってラジコン戦車つくりました^^)
この記事では、ハードウエア組み立てについて紹介します
完成品の姿
完成品はこんな姿です。
身の回りにあるものでお金をかけずにつくっているので、素朴な仕上がりです^^;
動かしている様子はこんな感じ
↓
戦車を選んだ理由
モータドライバICの役割と仕組み
上の図1で説明した戦車の動きを実現するためには、モータの回転方向を切り替える必要があります。そのためにモータードライバICを使いますが、ここで簡単に原理を見ていきたいと思います。
モータは、図2のように、電池をつなげば決まった方向に一定の速度で回転します。
逆回転させるためには、電池のプラスとマイナスを逆に接続を変える必要がありますが、モータドライバICを使うと、モータに流す電流の方向を変えたり、電流の大きさを変えることができます。
モータドライブICは、図3のように電池とモータを4つのスイッチ(Sw1~Sw4)でつなぐ内部構造になっています。このスイッチは、手動のスイッチではなく、プログラムで命令すると電気的にON/OFF可能なスイッチです。今はSwがすべてOFFでモータは停止しています。
プログラムによる命令で、下の図4のように、Sw1とSw4をONにすると、電気回路が図2と同じ接続状態になるので、モーターは正回転します。
これとは逆に、Sw2とSw3をONにすれば、次に示す図5のようにモータを逆回転させることができます。
モータドライバICは、さらにSw1とSw2およびSw3とSw4のONとOFFの時間比率であるデューティー比を0対100から100対0の間で変化させることで、モータの両端に印加される電圧の平均値を変化させて、モータに流れる電流量をコントロールすることも可能です。これをPWM制御と言います。これなら、モータのトルクも自由に変えられますね。
ギヤ比の選び方
ギヤBoxは、タミヤ 楽しい工作シリーズ No.227の中にふくまれていますが、タミヤの楽しい工作シリーズ、No.168 ダブルギヤボックスとして単体でも売っています。
黄色と青の歯車の組み合わせを変えることで、ギヤBox全体のギア比を、以下のA~Dの4種類に設定できます。この値は説明書に書かれている、3V駆動時の出力軸の実測データです。
タイプ ギヤ比 回転トルク 回転数
A 12.7:1 94 gf•cm 1039 rpm
B 38.2:1 278 gf•cm 435 rpm
C 114.7:1 809 gf•cm 115 rpm
D. 344.2:1 2276 gf•cm 38 rpm
ギヤ比とトルク、ギヤ比とスピードの関係をグラフにしてみました。
左のグラフのように、ギヤ比とを上げると大きなトルクが出せますが、右のグラフに示されるように、スピードは下がります。自転車のスタート用の1段ギアをイメージしてください。大きなトルクが出せるので、軽い力で上り坂も登れますが、その分多くの回数ペダルを回す必要があるのでスピードはそれほど上がりません。
今回は、モータドライバICの最大電流が0.2Aとかなり小さい値に制限されていることと、狭い部屋の中で微妙なコントロールをして遊ぶことを想定して、Dタイプの低速で大トルクのギヤ比を選択しました。
使った部品の紹介
使った部品と購入の参考となるリンクを貼っておきます。
M5CAMERA
ラジコンカーの頭脳と目となる部品です。
ここから購入できます、安い!
詳細は、今後のプログラム紹介で触れたいと思います。
本体
こちらの、タミヤ 楽しい工作シリーズ No.227 カムプログラムロボット 工作セット 70227を使いました。筐体+キャタピラ+モータ+ギアのセットです。
モータードライバIC
ケーブルとHUB
ケーブルはM5STACK用のGROVEケーブルを使いました。電源とI2Cを一体にした4本線をまとめたコネクタ付きのケーブルです。
M5Stack用GROVE互換ケーブル 10 cm(5個入り) - スイッチサイエンス
できるだけ短いケーブルがほしかったので10cmを購入しました。
電源を電池ボックスから取っているため、M5CAMERA、モータドライバIC、電池ボックスの3部品を接続する必要があったため、HUBを使いました。
電池ボックス
電池ボックスは、家にあったものを流用しました。
単四のエネループ4本で、1.2V×4=4.8Vで動かしています。
乾電池も安く無いので、充電可能なエネループをつかいました。
マスキングテープ
M5カメラを戦車に固定するために、貼り直しやすいマスキングテープを使いました。
部品の接続
部品は下図のように接続ています。
部品を使っている場所と、部品の形状を下記の動画にまとめたので組み立ての参考にしてください
以上、簡単ですがラジコン戦車の組み立てについての紹介でした!
M5CAMERAで、ストリーミングカメラ映像見ながら遊べるWiFiリモート戦車作ってみた
M5CAMERA使ってラジコン戦車作ってみました
ストリーミングカメラの映像見ながら、スマホから操縦できます!
小学生の息子が別の部屋から操縦して、月面探査機みたく遊んでいます。
↓こんな感じ
作ってみると色々な勉強になったので、おいおい製作方法を備忘録として残そうと思います。今回は、とりあえず概要ということで。
ハードウエア
- 本体とキャタピラ、モータ・ギアはタミヤの教育用工作キットです
- 左右2つのモータの回転方向とスピードをコントロールするために、モータドライバIC GROVE - I2C ミニモータードライバ - スイッチサイエンス を使いました。Amazonで扱っていないのでスイッチサイエンスさんのリンクを貼っておきます
- バッテリは、充電して何度もつかえる単四型のエネループを4本使っています。1.2x4=4.8Vで、M5カメラ本体とモータドライバIC両方に給電しています
- それぞれのパーツの電気接続はグローブケーブル使いました
部品を使っている場所と、部品の形状を下記の動画にまとめたので組み立ての参考にしてください
ソフトウエア
操縦画面はこんな感じです。
カメラの映像を中央にして、左右のキャタピラを動かすための前進・後退用スライダーを付けました。左右のキャタピラを反対方向に動かすと、その場でクルクルと回転します。
- 操縦画面はホームページを作成する要領でHTMLで作りました
- M5カメラ側でHTML表示用のウェブサーバーを動かし、そこにスマホからウェブブラウザでアクセスしてスマホの画面に表示させています
- スマホとM5カメラは、WiFiでつながっています
- ウェブサーバーは、マイクロパイソンで動かすことのできるpicowebサーバー
- スライダーを動かすと、htmlファイル内のjavaScriptがスライダーの状態に応じた変数を、xmlHttpRequestを使ってサーバーに通知します
- 通知を受けたサーバ側は、スライダーの状態を受け取り、モータドライバにI2Cで命令を送ります。この部分はPythonで書いています
工夫したところ
スマホ側での操作は、HTMLの状態変化として認識されますが、スライダーを動かすたびにhtml全体を更新すると、カメラのストリーミングも再読み込みされてしまい、数秒間映像が途切れてしまいました。カメラのストリーミングに影響を与えることなくスライダーの操作を行うために、htmlの必要な部分のみを更新させる、Ajaxと呼ばれる方法を使っています。
この方法で出来た! M5STACKにMicroPythonファームウエアをMacBookAirからインストールする方法
背景
M5STACKをMicroPythonで開発するためのファームウエアをインストールする手順を備忘録としてまとめました。
このページで伝えたいこと
最低限の手間と時間で、Pythonを使ったM5STACKの開発が始められる事を目指しました。自身、ネット上のいくつかの方法を試しましたが、うまくいかないものがあまりに多いことに驚きました。同じような困りごとにぶつかっている人が、理屈はさておき前に進められるようにと思い残しました。
ゴールイメージ
ゴールは、M5STACKとPCをUSBケーブルでつないで、パイソン対話モードでM5STACKを動かせること。今回はティスプレイに文字を表示するHello worldプログラム、すなわち
と打ったら、この写真のようにディスプレイ画面に表示されることがゴールです。
前提条件
開発環境はMacBookAir M1 2020で、macOS Big Sur バージョン11.2.2 を使っています。 なお、M5STACKは Basicです。
Arduino IDEではなく、なぜMicroPythonなのか?
個人的にPythonが好きだからです
M5STACKの開発環境といえば、Arduino IDEが標準的ですね
自分はArduino IDEも使いますが、ライブラリやトラブルシュート情報もネットに充実・・・
やりたいことを最小限の努力で実現するならArduinoをおすすめします
うまくいった方法(ここからがメイン)
ここからは実際に、うまくいったファームウエアのインストール方法を紹介します。
早速ですが、自分が使ったファームウエアはここにあります。
ここのディレクトリにある、m5stack-20180516-v0.4.0.bin を使いました。
拡張メモリpsram無しバージョンで、最新の物を選択しました。
ファームウエア書き込みの流れ
ファームウエア書き込みの流れは、
順番に説明しますね。
1.ファームウエアファイルをローカルにコピー
Macのターミナルで作業したいフォルダに移動、
そのディレクトリでgitコマンドを使ってファームウエアの置いてあるディレクトリを丸ごとコピーしました。
usagi@usagi-mba work % git clone https://github.com/m5stack/M5Cloud
Cloning into 'M5Cloud'...
remote: Enumerating objects: 510, done.
remote: Total 510 (delta 0), reused 0 (delta 0), pack-reused 510
Receiving objects: 100% (510/510), 25.65 MiB | 17.66 MiB/s, done.
Resolving deltas: 100% (230/230), done.
usagi@usagi-mba work %
ここでは、ファームウエアが格納されている階層の2階層上のディレクトリ以下をまとめてコピーしています。ファームウエアが置いてある、もっと下位のフォルダでgit clone できないかと思って試しましたが、そんなリポジトリはないと言われて進みませんでした。
2.esptoolを使ってM5STACKのフラッシュメモリデータを消去
esptoolを使って、M5STACK内のフラッシュメモリを消去します。
esptoolが使える状態か、確認するには、ターミナルで下記のコマンドを実行します。
usagi@usagi-mba ~ % esptool.py version
esptool.py v3.0
3.0
バージョン情報が返ってきたら、OK。
command not found などエラーっぽいメッセージが返ってきたらなんらかの問題があります。esptoolをまだインストールしていないという方も含めて、自分が以前に実施して成功したこちらを真似してみてください。
フラッシュメモリの消去は以下のコマンドを使います
esptool.py --port /dev/tty.usbserial-0203ACAE erase_flash
ここで、/dev/tty.usbserial-0203ACAEが、M5STACKのデバイス名です。
この部分は使っているデバイスや環境によって異なるため、自身の環境で確認が必要です。
確認方法は次のように行ってください。
まず、M5STACKをUSB接続していない状態で、デバイス情報をlsコマンドで確認
usagi@usagi-mba ~ % ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.wlan-debug
/dev/tty.debug-console
つぎに、M5STACKをUSB接続している状態で、デバイス情報をlsコマンドで確認します
usagi@usagi-mba ~ % ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.wlan-debug
/dev/tty.debug-console
/dev/tty.usbserial-0203ACAE
一つ増えた。/dev/tty.usbserial-0203ACAEがM5カメラです
以下は、メモリ消去実施結果です。
usagi@usagi-mba OFF-LINE % esptool.py --port /dev/tty.usbserial-0203ACAE erase_flash
esptool.py v3.0
Serial port /dev/tty.usbserial-0203ACAE
Connecting.....
Detecting chip type... ESP32
Chip is ESP32-D0WDQ6-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: b8:f0:09:c5:c5:10
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 25.5s
Hard resetting via RTS pin...
usagi@usagi-mba OFF-LINE %
Chip erase completed successfullyと表示されればOK!
3.esptoolを使って新しいファームウエアを書き込み
ターミナルでcd コマンドを使い、ファームウエアの置いてあるディレクトリまで移動します
usagi@usagi-mba work % cd M5Cloud/firmwares/OFF-LINE
ls コマンドでファームウエアが表示されればOK!
usagi@usagi-mba OFF-LINE % ls
m5stack-20180323-v0.3.8.bin
m5stack-20180516-v0.4.0.bin
m5stack-psram-20180419-v0.3.9.bin
m5stack-20180419-v0.3.9.bin
m5stack-psram-20180323-v0.3.8.bin
m5stack-psram-20180516-v0.4.0.bin
ファームウェアの書き込みは、フラッシュメモリ消去の時と同様に、esptoolをつかいます
書き込むファームウエアを選んで下記のコマンドを実行します
esptool.py --chip esp32 --port /dev/tty.usbserial-0203ACAE write_flash -z 0x1000 m5stack-20180516-v0.4.0.bin
/dev/tty.usbserial-0203ACAEの部分は、みなさんの環境によって異なるので、上の方の「2.esptoolを使ってM5STACKのフラッシュメモリデータを消去」を参考に確認してください。
書き込みを行うと以下のメッセージが流れます。
usagi@usagi-mba OFF-LINE % esptool.py --chip esp32 --port /dev/tty.usbserial-0203ACAE write_flash -z 0x1000 m5stack-20180516-v0.4.0.bin
esptool.py v3.0
Serial port /dev/tty.usbserial-0203ACAE
Connecting.......
Chip is ESP32-D0WDQ6-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: b8:f0:09:c5:c5:10
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Compressed 1747296 bytes to 1119059...
Wrote 1747296 bytes (1119059 compressed) at 0x00001000 in 98.6 seconds (effective 141.8 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
usagi@usagi-mba OFF-LINE %
うまくいくとM5STACKのディスプレイが、プツッという音とともに光ります。
この状態になれば、ファームウエアの書き込みは完了です!
4.動作確認
USB接続した状態で、screenコマンドでM5STACKにアクセスします。
screenコマンドに続いて、M5STACKのデバイス名を引数に指定し、通信速度は115200とします
usagi@usagi-mba work % screen /dev/tty.usbserial-0203ACAE 115200
コマンド実行すると、下記のようにはじめは真っ白な画面が出ますが、リターンキーを押すとプロンプトが表示されて、Pythonの対話モードにはいります。
- まずはターミナルでscreenコマンド入力
- 直後は真っ白な画面が表示されます
- リターンキーを押すと、プロンプト>>>が表示され、Pythonの対話モード開始
動作確認は、対話モードでおこないます。
対話モードは、コマンド入力すると応答が即座に得られます。
たとえば、以下のような計算を行うと答えが表示されます。
>>> 1+1
2
>>>
以下はm5stackのlcdに文字を表示するコマンドで、一行づつ実行します。
m5stackパッケージから、lcdモジュールをインポート
m5stackのlcd(液晶ディスプレイ)をクリア
m5stackのlcdに文字を表示
以上が、M5STACKにMicroPythonファームウエアを、MacBookAirからインストールする方法でした。
この記事が、誰かのお役に立つことを願っています^^)
アップルM1チップ搭載のMacBookAirにesptoolをインストールしてみた
背景
MacBookAir 11インチを愛用していたが、5年ぶりにM1チップ搭載のMac Book Airを購入。当然だがそのままではesptoolが使えないのでインストール方法まとめてみた。
結論
M1チップMacBookAirは、購入状態ではpipコマンドによるesptoolのインストールに失敗するが、pipを最新にアップグレードしたら問題解決。esptoolが使えるようになった。
前提
esptool.pyのようなPythonモジュールがらみの環境構築には、PythonとPython3の共存の話が尽きない。最新のMacを購入したのに、旧バージョンのPythonに悩まされたく無いので、Python3のみで構築することを前提とした。
以下、やった事を残した。
まずはそのままesptoolのインストール
MacBookAir購入状態でそのままesptoolのインストールしてみた。
方法は簡単。コンソールで下記コマンド実行
詳しくは、ここに詳細説明あり。
micropython-docs-ja.readthedocs.io
言われた通りにpipでのインストールやってみたが・・・
pipコマンドでesptoolインストールした結果が以下
usagi@usagi-mba ~ % pip install esptool
Traceback (most recent call last):
File "/usr/local/bin/pip", line 11, in <module>
load_entry_point('pip==21.1.1', 'console_scripts', 'pip')()
...長いので省略
ImportError: No module named typing
ImportError: No module named typing、要するにpipが見つからないっぽい。
pip3コマンドでやってみた
usagi@usagi-mba ~ % pip3 install esptool
Collecting esptool
Collecting reedsolo<=1.5.4,>=1.5.3 (from esptool)
Collecting cryptography>=2.1.4 (from esptool)
Using cached https://files.pythonhosted.org/packages/9b/77/461087a514d2e8ece1c975d8216bc03f7048e6090c5166bc34115afdaa53/cryptography-3.4.7.tar.gz
Installing build dependencies ... done
...長いので省略
I
Successfully built cffi
ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly
WARNING: You are using pip version 19.2.3, however version 21.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
usagi@usagi-mba ~ %
pipの時とは異なり、なんとなくうまく進んでsuccessfullyで終わっている部分もあるが、最終的にはERRORで終わっている。
こんな警告が出ていた。
WARNING: You are using pip version 19.2.3, however version 21.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pipの更新をおすすめされているらしい。
pipを最新バージョンにアップグレードした。
usagi@usagi-mba work % sudo pip3 install --upgrade pip
... 省略
Installing collected packages: pip
Found existing installation: pip 19.2.3
Uninstalling pip-19.2.3:
Successfully uninstalled pip-19.2.3
Successfully installed pip-21.1.1
問題なく終わった
pipのバージョン確認
問題なく最新バージョンに更新された。
さらに注目は、pip3コマンドではなく、pipコマンドでPython3のモジュールの呼び出しができているところ。これからはpipとpip3を気にしなくていいと思われる。
最新のpipでesptoolをインストール
usagi@usagi-mba work % pip install esptool
... 省略
Successfully built esptool bitstring cffi reedsolo
Installing collected packages: pycparser, cffi, reedsolo, ecdsa, cryptography, bitstring, esptool
Successfully installed bitstring-3.1.7 cffi-1.14.5 cryptography-3.4.7 ecdsa-0.16.1 esptool-3.0 pycparser-2.20 reedsolo-1.5.4
無事インストールされたらしい。
esptoolの動作確認
versionコマンドで動作チェック
そんなコマンドないよって。
whichコマンドで探してみたら、ここにあった。
ここに移動して再度確認
usagi@usagi-mba bin % ./esptool.py version
esptool.py v3.0
3.0
動くぞ!
要するに、パスが通ってないってことか?
パスの設定見てみる。
usagi@usagi-mba work % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
確かに通ってない。
パスを通す
パスを設定するには、.zschrcにパスを追記すればいい。
まずは、ホームに.zschrcが存在するか確認。
usagi@usagi-mba ~ % find .zshrc
find: .zshrc: No such file or directory
ないので作成
usagi@usagi-mba ~ % touch .zshrc
作成したファイルにviエディタなどでesptool.pyのあるディレクリ
/Users/usagi/Library/Python/3.8/bin
を追加。
export PATH=$PATH:/Users/usagi/Library/Python/3.8/bin
保存して、有効化する。
usagi@usagi-mba ~ % source ~/ .zshrc
改めて、あえてesptool.pyの存在する場所とは異なるディレクトリからの動作確認
無事に通った。
M5STACK差し込んで確認してみる
差し込む前のデバイス情報をlsコマンドで確認
usagi@usagi-mba ~ % ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.wlan-debug
/dev/tty.debug-console
接続後
usagi@usagi-mba ~ % ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.wlan-debug
/dev/tty.debug-console
/dev/tty.usbserial-0203ACAE
一つ増えた。/dev/tty.usbserial-0203ACAEがM5カメラ
flash_idコマンドでチップ情報みてみる。
usagi@usagi-mba ~ % esptool.py chip_id
esptool.py v3.0
Found 4 serial ports
Serial port /dev/cu.wlan-debug
/dev/cu.wlan-debug failed to connect: [Errno 16] could not open port /dev/cu.wlan-debug: [Errno 16] Resource busy: '/dev/cu.wlan-debug'
Serial port /dev/cu.usbserial-0203ACAE
Connecting....
Detecting chip type... ESP32
Chip is ESP32-D0WDQ6-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: b8:f0:09:c5:c5:10
Uploading stub...
Running stub...
Stub running...
Warning: ESP32 has no Chip ID. Reading MAC instead.
MAC: b8:f0:09:c5:c5:10
Hard resetting via RTS pin...
認識した。
これでこれまでのMacと同様にesptool使える環境に戻った。