どこかのバージョンアップで、ストレージの管理画面でディスクの位置が表示されるようになった模様。多分以前はこんなイメージは出なかったと思う。
割と地味ではありますが、特にファイル4台以上とかのNASメンテには役立ちそうです。
admin
la vie libre
サーボモーター(LFD-01M)到着したので早速動作確認。制御は標準的なPWM方式。PWMの周波数も標準的な50Hzです。
接続はモーターへの電源、そしてM5stackからのPWM制御信号です。GNDの共有を忘れずに。当然モーターの電源は大電流なので外部電源で5Vを使います。PWMは多くの他の信号がそうであるように3.3V振幅ですが、入力はどうせC-MOSだろうから問題なし。
https://coskxlabsite.stars.ne.jp/html/for_students/M5Stack/RCServo/RCServo.html
PWMピンは上記を参照してDIOの2ピン目を使用。
動作確認用のソースはHiwonderのwebページからですが、サーボモーター用のライブラリは使ってません。存在しないのかもしれませんが、直接コードを書く方が動作の理解には助けになります。
https://drive.google.com/drive/folders/1Bgf1HGrfhB8N8XIxlRpz-U9_2oxVurDv
Arduino用なので多少の修正が必要なのと、画面表示がないと電源オンもわからないのでメッセージを出すようにしてます。ライブラリを使わないと、動作時間制御もコードで指定(この場合には20ms*20 = 400ms)しています。試しに9行目の20を10にすると90度ぐらいしか回転しません。
/*******舵机测试程序*******
* Arduino型号:Arduino UNO
**************************/
#include <m5stack.h> // M5stack needs this module
int servopin=2;
int pulsewidth;
void servo(int myangle)
{
for (int i = 0; i < 20; i ++) // i is used to make moving time, since this source does not use library.
{
pulsewidth=map(myangle,0,180,500,2500);
digitalWrite(servopin,HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(servopin,LOW);
delay(20-pulsewidth/1000);
}
}
void setup()
{
pinMode(servopin,OUTPUT);
M5.begin();
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.
}
void loop()
{
M5.Lcd.setCursor(0, 70);
M5.Lcd.printf("servo_motor drive");
servo(0);
delay(500);
servo(180);
delay(500);
}
駆動波形はこんな感じ。
動作時の動画は、
となります。180度以上振れてるようなので、キャリブレーションは必要そうです。
admin
M5stack grayでサーボモーター使ったアプリ作ってみるためにオーダー。
ホビー用のサーボモーター選択肢は多いけれども、金属ギアを使ったものを前提にすると概ね価格レンジはこれ以上という感じ。二軸必要だから2個オーダー。
https://www.switch-science.com/catalog/7133/
admin
SMR方式の解説読んでも本質的なところが不明でなぜ、shingle(瓦)方式ができるのか理解できなかったけれども、seagateのページ見てようやく理解。
一番のポイントは以下の通り、書き込みヘッドが密度向上のネックだから。
”現在の技術では、データを読み取れる面積と、書き込める面積を比較すると、前者のほうが狭く、書き込み用ヘッドの精度がHDD記録密度のボトルネックとなっています。”
以下の説明図からそれが汲み取れます。書き込みヘッドに比べて読み取りヘッドがトラック間隔を狭くできるから、というのがSMR方式が成り立つわけです。書き換えはSSDと似たようなことをやる必要があるから、インテリジェンスが必要なファイルです。
この先は垂直記録方式でさらに容量拡大していくだろうというのもFlashメモリと同じかもしれない。
admin
M5stackにはセンサーが二種類あるらしいので、手順前後ですが調べてみました。
最近のM5Stack GrayにはMPU6886:6軸センサー + BMM150:磁気センサーを搭載。その前はMPU9250:9軸センサーが搭載(実は6軸センサMPU6500と3軸コンパスAK8963のハイブリッドであることは同じ)されています。AK8963がEOLになったのでMPU6886+BMM150に切り替えているようです。
昨日の記事のソースはコメントにMPU6886とあるので現物とマッチングしているようです。
内蔵IMUの種類を判定できるプログラムがambientのサイトにあるので、調べてみました。
確かに購入したM5stackはMPU6886になっているようです。webの記事を見る限りは6軸で使う場合にはMPU6886とMPU9250でライブラリも互換があるようですが。
admin
(IMU:Inertial 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