MaixduinoでMakerDrive(モータードライバ )制御
注意) BLINKアプリでの操作は、MaixPyにuselectが実装されていないので、2020/8/23現在はできません!!
ようやくスタートラインに立った感。
Maixduinoでモータードライバ を動かすまで、結構長い道のりだった。
MaixduinoとMaker Driveでモーター動かしてみたんだけど、宙に浮かせるための台(マウスレスト)がずれて、なんか荒ぶった動きに。 pic.twitter.com/FGS26quSyF
— パリピ般若(hack-tenorion) (@hack_tnr) August 23, 2020
用意したもの
- Maixduino
- USB type-Cケーブル(Maixduino用)
- MakerDrive (モータードライバ )
- タミヤ ダブルギヤボックス
- 外部電源(3.3V or 5V) ※↑の動画では3.3V使用
- ジャンパーピン
- オスーメス 5本(MakerDrive - Maixduino用)
- 外部電源用2本 ※何を使うかによる
加えて、モーターにコンデンサー 100nF、外部電源のところにパスコンとしてコンデンサー 1μFつけるのがベターなのですが、そもそもArduino・ラズパイを通らずMaixduinoにチャレンジする人はそうそういないので割愛。
USBから3.3Vor5V取るのは、みんなのラボさんの「ブレッドボード電源モジュール」が重宝してます。マルツ本店2Fに在庫が買えるとラッキーです。
実体配線図
データを作る余力がありませんでした。。
あと前述のコンデンサー書いてないですが、まぁ動きます。
コード
前進、後進、右回転、左回転をするだけです。MakerDrive用のライブラリは不要。
トラ技2019年11月号に掲載されているPCA9685はライブラリがあるので、これとは違った内容になります。
import time from machine import Timer,PWM from Maix import GPIO freq=100000 max_duty=50 #最大100。大きいほど速い。 tim_1 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM) tim_2 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM) tim_3 = Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM) tim_4 = Timer(Timer.TIMER0, Timer.CHANNEL3, mode=Timer.MODE_PWM) #右タイヤ前進(ボード 8番ピン) ch_r1 = PWM(tim_1, freq=freq, duty=0,pin=14) #右タイヤ後進(ボード 9番ピン) ch_r2 = PWM(tim_2, freq=freq, duty=0,pin=13) #左タイヤ前進(ボード 10番ピン) ch_l2 = PWM(tim_3, freq=freq, duty=0,pin=12) #左タイヤ後進(ボード 11番ピン) ch_l1 = PWM(tim_4, freq=freq, duty=0,pin=11) #前進 ch_r1.duty(max_duty) ch_l1.duty(max_duty) ch_r2.duty(0) ch_l2.duty(0) time.sleep(3) #後進 ch_r1.duty(0) ch_l1.duty(0) ch_r2.duty(max_duty) ch_l2.duty(max_duty) time.sleep(3) #右回転 ch_r1.duty(0) ch_l1.duty(max_duty) ch_r2.duty(0) ch_l2.duty(0) time.sleep(3) #左回転 ch_r1.duty(max_duty) ch_l1.duty(0) ch_r2.duty(0) ch_l2.duty(0) time.sleep(3) ch_r1.disable() ch_r2.disable() ch_l2.disable() ch_l1.disable()
参考資料
PWMは最大12こまで扱える。
Timerは0-3まで。それぞれにChannel 0-4が割り当てられている。
ピンアサインはSipeedのGitHubからmaixduino_pins.pngを参照。
この先やりたいこと
一旦はBLINKアプリで動作させたかったけれど、uselectが使えないのでそれは先のお話。
カメラを使って自動運転できると良いなぁ。
そういえばM5Atom(Arduino) + MakerDrive + BLINKアプリの記事を書いてないので、後で書く予定。
MaixduinoをMaixPyでPWM制御する方法
さて、前回 でようやくGPIOの出力を理解したので、PWMが使えるようになりました。
MaixPyでPWMでLチカ。なるほど🤔https://t.co/22jpzRVdpz pic.twitter.com/C4GcTOfvNa
— パリピ般若(hack-tenorion) (@hack_tnr) August 23, 2020
コード
例によって、ボードの9番ピンからLEDをちょっとずつ明るく光らせるだけの簡素なものです。
ピンアサインはSipeedのGitHubからmaixduino_pins.pngを入手して確認してください。
import time from machine import Timer,PWM from Maix import GPIO tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM) # ボードの9番 =pin13 ch = PWM(tim, freq=500000, duty=0,pin=13) duty =0 for duty in range(100): ch.duty(duty) time.sleep(0.5)
ドキュメント
ちょっと紛らわしいのですが、MaixduinoのAnalog I/Oの項ではなく、MaixPyのPWMの項に掲載されています。
参考資料
高度な応用例についてはトラ技201911月号の、砂川寛行さんの記事「第4章 K210の研究4 ニューラル・ネットワークとI/O」に二足歩行AIロボットの例があるのでそちらがオススメです。
以上。作業の日が空くと忘れてしまうので備忘録でした。
MaixduinoのMaixPyでGPIO制御
※理解が正しくない部分など、ちょいちょい加筆・修正しています
前回、MaixduinoでMaixPyからESP32よぶにはシリアル通信が必要と書きましたが、間違いでした。。
どうもこれが正解のようです。。
MaixduinoでMaixPyからGPIO使うの、Arduinoと併用せずにやる方法をようやく理解した。。(›´Δ`‹ ) pic.twitter.com/oooWkrkSCS
— パリピ般若(hack-tenorion) (@hack_tnr) August 22, 2020
読むべき資料
SipeedのGitHubから以下の資料を入手する
- maixduino_pins.png
- 青枠の数字を"IO"はつけずに定義してやればOK
- 定数もあるけれど資料と合ってない部分があったので、かえってつまづくかも
- MaixDunio(Pin assignment table).xlsx
- 前述の青枠の数字の代わりに、Functionの定数を使うこともできる
- しかし、print(board_info.LED_R) で戻ってきたのが13ではなく14だった(あれ?)
その他、MaixPyで下記を実行すると、ピンに割り当てる機能の定数が確認できる。(fm.fpioa.GPIO0など)
from fpioa_manager import fm print(fm.fpioa.help())
コード
ボードの9番ピンからLEDを光らせるだけですが。
import time from Maix import GPIO from fpioa_manager import fm # ボードの9番にLEDを繋いで光らせる場合 fm.register(13, fm.fpioa.GPIO0) led_1 = GPIO(GPIO.GPIO0, GPIO.OUT) flg=0 while(1): led_1.value(flg) if flg==0: flg=1 else : flg=0 time.sleep(1)
ハマった点
ESP32のFWは通常と異なるので、Arduino IDEでも通常のESP32のコードの流用はできないこともある。
- ArduinoIDEでledcSetupなど対応していないメソッドを呼ぶと、ESP32が延々再起動する
- ArduinoIDEはanalogWriteもコンパイルエラーになった。
- Maixduino_esp32_fimwareをESP32で入れた状態で、MaixPyからanalogWriteはできるらしい
- analogReadは動く。(逆にMaixPy上で動かせない)
MaixPyのPWM制御はトラ技にあったので、こちらを参考にしようと思います。
GPIOのピンアサインさえわかれば、あとはM5StickVでググるのが吉。
・・・そういえばBLEって使えないんですかね。
まぁ、通常のESP32のようなことがしたいなら、M5Atom LiteかM5StickCと接続した方が良い気もします。
MaixduinoでBLINK使おうとして失念した話
※理解が正しくない部分など、ちょいちょい加筆・修正しています
本当は「M5Atom LiteとBLINKでモータードライバ を動かす」話を先にかくべきだったのに、順序が逆になってしまうのですが。。
失敗まとめは時間が経つと書く気が無くなるので、勢いがあるうちに書いておきます。
BLINKとは
試そうとしたライブラリ
Readmeの手順参照
失念した理由
- Maixpyがライブラリ"uselect"を扱わなくなったため、blinklib_mp.pyの読み込みでエラーになる。
- uselectは公式から綺麗さっぱり消えてる。。
- replでhelp('modules')を叩いても出てこない。
- 結論)現段階では無理そう。
- 追記)2020/8/22現在は、Ano研さんがSipeedにIssueをあげてくださってるので、今後に期待。
古いバージョンなら使えるとか、Micropythonのソースから持ってくる手もあるのかもしれないけれど、今時間をかけてやる意義はないと判断した。
失念したけれど勉強になったこと
MaixduinoでK210からESP32を呼び出すには、K210とESP32でシリアル通信をする必要がある。MaixPyから直接DIGITAL/PWM呼ぶ方法がわかったので、別記事書きました。(ANALOG INはK210とESP32をシリアル通信で良いらしい)- K210はMaixPy IDEから書き込み。ESP32は Arduino IDEから書き込みを行う。
- シリアルポートに2種類出てくる。AがK210、BがESP32。
- シリアル通信やWi-FI接続でエラーが出る場合は、ESP32のファーム書き換えが解決する場合がある。
- この辺のまとまった情報については、Ano研さんの「MAiX MAniaX」が良い。
- Maix Bitを使ったGPIO制御ならトラ技の2019年11月号も情報量がある。(ESP32ではない)
- Wi-Fiの処理はK210側でやるのが基本らしい。
- 試しにESP32側でWi-Fi処理書いたら、ひたすら再起動かかってダメだった。
ちなみにArduino IDEで、全手の処理をArduinoで書くという手もあるけれど、IDEのバージョンなどでSDカード読み込めなくてはまるなどあって、今は触っていない。(もしかしたらファームの更新で改善されたかも?)
mac OSによるESP32のファーム更新
参考になった記事。
自分の環境ではこうなりました。
/Users/ユーザー名/.pyenv/versions/anaconda3-5.0.1/envs/py/bin/esptool.py --chip esp32 --port /dev/tty.usbserial-00002114B --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0x000 ./maixduino_esp32_firmware_v1.4.1_0x0.bin
M5StackでLED万華鏡を作ってみた
なんとなく思いついて、部品を取り寄せた勢いだけで作ってみました。
M5Stack用NeoPixel互換LED搭載 六角形ユニットで、簡素なLED万華鏡を作ってみた。(1箇所信号不良あり)
— パリピ般若(hack-tenorion) (@hack_tnr) August 2, 2020
小学校の夏休みの宿題でも作れそう。 pic.twitter.com/s3euogI5Qd
材料
- どこのご家庭にもあるM5Stack(AtomやStickCでもOK)
- ミラーシート
- マスキングテープ
- M5Stack用NeoPixel互換LED搭載 六角形ユニット
- M5Stack用Groveケーブル
- (あると尚良し)拡散版
作り方
ミラーシートを1.8mm×10.5mmカットする。6本用意する。
ミラーシートの間隔を約1mm開けて、マスキングテープで止める。
1箇所だけ写真のように深さ3mm程度の切れ目を入れる。
上から見るとこんな状態になります。
M5StackにLED37こをランダム点灯するコードを書き込みます(後述)
拡散板がないので、折りたたんだティッシュペーパーをかぶせてみました。
だいぶ柔らかくなります。
Arduinoコード
37個すべてランダム色にしていますが、色を白ベースにして赤系・青系などに絞ったほうが綺麗だと思います。
せっかくM5Stackを使っているのだから画面にも何か出したかったのですが、空いてるのが画面破損しているものしかなかった。。
#include <M5Stack.h> #include "FastLED.h" #define DATA_PIN 21 #define LED_TYPE WS2812B #define COLOR_ORDER GRB #define NUM_LEDS 37 #define BRIGHTNESS 5 CRGB leds[NUM_LEDS]; uint8_t direction;//0: clockwise 1: anti-clockwise void setup() { M5.begin(true, false, true); Wire.begin(); Serial.begin(115200); FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip FastLED.setBrightness(BRIGHTNESS); showLedCleanUp(1); M5.Lcd.clear(); M5.Lcd.setCursor(0, 0); showLedRandom(500); } void showLedCleanUp(long delayTime) { for (int i = 0; i < NUM_LEDS; ++i) { leds[i] = CRGB::Black; } FastLED.show(); delay(delayTime); } void showLedRandom(long delayTime) { while(1) { for (int i = 0; i < NUM_LEDS; ++i) { leds[i] = CHSV(random8(), 255, 255); } FastLED.show(); delay(delayTime); } } void loop() { }
未解決事件簿
LEDのうち1つだけ(10番)信号の制御がうまくいかず、点灯しないor意図した色にならないという問題がありました。
詳しい方々から教えていただいたのですが、ESP32のあるある問題らしい。。
もしかしたら検索「Fast LED 一部 光らない」などでこのブログに辿り着くことがあれば、以下参考になさってください。
- Adafruits_NeopixelはESP32だと誤点灯が起きる(Arduinoだと問題なし)
- RTOS等入ってないので信号生成系ライブラリはESP32だと大体死ぬ
- AVRだと割り込み禁止にしておけば、正確にCPUとGPIOで信号生成処理出来るが、ESP32だとRTOSとかキャッシュとかいろんな要因で難しい
- パルス幅とかが正確じゃ無いと困る系は、ESP32対応と謳っているものを使うのが無難
10番のLEDだけなんだか動きが怪しい pic.twitter.com/NbXjcKhAva
— パリピ般若(hack-tenorion) (@hack_tnr) August 2, 2020
(追記)M5Stackでタミヤ ダブルギヤボックスを動かす
ピンアサインで微妙にハマったので備忘録。
左右のクローラーの動作確認するところまでですが、BLEや障害物検知と組み合わせると楽しそう。
用意したもの
- M5Stack Gray(そこにあったので)
- モータードライバ TB6612FNG
- タミヤ ダブルギヤボックス
- タミヤ 楽しい工作シリーズ タンク工作基本キット(クローラーのみバラして使った)
- コンデンサー 100nF 2つ(モーターにつける)
- コンデンサー 1μF 1つ(外部電源側にパスコンとして入れる)
- ジャンパーピン
モータードライバ ーはDRV8835を購入予定でしたが、秋月がコロナで日祝休業のため、千石で調達できるものを選びました。
ピンアサイン
M5Stack | TB6612FNG |
---|---|
3 | PWM_A |
1 | AIN1 |
16 | AIN2 |
17 | PWM_B |
18 | BIN1 |
19 | BIN2 |
26 | STBY |
3V3 | VCC |
GND | GND |
- | (外部電源で5Vor3.3V) |
Arduinoコード
↓こちらのコードをM5Stackに置き換えただけです、はい。。
回路図もこちらを参考に。。
#include <M5Stack.h> #define AIN1 1 #define AIN2 16 #define PWMA 3 #define BIN1 25 #define BIN2 26 #define PWMB 17 #define STBY 26 void setup() { Serial.begin(9600); Serial.println( "Motor Standby" ); delay( 1000 ); M5.begin(); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(PWMA,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT); pinMode(PWMB,OUTPUT); pinMode(STBY,OUTPUT); digitalWrite(AIN1,LOW); digitalWrite(AIN2,LOW); digitalWrite(PWMA,LOW); digitalWrite(BIN1,LOW); digitalWrite(BIN2,LOW); digitalWrite(PWMB,LOW); digitalWrite(STBY,HIGH); } void loop() { Serial.println("motorA forward"); digitalWrite( PWMA, HIGH ); digitalWrite( AIN1, HIGH ); digitalWrite( AIN2, LOW ); delay( 3000 ); Serial.println("motorA stop"); digitalWrite( PWMA, LOW ); delay( 1000 ); Serial.println("motorA back"); digitalWrite( PWMA, HIGH ); digitalWrite( AIN1, LOW ); digitalWrite( AIN2, HIGH ); delay( 3000 ); Serial.println("motorA stop"); digitalWrite( PWMA, LOW ); delay( 1000 ); Serial.println("motorB forward"); digitalWrite( PWMB, HIGH ); digitalWrite( BIN1, HIGH ); digitalWrite( BIN2, LOW ); delay( 3000 ); Serial.println("motorB stop"); digitalWrite( PWMB, LOW ); delay( 1000 ); Serial.println("motorB back"); digitalWrite( PWMB, HIGH ); digitalWrite( BIN1, LOW ); digitalWrite( BIN2, HIGH ); delay( 3000 ); Serial.println("motorB stop"); digitalWrite( PWMB, LOW ); delay( 1000 ); } 〜
追記
今回はモータードライバ ーにTB6612FNGを使用したのですが、Twitterで別の製品のおすすめをいただきました。
Maker DriveからM5 Atom Liteに電力供給できるのは配線もシンプルで良さそう。
最初は自分も同じモータードライバを使ってましたけど
— もけ@ムギ㌠ (@coppercele) August 2, 2020
結局はこちらに落ち着きました
PWM4本だけで2chモータ動かせますし
モータードライバ「から」マイコン用電源が取れるので配線も省略できます
Maker Drive - 入門用Hブリッジモータードライバ - スイッチサイエンスhttps://t.co/RDwrsAXaFI
- PCA9685
- Maker Drive - 入門用Hブリッジモータードライバ
「キャタピラっぽいもので旋回するものを作るにはどうすれば良いか」教えてもらった話。
↑についてTwitterで「わかりません、助けてください(要約)」と助けを求めたところ、予想外にたくさんの方から多くのアドバイスをいただきました。
皆様ありがとうございます。
私と同じように途方に暮れる人もいるだろうと思い、いただいた内容をブログにまとめることにしました。
元ツイート
これ作ったものの、旋回とかできるようにするためにどういうキーワードで検索すれば良いのかがまったく分からない。 pic.twitter.com/xuPYEMhWYa
— パリピ般若(hack-tenorion) (@hack_tnr) July 22, 2020
やりたいこと
キャタピラっぽいもので、前後移動・旋回できるものを作りたい
質問した背景
- Twitterで見かけたM5Atom+タミヤの連結式クローラー&スプロケットセットを使った作品が素敵だったので、新作*1
- しかしミニ四駆のようなモーターを使った工作を子どもの頃に経験していないので、正しい情報を得られる検索ワードがわからない*2
- リアル戦車などの機構について情報を得られたものの、選ぶべきパーツがわからない。*3
- 参考にタンク工作基本キットというものを買ったけれど、曲がるための部品は何を買えばいいかわからない
→TwitterのTLの方々ならばすでに色々作ってるのでは?と思って質問することにしました。
教えていただいた検索キーワード
→自分の引き出しにはキャタピラという言葉以外なかった。。
おすすめされて図書館に予約入れた本
おすすめされて買ったもの
その他オススメいただいたパーツ、キット類
- タミヤ ツイストクローラー工作セット
- レゴマインドストームRCX(終売)
- タミヤ カムプログラムロボット工作セット
- M5Stack Lidar Bot
-
グランツーリスモの攻略本(軸受に詳しくなれるらしい)
おすすめいただいたブログ記事
実装に関するアドバイス
こんにちは、私はクローラでいつも苦労するのは張りすぎると所要動力が必要になて回らなくなるので軸の間隔かコマの調整をしたりしますね!あとマイコンで動かす場合にはモータードライバが必要だと思います。
— robotakao (@robotakao) July 22, 2020
現状
追加購入したリモコンロボット製作セット(クローラータイプ)を組み立て、動作確認まで完了。
とはいえ機構の理解をがっつりやるよりも、イベント出展向けの作品を作るのがゴールなので先は長そう。
ゆるいロボ作りたくて、装備の面からMaixduinoでぼちぼちやっています。
maixduinoの顔表示に音声つけてみた。
— パリピ般若(hack-tenorion) (@hack_tnr) July 11, 2020
necobitさんの音源と、OpenJtalkで出力したwavファイル。
wavは変換して16bitなのにI2S.RESOLUTION_16_BITで音割れたので、 I2S.RESOLUTION_24_BITにしたら落ち着いた。
音量はAudacityであらためて調整する必要あるな。 pic.twitter.com/jvHxlb9m3C
追記
キャタピラというのはキャタピラ社の商標で、今はクローラーと呼ぶのが一般的という指摘をいただきました。
皆どこで知るんだろうと思ったのですが、よくよく思い返すと乗り物図鑑を読んだことがなかったのも一因と思われる。。
*1:2月のMini Maker Faire Ogakiへの出展が目標。募集が8月下旬と知って焦る。に使ってみたい
*2:
男子なら小学校低学年のうちに、親や友人の影響でミニ四駆ぐらいは触ると思うのですが、女子は上にお兄さんがいないときっかけを得ることができない。
興味関心を持つ以前に、オモチャ屋の売り場に行く機会もないので、知らないということさえ知らないものが多い気がします。。
*3:信地旋回で調べたらガチ戦車ばかり出てきた