M5stack grayのIMUの違い

M5stackにはセンサーが二種類あるらしいので、手順前後ですが調べてみました。

最近のM5Stack GrayにはMPU6886:6軸センサー + BMM150:磁気センサーを搭載。その前はMPU9250:9軸センサーが搭載(実は6軸センサMPU6500と3軸コンパスAK8963のハイブリッドであることは同じ)されています。AK8963がEOLになったのでMPU6886+BMM150に切り替えているようです。

昨日の記事のソースはコメントにMPU6886とあるので現物とマッチングしているようです。

内蔵IMUの種類を判定できるプログラムがambientのサイトにあるので、調べてみました。

パソコン上のM5Stackの3Dモデルを、M5Stackの動きに合わせて動かす

 

確かに購入したM5stackはMPU6886になっているようです。webの記事を見る限りは6軸で使う場合にはMPU6886とMPU9250でライブラリも互換があるようですが。

 

admin

M 5stack grayでIMUの値を読み出す

IMUInertial Measurement Unit)が内蔵されているのがgrayの特徴ですが、その値を読み取れるサンプルプログラムがあったので実行してみました。

サンプルプログラムはArduino IDEのスケッチ例からです。


/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
*                  Equipped with M5Core sample source code
*                          配套  M5Core 示例源代码
* Visit the website for more information:https://docs.m5stack.com/en/core/gray
* 获取更多资料请访问:https://docs.m5stack.com/zh_CN/core/gray
*
* describe:MPU6886 example.  惯性传感器
* date:2021/7/21
*******************************************************************************
*/
#define M5STACK_MPU6886
#include 

float accX = 0.0F;  // Define variables for storing inertial sensor data
float accY = 0.0F;  //定义存储惯性传感器相关数据的相关变量
float accZ = 0.0F;

float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;

float pitch = 0.0F;
float roll  = 0.0F;
float yaw   = 0.0F;

float temp = 0.0F;

/* After M5Core is started or reset
the program in the setUp () function will be run, and this part will only be run once.
在 M5Core 启动或者复位后,即会开始执行setup()函数中的程序,该部分只会执行一次。 */
void setup(){
  M5.begin(); //Init M5Core.  初始化 M5Core
  M5.Power.begin(); //Init Power module.  初始化电源

  M5.IMU.Init();  //Init IMU sensor.  初始化惯性传感器

  M5.Lcd.fillScreen(BLACK); //Set the screen background color to black. 设置屏幕背景色为黑色
  M5.Lcd.setTextColor(GREEN , BLACK); //Sets the foreground color and background color of the displayed text.  设置显示文本的前景颜色和背景颜色
  M5.Lcd.setTextSize(2);  //Set the font size.  设置字体大小
}

/* After the program in setup() runs, it runs the program in loop()
The loop() function is an infinite loop in which the program runs repeatedly
在setup()函数中的程序执行完后,会接着执行loop()函数中的程序
loop()函数是一个死循环,其中的程序会不断的重复运行 */
void loop() {
  //Stores the triaxial gyroscope data of the inertial sensor to the relevant variable
  //将惯性传感器的三轴陀螺仪数据存储至相关变量
  M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.IMU.getAccelData(&accX,&accY,&accZ); //Stores the triaxial accelerometer.  存储三轴加速度计数据
  M5.IMU.getAhrsData(&pitch,&roll,&yaw);  //Stores the inertial sensor attitude.  存储惯性传感器的姿态
  M5.IMU.getTempData(&temp);  //Stores the inertial sensor temperature to temp.  存储惯性传感器的温度

/* The M5Core screen is 320x240 pixels, starting at the top left corner of the screen (0,0).
gyroscope output related
M5Stack屏幕像素为 320x240,以屏幕左上角为原点 (0,0)*/
//gyroscope output related.  陀螺仪输出相关
  M5.Lcd.setCursor(0, 20);  //Move the cursor position to (x,y).  移动光标位置到(x,y)处
  M5.Lcd.printf("gyroX,  gyroY, gyroZ"); //Screen printingformatted string.  输出格式化字符串
  M5.Lcd.setCursor(0, 42);
  M5.Lcd.printf("%6.2f %6.2f%6.2f o/s", gyroX, gyroY, gyroZ);

// Accelerometer output is related
//加速度计输出相关
  M5.Lcd.setCursor(0, 70);
  M5.Lcd.printf("accX,   accY,  accZ");
  M5.Lcd.setCursor(0, 92);
  M5.Lcd.printf("%5.2f  %5.2f  %5.2f G", accX, accY, accZ);

// Pose output is related
//姿态输出相关
  M5.Lcd.setCursor(0, 120);
  M5.Lcd.printf("pitch,  roll,  yaw");
  M5.Lcd.setCursor(0, 142);
  M5.Lcd.printf("%5.2f  %5.2f  %5.2f deg", pitch, roll, yaw);

// Inertial sensor temperature output related
//惯性传感器温度输出相关
  M5.Lcd.setCursor(0, 175);
  M5.Lcd.printf("Temperature : %.2f C", temp);

  delay(10);  // Delay 10ms  //延迟10ms
}

9軸の内訳は角速度(gyro)、加速度(acc)、ピッチ/ロール/ヨー(pose)の三要素の数値になるので、これらの数値から物体の回転角度、移動距離と傾き量(姿勢)を知ることができます。表示(数値)を見てみると結構揺れていますから、この精度がセンサーの値段そのままになるのでしょう。

<疑問点>

・Z方向の加速度にオフセット1が付加されているように見えるのは、重力加速度?

-> そうでした、M5stack傾けると軸ごとにオフセット移動します。

・温度は華氏にしても変な値だし、値が振れすぎでもあります。

・gyroZが静止状態でもある値を取るのでyawが回り(減少)続ける。

-> 先人も経験しているようで、対症療法(静止時のgyroZの値の平均を取って差し引いて再計算)ですが対策も記載されてます。

https://qiita.com/foka22ok/items/53d5271a21313e9ddcbd

admin

MacBookのSSD使用量

モバイル用のAirは、使用2年半で256GBのうちおよそ130GB使用、そしてProは使用1年半で500GB中で220GBぐらいの使用。Airは128GBモデル選択しなくて良かったと思う。多分128GBでは溢れるだろうと思っていたけども。

どちらも、ほとんど画像と音楽データは領域使ってなくてもそうだから、普段使いで500GBはミニマムの感じ。領域の多くは開発環境が占めています。

次はモバイルが500GBで普段使いは1TBがミニマムになるだろうと思う。

 

admin

M5stackをVS codeで使う(2)

M5stackへの書き込みとシリアルモニターについての記事です。

コードをコンパイルしたらM5stackに書き込みますが、そのボタンは”→”になります。”✔︎”はコンパイルエラーの確認用。

またシリアルモニター使う時には、同じく”🔌:電源プラグマーク”を押すと、上の画像のようにターミナルにシリアル出力します。

このプログラムは、Wi-Fiのアクセスポイント情報のログを取るサンプルプログラムWiFiScan.inoです。

M5stackを手で覆うと20dbぐらいレベル減衰が確認できたから、人体はシールド材と同じ。

 

admin

M5stackをVS codeで使う(1)

Arduino IDEはコンパイル遅いし、使い慣れたVS codeの方が良さそうに見えるので、VS codeで環境構築。コアとなる拡張機能はPlatformIOになります。

参考サイトは以下の通り、

https://haratta-tech-lab.com/m5stack-intro-arduino-vscode/#toc12

https://fabcross.jp/category/make/sorem5/20210112_cat_robot.html

ライブラリは画像中のワークスペースではなく、PlatformIO管理下に配置されるようです。この例ではM5Stack.hとSimpleBeep.hを組み込んでいますが、必要になればPlatformIOのライブラリ管理で必要なライブラリを追加すれば良さそうです。実はライブラリ管理は少々複雑のようですが、まずは必要なら都度追加で問題はないでしょう。

コンパイル速度はArduino IDEよりも明かに高速化しているように思う。

 

admin

 

Montereyから導入のコマンドラインでネット速度を計測できるコマンド

% networkquality

==== SUMMARY ====                                                                                         

Upload capacity: 220.748 Mbps

Download capacity: 291.286 Mbps

Upload flows: 16

Download flows: 12

Responsiveness: High (2364 RPM)

最後のResponsiveness1分間で何回やりとり可能かということだろうから、秒換算でおよそ40回だからping相当で12ms程度ということになる。nuro以外だとこの数字が落ちるんだろう。

 

admin

Arduinoのプロジェクトディレクトリ変更

Macの書類ディレクトリにArduino関連のライブラリやスケッチを入れてましたが、M5stack関連をインストールしたらiCloudの残り容量がなくなったのでディレクトリを変更しました。

Arduino — preferencesの設定メニューにディレクトリ指定があるので、元のディレクトリを丸ごとiCloudのバックアップ対象外にコピーすれば大丈夫でした。

移動先はユーザディレクトリのルートに、

 

admin

初めてM5stack gray を使う

納品されたので、半分に分解してみた。左側部分には電池が入っていて、ある程度はバッテリー動作もできるようです。また、磁石も入っているようで、Macのトラックパッドに吸い付きます。

9軸センサーの機能確認は追々ですが、まずはArduino IDEでM5stackの疎通を確認します。

参考サイトは、

https://qiita.com/hmmrjn/items/2b2da09eecffcbdbad85

①〜④はマストで、⑤は動作確認用、初めてM5stackに電源つないだときは自己診断プログラムが走りますが、sdカードは入っていないのでエラーになりました。

① M5stack用のUSBドライバーインストール

ちなみに接続はUSB type-cなのでArduinoとは異なります。ごく短いtype-cケーブルが添付されてますが、実用上は短すぎると思うので別の長めのケーブルを使った方が良いと思います。

② Arduino Core for ESP32のインストール

③ ボードとシリアルポートの選択

チェックしたように選択、ボード種類とコード書き込み用のポート設定です。

④ ライブラリのインストール

必要になれば入れれば良いと思うけど、必須そうなものをとりあえず入れてみた。

⑤ サンプルプログラムの動作

ここではスピーカの機能を確認するプログラムを書き込みしてみました。コードを見るとボタンが押された時にボタン毎に異なるトーンの音が出るようになってますが、音階の正しさはともかく異なるトーンの音が出ました。

 

admin

Rubyの進捗

見返すと、10月下旬に買った本ですが、進捗は8割ぐらいで残りは第8章の「オブジェクトとクラス」。

Rubyは他の言語(Java, c# etc)と印象が違うのはLisp系(関数プログラミング言語)の影響を受けているからなのかとようやく理解してきた感じです。

Ruby

おそらくRubyに馴染むと他の関数プログラミング言語にも取っ付きやすいんじゃないかと思う。

 

admin