2021年5月23日日曜日

M5stickC plusを使った倒立...倒立は一日にして立たず

今回は

前回はトラ技の記事を参考にマイコンstm32を使って倒立マシンを作成しました。20cmx25cmとちょいと大き目でした。参考リンクを読んで、再び倒立熱が高まってきたので小型倒立マシンに挑戦したいと思います。さて、倒立するのか。「倒立は一日にして立たず」。

準備

必要なパーツは秋葉原だと秋月と千石を回れば購入できます。最近は通販が主流ですが。今回使用するモーターは非常に小型です(倒立するのか)。モータードライバは、2回路入っていて1回路1.5Aまでドライブ可能です。他でも小型モーターなので大抵は使えると思います。

  • 制御用マイコン M5StickC plus (6軸センサー入り)
  • DCモータ    FM90×2 (DCモーターにギヤが付いてます)
  • モータードライバ DRV8835×1
  • 電池ボックス 単3×3
  • 電池     エネループ単3×3

まずは個別に機能確認

6軸センサー

M5stickC plusには、6軸センサーがI2C接続されていてサンプルコードで簡単に動作確認できます。

制御プログラム

Arduinoで記述します。6軸センサーによって傾きを検知し、傾きの値をPID制御してDCモーターの出力を決定します。このモータードライバーは2入力で回転方向と出力値を決めるので、2入力には傾きから計算した出力値をPWMにより2入力それぞれに出力するようなソフトウェアを参考リンクをお手本に記述します。

モータドライバー

DRV8835のデーターシートを見ながら配線します。DCモーターなのでIN/INモードにします。2回路の入力と出力は1回路にまとめます。これによりDCモーターの最高電流は3AまでOKとなります。そこまでは流れないでしょうけど。

機能確認結果

個別に機能を確認した後、配線確認のためブレッドボードで動きを確認します。DCモーターは片側だけ接続してます。


 M5stickC drv8835

回転方向の正回転と逆回転やモーター出力の変更ができていることを確認できました。

今日のまとめ

M5stickCplusを使って倒立ロボットの機能確認をしました。ここまでは問題なく順調に進んでいます。躯体を作成し配線して「倒立」に向けて進めていきたいと思います。

参考リンク

全60Stepで超超簡単M5StickC 倒立振子 - Qiita

2021年5月8日土曜日

Pi4b+2軸servo台(SG90x2)の動作確認

今回は

M5stickC plusと2つのサーボを使ってラズパイに繋がっているカメラの架台を作成します。

準備

Amazonでぽち。で、終了です。便利な世の中になりました。プラスチックで成型されたSG90サーボ用の2軸台です。説明書等は何もありません。ざっくりと袋に入っているだけです。。参考リンクに先人がいたので写真を見ながら組み立てました。

サーボのアームを削ったりとポン付けではありません。サーボアームは若干の加工が必要です。

配線

Pi4bに接続します。サーボSG90は、5VなのでPi4bから給電します。Low Voltageと怒られそうですが。縦サーボと横サーボの制御線は、GPIO23とGPIO24にそれぞれ接続します。

写真のとおりオスメスがそれぞれ両端についている配線部材で接続します。

ソフトウエア

お試しはpythonで書いてちゃちゃっと動作の確認をします。参考リンクのコードを参考に、サーボの動きを横方向に15度刻みで-90度から90度まで動かしつつ縦には-30度から30度まで動かします。

戻りは90度からー90度まで動かしつつ30度から-30度に縦方向に振りながら戻ってきます。pythonのサンプルコードは、参考リンクの下に貼っておきます。

動作確認

pythonなので動きを確認しながら確認することができました。コードのとおり動いてます。delayの長さは経験的な感じでしょうか。動作状況は以下の動画のとおりです。


今日のまとめ

サーボSG90を2つ使って2軸台を作成し、pythonサンプルコードにより動作確認をしました。軽いカメラなら載せて動くと予期します。今後は、カメラをこの2軸台に取り付けてOpenCVと連携させることにより物体を追従できるような装置の製作を進めていきたいと思います。

参考リンク

SG90サーボ用2軸カメラマウントを組み立てる

RaspberryPiでサーボモーター動作

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

GPIO.setup(23, GPIO.OUT) # 横
GPIO.setup(24, GPIO.OUT) # 縦

yoko = GPIO.PWM(23, 50)
tate = GPIO.PWM(24, 50)
yoko.start(0.0)
tate.start(6)

yoko.ChangeDutyCycle(2.5)
time.sleep(1.0)

# 横 -90 -> 90 15度づつ
# 縦 -30 -> 30 15度づつ
for degree in range(-90, 90, 15):
    dc = 2.5 + (12.0-2.5)/180*(degree+90)
    yoko.ChangeDutyCycle(dc)
    time.sleep(0.03)
    for kaku in range(-30, 30, 15):
        dc_tate = 2.5 + (12.0-2.5)/180*(kaku+90)
        tate.ChangeDutyCycle(dc_tate)
        time.sleep(0.1)

# 横 90 -> -90 -15度づつ
# 縦 30 -> -30 -15度づつ
for degree in range(90, -90, -15):
    dc = 2.5 + (12.0-2.5)/180*(degree+90)
    yoko.ChangeDutyCycle(dc)
    time.sleep(0.03)
    for kaku in range(30, -30, -15):
        dc_tate = 2.5 + (12.0-2.5)/180*(kaku+90)
        tate.ChangeDutyCycle(dc_tate)
        time.sleep(0.1)

GPIO.cleanup() # warning 抑止

2021年5月1日土曜日

M5stickCでservoを動かす

今回は

久しぶりに動きものに手を出そうと思い、サーボやDCモータを動かすために基本事項の確認をします。M5stcikCを使った倒立やサーボモータで画像認識して物体を追いかける2軸追尾機などに繋がっていけばと思います。まずは、サーボを動かしてみます。先人多数なので、そう難しくはないと思います。

準備

使用するものは以下のとおりです。

  • マイクロサーボ SG-90×1個
  • M5StickC plus
  • オスーオスジャンパー線×3本

ソフトウェアは、参考事例も多数あるのでArdunoでお気軽にいきます。VScode+PlathomeIO上に環境を構築します。

サーボの仕組み

サーボの主要構成品としては、DCモータ、減速ギア、ポテンショメータ、作動アンプで構成されています。制御信号として50Hzの矩形波にデュティー比を最小0.5/20(回転角0度)から最大2.4/20(回転角180度)まで変更することによって角度を変更します。データーシート上は、そのような説明ですが、個体差が若干あるようで正確に動作させるには微調整が必要なようです。

配線

サーボから3本線が出ています。M5StackCとは、このように接続します。

  • 黒 ←→ GND
  • 赤 ←→ +5V
  • 黄 ←→ G26
M5stickCの裏側には、ピン番号が印刷してあり配線間違え防止になります。

ソフトウェア

参考リンクを見ながらarduinoで記述します。詳細は参考リンクにリンクしておきます。

サーボというとピンときませんが、PWM出力の応用と考えれば非常に簡単です。サーボSG90の仕様に合わせてPWM出力を変化させればサーボの回転軸が動きます。ソースのPWM設定のところでデューティー比を16bitとしました。PWM周波数は50Hzなので1周期は20msです。軸角度0度は、0.5msなので1638。軸角度180度は、2.4msなので7864となります。

デューティー比の変更はボタンAを押したらプラスに、ボタンBを押したらマイナスにします。1度づつ動かすとボタンを連打しないといけないので30度づつ動くようにしました。

ボタンの状況とデューティー比の数値をシリアルとLCDに表示します。

動作状況

個体差があるようで軸角度0度と180度付近は、もう少し細かく値を調整する必要があります。動作の状況は動画のとおりです。


 M5stickC servo

今日のまとめ

M5StackC plusを使ってサーボを動かしてみました。PWM出力の応用ということで単に動かすだけならそう難しくもありません。正確な動作とか安定性等を反映させるには更なる調整が必要です。これをスタートラインに2軸のカメラ台を作ってみたいと思います。

参考リンク

M5Stack + サーボモーターSG90 - 日記とか、工作記録とか

https://gist.github.com/hkaji/8beef2790886b383e82e02585f9a5071

2021年4月24日土曜日

M5stackのSD書き込み速度

はじめに

前回、M5stackのSDカードへの書き込み確認を実施しました。今日は、書き込み速度について計測してみます。

準備

SDカードは、前回書き込めることが確認できた2種類を使用します。FAT32フォーマットをしておきます。WWW情報を調べると書き込みに20ms程度必要だという記事がありました。参考リンクを読みながらArdurinoソースを活用し書き込み時間を測定します。

書き込み時間測定

M5stackのSDカードへの書き込み時間を計測します。以下のように10byteづつ時間とデータを書き込んであとから書き込み時間を計算してグラフにします。

count,time,diff

0,4237,0
1,4338,101
2,4438,100
3,4538,100
4,4638,100
5,4738,100
  1. タイプスタンプを取得
  2. 書き込みデータを作成(10byte)
  3. SD_write (fileへappend)
  4. delay
  5. 1.を繰り返す

というプログラムをarduinoで記述して、計測データを取得しました。取得したデータは、VScode+jyupiter拡張機能、python+pandas+matplotlibを使って処理してグラフを作成しました。

★書き込みパラメータ

カウンター値、タイムスタンプ、差分の10byte程度の文字列をSDカードへwrite

ディレイ時間(2,3,10,50,100ms)と変えて、それぞれ10,000ポイント程度計測

測定結果

測定時間は書き込み処理以外の時間も含まれていますが、ざっくりの参考値です。横軸が書き込みのカウント回数、縦軸が処理時間です。上のグラフは、書き込み処理後にdelayを2,5,10,50,100ms挿入したときのグラフです。下のグラフをdeleyを0msにした時のグラフです。

delay時間を変化させても10byteほどの書き込みには影響はないようです。ただし、不定期に処理時間が遅延する場合があり、フィルター処理等をしていると影響があるかもしれません。delay無しで2-3msの書き込み時間ということがわかりました。書き込み時間10msとしても10byte程度であれば1秒間に100回は書き込めます。

ただし、他の処理を含めてプログラム全体をよく検討する必要があります。使用したマイコンはesp32なので、デュアルコアを使いこなして処理を分割できると不定期に発生する長い処理時間を回避できるかもしれません。

今日のまとめ

M5stackのSDへの書き込み時間を測定しました。10byte程度の書き込みだと1秒間に100回以上は書き込めることが確認できました。

参考リンク

【PowerMeter2020】M5StackのSD遅い<20msec周期でも遅延発生>


2021年4月17日土曜日

M5Stack SD書き込みを試してみる

はじめに

今日は、M5stackのSDカードの書き込みを試してみます。取得したセンサーデータを保管したい場合を想定します。M5stackがシリアルやWiFiで繋がっていれば、母艦PCやIoTクラウドに書きたいデータを投げれば保管できます。単独運用にて屋外だとWiFi接続が必ず可能なわけでもなく、内部メモリだけではすぐ一杯になるので、SDカードの出番となります。先人の知恵を見ていると、カードの相性問題があるという記事があり、これは試しておかないとです。

準備

今回は配線等必要ありません。M5stackとSDカードを用意すればハードはOKです。SDカードは、SD card formatterでFAT32フォーマットをしておけば問題ないようです。手元に2種類のSDカードがあるので、相性問題を含めて試してみます。

SDカードは以下の2枚です。

  • SP(Silocon Power)製 32GB
  • ELECOM製 8GB
M5StackへSDカードは、カードの端子面を上向きに挿入します。
逆だと入らないので間違わないとは思います。

ソフトウェアの準備

参考リンクのArduinoコードをほぼそのまま活用します。サンプルプログラムは、以下の動作をします。

  1. M5Stackは家ルーターにWiFI接続して、ntpサーバーをたたいて時刻同期をします。
  2. SDカード上にlogファイルをオープンする。
  3. ボタンA-Cが押されたら、時間とどのボタンを押したかという内容をcsv形式でファイルに書き込む
  4. 3.繰り返す

結果

2種類のSDカードへ問題なくデータが書き込まれていることを確認しました。 時間、どのボタンが押されたかを記録しています。

2021/4/6,9:41:26,ボタンA
2021/4/6,9:41:29,ボタンB
2021/4/6,9:41:30,ボタンC
2021/4/6,9:41:31,ボタンA
2021/4/6,9:41:31,ボタンB
2021/4/6,9:41:32,ボタンC
2021/4/6,9:41:32,ボタンC
2021/4/6,9:41:33,ボタンC
2021/4/6,9:41:33,ボタンC
2021/4/6,9:41:33,ボタンB
2021/4/6,9:41:34,ボタンB
2021/4/6,9:41:34,ボタンA
2021/4/6,9:41:35,ボタンA
2021/4/6,9:41:35,ボタンA
2021/4/6,9:41:35,ボタンA
2021/4/6,9:41:35,ボタンB

今日のまとめ

M5stackのSD書き込みを試してみました。手動でボタンを押した時間は、問題なく書き込まれことを確認できました。センサーデータ等もっと間隔の短いデータをどこまで書き込めるか更に調べていきたいと思います。

参考リンク

M5StackでSDカードにCSVデータを作成する

2021年4月10日土曜日

CAN送受信...3ノード

今回は

前回M5stackとM5stcickC plusを使って送受信試験をしました。今回は、更にesp32をCAN BUSに加えて3ノードの送受信試験をしてみました。

CAN BUSに3ノード

準備

CAN BUSに以下の3つのノードを接続します。IDは、標準の11bit、BUS速度は500kbpsです。

  • M5stack+commuモジュール[受信]
  • M5StickC Plus+mcp2562[送信] 送信ID=1
  • esp32+mcp2562[送受信] 送信ID=5

図で書くと以下のようになります。

実際の構成は、写真のとおりです。

試験結果

送受信結果をesp32+mcp2562ノードをPCにUSB接続してシリアル出力を確認します。

> Executing task: C:\\Users\\kaji\\.platformio\\penv\\Scripts\\platformio.exe device monitor <

--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at <http://bit.ly/pio-monitor-filters>
--- Miniterm on COM7  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
New standard frame from 0x00000001, DLC 8
H       e       l       l       o       C       A       N
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n
New standard frame from 0x00000001, DLC 8
M       5       S       T       A       C       K
send frame:e    s       p       3       2       c       a       n
send frame:e    s       p       3       2       c       a       n

受信専用のM5StackのTFT画面の動画はこちら。


 https://youtu.be/_ZjJ3LRkQ8s

2ノードから送信されたメッセージは、それぞれ受信されていることが確認できました。CAN BUSは共通なのでethernetと同じくCSMA/CD方式にてデータの衝突は回避しているようです。と、思ってましたがさらに調べてみると、データの衝突回避は「無損失ビット単位アービトレーション方式」が採用されています。CANデータは、500kbps程度ですが、各コントローラが更に高い周波数でデータをサンプリングして同期をとっているようです。なるほど、CAN BUS上にクロック線がないのにどうやって同期しているのかと思っていました。ノイズの多い車の中で安く確実にという観点でよく考えられています。細部はWikipediaに詳しく書いてあります。

今日のまとめ

CAN BUSに3ノード接続して送受信試験をやってみました。2ノードから送信されたデータが受信できていることを確認しました。M5シリーズを使ってCAN送受信できることがわかりました。

引き続き、実機データの吸出し、SDカードにデータの書き込みや6軸センサーとの同時記録等進めていきたいと思います。

参考リンク

【M5Stack】CommuモジュールでCAN通信

M5Stack Commuモジュール - スイッチサイエンス

Controller Area Network - Wikipedia

2021年3月28日日曜日

CAN送受信OK...M5stack+M5StickC plus

今回は

前回M5stackとMCP2562というCAN トランシーバーを使って送受信試験をしましたが、うんともすんとも言わずで終わりました。デジタルオシロ等あれば、確認できるのですが持ち合わせていません。出来合いのモジュールがあることがわかり、それらを使って送受信の確認をしてみます。

M5stack commとM5stickC+CAN moduleで送受信

M5stickC Plusの準備

CAN moduleを購入し、GROVEコネクタにて接続します。GROVEコネクタの実態はI2C接続です。M5stickC Plus側は、GND,5V,SDA,SCLの4線です。このコネクターは、HY2.0-4Pという規格だそうです。名前のとおりピンのピッチが2mmとちょいと狭いです。汎用のコネクタは、はまりません。メス配線コネクターも市販のものは大抵2.54mmなので、この2mmピッチのコネクターが必要です。配線には専用ケーブルを用意するか、手持ち組み合わせて工夫が必要です。0.54mmなんとかなるかと思いましたが、なりませんでした。

CANモジュールはGROVEケーブルを介して外付けなのでちょいとでかくて、M5StickCと同じくらいの大きさです。モジュールの先端は内部と電気的に分離されてCAN BUSになっておりGND、CAN_H、CAN_Lを接続します。

ソフトウェアは、参考が多いArduinoにします。参考リンクのソースそのままで送信プログラムは動きました。ボタンAとBを押せば、それぞれ異なるメッセージがID 0x0でCAN BUSに送信されます。

M5stack+commu moduleの準備

M5stackにスタックできるcommuモジュールを購入しました。これは、esp32とSPI接続してそれぞれのドライバーにつながっていて、以下のインターフェースが入出力できます。

  • I2C x 2
  • CAN × 1
  • RS485 × 1
  • TTL × 1

モジュールを本体の底にガチャっと差すだけでOKです。配線間違いの可能性を低減できます。本体とドッキングしたときの側面4方向です。バッテリーモジュールも接続してます。これで、150mA→750mAに容量が上がります。

ソフトウェアはサンプルコードが各種提供されているの、それを参考に作成します。ほぼそのままですが。

CAN送受信試験

送信機と受信機ができたので、送受信できるか確認します。CAN_H、CAN_L、GNDをそれぞれ接続して、CAN_HとCAN_Lの間に120Ωの抵抗を終端として入れます。全体の接続は以下のとおりです。

全体構成とそれぞれの部位は、以下のとおりの構成です。

配線の長さが短いので配線は撚らなくても(twist pairにしなくても)大丈夫です。

送信機は、以下のとおりAとB2種類のメッセージを送信します。

受信機は、2種類の8バイトメッセージを受信してます。

送信機からCAN ID 0x0 にAとBを加えて異なるメッセージを送信すると、受信機側でそれぞれ受信していることが確認できました。

CAN送信機のトランシーバーをMCP2562に変更

送受信確認できたので、以前うんともすんとも言わなかったトランシーバーに変更してみます。再度データーシートを見直すとVDDとVIOが内部で繋がっていないことがわかりました。MCP2561は繋がっているようです。よく確認が必要です。VIOへ配線を追加して、トランシーバーを変更して送受信すると、問題なく送受信確認できました。

一式ちゃんと動くセットがあると、デバッグしやすいです。デジタルオシロ買わずになんとかここまで進んだ感じです。オシロがあればもう少し早くここまでたどり着いたかもです。引き続き購入は検討します。

今日のまとめ

M5stack+commuモジュールとM5StickC+CANモジュールを使ってCAN送受信の確認ができました。また、以前動かなかったmcp2562トランシーバも動作確認ができました。

更にCANメッセージの内容を確認してソフトウェアを改良しつつ、バイクからデータを吸い出せるように引き続き検討したいと思います。

参考リンク

M5StickC PlusでCAN通信 - Embedded &oT

M5Stack Commuモジュール - スイッチサイエンス

ページ引っ越しました

このページは、以下に引っ越しました。内容も逐次移行中です。引き続きよろしくお願いします。  https://hkaji.github.io →こちら