PythonでTENORI-ONを動かすblog(仮)

PythonでMIDIを作ってYAMAHAのTENORI-ONをごにょごにょするよ。

MaixduinoでMakerDrive(モータードライバ )制御

注意) BLINKアプリでの操作は、MaixPyにuselectが実装されていないので、2020/8/23現在はできません!!

 

ようやくスタートラインに立った感。

Maixduinoでモータードライバ を動かすまで、結構長い道のりだった。

 

用意したもの

  • Maixduino
  • USB type-Cケーブル(Maixduino用)
  • MakerDrive (モータードライバ )
  • タミヤ ダブルギヤボックス
  • 外部電源(3.3V or 5V) ※↑の動画では3.3V使用
  • ジャンパーピン
    • オスーメス 5本(MakerDrive - Maixduino用)
    • 外部電源用2本 ※何を使うかによる

加えて、モーターにコンデンサー 100nF、外部電源のところにパスコンとしてコンデンサー 1μFつけるのがベターなのですが、そもそもArduino・ラズパイを通らずMaixduinoにチャレンジする人はそうそういないので割愛。

f:id:bastardeyes:20200823184209j:plain

接続イメージ

f:id:bastardeyes:20200823185026j:plain

モーターにコンデンサの図

USBから3.3Vor5V取るのは、みんなのラボさんの「ブレッドボード電源モジュール」が重宝してます。マルツ本店2Fに在庫が買えるとラッキーです。

minnanolab.net

実体配線図

データを作る余力がありませんでした。。

あと前述のコンデンサー書いてないですが、まぁ動きます。

f:id:bastardeyes:20200823184150j:plain

手書きですみません



コード

 前進、後進、右回転、左回転をするだけです。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が割り当てられている。

maixpy.sipeed.com

ピンアサインはSipeedのGitHubからmaixduino_pins.pngを参照。

 

この先やりたいこと

一旦はBLINKアプリで動作させたかったけれど、uselectが使えないのでそれは先のお話。

カメラを使って自動運転できると良いなぁ。

そういえばM5Atom(Arduino) + MakerDrive + BLINKアプリの記事を書いてないので、後で書く予定。

MaixduinoをMaixPyでPWM制御する方法

さて、前回 でようやくGPIOの出力を理解したので、PWMが使えるようになりました。

 

 

コード

例によって、ボードの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の項に掲載されています。

maixpy.sipeed.com

 

参考資料

高度な応用例についてはトラ技201911月号の、砂川寛行さんの記事「第4章 K210の研究4 ニューラル・ネットワークとI/O」に二足歩行AIロボットの例があるのでそちらがオススメです。

cc.cqpub.co.jp

 

 

以上。作業の日が空くと忘れてしまうので備忘録でした。

MaixduinoのMaixPyでGPIO制御

※理解が正しくない部分など、ちょいちょい加筆・修正しています

 

前回、MaixduinoでMaixPyからESP32よぶにはシリアル通信が必要と書きましたが、間違いでした。。

 

どうもこれが正解のようです。。

  • ANALOG IN(A0〜5)はArduino IDE使わないとダメ
  • DIGITAL/PWMはMaixPyを使う

 

読むべき資料

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もコンパイルエラーになった。
  • analogReadは動く。(逆にMaixPy上で動かせない)

homemadegarbage.com

MaixPyのPWM制御はトラ技にあったので、こちらを参考にしようと思います。

cc.cqpub.co.jp

GPIOのピンアサインさえわかれば、あとはM5StickVでググるのが吉。

 

・・・そういえばBLEって使えないんですかね。

まぁ、通常のESP32のようなことがしたいなら、M5Atom LiteかM5StickCと接続した方が良い気もします。

www.switch-science.com

MaixduinoでBLINK使おうとして失念した話

※理解が正しくない部分など、ちょいちょい加筆・修正しています

 

本当は「M5Atom LiteとBLINKでモータードライバ を動かす」話を先にかくべきだったのに、順序が逆になってしまうのですが。。

失敗まとめは時間が経つと書く気が無くなるので、勢いがあるうちに書いておきます。

 

BLINKとは

blog.livedoor.jp

試そうとしたライブラリ

Readmeの手順参照

github.com

失念した理由

  • Maixpyがライブラリ"uselect"を扱わなくなったため、blinklib_mp.pyの読み込みでエラーになる。
    • uselectは公式から綺麗さっぱり消えてる。。
    • replでhelp('modules')を叩いても出てこない。
    • 結論)現段階では無理そう。
    • 追記)2020/8/22現在は、Ano研さんがSipeedにIssueをあげてくださってるので、今後に期待。

古いバージョンなら使えるとか、Micropythonのソースから持ってくる手もあるのかもしれないけれど、今時間をかけてやる意義はないと判断した。

maixpy.sipeed.com

失念したけれど勉強になったこと

  • 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のファーム書き換えが解決する場合がある。
    • windowsGUIのツールがあるが、macの場合はestpool.pyで書き込む(後述)
  • この辺のまとまった情報については、Ano研さんの「MAiX MAniaX」が良い。
  • Maix Bitを使ったGPIO制御ならトラ技の2019年11月号も情報量がある。(ESP32ではない)
  • Wi-Fiの処理はK210側でやるのが基本らしい。
    • 試しにESP32側でWi-Fi処理書いたら、ひたすら再起動かかってダメだった。

ちなみにArduino IDEで、全手の処理をArduinoで書くという手もあるけれど、IDEのバージョンなどでSDカード読み込めなくてはまるなどあって、今は触っていない。(もしかしたらファームの更新で改善されたかも?)

 

cc.cqpub.co.jp

 mac OSによるESP32のファーム更新

 参考になった記事。

dev.classmethod.jp

自分の環境ではこうなりました。

/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(AtomやStickCでもOK)
  • ミラーシート
  • マスキングテープ
  • M5Stack用NeoPixel互換LED搭載 六角形ユニット
  • M5Stack用Groveケーブル
  • (あると尚良し)拡散版

 

www.switch-science.com

www.amazon.co.jp

作り方

ミラーシートを1.8mm×10.5mmカットする。6本用意する。

f:id:bastardeyes:20200802174537j:plain

 

ミラーシートの間隔を約1mm開けて、マスキングテープで止める。

1箇所だけ写真のように深さ3mm程度の切れ目を入れる。

f:id:bastardeyes:20200802174554j:plain

 

上から見るとこんな状態になります。

f:id:bastardeyes:20200802174607j:plain

 

M5StackにLED37こをランダム点灯するコードを書き込みます(後述)

f:id:bastardeyes:20200802174623j:plain

 

拡散板がないので、折りたたんだティッシュペーパーをかぶせてみました。

だいぶ柔らかくなります。

f:id:bastardeyes:20200802183835j:plain



 

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対応と謳っているものを使うのが無難

 

f:id:bastardeyes:20200802174511j:plain

 

(追記)M5Stackでタミヤ ダブルギヤボックスを動かす

ピンアサインで微妙にハマったので備忘録。

左右のクローラーの動作確認するところまでですが、BLEや障害物検知と組み合わせると楽しそう。

 

f:id:bastardeyes:20200802140855j:plain



用意したもの

  • M5Stack Gray(そこにあったので)
  • モータードライバ  TB6612FNG
  • タミヤ ダブルギヤボックス
  • タミヤ 楽しい工作シリーズ タンク工作基本キット(クローラーのみバラして使った)
  • コンデンサー 100nF 2つ(モーターにつける)
  • コンデンサー 1μF 1つ(外部電源側にパスコンとして入れる)
  • ジャンパーピン

モータードライバ ーはDRV8835を購入予定でしたが、秋月がコロナで日祝休業のため、千石で調達できるものを選びました。

www.sengoku.co.jp

 ピンアサイ

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に置き換えただけです、はい。。

回路図もこちらを参考に。。

www.moonmile.net

#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に電力供給できるのは配線もシンプルで良さそう。

 

「キャタピラっぽいもので旋回するものを作るにはどうすれば良いか」教えてもらった話。

↑についてTwitterで「わかりません、助けてください(要約)」と助けを求めたところ、予想外にたくさんの方から多くのアドバイスをいただきました。

皆様ありがとうございます。

 

私と同じように途方に暮れる人もいるだろうと思い、いただいた内容をブログにまとめることにしました。

 

元ツイート

やりたいこと

キャタピラっぽいもので、前後移動・旋回できるものを作りたい

 

質問した背景

  • Twitterで見かけたM5Atom+タミヤ連結式クローラー&スプロケットセットを使った作品が素敵だったので、新作*1
  • しかしミニ四駆のようなモーターを使った工作を子どもの頃に経験していないので、正しい情報を得られる検索ワードがわからない*2
  • リアル戦車などの機構について情報を得られたものの、選ぶべきパーツがわからない。*3
  • 参考にタンク工作基本キットというものを買ったけれど、曲がるための部品は何を買えばいいかわからない

TwitterのTLの方々ならばすでに色々作ってるのでは?と思って質問することにしました。

教えていただいた検索キーワード

 →自分の引き出しにはキャタピラという言葉以外なかった。。

 

おすすめされて図書館に予約入れた本

 

おすすめされて買ったもの

  • タミヤ ダブルギヤボックス
  • タミヤ リモコンロボット製作セット(クローラータイプ)

  • モータードライバ ※秋月は祝日で閉まっていたので千石で買えるものにした。。

その他オススメいただいたパーツ、キット類

 

www.tamiya.com

おすすめいただいたブログ記事

 

実装に関するアドバイス

 

現状

追加購入したリモコンロボット製作セット(クローラータイプ)を組み立て、動作確認まで完了。

とはいえ機構の理解をがっつりやるよりも、イベント出展向けの作品を作るのがゴールなので先は長そう。

 

ゆるいロボ作りたくて、装備の面からMaixduinoでぼちぼちやっています。

f:id:bastardeyes:20200725154425j:plain

f:id:bastardeyes:20200725154511j:plain

 

追記

キャタピラというのはキャタピラ社の商標で、今はクローラーと呼ぶのが一般的という指摘をいただきました。

皆どこで知るんだろうと思ったのですが、よくよく思い返すと乗り物図鑑を読んだことがなかったのも一因と思われる。。

 

*1:2月のMini Maker Faire Ogakiへの出展が目標。募集が8月下旬と知って焦る。に使ってみたい

*2:

男子なら小学校低学年のうちに、親や友人の影響でミニ四駆ぐらいは触ると思うのですが、女子は上にお兄さんがいないときっかけを得ることができない。

興味関心を持つ以前に、オモチャ屋の売り場に行く機会もないので、知らないということさえ知らないものが多い気がします。。

*3:信地旋回で調べたらガチ戦車ばかり出てきた