M5Stack (M5GO/M5Camera/M5Stick)
コンパクトなケースに沢山の機能が詰まった魅力的なIoTデバイスM5Stack (M5GO/M5Camera/M5Stick)
マイコン世代のひとはM5と聴くと
SORD m5を思い出すはずw
備忘録も兼ねています。機種やバージョンなどの違いによって使い方が変わっている可能性もあるのでご注意ください。
ドローンTelloをM5Stackで飛ばしてみました。(バイナリーモード) (2018/06/12)
M5Stack(M5GO)でTelloのバイナリモードを使ったコントロールに成功しました!
ファームはオフライン版のm5stack-20180419-v0.3.9.binを使いました。
Telloのバイナリ制御はPingguSoft-pytello-09d98e0e1646からMicroPythonに移植しました。
PingguSoft-pytello-09d98e0e1646.zip
MPU9250の傾きでTelloを制御します。
Aボタン長押しでコネクト
Bボタン長押しで離陸
Cボタンで着陸
前後の傾きで前後移動※
左右の傾きで左右移動※
Aボタンを押しながら前後の傾きで上昇下降※
Aボタンを押しながら左右の傾きで左右旋回※
※傾き角度で速度調整
バイナリモードなのでカクカクしないでスムーズに動きます。
M5Stack用のモーターモジュールを自作してみました。(2018/06/24)
M5Stackのコンパクトな筺体にあわせて出来るだけ小さくモーターモジュールを作ってみました。
設計 / 製作
設計コンセプト
収納出来るバッテリーの目安
ケースの内幅は50.4mmです。バッテリーはケースに入ることを確認してください。
LiPo 3.7V 〜1000mAh 503450(厚さ5mm x 34mm x 50mm)
LiPo 3.7V 1000mAh〜1200mAh 603450(厚さ6mm x 34mm x 50mm)
千石電商でも扱っているようです。
パチパチクラッピー[トール君]を自走式にしました。(2018/07/01)
いちぶでは有名なパチパチクラッピー[トール君]を自走式にしました。(^_^)
クラッピーもサーボでパチパチします。メカも完全内臓、元のスプリングを生かしているのでしっかりパチパチします。そして!手動でもパチパチ出来るステルス改造になっています (^_^)
インターフェースをI2C(Grove) にしたのでM5Stackに直結出来ます。
ご要望が多いので内部機構を公開、サーボーを完全に内蔵して、さらに手動でも動くようにするために、最初にレバーなどの部品を採寸して図面化しました。ここから追加パーツを設計して作っています。使った部品のなかには小ロットでの入手が難しい部品もあったりします。
New AIBO風のシッポを付けました。(2018/07/18)
パチパチクラッピー[トール君]の目を動くようにしました。(2018/08/11)
M5Stack WALL-E完成しました!(2018/07/24)
ファームウェアのバックアップ / リストア
esptoolのインストール
@ CP210x USB - UART ブリッジ VCP ドライバのインストール
SILICON LABSのサイトからダウンロードしてインストールします。
OSに合わせて選択します。Windows 7/8/8.1(v6.7.6)を使いました。
A Pythonのインストール
OSに合わせて選択します。バージョン3.6.5を使いました。
Windows環境の際はインストーラ版を使って Customize installation -> "Advanced Options" -> "Add Python to environment variables"のチェックが必要です。
B esptoolのインストール
pip install esptool
エラーが発生する際は下記の実行が必要な場合があります。
python -m pip install --upgrade pip
消去
esptool.py -p COM3 -b 921600 erase_flash
COM3 任意のCOMポート
バックアップ
esptool.py -p COM3 -b 921600 read_flash 0 0x400000 firmware.bin
COM3 任意のCOMポート
0x400000 ファームウェアのサイズ(4MB / 8MB)
firmware.bin 任意のファイル名
リストア
esptool.py -p COM3 -b 921600 write_flash 0 firmware.bin
COM3 任意のCOMポート
firmware.bin バックアップしたファイル名
書き込み後に起動しない場合などは先に消去してから再実行してください。
M5StackのI2C(Grove)コネクタ
M5Stackの本体にはI2C(Grove)のコネクタが搭載されています。ここに外部モジュールを接続できます。
端子それぞれの割り当てはこちらになります。
シグナルは3.3V、電源出力は5Vと異なっているので注意が必要です。
M5GOに付属のケーブルは黄と白が逆になっています。カットして使う際は注意が必要です。
M5Cameraは10KΩでプルアップ。
M5Stackの音割れ問題の解決
抵抗を追加して音質改善 (2018/10/18)
M5Stackにはスピーカーが内蔵されていますが、音割れを起したり音質はいまひとつで、もったいない状態でした。
N.Yamazakiさんはブログで
M5Stackの音量を抵抗1つで調節する方法を発表されました。
画期的な方法です!ただしGPIO25を
フローティング状態に出来ずに効果が薄かったとのこと。
この方法をMicroPythonで試してGPIO25をフローティング状態にする設定にトライしてみたところ、オープンドレイン(出力)でフローティング状態になりました。
この状態でGPIO25とGPIO26を75Ωでバイパスして、さらにGPIO26とGNDの間に2μFの電解コンデンサをいれたら良い感じの音になりました。(^_^)
machine.Pin(25,Pin.OUT_OD)
N.Yamazakiさまありがとうございます。
詳しくはN.Yamazakiさんの
ブログで確認ください。
MP3ファイルを再生して音質改善 (2018/11/15)
MicroPython[loboris]にMP3ファイルの再生機能を追加しました。M5Stack無改造での音質も格段に向上しています。
詳しくは「M5StackでSDカード内のMP3ファイルを再生する」をみてください。
M5Stack用のプロトモジュールケース (2018/10/25)
ケースを自作する方のためにプロトモジュールケースのCADデータを公開します。
実物を採寸してCAD化しています。(
入手出来る編集可能なCADデータは寸法が合っていないものが多いです)
実測したままの寸法です。3Dプリンタで出力出来る事は確認していますが、出力する際はご注意ください。
編集可能なigesファイルを置いておきます。
M5Stickのバッテリー容量アップ (2019/03/03)
バッテリー容量を80mAhから400mAhにアップします。ケースに収まらないのでケースを加工して3Dプリンタで作った部品で蓋をします。
M5Cameraのバッテリー駆動電圧アップ (2019/03/23)
M5Cameraにはバッテリーを繋ぐことが出来ます。USBコネクタから電力を供給すると充電されます。(TP4057経由)
M5Cameraには5Vの昇圧回路がないため、バッテリーから電力を供給した場合でも内部ではバッテリーの電圧のままです。
そこで回路の途中に昇圧回路を入れてバッテリーからの電力供給でも安定した5Vが出力されるようにしました。
M5Cameraには5Vの昇圧回路がありません。I2C(Grove)コネクタの電源出力は入力電圧のままとなります。
M5Stick-Cで変わったところ / 対策 (2019/06/06)
M5Stackファミリー最新のM5Stick-Cが国内販売されました。小さくても拡張性が考慮されているのでとても魅力的なアイテムです。M5Stack、M5Stick(無印)と比べると次の基本仕様が変更されています。
これにより今までと勝手が変わっています。今のところ下記の症状は対処方法が分りました。
@ 電源を入れても画面が真っ黒のまま反応しない
バッテリーの残量が少ない場合に起きるようです。しっかり充電して再度電源を投入しても反応が無いときはesptoolを使ってファームを上書きすると、書き込み後に起動します。(バックアップを忘れずに)
A esptoolを使うとエラーが発生する。
USBシリアル変換ICが変わった事によりOSの環境によって発生するようです。ボーレートを下げることで正常に動作します。(750000、500000、250000、115200)
基板裏面の端子は写真ではコネクタになっていますが、実際にはハンダ付けで子基板と繋がっています。分解の難易度は高いです。
M5Friskを作ってみた (2019/06/28)
M5Stick-Cをフリスクのケースに入れました!!
スペースがたっぷりあるので夢が広がります!
上の動画ではフリスクのCM(Hello,idea編)をスタンドアローンで再生しています。
スピーカー追加、スイッチ、背面拡張コネクタを移設、LiPoを80mAhから300mAhにアップしています。
M5Stackのバッテリー容量アップ (2019/11/23)
バッテリー容量を1200mAhにバッテリーに合わせてスリムケースを作ります。
バッテリーはAPPLE iPod 616-0206 交換バッテリー(ロワジャパン)です。コネクタは3Pなので2Pに換装が必要です。
カッターの刃先などで外して2Pのコネクタに交換できます。
固定ボルトはM5Stack(BASIC)のボトムのものが使えます。
ケースデータのSTLファイルを置いておきます。 3Dプリンタ(FDM)で出力出来るように調整しています。
M5Stack / M5Stick / M5CameraをMicroPythonで使ってみる
M5Stack / M5Stick / M5Cameraで使えるMicroPythonファームウェアには複数の種類があります。さらにビルドに使ったESP-IDF(CPU開発元の公式SDK)のバージョンによっても機能が異なってきます。
micropython.org | 公式版(新v1.1x) | ソースコード | | M5ハード対応[低] |
loboris | 公式版(旧v1.9.4) カスタム | ソースコード | 開発休止?? | M5ハード対応[中] |
M5cloud | loboris カスタム | | 開発休止 | M5ハード対応[中] |
M5Stack公式 | loboris カスタム | ソースコード | 開発休止? | M5ハード対応[中] |
M5UI.Flow | 公式版(新v1.1x) カスタム | MITライセンス | | M5ハード対応[高] |
それぞれ互換性がないため相互に使うにはプログラムの手直しが必要です。
M5Stack公式ではM5UI.Flowを推奨しています。
UI.Flowをオフラインで使う場合はUIFlow-Desktop-IDEを使います。ダウンロード
現状ではどのMicroPythonでも使えない機能があるため、今のところ機能が豊富なloboris版をM5Stack(M5Sstick)に最適化したリビルド済みのイメージファイルを用意しました。(ドライバ対応済み)
上記に加えてBluetooth(btstack)の一部の機能を使えるようにしたもの 実験バージョン
btstackがメモリを占有するため利用可能メモリが減っています。
(PSRAMが搭載されていないとWiFiが使えません)
リビルド版を使っているときは
MicroPython[loborisリビルド版]と記載しています。
リビルドについては後ほど説明
開発環境は
uPyCraft V0.28を使っています。
v0.30(Win)は不具合で使えませんでした。
追加した機能 (MicroPython[loborisリビルド版])
@ M5Stack / M5Stickのハードウェアに対応
機種ごとの固有機能も含めて詳しくは後ほど説明します。
A MP3ファイルの再生に対応
dac.mp3play('ファイル名.mp3',freq=48000,buffsize=8,stacksize=4096)
B WAVファイルの再生時にバッファー容量を指定できる。
dac.wavplay('ファイル名.wav', サンプルレート補正, バッファ数(省略可))
C ファイル以外にバッファに格納されたイメージデータを表示できる。
tft.image(0, 0, "", type=tft.JPG, buf=バッファ(省略可))
※ バッファを指定する際はtypeの指定が必須。
D ソケット受信で受信バッファ内のデータ格納位置をオフセット指定できる。
sock.readinto(バッファ, 受信バイト数(省略可), オフセット(省略可))
※ Cと合わせると受信データの表示が容易になります。
E M5StackでLCDと外部SPI機器が同時に使える。
spi = SPI(
spihost=SPI.VSPI,
省略
dma = 2) DMAチャンネル2を指定できるようにします。
M5Stack / M5StickでMP3ファイルを再生する (MicroPython[loborisリビルド版]) (2018/11/15)
MP3ファイルの再生機能を追加しました。音質も格段に向上しています。
実行後はバックグラウンドで再生を続けるので処理を継続できます。
dac.mp3play('ファイル名.mp3',freq=48000(省略可),buffsize=8(省略可),stacksize=4096(省略可))
mp3ファイルはモノラルに変換してください。
M5StackでSDカード内に保管されたファイルを再生した場合でも、データが圧縮されていることでインターフェース(VSPI)の占有率が減ったため、LCDの同時アクセスにも余裕がでます。
PDM出力を使って再生しています。M5Stackでは下記の対策を行うことで音質が向上します。
音声出力(GPIO25)からGNDの間に75Ωの抵抗と1μF(もしくは2μF)のコンデンサを並列に入れる。
M5Stack / M5Stick / M5CameraでDeepSleepを使う (MicroPython[loboris])
DeepSleep中は消費電力を節約できます。
import machine
指定期間(msec)DeepSleepした後に自動復帰
machine.deepsleep(3000)
任意の秒数(msec)を指定
指定のボタンを押したときにDeepSleepから復帰
rtc = machine.RTC()
rtc.wake_on_ext0(39, 0) 復帰に使うGPIO番号とレベル(0=LowActive / 1=HighActive)を指定
machine.deepsleep()
次のメソッドでDeepSleepからの復帰を確認できます。
machine.wake_reason()
machine.wake_description()
M5Stack / M5Stick / M5Cameraで動作クロックを変更する (MicroPython[loboris])
動作クロックには2MHz, 80Mhz, 160MHz, 240MHzを指定できます。
import machine
machine.freq(240) 任意の動作クロックを指定、省略した場合は現在のクロックを返します。
MicroPythonをリビルドする[玄人志向] (MicroPython[loboris])
詳しくは
Building MicroPython for ESP32を参考にしてください。
きほん備忘録です。リビルドに関しては日本語での解説ページもいくつかあるので参考にしてください。
@ sdkconfig の準備
ビルドにはM5Stackに対応したsdkconfigファイルが必要です。M5Stack_MicroPythonのPython_BUILD/firmware/以下にあります。必要な種類から選びます。
MicroPython_BUILD/firmware/esp32_all/sdkconfig
※ menuconfigを実行することで公式版とloboris版の記述の差異も更新されます。
A menuconfigを実行してカスタマイズ
./BUILD.sh menuconfig
Log outputをDEBUGレベルからINFOレベルに変更
Component config --->
Log output --->
Default log verbosity (Debug) --->
(X) Info
内部Flash設定変更
Serial flasher config --->
Flash size (4 MB) --->
(X) 16 MB Fireは16MB
Flash SPI speed (40 MHZ) --->
(X) 40 MHZ アクセススピードが足りないときは80MHzも指定できます。
SPI RAM設定変更
Component config --->
ESP32-specific --->
[*] Support for external, SPI-connected RAM
SPI RAM config --->
[*] Initialize SPI RAM when booting the ESP32 起動時にSPI RAMを初期化する。
[*] Ignore PSRAM when not found 見つからない場合はPSRAMを無視する。
PSRAMがない機種用には別々にビルドすることをお勧めします。
SPI RAM access method ---> SPI RAMアクセス方法
( ) Integrate RAM into ESP32 memory map
RAMをESP32メモリマップに統合する。
(X) Make RAM allocatable using heap_caps_malloc(…, MALLOC_CAP_SPIRAM)
heap_caps_malloc(…, MALLOC_CAP_SPIRAM)を使用してRAMを割り当て可能にする。
( ) Make RAM allocatable using malloc() as well
RAMもmalloc()を使用して割り当て可能にする。
Set RAM clock speed (40MHZ clock speed) --->
(X) 40MHz clock speed
( ) 80MHz clock speed
80MHzを指定するとVSPIポートはシステムによって占有されます。不安定?
(16384) Maximum malloc() size, in bytes, to always put in internal memory
malloc()を使用してSPI RAMを割り当てる場合、指定バイト数以上はSPI RAMとする。
[ ] Try to allocate memories of WiFi and LWIP in SPIRAM firstly.
If failed, allocate internal memory
WiFiとLWIPには優先してSPIRAMを割り当てる。 失敗した場合は内部メモリを割り当てる。
(32768) Reserve this amount of bytes for data that specifically needs to be in DMA
or internal memory
[ ] Allow external memory as an argument to xTaskCreateStatic
xTaskCreateStaticへの引数として外部メモリを許可する。
WiFi設定
Component config --->
Wi-Fi --->
[*] Software controls WiFi/Bluetooth coexistence
WiFi/Bluetooth coexistence performance preference (Balance) --->
( ) WiFi
( ) Bluetooth(include BR/EDR and BLE)
(X) Balance
Type of WiFi TX buffers ---> WiFi TXバッファーのタイプを選択します。
(X) Static PSRAMが有効の場合、十分なバッファーを確保するために選択
( ) Dynamic PSRAMが無効の場合、RAMの使用率を改善するために選択
BlueTooth設定
Component config --->
Bluetooth --->
[*] Bluetooth
The cpu core bluetooth controller run (Core 0 (PRO CPU))
(X) Core 0 (PRO CPU)
( ) Core 1 (APP CPU)
HCI mode (VHCI) ---> 最下層インターフェース
(X) VHCI
( ) UART(H4)
MODEM SLEEP Options --->
[ ] Bluetooth modem sleep
[ ] Bluedroid Enable ---
MicroPython設定
MicroPython --->
System settings --->
[ ] Use both cores for MicroPython tasks (experimental)
デュアルコアCPUのタスク振り分け設定
[*]に設定するとFreeRTOSによってタスクはそれぞれのコアに振り分けられます。(実験的)
(16) MicroPython stack size(KB) SPIRAMがある場合20
(96) MicroPython heap size(KB) SPIRAMがある場合3072
フレームバッファー有効化
MicroPython --->
Modules --->
[*] Enable framebuffer
B ./BUILD.shの編集
FILE_SIZE=16 変更したFlashサイズに合わせます。
C ビルトインモジュールの追加
components/micropython/esp32/modulesにpythonで記述されたファイルを追加するとビルトインモジュールとしてインポートすることが出来ます。
サイズの大きいファイル(16KB以上)のインポートは不安定に繋がるのでこちらに格納する必要があります。
D ビルド
./BUILD.sh clean QSTRに変更がある場合は必須
./BUILD.sh -v
なぜか下記の実行も必須でした。
../Tools\esp-idf\components\partition_table\gen_esp32part.py partitions_mpy.csv partitions_mpy.bin
E M5Stackに書き込み (ファイルは上記で作成したファイル)
Windowsを使いました。
esptool.py -p COMシリアルポート番号 -b 921600 --before default_reset --after no_reset write_flash 0x1000 bootloader.bin 0xf000 phy_init_data.bin 0x10000 MicroPython.bin 0x8000 partitions_mpy.bin
MicroPythonでBluetoothを使う (MicroPython[loborisリビルド版]+btstack) (2019/08〜)
icetomcatさんがビルドしたバージョンで、BLEを使用してデバイス間の通信を実装できるようになりました。との報告があったのでBluetoothの部分のみ移植してみました。
結果は初期化でPanic発生。
次に
btstackを組み込んでみました。
まずは、HIDホストの機能をモジュールに組み込んでWiiリモコンのパケット受信に成功。HID以外の機能も追加する予定。btstackはサンプルコードがしっかりしてますが、API構成(
BLE ANCS Client API)が独自なのでちょっと面倒。
import hid
import utime
def hid_handler(arg):
# packet_type = arg[0] / channel = arg[1] / packet = arg[2]
if(arg[0]==hid.L2CAP_DATA_PACKET): ボタンの状態変化でCallBackルーチンが呼び出される
print('L2CAP_DATA_PACKET ', arg[2])
hid.setup('xx-xx-xx-xx-xx-xx', hid_handler, all_events=False, debug=False)
接続するHIDデバイスのアドレスを指定
hid.power_control(hid.POWER_ON)
while True:
res=hid.run_noloop_execute(10) 必ずメインループで実行 (10msのあいだbtstackの処理を実行)
utime.sleep(0.001)
DUALSHOCK3(sixaxis)にも対応
import sixaxis
import utime
import ubinascii
print(ubinascii.hexlify(sixaxis.read_mac(),':').decode()) ホスト側MACアドレスの表示
def hid_handler(arg):
# packet_type = arg[0] / channel = arg[1] / packet = arg[2]
if(arg[0]==sixaxis.L2CAP_DATA_PACKET): ボタンの状態変化でCallBackルーチンが呼び出される
print(sixaxis.read_switch())
sixaxis.setup(handler=hid_handler, mac_address='xx:xx:xx:xx:xx:xx',
all_events=True, debug=False, wait=10)
hid_handler(オプション) CallBackルーチンの指定
mac_address(オプション) ホスト側MACアドレスの変更
all_events(オプション) Trueを指定すると全てのイベント通知でCallBackルーチンを呼び出す。Falseはボタンの変化時のみ呼び出し。
debug(オプション) Trueを指定するとBTSTACKのデバッグメッセージが出力される。
wait(オプション) DUALSHOCK3のバージョンによりWaitが必要だったため追加。デフォルト[6ms]
sixaxis.power_control(sixaxis.POWER_ON)
while True:
hid.run_noloop_execute(10) 必ずメインループで実行 (10msのあいだbtstackの処理を実行)
packet=sixaxis.read_buffer() スティックの状態とsixaxisの値はread_bufferで取得
if packet is not None:
print(packet)
utime.sleep(0.001)
Callbackルーチン内でのメモリ確保はエラーの要因になります。配列等の定義にはglobalの使用を推奨します。
M5StackをMicroPythonで使ってみる
M5Stackで家のドアをメイドカフェ風に改造してみた。 (MicroPython[loboris]) (2018/10/19)
MicroPython
loboris版で作ったサンプルプログラムを公開します。
省電力など考慮していません
音割れ対策として音声ファイルは波形編集ソフトを使って音量を下げています。(量子化ビット数が犠牲にります。)
import display
import mpu9250
import mpu6500
import machine
from machine import Pin
from time import sleep, sleep_ms
# Charge Mode
buttonA = Pin(39, Pin.IN)
if not buttonA.value():
while True:
pass
# I2C Init
try:
i2c = machine.I2C(sda=21, scl=22)
except:
print("I2C Error")
print(i2c.scan())
# Neopixel
Neopixel = machine.Neopixel
np = Neopixel(Pin(15), 10,Neopixel.TYPE_RGB)
np.show()
np.set(1, 0x000000,0,10,True)
# DAC
dac=machine.DAC(Pin(25))
# MPU9250 (0x68,0x0C)
mpu = mpu6500.MPU6500(i2c,
accel_fs = mpu6500.ACCEL_FS_SEL_16G,
# 加速度 (測定レンジ±16g)
gyro_fs = mpu6500.GYRO_FS_SEL_500DPS,
# ジャイロ (測定レンジ ±500°/sec)
accel_sf = mpu6500.SF_G,
#Raw
gyro_sf = mpu6500.SF_DEG_S
#Raw
)
imu = mpu9250.MPU9250(i2c, mpu6500=mpu)
# TFT(LCD)
tft = display.TFT()
tft.init(tft.M5STACK, width=240, height=320, rst_pin=33, backl_pin=32, miso=19, mosi=23, clk=18, cs=14, dc=27, bgr=True, backl_on=1, rot=tft.LANDSCAPE)
tft.image(0,0,"kizuna.jpg")
#
# Main
#
while True:
if imu.gyro[1]<-40:
dac.wavplay('okaeri.wav')
sleep(12.5)
dac.stopwave()
dac.write(0)
if imu.gyro[1]>40:
dac.wavplay('itte_.wav')
sleep(12.5)
dac.stopwave()
dac.write(0)
sleep(0.1)
イメージダウンロード
door.zip
M5StackでSDカードをマウントする (MicroPython[loboris])
SDカードは次の初期化を行うことでマウントできます。
import uos
uos.sdconfig(uos.SDMODE_SPI, clk=18, mosi=23, miso=19, cs=4, maxspeed=40)
uos.mountsd()
SDカードスロットはインターフェース(VSPI)をLCDと共有しています。
SDカードとLCDを同時にアクセスする際には注意が必要。
maxspeedはSPIインターフェースのクロック速度を指定します。(初期値40、省略できます)実際の転送速度はSDカードとの相性によるようです。
M5StackでWAVファイルを再生する (MicroPython[loborisリビルド版]) (2018/11/02)
SDカードスロットとLCDはインターフェース(VSPI)を共有しています。
SDカードとLCDへのアクセスが集中した状態ではLCDへの表示が遅れたり再生音が途切れることがあります。
この問題をWAVファイルを再生する際のバッファーを増やすことで対応します。
WAVデータはDMAを使ってDAコンバータに転送されます。
DMAのサイズはバッファ数2(バッファ長1024Byte)と固定されているため、
ソースを変更して第3引数にバッファ数を指定できるように修正しました。
dac.wavplay('/sd/ファイル名.wav', 0, バッファ数(省略可))
32を指定した場合、バッファサイズは32KBになります。
弊害として再生開始までの時間が長くなります。
M5Stackの動画再生能力 (MicroPython[loborisリビルド版]) (2019/04/09)
上の動画は内蔵フラッシュメモリーに保存した画像ファイル(jpeg)から表示しています。
全画面(320×240)にjpeg画像1枚を表示する時間を測定すると約0.1ミリ秒でした。
全画面表示はLCD(ILI9341)のアクセススピードより、画像データ保管場所からの転送スピードに影響されます。LCDへの画像データはDMA転送されます。
動画データの作り方
動画をムービーメーカーで7FPSに変換 → Free Video to JPG Converterで画像に変換(フレーム毎) → XnConvertでトリミング/リサイズ/再圧縮(10KB以内、320×240[Offset 56,11]、圧縮率=25/DCT=Float/Smooth=0/Sub=4,1,1/EXIFなし/ハフマンなし) → FlexRena84でファイル名調整 → 同じ画像を間引く
M5Stackで外部SPI機器を使う際のトラブル&対策
ESP32モジュールにはHSPIとVSPIの2系統のSPIインターフェースが用意されています。(FlashとpsRAM用は別)
M5StackではVSPIにLCDとSDスロットが接続されていて外部用SPI端子もVSPIに接続されます。
またSPIはDMAも使用しており現状MicroPythonでは下記に固定されています。
このためLCDと外部SPI機器は同時に使用出来ず、次のエラーが発生します。
spi_master: spi_bus_initialize(96): dma channel already in use
[SPI_UTILS]: spi initialization failed with rc=0x103
M5StackでDualShock/2を使う (MicroPython[loborisリビルド版]) (2018/06/24)
DualShock/2はSPIインターフェースで通信できます。
spi = SPI(
spihost=SPI.VSPI,
#mode = SPI.MASTER
baudrate = 250000, polarity = 1,
phase = 0, # Cable=1 / Remote=0
bits = 8, firstbit = SPI.LSB,
duplex = True,
sck = Pin(18, Pin.OUT), mosi = Pin(23, Pin.OUT), miso = Pin(19, Pin.IN),
cs = Pin(26, Pin.OUT))
DualShock/2の資料はこちらが詳しくとても分かりやすいです。
プレイステーション2専用ローリングスイッチ技術資料
ワイヤレスタイプのPS2コントローラーをM5Stackプロトモジュールに取り付ける場合の配線図。
プレイステーションのコネクタは除去しています。表面実装のクリスタルに交換しています。交換はハンダ付けの難易度が高いです。
M5Stackのロットと9軸センサー (MicroPython[loborisリビルド版])
いまのところ次のロットが確認されています。
リリース | IMU | 特徴 |
初期ロット | MPU9250 | PSRAMが認識しない |
| MPU9250 | バッテリー残量が取得できない |
| MPU9250 | |
2019/8〜 | SH200Q | Kxxxxxxxx / SH200Qのシール |
2019/8〜 | MPU6886 | Kxxxxxxxxのシール |
2019/8〜 | MPU6886 | Kxxxxxxxxのシール / IPS液晶 |
IPS液晶の識別は下記になります。
ips_check = Pin(33,Pin.IN,Pin.PULL_DOWN)
if ips_check.value():
display_type = tft.M5STACK_IPS
else:
display_type = tft.M5STACK
Pin(33,Pin.OUT)
MPU6886はこちらで使えます。MPU9250と同様に使えるようにしました。
import mpu6886
imu = mpu6886.MPU6886(i2c,
accel_fs = mpu6886.ACCEL_FS_SEL_16G,
gyro_fs = mpu6886.GYRO_FS_SEL_250DPS,
accel_sf = mpu6886.SF_G,
gyro_sf = mpu6886.SF_DEG_S
)
SH200QはM5Stick-Cと同じなので、M5Stick-CのIMUを使うを参照してください。
M5Stack FIRE 初期版(PSRAMが認識しないもの)など一部機種の9軸センサーは地磁気センサーのI2Cアドレスが他のM5Stackと異なります。次の修正が必要です。
mpu6500.MPU6500.whoami=0x71
ak8963.AK8963.whoami=18
mag = ak8963.AK8963(i2c,address=0x0e)
mpu = mpu6500.MPU6500(i2c,
# 省略
)
imu = mpu9250.MPU9250(i2c, mpu6500=mpu, ak8963=mag)
M5CameraをMicroPythonで使ってみる
M5CameraとM5Stackの双方向通信 (MicroPython[loborisリビルド版]) (2019/01/23)
M5Cameraで撮影したデータをM5StackにWiFiで送信します。逆にM5StackからのDUALSHOCKデータをM5Cameraに送信します。すべてMicroPythonでプログラム。
M5Cameraで撮影データを取得する (MicroPython[loborisリビルド版]) (2019/01/23)
M5CameraにmicroPythonを載せて
MicroPythonから直接Camera(OV2640)にアクセス出来るようにしました。
import camera
camera.init([,reset] [,xclk] [,siod] [,sioc] [,d7] [,d6] [,d5] [,d4] [,d3] [,d2] [,d1] [,d0]
[,vsync] [,href] [,pclk] [,freq] [,timer] [,channel] [,pixformat]
[,framesize] [,quality] [,fb_count]) イニシャライズ
camera.sensor_set([,pixformat] [,framesize] [,contrast] [,brightness] [,saturation]
[,gainceiling] [,quality] [,colorbar] [,whitebal] [,gain_ctrl] [,exposure_ctrl]
[,hmirror] [,vflip] [,aec2] [,awb_gain] [,agc_gain] [,aec_value] [,special_effect]
[,wb_mode] [,ae_level] [,dcw] [,bpc] [,wpc] [,raw_gma] [,lenc])
img=camera.get_fb()
width=camera.width()
height=camera.height()
imgに取得したイメージデータが格納されている
camera.return_fb() 取得イメージ解放
#camera.reset()
camera.deinit()
pixformat = RGB565, YUV422, GRAYSCALE, JPEG, RGB888
framesize = QQVGA, QQVGA2, QCIF, HQVGA, QVGA, CIF, VGA, SVGA, XGA, SXGA, UXGA
contrast = -2 - 2 コントラスト
brightness = -2 - 2 輝度
saturation = -2 - 2 彩度
gainceiling = GAINCEILING_2X - 128X
quality = 0 - 63
colorbar = True, False
whitebal = True, False オートホワイトバランス
gain_ctrl = True, False
exposure_ctrl = True, False 露出
hmirror = True, False 水平反転
vflip = True, False 垂直反転
aec2 = True, False
awb_gain = True, False
agc_gain = 0 - 30
aec_value = 0 - 1200
special_effect = NORMAL, ANTIQUE, MONO, NEGATIVE, BLUISH, GRENNISH, REDDISH, MONO_NEGATIVE
wb_mode = 0 - 4
ae_level = -2 - 2
dcw = True, False
bpc = True, False
wpc = True, False
raw_gma = True, False
lenc = True, False
OV2640ピンアサイン
1 | STROBE/NC | 2 | AGND | 3 | SIO_D(22) | 4 | AVDD(3.3V) |
5 | SIO_C(23) | 6 | RESET(15) | 7 | VSYNC(25) | 8 | PWDN |
9 | HREF(26) | 10 | DVDD(1.8V) | 11 | DOVDD(2.8V) | 12 | Y9(D7=19) |
13 | XCLK(27) | 14 | Y8(D6=36) | 15 | DGND | 16 | Y7(D5=18) |
17 | PCLK(21) | 18 | Y6(D4=39) | 19 | Y2(D0=32) | 20 | Y5(D3=5) |
21 | Y3(D1=35) | 22 | Y4(D2=34) | 23 | Y1 | 24 | Y0 |
イメージファイル公開準備中…
M5StickをMicroPythonで使ってみる
M5Stick-CからFTPサーバーに接続する (MicroPython[loborisリビルド版]) (2019/07/24)
自力でFTPサーバーに繋げるようにしました。スクリーンキーボードは加速値で動かしています。REPLを使わずに高速ファイル転送ができるので便利。
M5Stick-Cのディスプレイに表示する (MicroPython[loborisリビルド版]) (2019/06/26)
MicroPythonからTFT ST7735Rにアクセスする。
import display
tft=display.TFT()
tft.init(tft.M5STICKC, width=160, height=80, mosi=15, miso=14, clk=13,
cs=5, dc=23, rst_pin=18, speed=8000000, splash=False,
rot=tft.LANDSCAPE_FLIP, offset_x=1, offset_y=26, bgr=True)
縦画面の場合 width=160, height=80, rot=tft.LANDSCAPE_FLIP, offset_x=1, offset_y=26
tft.set_bg(tft.WHITE)
tft.set_fg(tft.BLACK)
tft.clear()
tft.font(tft.FONT_Ubuntu) フォント指定
tft.text(0, 0, '[SELECT]', tft.BLACK) 文字の表示
tft.rect(1, 1, 158, 78) 端から端まで線を引く
tft.image(0, 0, 'test.jpg') 'イメージファイル名' 160x80ドット
M5Stick-Cのマイクを使う (MicroPython[loborisリビルド版]) (2019/06/26)
MicroPythonからMicophone SPM1423にアクセスする。
from machine import I2S
samples = bytearray(2*8192)
mic = I2S(I2S.NUM0,
ws=Pin(0), sdin=Pin(34),
mode=I2S.MASTER_RX_PDM,
dataformat=I2S.B16, channelformat=I2S.RIGHT_LEFT,
samplerate=10000, dmacount=2,
dmalen=128) 任意のサンプルレート
mic.set_clk(samplerate=10000,dataformat=I2S.B16,channel=I2S.MONO)
numread = audio.readinto(samples,timeout=I2S.portMAX_DELAY) 録音実行
M5Stick-CのPMICを使う (MicroPython[loborisリビルド版]) (2019/07/18)
MicroPythonからパワーマネジメントIC AXP192にアクセスする。
import axp192
i2c = machine.I2C(sda=21, scl=22)
pm=axp192.AXP192(i2c)
pm.ScreenBreath(brightness) バックライト精度調整
pm.EnableCoulombcounter()
pm.DisableCoulombcounter()
pm.StopCoulombcounter()
pm.ClearCoulombcounter()
pm.GetCoulombchargeData()
pm.GetCoulombdischargeData()
pm.GetCoulombData()
pm.GetVbatData()
pm.GetVinData()
pm.GetIinData()
pm.GetVusbinData()
pm.GetIusbinData()
pm.GetIchargeData()
pm.GetIdischargeData()
pm.GetTempData()
pm.GetPowerbatData()
pm.GetVapsData()
pm.SetSleep()
pm.GetWarningLeve()
pm.GetBtnPress()
pm.GetBatState()
pm.GetBatVoltage() バッテリー電圧
pm.GetBatCurrent()
pm.GetVinVoltage()
pm.GetVinCurrent()
pm.GetVBusVoltage()
pm.GetVBusCurrent()
pm.GetTempInAXP192()
pm.GetBatPower()
pm.GetBatChargeCurrent()
pm.GetAPSVoltage()
pm.GetBatCoulombInput()
pm.GetBatCoulombOut()
pm.GetWarningLevel()
pm.SetCoulombClear()
pm.SetLDO2(True/False)
pm.ShutDown() シャットダウン
M5Stick-CのRTCを使う (MicroPython[loborisリビルド版]) (2019/07/18)
MicroPythonからリアルタイムクロックBM8563にアクセスする。
import bm8563
i2c = machine.I2C(sda=21, scl=22)
rtc=bm8563.BM8563(i2c)
rtc.GetBm8563Time() (年, 月, 日, 時, 分, 秒, 週)が戻ります。
rtc.GetTime() (時, 分, 秒)が戻ります。
rtc.SetTime(Hours, Minutes, Seconds) 時間を設定します。
rtc.GetData() (年, 月, 日, 週)が戻ります。
rtc.SetData(Year, Month, Date, WeekDay) 日付を設定します。
M5Stick-CのIMUを使う (MicroPython[loborisリビルド版]) (2019/07/18)
MicroPythonから6軸IMU SH200Qにアクセスする。
import sh200q
i2c = machine.I2C(sda=21, scl=22)
imu = sh200q.SH200Q(i2c,
accel_fs = sh200q.ACCEL_FS_SEL_8G,
# 加速度 (測定レンジ±8g)
gyro_fs = sh200q.GYRO_FS_SEL_2000DPS,
# ジャイロ (測定レンジ ±2000°/sec)
#accel_sf = sh200q.SF_G, #Raw
accel_sf = sh200q.SF_M_S2,
# 1 g = 9.80665 m/s2 ie. standard gravity
#gyro_sf = sh200q.SF_DEG_S, #Raw
gyro_sf = sh200q.SF_RAD_S,
# 1 rad/s is 57.295779578552 deg/s
#accel_rate=ACC_OUT_DATA_RATE_256HZ,
#gyro_dlpf=GYRO_DLPF_3,
#gyro_rate=GYRO_OUT_RATE_500HZ )
imu.acceleration 加速[計算値] (xyzのタプル形式)
imu.acceleration_raw 加速[出力値] (xyzのタプル形式)
imu.gyro ジャイロ[計算値] (xyzのタプル形式)
imu.offset オフセットの取得設定 (xyzのタプル/リスト形式)
imu.whoami
imu.temp
imu.sh200q_ADCReset()
imu.sh200q_Reset()
M5Stick(初代)のディスプレイに表示する (MicroPython[loborisリビルド版]) (2019/01/27)
MicroPythonからOLED SH1107にアクセスする。(framebufを使っています)
import sh1107
oled = sh1107.SH1107_SPI(64, 128, spi, dc=Pin(27), res=Pin(33), cs=Pin(14), seg_remap=1)
# seg_remap=1 上下反転
oled.line(0, 0, 64, 128, 1) 端から端まで線を引く
oled.text('Micropython', 0, 0, 1, 1)
'表示文字',X座標,Y座標,1=白,1=右90°回転
oled.scroll(-8, 0)
oled.show()
画面リフレッシュ
oled.bitmap('i2is.bmp')
'ビットマップファイル名' 128x64ドット 単色
oled.show()
画面リフレッシュ
M5Stack(M5GO)の初期不良(発売初期の問題、今は品質が安定しているようです。)
とっても素敵で魅力的なM5Stackですが製造時の不具合が多数報告されています。
とくにM5GOの初期生産分での不具合の報告が多いようです。
私が購入したM5GOも不具合品でした。先に購入したM5Stack Facesのハンダのクオリティと比較してもM5GOは雑に感じました。
不具合品は直接製造メーカーに連絡すれば交換してくれるとの事です。
スイッチサイエンスさんで購入した人はスイッチサイエンスさんで交換対応して貰えます。
主な不具合(※印は実際に遭遇)
M5Stack(PSRAMなし)にSRAMを追加してみました。
結果は失敗…
純粋なSRAMの23A512が使えたら消費電力的に嬉しいと思ったのですが残念です。
esp-psaram32と23A512のコマンド仕様が異なるのは分かっていたのですが、下位互換にしてるのでは…と思った甘い予測が外れたみたいです。
実績のあるLyontek LY68S3200とかのチップ単体購入のハードルは高そうなのでPSRAMあり版のM5Stackの技適審査を待つしかなさそうです。
※ テストは電子レンジの中でやりましたw
※ 余談ですが下の写真にジャギ様が居ますw