USB Type-Cスタンドを買った

概要

前回の最後で書いてあったUSB Type-Cのスタンドが届きました。結局前回は届かなかったので、他の店舗で購入したんですけれどね、、、

商品

上記の商品を購入しました。400円前後で一ヶ月弱で届きました。

Amazonだとこれかな? ただ結局中国発送なので、Amazonから買うメリットがないですね。

こんな感じの商品になります。色は黒、白、グレーの3色あるみたいです。

横からみると、ちょっと後ろに傾いています。

裏側からの写真です。Type-Cを裏から接続して使います。

ATOMを接続してみました。ちょっと台としては大きいですが、スッキリ展示できます。

ATOM Echoもスピーカーとして設置するのには良さそうです。ただEchoで使うんだった白のスタンドですよね。追加注文しておきたいと思います。

M5Stack Fireです。横にコネクタがあるので、ボタンが右側に来てしまいますね。

横からみた写真です。結構きれいに収まっています。

チャージ専用のボトムを使うと上下逆さになりますが接続できます。ただ出っ張りがすごい、、、

スタンド付属のPM2.5キットですがこんな感じです。

横からです。バッテリー内蔵していないのでやっぱりなにかのスタンドに立てたいですよね。むしろバッテリーボトムをつけて、常時給電はちょっと怖いかな?

TTGO T-Watchです。

技適マーク重要!

ただ、USBコネクタが真ん中にないので、残念なことに、、、

他の商品紹介

ちょっとわかりにくいですが、ものすごく短いType-C to Type-Aコネクタです。これかなり便利ですが、USBハブの種類を選びます。お気に入りだったのですが、便利度ではスタンドの方がいいのかもしれません。

他の商品紹介その2

これはおすすめしません。。。この手の部分が邪魔で厚みがあるものが刺さらないんですよね。

他の商品紹介その3

ボツにしたので写真がない。。。Qiのスマホ用充電アダプタです。よくあるケースの間に入れるタイプです。これ使うとちょっとした隙間を通せるのでケーブルを隠しやすいです。

本当はケーブルだけほしいのですが、Type-Cがついているフレキシブルケーブルって高いんですよね。

まとめ

いまのところ、きれいに展示するにはこのType-Cスタンドが一番かなーって思っています。まあ展示する予定はないのですが、、、

M5StackAuto(C, C+, Stack, Atom)のIMU確認

概要

M5シリーズを同時に開発できるM5StackAutoでIMUの動作を確認してみました。特に座標軸が違うと同じコードで動かないので、統一したいと思います。

加速度

画面の向きで正面を決めました。正面で画面を上に机に置いたところZ軸が1になりました。

左側に倒したところにX軸が1になりました。TTGO T-Watchが逆だったので補正します。

同じく正面のまま立てかけるとY軸が1になりました。TTGO T-Watchが逆だったので補正します。

ここには写っていませんですが、ATOM Matrixも軸がずれていたので、M5StickCと同じ数値になるように補正しました。

ジャイロ

X軸の回転は手前に傾けるとプラスでした。

Y軸の回転は右に傾けるとプラスでした。

Z軸は左に傾けるとプラスでした。

シリアルプロッタで描画しながら動かすとわかりやすいですね。この軸になるように他の端末も補正していきます。TTGO T-Watchはそもそも3軸なのでジャイロがありません。そのためATOMだけ補正が必要になります。

MahonyAHRS

組み込もうかと思いましたが、既存M5StickCライブラリのピッチとロールの軸が逆な気がするんですよね。MahonyAHRS以外のもいろいろライブラリがあるので、各自自分で組み込んでみてください、、、

まとめ

M5StickCとM5StackはIMUの軸が同じでした。このへんは流石ですがATOMが違ったのが残念。小さいから設計の自由度が低いのかな?

Hantek 6022BL(USB 20MHz2Chオシロ+24MHz16Chロジアナ)

概要

低予算オシロ、ロジアナで紹介した機種を実際に購入してみてのレビューです。今回はHantek 60022BLになります。

商品

今回はAliExpressのHantek Official Storeから購入してみました(¥ 7,340)。8月2日に購入して一週間以内で到着しました。中国からなのに早い!

最初に結論をいっておくと、ロジアナは使い物にならないので買うんなら安い6022BEで十分です。差額でEZ-USBを購入したほうがいいでしょう、、、

こんな感じの荷姿で佐川から届きます。ちなみに追跡はできません!

AliExpressでまったく追跡できません。佐川グローバルからは追跡できましたので、Japan Direct Lineってのがこれなのかもしれません。

中身はこんな感じです。

こんな感じでいろいろはいっています。

二本目のプローブは箱の下にはいっているので注意しましょう!

本体は金属製で結構しっかりしています。

オシロスコープの2Chとロジックアナライザーの16Chの端子、GNDとプローブの補正用端子があります。

USB端子と、謎のボタン、USBXI端子があります。謎のボタンは押し込んだ状態(H)で使うとHantekのデバイスとして認識されます。でっぱっている状態(P)だと別のUSB VID / PIDで認識されます。Pの状態で認識させて、Zadigを使ってWinUSBのドライバーをセットアップすることでsigrok(PulseView)で8チャンネルのロジックアナライザーとして利用が可能になります。

USBXI端子はよくわかりません。。。通常は使うことはないと思います。

資料

上記のダウンロードのタブからソフトウエア、ドライバ、マニュアル、SDKがダウンロードすることができます。

セットアップ

マニュアルによると、接続する前にソフトウエアをインストールしろとああります。ただ、これは罠です!

ソフトウエアに入っているドライバはWindows7用で、Windows10だと動きません(涙) まちがって入れるとかなり面倒になります。

間違っていれた場合のリカバリ方法

ドライバの署名がないと言われる場合にはWindows7用のドライバが入っています。イベントを開いて、oem??.infの文字を探します。ここの番号は環境によって異なります。Hantekのマニュアルだと違う番号になっているので注意してください、、、

C:\Windows\INFから該当ファイルを削除します。あとでWindows10用のドライバを入れると復活するのでバックアップなどは必要ありません。一応中身を確認してHantekの文字が書いてあれば正しいファイルです。

次にC:\Windows\System32\drivers配下にあるHantek6022がついているファイルをすべて消します。

この状態でUSBにHantek6022を接続することで不明なデバイスが追加されれば成功です。ちなみにUSBハブ経由で接続したら電源が足りないのかOSごと落ちました(涙)

本体直結のUSBに接続してあげましょう。できれば電源用の赤いコネクタも接続したほうが安心だと思います。

ドライバのセットアップ

Hantek6022をUSBで接続すると、不明なデバイスが増えます。この状態でダウンロードしたドライバのWindows10フォルダを指定してセットアップをします。

ソフトウエアのセットアップ

ソフトウエアをセットアップします。ここは標準設定で問題ないはずです。

アプリの起動

こんな感じの画面がでてきて、左がオシロスコープで、右がロジックアナライザーになります。

ロジックアナライザーアプリ

えーっと、ちょっと触ってみたのですが使い物になりません。そもそもトリガーがないので、キャプチャボタンを押した瞬間からの信号を取り込んでくれる機能しかありません。

プロトコルの解析などもできないので、このアプリを使う必要はありませんね。他のアプリを使うのであれば単体のEZ-USBを購入したほうが使いやすいと思います。。。

なのでロジックアナライザーの機能は検証しません。EZ-USB単体での検証で実施したいと思います。

オシロスコープアプリ

起動直後はこんな画面になります。まずはプローブの補正をする必要があります。プローブを接続してグリップのところにx1とx10というスイッチがあるのでx10を選択します。そして画面上もx10に設定します。そして本体の補正用の端子に接続すると矩形波が表示されますので、付属のマイナスドライバーできれいな波形になるように調整します。

最初はこんな風に変な波形になっていると思いますので、上にあるAUTOボタンを押して、自動設定を利用してください。画像はプローブの設定がx1のままです。。。

こんな感じになれば補正完了です。

このままだと使いにくいので、Viewにあるものを全部開いてみます。左側に追加されたので波形の情報を選択すると、下に出力されます。Maxが2Vちょっとですね。縦1マス1Vで2マス分なので確かに2Vぐらいです。横が時間で、ピリオドが1000uSですね。横1マスが500uSなので1周期分の時間が表示されます。周波数は1KHzですね。DutyサイクルはPWM的なやつで50%なのでHIGHとLOWが同じ割合になっています。パルス幅が500uSとなっています。

カーソルという機能もあって、エリアを指定すると差分を表示してくれる機能もあります。微妙な電圧とかを確認するときにはカーソルで確認したほうが楽だと思います。

試験用信号発生

こんな感じでM5StickCを利用して、PWM信号を発生させてオシロスコープで観察してみました。信号は1KHzから徐々に上げていき、どのような結果になるのかを確かめました。

ちなみにこんなにびろーんと配線すると、普通は怒られますのでご注意を!(笑)

//#include "M5StackAuto.h"
#include "M5StickC.h"

const int ddsPin = 26;
const int ddsChannel = 1;
int frequencyMode = 0;
int frequencyList[] = {
  1000,     // 1K
  5000,     // 5K
  10000,    // 10K
  50000,    // 50K
  100000,   // 100K
  500000,   // 500K
  1000000,  // 1M
  2000000,  // 2M
  3000000,  // 3M
  4000000,  // 4M
  5000000,  // 5M
  6000000,  // 6M
  7000000,  // 7M
  8000000,  // 8M
  9000000,  // 9M
  10000000, // 10M
  11000000, // 11M
  12000000, // 12M
  13000000, // 13M
  14000000, // 14M
  15000000, // 15M
  16000000, // 16M
  17000000, // 17M
  18000000, // 18M
  19000000, // 19M
  20000000, // 20M
  30000000, // 30M
  40000000, // 40M
};
int frequencyCount;

void setup() {
  M5.begin();

  frequencyCount = (sizeof(frequencyList) / sizeof(int));

  ledcSetup(ddsChannel, frequencyList[frequencyMode], 1);
  ledcAttachPin(ddsPin, ddsChannel);
  ledcWrite(ddsChannel, 1);
}

void loop() {
  M5.update();

  if (M5.BtnA.wasPressed()) {
    frequencyMode++;
    frequencyMode = frequencyMode % frequencyCount;
    ledcSetup(ddsChannel, frequencyList[frequencyMode], 1);
    ledcWrite(ddsChannel, 1);
  }
  if (M5.BtnB.wasPressed()) {
    frequencyMode--;
    frequencyMode = (frequencyMode + frequencyCount) % frequencyCount;
    ledcSetup(ddsChannel, frequencyList[frequencyMode], 1);
    ledcWrite(ddsChannel, 1);
  }

  M5.Lcd.setCursor(0, 0, 1);

  M5.Lcd.printf("M5StickC DDS\n");
  M5.Lcd.printf("frequency\n");
  M5.Lcd.printf(" %9d\n", frequencyList[frequencyMode]);
  M5.Lcd.println();
  M5.Lcd.printf("BtnA : UP\n");
  M5.Lcd.printf("BtnB : DOWN\n");

  delay(100);
}

上記のようなコードになります。PWMを1ビットで呼び出していますので指定した周波数の矩形波が出力されるスケッチになります。

GNDの接続について

GNDなしで、信号だけ接続することで測定が可能です。これは同じパソコンにM5StickCとオシロスコープを接続しているので、GNDはすでに共通になっているからです。

GNDを接続しました。すると信号のエッジがきれいになりました。やっぱりGNDが遠いと信号にノイズが乗ってしまうのですね。オシロスコープのGNDは変なところにショートさせると危険なので気をつけて接続させる必要があります。今回は接続した状態で測定をしてみたいと思います。

測定実験

1kHz

さすがに1KHzはきれいに測定できます。左右の不要な表示を消してみました。アウトプットはVp-pで信号の最大と最小の差、トップはHIGHのときの最頻値の電圧、ピリオドが周期の間隔、周波数を表示させています。

5KHz

まだまだきれいです。

10KHz

信号のエッジが少し丸くなった?

50KHz

若干トリガーのかかりが甘いですが、きれいにとれています。

100KHz

あまり変わらず。

500KHz

すこしがびがびしてきましたが、波形自体はきれいです。

1MHz

若干悪化ですがそれほど変わらず。

2MHz

ちょっとモードを変えてみました。補間モードでSinX/xになっていたのをStepにしました。線を補間なしにしました。エッジがすこし丸まっていますがまだ大丈夫ですね。一般的に測定対象の10倍以上あるオシロスコープで測定するのが推奨されています。20MHzのオシロスコープなので、このグラフまでがきれいな波形だと思います。

3MHz

ちょっと波形が崩れてきました。

4MHz

丸まってきていますが、まだ大丈夫かな?

この波形が対象の5倍になります。これぐらいまでにしなさいと言われています。

5MHz

この辺になってくると周波数が安定しません。5MHzだったり4.8MHzだったりぶれます。

6MHz

これは完全に波形がおかしいですね。

7MHz

どんどん正弦波っぽくなってきます。

8MHz

9MHz

まだLOWとHIGHはわかりますが、限界が近いです。

10MHz

帯域の半分です。これぐらいが一般的に限界です。

2Chで取得してみました。サンプリングの数は同じでした。1chのペン型が96MS/sというスペックなので、これも48MS/sが2つではなく、96MS/sが搭載されていると予想します。

信号を補間するとこんな感じで、どんどん正弦波になっていきます。

11MHz

基本は11MHzと認識されますが、たまに9.6MHz扱いになります。

12MHz

かなりぶれてきました。

13MHz

Vp-pの電圧も減ってきました。サンプリングの関係からここが限界だと思います。

信号と帯域の関係

Hantek 6022は20MHz帯域の48MS/sというスペックになります。これは20Mhzはオシロスコープの帯域を表すのですが、サンプリングレートもかなり重要です。1周期の波形を測定するのには正弦波に限定しても最低2サンプリングは必要です。一般的には4サンプリング程度は必要になります。

48MS/sということは12MHzの矩形波はなんとなく表示できる限界になります。帯域とサンプリングレートの両方が影響して、どんな信号まで測定できるかが決まります。ちなみに他社の20MHzオシロスコープだと100MS/sぐらいが標準的なサンプリングレートなので、Hantekはちょっと波形が汚いですね。

一般的には帯域の10分の1までの対象は測定できて、5分の1か4分の1ぐらいまではなんとか測定できると言われています。オシロスコープが20MHzなので対象は2MHzまではきれいで、4MHzから5MHzまでが限界となります。

このへんの情報はオシロスコープ会社のページにあるのですが、60MHzのオシロスコープだと測定できませんねみたいな全然共感できない内容になっています。。。

とはいえ、よくできていますのでおすすめです。このへんは実際に触ってみたいと理解しにくいところがあると思います。

ちなみに帯域が足りない場合には、どんどん測定する電圧が下がってきています。

まとめ

購入する前からわかってはいましたが、ロジックアナライザーはダメですね。。。

オシロスコープは値段なりに利用できるとは思います。次回は同じ信号をもう少しスペックの高いオシロスコープで測定して、どのような結果になるのかを比較してみたいと思います。

なぜならESP32の出力するPWM信号自体がなまっている可能性があるからです!

とはいえ、つよつよのオシロスコープは持っていないのでOWONの25MHzペン型オシロスコープで検証します。ちょっとみたところそれほど信号は崩れていないので、このままESP32のPWMで検証を続けたいと思います。

Si5351という、160MHzまでのクロックジェネレーターをもっていますが、ESP32の方が再現しやすいですもんね?

M5StackAuto : M5StickC, M5StickC Plus, M5Stack, M5ATOMを単独ソースで開発する

概要

もともとM5StickCの互換ライブラリを準備していたのですが、らびやんさん作成の高速LCDライブラリのLovyanGFXが複数ボードの自動認識機能が実装されたのでM5StickC風のライブラリで、M5シリーズを単独ソースの単独バイナリで同時開発できるものを作ってみました。

対応表

ボードLCD/LED電源管理IMURTCボタンAボタンBボタンCTone
M5StickCM5.Lcd
LovyanGFX
M5.Axp
AXP192
M5.Imu
SH200Q
MPU6886
M5.Rtc
BM8563
M5.BtnA
GPIO37
M5.BtnB
GPIO39
M5.BtnC
電源ボタン
M5StickC PlusM5.Lcd
LovyanGFX
M5.Axp
AXP192
M5.Imu
MPU6886
M5.Rtc
BM8563
M5.BtnA
GPIO37
M5.BtnB
GPIO39
電源ボタンM5.Beep
M5Stack BASICM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
M5Stack GrayM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.Imu
MPU6886
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
M5Stack FireM5.Lcd
LovyanGFX
M5.Power
IP5306
M5.Imu
SH200Q
MPU6886
M5.BtnA
GPIO39
M5.BtnB
GPIO38
M5.BtnC
GPIO37
M5.Beep
ATOM LiteM5.dis
FastLED
M5.BtnA
GPIO39
ATOM MatrixM5.dis
FastLED
M5.Imu
MPU6886
M5.BtnA
GPIO39
ATOM EchoM5.dis
FastLED
M5.BtnA
GPIO39
TTGO T-watchM5.Lcd
LovyanGFX
M5.Imu
BMA423
M5.Rtc
BM8563
M5.BtnA
GPIO36

ちょっと大きな表になってしまいましたが、対応表になります。

利用ライブラリ

外部ライブラリ

LovyanGFX

ボード自動判定機能付きのLCDライブラリです。既存のTFT_eSPIライブラリとの互換性はありますので、ほぼ同じイメージで利用可能です。

FastLED

ATOMでのLED制御で利用しています。既存ライブラリと同じなので特に変わりはありません。

I2C_AXP192

M5StickCの電源管理などで使われているAXP192の単独ライブラリはなかったので、自作しました。既存との互換性は考えずに、単独で使いやすいように作っています。

I2C_MPU6886

こちらもM5StickCの6軸IMU用ライブラリを自作しました。

I2C_BM8563

こちらもM5StickCのRTC用ライブラリの自作ですが、そもそも他のRTCコンパチだったので既存ライブラリが使えた気がします、、、

内蔵ライブラリ

I2C_SH200Q

古いM5StickCなどで使われている6軸IMUですが、あまり利用例がないので独立ライブラリではなく内蔵させています。

I2C_IP5306

M5Stackで使われている電源管理ライブラリです。もともとはモバイルバッテリーなどの管理用ICなのでAXP192と比べるとかなり機能が少ないです。

I2C_BMA423

TTGO T-watchの3軸IMUです。M5シリーズではないのですが、対応できそうなので作ってみました。

使い方

ライブラリマネージャーに登録済みなので、「ESP32LitePack」で検索してください。

インストールするときに、必要なライブラリも一緒にインストールするかと聞かれるので「Install all」を選んでください。

ちなみにM5StickCやM5Stackの既存ライブラリは必要ありません。公式ライブラリには依存せずに互換ライブラリを構築しています。

スケッチ例

#include "M5StackAuto.h"

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(10);

  Serial.printf("Lcd Width=%d, Height=%d\n", M5.Lcd.width(), M5.Lcd.height());

  M5.Imu.Init();
  Serial.printf("IMU : %d\n", M5.Imu.imuType);

  M5.dis.drawpix(0, CRGB(255, 0, 0));
  M5.dis.drawpix(2, CRGB(0, 255, 0));
  M5.dis.drawpix(4, CRGB(0, 0, 255));
  M5.dis.drawpix(6, CRGB::White);

  // Not Support(ESP_LOGE)
  M5.Axp.GetWarningLevel();
}

void loop() {
  static int vol = 11;

  M5.update();

  M5.Lcd.setCursor(0, 4, 1);

  M5.Lcd.printf("M5StackAuto\n");

  M5.Lcd.printf("Battery\n");
  M5.Lcd.printf(" Temp :%6.1f\n", M5.Axp.GetTempInAXP192());  // AXP192 Internal temperature
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetBatVoltage());    // Battery Voltage(3.0V-4.2V)
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetBatCurrent());    // Battery Current(+:charge, -:decharge)

  M5.Lcd.printf("ASP\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetAPSVoltage());    // ESP32 Voltage

  M5.Lcd.printf("VBus(USB)\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetVBusVoltage());   // USB Voltage
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetVBusCurrent());   // USB Current

  M5.Lcd.printf("VIN(5V-In)\n");
  M5.Lcd.printf(" V(V) :%6.3f\n", M5.Axp.GetVinVoltage());    // 5V IN Voltage
  M5.Lcd.printf(" I(mA):%6.1f\n", M5.Axp.GetVinCurrent());    // 5V IN Current

  if (M5.Imu.imuType != 0) {
    float ax;
    float ay;
    float az;
    float gx;
    float gy;
    float gz;
    float t;

    M5.Imu.getAccelData(&ax, &ay, &az);
    M5.Imu.getGyroData(&gx, &gy, &gz);
    M5.Imu.getTempData(&t);

    Serial.printf(" %f,%f,%f,%f,%f,%f,%f\n", ax, ay, az, gx, gy, gz, t);

    M5.Lcd.printf(" Accel   Gyro\n");
    M5.Lcd.printf("X%5.2f%7.1f\n", ax, gx);
    M5.Lcd.printf("Y%5.2f%7.1f\n", ay, gy);
    M5.Lcd.printf("Z%5.2f%7.1f\n", az, gz);
  }

  RTC_TimeTypeDef RTC_TimeStruct;
  RTC_DateTypeDef RTC_DateStruct;
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.printf("%04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
  M5.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);

  if (M5.BtnA.wasPressed()) {
    Serial.println("M5.BtnA.wasPressed()");
    M5.Beep.tone(1000, 100);
  }
  if (M5.BtnB.wasPressed()) {
    Serial.println("M5.BtnB.wasPressed()");
    vol--;
    M5.Beep.setVolume(vol);
    Serial.printf("vol = %d\n", vol);
  }
  if (M5.BtnC.wasPressed()) {
    Serial.println("M5.BtnC.wasPressed()");
    vol++;
    M5.Beep.setVolume(vol);
    Serial.printf("vol = %d\n", vol);
  }
  if (M5.BtnA.wasReleased()) {
    Serial.println("M5.BtnA.wasReleased()");
  }
  if (M5.BtnB.wasReleased()) {
    Serial.println("M5.BtnB.wasReleased()");
  }
  if (M5.BtnC.wasReleased()) {
    Serial.println("M5.BtnC.wasReleased()");
  }

  delay(100);
}

M5StackAuto.hを読み込むことで、M5StickC的なライブラリ構成でプログラムを行うことができます。基本的に利用できないデバイスのクラスを呼んでもエラーにならないようになっています。画面の大きさやボタンの数などで条件わけをする必要はありますが、既存に比べると同一ソースでプログラムをしやすいとは思います。

クラスの紹介

M5クラス

begin()とupdate()関数以外はクラスを持っているだけです。begin()の引数はM5StickCのものを採用していますが、通常は引数無しで実行するだけで良いと思います。

update()関数はBeep.updte()も内部で呼んでいます。

M5.Lcdクラス

LovyanGFXライブラリを利用していますので、互換性はありますがかなりの数の機能が追加されています。既存の機能もかなり高速化されています。

M5.disクラス

ATOMのLED制御クラスです。ほぼ同じラッパークラスを作っているので同じように利用できると思います。ただし、色の並びがおかしいのは修正していますのでCRGB::RedやCRGB(255, 0, 0)は正しく赤く光ります。

M5.Imuクラス

M5StickCのImu自動判定と同じようなことをしています。自動判定自体私がPRして本家に取り込んでもらったので、、、

SH200Q、MPU6886、BMA423を自動判定しています。M5Stack系は自動判定がなかったのでかなり便利に使えるのではないでしょうか?

今後軸が違う可能性があるので、座標系をM5StickCに合わせる改修が入る可能性があります。TTGOのT-watchで使われているBMA423は3軸なんで加速度しか取れませんのでご注意ください。

MahonyAHRSはまだ取り込んでいませんので使えませんので注意してください。MahonyAHRSは単体ライブラリとして存在しているので、そちらを使うのを推奨します。そのうち依存ライブラリに追加して内部に取り込むかもしれません。

M5.Axpクラス

AXP192の既存ライブラリで使いそうな関数のみ実装しています。Sleep系は実装していませんのでご注意ください。

M5.Powerクラス

M5Stackの電源管理クラスです。バッテリー残量取得などは実装していますがスリープ系は未実装です。使える機能が少ないのでAxpクラスに統合するかもしれません。

M5.Rtcクラス

M5StickCとM5StickC Plus、TTGO T-watchで使われているRTCをサポートしています。

M5.BtnA, BtnB, BtnCクラス

ここはM5StickCではなく、M5Stackにそろえています。M5StickCの電源ボタンはM5.Axp.GetBtnPress()ではなく、M5.BtnC.wasReleased()を利用してください。

ATOMとTTGO T-watchは物理的にボタンが1つしかないので、BtnAのみになります。

M5.Beepクラス

M5StackC PlusのBeepクラスをベースにしています。M5StackはSpeakerクラスだったので注意してください。M5Stackは爆音か変な音だったのであまり使っている人がいないのでしょうか?

M5Stackは、M5StackC Plusと同じぐらいの大きさのクリアな音がするように調整しました。ただPWMで出力を絞っているだけなので、周波数が変わって音がちょっと違います。。。

Wire1クラス

内蔵しているI2Cにアクセスするクラスになります。こちらはATOMだけピン配置が違うのですがボードの自動判定に応じたピンで初期化してあります。

Groveなどの端子で別系統のI2Cを使う場合にはWireクラスの方を利用してください。M5StackのPortAなどは内部と同じ端子が出ているのでWire1になります。

開発の注意点

開発で利用するボードは常にM5Stick-Cで大丈夫です。シリアルポートだけ利用するボードに変更してください。アップロード速度は1500000のままで、すべてのボードに転送できます。

また、一部サポートしていない関数があるので、Core Debug Levelはエラー以上にしてもらえると、シリアルモニタにで「Not Support」と関数名と一緒に表示されると思います。

まとめ

まだ資料が圧倒的に足りていませんが、M5StickCの開発経験がある人であればそれほど違和感なくM5Stackの開発もできると思います。とにかくシリアルポートを変更することだけで複数のボードで開発できるのは便利です!

当初はM5StickCとM5StickC Plusを同時開発するライブラリの予定だったのですが、LovyanGFXが他のボードも自動判定してくれたのでこんな感じのライブラリになりました。

もともとは個人的に便利なスケッチ例などを入れる予定だったので、ESP32LitePackという名前になっているので、中身と名前がミスマッチなのです、、、

M5Stack デュアルボタンユニット

概要

M5Stack社のユニット紹介、デュアルボタンユニットです。前回のボタンユニットが2つボタンになったものです。

商品

ちょっと大きめの箱にはいっていますね。なんとボタンユニットより、2ボタンのデュアルボタンユニットの方が安いです。元々はボタンユニットの方が安かったんですが、値上げによって高くなっています。もう少ししたらデュアルボタンユニットも値上げしそうですね。

こんな感じで外側のAが上の青いボタン、Bが下の赤いボタンみたいですね。押すとLOWになります。回路図を確認したところ、回路でプルアップされていましたので入力側は単純に使えそうです。

ボタン側です。スイッチサイエンスさんの画像は古いのかカバーがなかったですが、私が公式サイトから購入したのはありました。いまスイッチサイエンスさんで買うとどっちが届くのかな?

ボタンはちょっとペコペコするタイプなので、個人的には好きなタイプではなかったです。

スケッチ例

const uint8_t pin1 = 33;  // M5StickC
const uint8_t pin2 = 32;  // M5StickC

void setup() {
  Serial.begin(115200);
  delay(100);

  pinMode(pin1, INPUT);
  pinMode(pin2, INPUT);
}

void loop() {
  Serial.printf("Blue=%d, Red=%d\n", digitalRead(pin1), digitalRead(pin2));
  delay(100);
}

非常に単純に利用することができますね。Groveは外側の端子から利用するってのを覚えておくと設定しやすいと思います。

まとめ

個人的にはボタンの押したときの感覚が好きじゃないですが、2ボタン必要なときには便利ですね。結構大きな音がなるので青で始動、赤で停止みたいな用途に向きそうですね。

低予算でのオシロスコープ・ロジックアナライザーの選び方(2020年8月)

概要

低予算でのオシロスコープとロジックアナライザーの選び方をもう一度調べ直してみました。

対象信号例

プロトコル周波数チャンネル
PS/215KHz2
UART(MIDI)31.25Kbps2
UART(RS-232C)1.2Kbps~115.2Kbps2
PWM1.2Kbps~312.5Kbps1
I2C100KHz~400KHz2
CAN10Kbps~1Mbps2
PCM64kbps~2.048Mbps4
LPT10MHz17
USB 1.112Mbps2
AC9712.288MHz5
SPI1MHz~24MHz4
Compact Flash 4.133MHz26
SD2.0/SDIO52MHz6
USB 2.01.5Mbps~480Mbps2

一般的なプロトコルと周波数の範囲になります。SPIなどはもっと高速で通信することも可能ですが、よく使う範囲になります。おそらくはI2Cの2チャンネルで400KHzと、SPIの4チャンネルで24MHzぐらいが一般的に使う上限だと思います。

ロジックアナライザー

通信などの信号を確認する場合に利用します。通常16チャンネルぐらいのものが多いですが、最低4チャンネルとまわりの回路で8チャンネルぐらいまであれば低予算構成では問題ないと思います。

ロジックアナライザーの場合には、読み取りたい信号の4倍ぐらいあると安心みたいです。SPIをちゃんと分析したいときには100MHz以上が必要になります。80MHz動作のSPIをちゃんと分析する場合には200MHzぐらいあったほうがいいと思います。

I2Cだと400KHzなので1MHz以上のスペックであれば分析できそうですね。

この手のものが最初に検討するロジックアナライザーになると思います。24MHzまでなのでI2Cを分析するのには十分です。ただし、これの中身はEZ-USB FX2LPと呼ばれるチップになります。

これはケース無しであれば結構安く手にはいります。しかしながらケーブルとかがついていないのでちょっと使いにくいですね。

あと、この手のロジックアナライザーはアプリがついていないか、違法なものになります。基本的には無料で使えるオープンソースアプリのsigrokを使うのがおすすめです。

同じく24MHzですが、3MHzのアナログ1チャンネルのオシロスコープがついているのが上記の商品になります。こちらもsigrokを使うのがいいと思います。I2Cの波形がオシロスコープで確認して、ロジックアナライザーで動作を確認するのであればこれでなんとかなりそうです。

あまりおすすめはしませんが、とりあえず安いものを一台持っておきたいって用途にはおすすめです。

こちらは20MHzのオシロスコープに、24Mhzのロジックアナライザーが搭載されている商品です。24MHzってことで、中身はEZ-USB FX2LPになります。

オシロスコープとしてはそれなりに実用範囲のスペックですが、ロジックアナライザーとしてはちょっと物足りません。そして両方の機能を同時に使うことできません(涙)

こちら私も所有していますが、非常にコスパのいい商品です。そして使っている人も非常に多いです。

  • ZEROPLUSロジックアナライザ(ロジック キューブ)[32kビット16ch100M]LAP-C(16032)(秋月電子)

※(2020/08/13)かなり安くなっていたと思ったら取り扱い中止になりました。。。

ちなみに秋月さんで非常に安くなっています。特徴としてアプリがちゃんとしていますので、プロトコルとかがかんたんに分析可能です。とりあえず秋月さんで9千円で購入できるのであれば、これが一番安心です。

安くて使いにくいアプリで苦しむよりは、ちゃんとしたアプリを使ったほうが楽だと思います。プロトコルを指定すると送信している文字なども画面上に出るので、分析が楽だと思います。

ちなみに一個上位機種はメモリ量が増えるだけなのですが、価格が二倍以上になるのでちょっと手が出ないです。。。そしてハードウエア的には同じらしいです。。。

オシロスコープ

通信の信号が正しいのかを確認する場合などに利用します。きれいに波形をみるためには測定周波数の10倍あると安心みたいです。最低でも4倍から5倍は必要です。

I2Cの信号をみてみて、信号がなまっている場合にプルアップ抵抗の値を変えて確認をするみたいな場合に活躍すると思います。この用途だと100KHzから400KHzの信号を測定するので4MHzぐらいほしいですね。一般的な入門機は20MHzぐらいです。

もともとは自分で組み立てるDIYキットになります。どちらかというと組み立てるのが主ですので、実際の性能は200kHz程度と低いです。テスター的に信号が出ているのかを確認するのには便利だと思います。

20MHzまでのUSB接続のオシロスコープです。おすすめはHantekでAliExpressのオフィシャルサイトから購入すると6千円弱で購入可能です。上のロジックアナライザーでも紹介していますが、千円ちょっとでロジックアナライザー付きもありますが、同時に使えないので別々に購入したほうが楽だと思います。6022BEはsigrokからも利用が可能です。

秋月さんだとこの価格帯はInstrustarの商品で、安いHantekは取り扱いがないみたいですね。性能はたぶんそんなに変わらないと思いますが、他のアプリを使える逃げ道があったほうが楽かなって思っています。

ZEROPLUSに接続して使う、オシロスコープモジュールです。20MHzまでで12,800円なのでちょっと高いのですがZEROPLUSのロジックアナライザーと同じ画面で利用することができます。I2Cの信号波形を見ながら、実際に流れている信号も確認できます。ZEROPLUSのアプリは結構使いやすいのでそこそこおすすめです。

同じコンセプトのAnalog Discovery 2もあります。こちらは2チャンネルの30MHzオシロスコープに16チャンネルのロジックアナライザー、そして信号発生器など必要そうなものを詰め込んでいるセットになります。学生やホビー用途で全部入りをした製品です。完全に統合されているので、これ1台で済むメリットがあります。

個人的にはこの価格帯は手が出ないです、、、

この上のランクでいうとUSB接続だとHantekの6254BDあたりだと思います。今までのは2チャンネルでしたが、これは4チャンネルあります。

Amazonだとちょっと高いですが、秋月さんだと30,800円です。250MHzまでなのでホビーユースだとこれぐらいが手がでる上限になると思います。

ちなみに私はこのペン型の絶縁タイプを持っています。

OWONの製品は結構好きなのですが、中古のを安く手にいれたので良かったです。定価だとちょっと手が出にくいかな?

絶縁型はあまりないのですが、パソコンの電源と絶縁されているのでより安全に使えます。普通のオシロスコープだとGNDを接続しなくてもパソコンや電源経由で、GNDがつながっているので測定できます。つまり間違った場所にオシロスコープのGND端子をつなげるとショートしてしまいます。

通常オシロスコープではGND端子は繋げないか、ターゲットのGNDに接続する必要があります。絶縁型の場合には、抵抗の前後みたいな測定が可能になります。ただ2チャンネルオシロスコープであれば差分表示させればいいので、通常は絶縁型である必要はないと思います。1チャンネルだと絶縁のほうが便利だとは思います、、、

圧倒的に据え置き型がオシロスコープは人気です。USBタイプはいまいちアプリのできが良くないのが多いです。やっぱり実際に操作できるほうがいいみたいですね。ただし、画面は小さいのでパソコンに接続して、操作は本体で画像はパソコンみたいな使い方もできます。

ちなみにAmazonの商品は並行輸入品扱いなので、修理対応が中国になりますので注意してください。秋月電子のもOWONJAPANではなく中国対応みたいですが、秋月さんならまあ安心ですね。

Hantekの場合には、そもそも日本法人ないのかな? 秋月電子で購入するか、直販がいいと思います。

似たような名前で2店舗ある。。。たぶんOfficialの方が古くからあるので正規代理店とかで、Directが工場直販とかかな?

Officialの方が若干安いのでOfficialで購入するのがいいと思います。。。

ちょっと前まで中華オシロスコープといえばRIGOLが有名でしたが、最近はちょっと値段的に優位性がなくなったかな?

気になっているのが、このタブレットタイプのオシロスコープです。タッチパネルで100MHzとそれなりのスペックです。

FNIRSIはUSBテスターとして有名なメーカーですよね。ただ、生データをパソコンから取得できないかもしれません。。。ちょっとした確認用だったらいいのかもですが、メイン用途にはきついかもしれません。中国サイトから直接購入すると1.5万円ぐらいなんですけれどね。

マルチメーター

番外編として、パソコンに接続できるテスターの紹介です。

いろいろ選び方はあると思うのですが、sigrokでUSB接続で使えるものからピックアップしてみました。OWONとかのもあるのですが、Bluetooth接続でいろいろ技適とかが問題になりやすいです。気軽に使うのはUSBかシリアル経由が便利です。

UNI-TのUT61EはUSBとRS-232の両対応です。一応絶縁型みたいなので、ショートさせてしまってもテスターは壊れるかもしれませんが、パソコンに影響は与えないはずです。

OWONとかのテスターは秒間1フレームのデータ更新が多いのですが、こちらは2フレームです。0.5秒間隔で測定が可能です。据え置き型だともっと細かい粒度の測定が可能ですが、通常予算だと秒間1フレームぐらいが多いです。そしてスペック表には載っていないことが多いので注意してください。

どちらかというと長時間測定する用途で、短時間の時間精度を求めてはいけないみたいです。

ちなみにこっちも2つお店があります。。。

まとめ

オシロスコープやロジックアナライザーは、問題が発生いたときに必要になる機材です。うまく動いていると使わないんですよね。。。私もほぼ使いません。

EZ-USB FX2LPはどこかにあった気がするので、他のものも購入してみて使い勝手を今度比べてみたいと思います。

M5Stack ボタンユニット

概要

M5Stack社のユニット紹介シリーズです。今回はボタンユニット。一番地味な?ユニットですね、、、

商品

単純なユニットなので、かなり安いですね。

インは普通に外側みたいです。

こんな感じのボタンになっています。M5StickCのBtnAと同じような感じになっていて、押すとカチカチ音がします。

スケッチ例

const int button = 33;  // M5StickC

void setup() {
  Serial.begin(115200);
  pinMode(button, INPUT);
}

void loop() {
  Serial.println(digitalRead(button));
  delay(100);
}

GPIOの値を単純に読み取って、押すとLOW(0)になるのを確認します。

M5StickCのボタンクラスを使う

#include <M5StickC.h>

const int button = 33;  // M5StickC

Button BtnGrove = Button(button, true, DEBOUNCE_MS);

void setup() {
  M5.begin();
}

void loop() {
  BtnGrove.read();
  if (BtnGrove.wasPressed()) {
    Serial.println("wasPressed");
  } else if (BtnGrove.wasReleased()) {
    Serial.println("wasReleased");
  }

  delay(100);
}

こんな感じになります。ただこのクラスは内部処理でプルアップしているのが気になるので非推奨です。

元になったライブラリを見てみたら、AVR用なので使うと警告でるんですよね。過去のPRみたらAVR用を消してくれと出ていましたが、リジェクトされていました。

まとめ

ちょっと離れた場所にボタンを設置したい場合には非常に便利なボタンです。値段も安いので持っていてもいいのかな?

M5Stack PM2.5 エアクォリティーセット

概要

M5Stack BASICとPM2.5用センサーが搭載されているボトムがセットになっている商品があったので購入してみました。

商品

こちらの商品になります。日本未発売かな?

たまーにある、本体セットじゃないと売っていない商品になります。M5Stack BASICを買おうと思ったのですが、どうせならということでこちらのセットにしてみました。

スタンド、M5Stack BASICにPM2.5ボトムのセットで、M5Stack BASICとPM2.5ボトムはくっついた状態で箱に入っています。ちなみにBASICの標準ボトムはついていません(涙)

おそらくこちらがM5Stack BASICに標準でついているバッテリー内蔵のボトムだと思います。まあ、バッテリーで動かすことないので必要ないのですが、他に購入するものがあるときに一緒に入手しておきたいと思います。

PM2.5ボトムはこんな感じの作りになっています。左上の場所にUSBを接続するコネクタがあります。

スタンドに立てた場合には、こちらにケーブルを接続するのを推奨しているはずです。

ボトムを分解したところ、こんな感じです。はじめての分解ですがしっかりささっていて、たしかに抜き差ししているとコネクタがもげるのもわかります。。。

固定用のネジがついていますが、このままだと長いので注意しましょう。このままネジを締めていくと画面を壊してしまいます!

このようにスタンドをつけて固定するための長さになっています。

スタンドはこんな感じです。

USBコネクタがあるのですが、PM2.5ボトムはセンサーの出っ張りがあるので使えなくなってしまいます。

裏側はこんな感じです。

このスタンドは別売りしていたの知っていたのですが、よく見ると回路が違うので別商品です!

どうやらPM2.5ボトムに温湿度センサーのSHT20が内蔵している関係で、スタンドにあったSHT30を削ったみたいです、、、後継であるSHT30の方が良かったな、、、

まとめ

PM2.5ボトムは単品では買えないので買ってみました。しかしながら欲しかったのはM5Stack BASICなのでPM2.5ボトムはあまり使っていません、、、

ただバッテリー内蔵していないのでUSBケーブル抜けば電源切れるってのは便利です!

M5Stack カラーセンサユニット

概要

M5Stack社のユニット紹介シリーズのカラーセンサユニットです。色を判定して取得することができます。

商品

赤のコネクタなのでI2C接続ですね。

使っているセンサーはTCS34725です。

まんなかの赤い部分がセンサーで、左右にLEDが並んでいます。LEDで光らせながらセンサーで読み取っていますので真っ暗な場所でも読み取ることができます。

UIFlowでの使い方

四角を画面において、その色を変更させています。背景色はRGB指定だと指定できないんですよね。

私の環境だと若干赤が弱かったですが、そこそこ色が判定できました。ただし紙みたいなもので画面上の色はちょっと難しかったです。

Arduinoでの使い方

ArduinoのサンプルスケッチではAdafruit_TCS34725を使っていますが、素のセンサーからの数値は取得できますが、一般的な色に変換するところがうまく動いていません。

このセンサーは明るさと赤、緑、青の4種類のセンサーが搭載されていますが、色ごとに感度が違うのでそのままの数値だと人間がみた色にはなりません。このへんはRGB LEDとかも色ごとに調整が必要なのと変わらないと思います。

AdafruitのセンサーとはLEDの色温度とか特性が違っていて、取得できる色も違うのではと思いますがよくわからないです。UIFlowではそれなりに色が取得できたので、なにか独自の補正をしていると思いますが、Arduinoのコード例はありません。

Arduinoで使いたい場合には素のセンサーの値をいろいろな色でどうなるか調べてみて、自分で補正をしてあげる必要がありそうです。ちょっといじってみたところ、明るさのCの値が重要そうですが時間かかる感じなのでまた今度にしたいと思います。。。

まとめ

んー、ちょっと使いにくい感じでした。最近だとマリオのLEGOが色センサー使っていましたね。クリボーとかの色を足の下のセンサーで読み取っているみたいです。

あの使い方だと、使っている色をすべて調べてテーブルにしておけば問題なさそうですね。

無印良品 タグツール・ルーペ ホワイト/3倍・7倍(M5StickC用ケース)

概要

さいきん話題になっている無印良品のM5StickC用ケースこと、タグツールをやっと購入してみました。ケースだけだと寂しいのでルーペも買ってみました。

商品

タグツールとは無印良品の展開するトラベル用品のシリーズで、5色のシリコンケースとその中に入れるツールになります。

中身はルーペーの他にLEDライトや静電気除去ツールなど、いろいろあります。ケースは290円で中身は490円ぐらいからあります。

M5StickCにつけてみた

厚みはピッタリですが、縦に伸ばして付ける感じになります。ちょっと伸びているので真ん中がゆがんでしまいますね。

ちなみに底には穴が空いているのでケーブルもささります。

ルーペ

とりあえず一つぐらいはと思って買ってみました。案外便利につかえています。

レンズは2種類で3倍と7倍です。7倍は1.8cmの距離なのでかなり近づけないと見えないので使いにくいです。3倍は使いやすいですね。

写真にとるのは非常に難しいですが、こんな感じです。ちなみにiPhoneのカメラでそのまま拡大したほうが見やすいかもしれませんが、やっぱり直接目で見るのもいいものです。

まとめ

Bluetoothビーコン的な使い方とかでM5StickCを大量にばらまくときなどに、このケースに入れておくとかするとかわいいと思います。