ラベル esp32 の投稿を表示しています。 すべての投稿を表示
ラベル esp32 の投稿を表示しています。 すべての投稿を表示

ラズパイ日記...esp32(arduino)+mpu6050

ラズパイ日記...35日目...倒立再始動

ラズパイ日記...34日目...6軸センサーmpu6050

ラズパイ日記..32日目...esp-idf環境でBME280を読む

esp32のC/C++環境構築継続中です。

倒立ロボットの制御プログラムをmicropythonを作成したものの、動作の遅さで制御しきれませんでした。やはりC/C++環境をと思い立って始めて見たものの、なかなか進みません。

今回は、

ちょっと時間はかかりましたが、今風の開発環境(Visual Studio code,
正確には高機能エディターらしいですが)を使うとだいぶ進展しました。C/C++で書いたプログラムを動かしてBME280センサーから値を取り出します。

esp32のC/C++開発はいろいろと嵌(はま)る

進まないポイントは、以下のような感じです。
  • esspressif社からもサンプル等は提供されているものの、そのままmakeしても途中で止まる
  • 開発環境のesp-idfとgccベースのクロスコンパイラー、使用するライブラリーのバージョンの組み合わせで結構はまる
  • C言語なのでドライバーの書きっぷりがそれぞれでmake時に止まる。原因を探るとif,elseで{}が合致していない等初歩的な事も多い
といった感じです。動いてる環境でpkgされたものがあればいいのですが、先人は少ない感じです。

まずはI2Cで温度湿度センサーを読んでみようと2日ほど費やして、やっとのことでバイナリーを作成。esp32へ書き込みまでOKでようやく動くかなと思ったら。

こんな感じです。「error code:22」って何? 
micropythonならちまちまprint文入れて調べるの簡単なのですが、C/C++環境だと簡単にはいきません。

Win10+debian(WSL版)にて開発環境、USB-serialにてesp32と接続可と環境はできたのですが、中身が進ません。

温度湿度センサーBME280を読み込む

micropythonで書くとちゃちゃっとできたのですが、C/C++だとそうはいきませんでした。いろいろと格闘した結果、C/C++環境でもセンサー値読めるようになりました。
原因は、I2C接続のPin番号の設定、I2Cアドレスの設定が違ってました。

ソースコードの行数をmicropythonと比較すると、以下のとおり20倍の差があります。関数やヘッダーファイルもっとダイエット可能ですが10倍ほどの差があると思われます。
結果出力は同じです。手間は、環境作ったり何度もコンパイルしたりとソースコードの行数差以上にC/C++は手間がかかります。
★micropython
bme280.py
206行
★C/C++
main.c+bme280.c+bme280h
188 + 2,231 + 1,714 =  4,133行

夏休み中は、debian上のemacsでソースコードと格闘してましたが、この定数は何とか結構大変でした。流行りのwin10+VScode(Visual Studio code + PlatformIO)環境に移行すると、関数や予約語のカラー表示、定数定義にマウスポインター持っていくと今入ってる定数値が表示される等すこぶるコードの読みっぷりが改善しました。
ビルド→書き込み→シリアルモニターがそれぞれワンクリックでできるのもいい感じです。
makeして
flashして
flashして書き込み終わると同時にプログラムが動き出します。やっとセンサー値読めました。温度、湿度、気圧それぞれ問題なくそれなりの値で出力されてます。
夏休みで終わらず、時間かかりましたが少し進んだ感じです。

今日のまとめ

やっとのことで、esp32をesp-idf開発環境にてI2C接続された温度湿度センサーの値を読み出すことができました。

ラズパイ日記...29日目...pythonからC/C++環境へ

前回は、母艦PCをx64 win10にしてWSLなdebianをインストールしたところまででした。

今回は、

WSL debian上でesp32の開発環境esp-idfを構築して、Lチカの確認までいきたいところです。

参考にしたのは、以下のページです。
https://qwx.jp/esp-32-idf-on-linux-mint-ubuntu-vmware/
https://qwx.jp/esp32-esp-idf-hello-world-and-blink-on-linux/

ESP32開発環境としてdebianを使ってる人は皆無で先人も少ない感じです。見た目のいいUbuntuが主流なんですね。ベースは同じなのに。

10年前まではFreeBSD派でkernel panicで落ちるLinuxは馬鹿にしていたのですが、最近は使い勝手の良さに負けてdebian系を使ってます。ラズパイがdebian系なので他のに手を出すとコマンド覚えきれません。

参考ページのとおり設定していけば環境構築は可能です。途中でいろいろと足りないとエラーが出るので、その都度調べてapt-get installが必要です。

サンプルのhello worldとblink(俗にいうLチカ)のコンパイルとESP32への転送、動作確認まで確認できました。状況は動画で。

まずは、hello worldですが、実行バイナリーがESP32に転送されてhello world表示して10秒カウントダウン後再びhello world表示と見た目は地味な動作が続きます。動画ではわかりずらいかもです。

次にblinkは、実行バイナリーがESP32へ転送されるとLEDがon/offします。

今回のまとめ

前回設定したWSLによるdebianにて動作するESP32開発環境のesp-idfを構築した。
また、サンプルプログラム2つ(hello world, blink)の動作を確認した。

ラズパイ日記...20日目..DCモータコントロール

倒立振子実現のために、事前確認です。

DCモーターコントローラは、東芝製のTA7921Pを使用してます。
こちらに詳しく説明とサンプルがあります。
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html

回転方向の制御に2線、回転速度の制御に1線を使用します。
ESP32側は、回転方向制御に1,0をそれぞれ出力してあげれば問題ありません。
回転制御は、アナログ出力はないのでPWM出力をアナログ出力とみなして制御します。
周波数は、500Hzから1kHzがいいようです。
デューティー比を0(0%)~1023(100%)まで変化させると擬似的にアナログ出力となります。
デューティー比は、0→1→10→100→500→1000と変化させた時のモータの動きです。

デューティ比0,1,10ではモーターは動きません。 PWM信号にLEDをつけてます。段々明るくなっている状況がわかると思います。

もう1個のモーターも配線を半田付けして、モーターコントローラと配線します。
反対側を見ながらコピーすればいいので簡単です。プログラムを反対側分も作成し、いざテスト。
うーん、新しく配線したモーターは、うんともすんとも動きません。反対側は問題なく回ってます。
再度、配線を見直しても間違ってません。
配線触ってると、モーター動き出しました。原因はここ。
モーターコントローラーのVCC線の剥き方が気持ち短くて、ブレッドボードと微妙に接触不良です。長めに剥いて配線しなおすと、左右同じように動くようになりました。

これで、左右のモータが動くようになりました。将来的な拡張を考えて左右個別にコントロール出来るようにしてあります。

あとは、これまでのセンサー読み出し、モーター駆動等の個別コードをまとめて、倒立できるようにプログラムの作成です。
基板に取り付けて、ようやく倒立実験です。GW中は楽しめそうです。

ラズパイ日記...19日目...9軸センサ(その3)

倒立振子のためにESP32をもう1個買いました。
あわせて片側6穴のブレッドボードも購入です。これで両側に配線が可能です。
左が新規購入した6穴、右がこれまで使ってた5穴です。5穴だとESP32の横幅が収まらずどちらかサイドのピンが使えなくなります。

 あとは、ArduinoIDEの新しいのは、シリアルデータをグラフにしてくれる機能があるようで、1.6.4から1.8.9にアップデートしました。
 
シリアルプロット試してみました。シリアルモニターからコマンド打って、シリアルにCSVデータが出力する状態でシリアルモニターをクローズして、シリアルプロットを立ち上げます。シリアルモニタとシリアルプロットは同時オープンできません。データ毎に色を変えてグラフにしてくれました。
加速度のx,y,z、ジャイロのx,y,xの6軸の状況です。センサをx方向とかy方向とか動かすと、それなりに反映されている感じです。

新規購入したESP32にもmicropythonを入れて、センサーを移し変えて配線をし直します。pythonコードもそのままコピーしてやれやれと思ったら、 センサ情報が出力されず、謎のエラーがでます。いろいろと確認したらI2CのSDA、SCLが逆になってました。
確認したつもりが、見直すと誤配線。配線は、少し間を置いて気分をリフレッシュしながら何度も要確認です。
モーター回路にも接続してモーター回ることを確認します。こちらは問題ありませんでした。
ということで、9軸センサとDCモータードライバーの配線は新しいESP32へ引越し終わりました。

センサーは、1方向の加速度とジャイロしか使わないので、x軸のみ加速度とジャイロ出力をグラフに出力して見てみます。

傾きが青線、加速度が赤線です。傾きにあわせて青線が動きます。早く動かすと赤線が上昇し、ゆっくり動かすと加速度は動きません。赤線は、微妙にオフセットされているので、これも補正しないとですね。
あとは、動かさなくても値が微妙に変化するので、感度を調整するか、制御ソフトで取捨選択するか考えないといけません。

ラズパイ日記...18日目...倒立振子始動

モーター系のお勉強ということで、倒立振子作ってみます。
 https://ja.wikipedia.org/wiki/%E5%80%92%E7%AB%8B%E6%8C%AF%E5%AD%90

DCモーターを9軸センサーの2軸を使って 制御します。
水曜日ポチッておいたのが届きました。

タミヤのダブルギヤセット(モーター2個付)や基板にタイヤ、
DCモーターの制御はTA7291Pで行います。
モーターの電源はエネループ(単3)×3がよろしいようです。エネループの単3は1本約1.2Vの出力です。モーター入力定格がMax3V、コントローラーの損失が約2Vあります。
エネループ1.2V×3→3.6Vでコントローラ損失が2Vということで、モーターは1.6V駆動となります。トルクが足りないときは、エネループ1本追加です。

先人の知恵としてこの辺のページが参考になります。
TA7921pの説明はこちら。
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html
半日でつくる倒立振子というナイスな先人もいます。
https://www.instructables.com/id/%E5%8D%8A%E6%97%A5%E3%81%A7%E4%BD%9C%E3%82%8B%E5%80%92%E7%AB%8B%E6%8C%AF%E5%AD%90/

倒立振子の運動方程式とか状態方程式は、ググルと沢山出てきます。
制御工学実装の基本のようで、いろいろな制御方法があります。

まずは、モーター単体を回転させるべく、配線等を行います。
ESP32からは、3本必要です。
IO2   PWM出力 モータ速度コントロール
IO22   0,1出力(正転、逆転、ブレーキ)
IO23   0,1出力(正転、逆転、ブレーキ)

全体はこんな感じです。ESP32はもう1個買って専用にしないとだめですね。
 
DCモーターコントローラは、こんな感じです。配線はまだ片側だけです。
写真下側電源ラインにESP32からの5V(赤線)を、上側の電源ラインに電池からの線(オレンジ線)を接続して、電源を分離してます。GNDは共通です。
とりあえず勢いよくモーターが回ることを確認しました。
早すぎてわからないので、ギヤボックスを入れます。ギヤ比は114.7:1を選択しました。

正回転と逆回転を3回繰り返します。

とりあえず、今週はこの辺までにしておきます。

ラズパイ日記...17日目...9軸センサー(その2)

9軸センサーの続きです。
前回積み残しの地磁気センサ値をESP32へ読み込みます。
BMM050.pyというライブラリを読み込んで、I2Cアドレス0x19へアクセスすると読み出してくれます。
これで9軸読み出せることは確認できました。

センサー情報をWindowsの画面にリアルタイムでグラフ化してくれそうなソフトがありました。無料で使えそうです。
シリアルから送られてくるcsvテキストをグラフに書いてくれるようです。
http://www.lapis-semi.com/lazurite-jp/lazurite/1499.html

このソフトにあわせるように出力を整形します。

各行の最初に「STX」、終わりに「ETX」をつけるそうです。シリアルモニターで出力を確認してます。とりあえず加速度の3軸のみです。

 lazuriteGraphというので読み込みます。画面設定はこんな感じです。
COMポートには先ほどの値が出力され続けているので、グラフをみると
なぜか書いてくれません。うーん、とりあえずこのままで、またの機会に考えます。
何事もうまくいくとは限りません。

2年目のラズパイ...16日目...9軸センサー

師匠に触発されて、9軸センサー購入しました。

動き系のセンサーは、どんなものか調べてみるのと、動力系と合わせて倒立振子をつくってみようと思ってます。
どんなものかは、Youtubeに沢山出てます。

センサー情報を元にモーターを制御するのはいろいろと難しい感じですが、結構サンプルもあるのでなんとかなりそうな感じです。目に見えて動くものはわかりやすいのでお勉強にはよろしいかと。

購入したのはBOSCH社BMX055です。めちゃくちゃ小さいです。3つ並んだ真ん中のチップに3つのセンサーが入ってます。他は電源レギュレータと信号線のレベル変換器です。
I2Cのアドレスや駆動電圧により、ジャンパーが必要です。
 JP1,JP2,JP3はすべてオープンのため、I2Cアドレスは以下のとおりです。
加速度 0x19
ジャイロ 0x69
磁気 0x13

JP6オープン,J7ショート,J8オープンとして、電源は3.3V,信号レベルは3.3Vに設定しました。J7は基盤の裏面を半田でジャンパーします。写真わかりにくいですがAEの右上を半田でジャンパーしてます。

ESP32基盤はこんな感じでいろいろと乗っかってます。
動作確認はmicropythonで実施します。先人の知恵をGithubで見つけました。すんなりいくかと思えばそうはいかずです。Pybordで動いたコードのようで、ちょっと修正が必要です。センサーは、I2Cアドレス3つでそれぞれ読み出さないといけないので、加速度、ジャイロ、地磁気センサーそれぞれを1つのデバイスに入れた感じです。コードもそのようになっていて、センサー毎にライブラリになってました。
こちらを参考に
https://github.com/micropython-IMU/micropython-bmx055
bma2x2.py→加速度センサ
bmg160.py→ジャイロセンサ
bmm050.py→地磁気センサ
それぞれがライブラリになっていて、importで読み込む必要があります。

今日のところは、加速度とジャイロまで読み取れるところまで出来ました。
uPyCraftの画面キャプチャーです。下の黄色枠に加速度の3軸(x,y,z)、ジャイロの3軸(x,y,z)計6個の値を0.5秒毎にESP32が読み取って表示しています。
地磁気は次回に。この値だけではよくわからないので、時間変化とともにわかるように可視化も必要です。センサー動かさなくても値が微妙に変わっているので、感度の調整や値の補正も必要なのかもです。
シリアルにセンサー情報をprintするためのpythonコードです。いろいろといらない部分もありますが。

2年目のラズパイ15日目...ESP32+BME280

引き続きESP32です。BOSCH製の温湿度・気圧センサーBME280を接続し、値を読み込み、先週のOLEDに表示するまでを頑張ります。

BME280は、秋月で買うと1,080円です。海外通販だと2-300円だそうです。送られてくるまで日数はかかるそうですが。 上位機種のBME680というのもあり、3項目に加えて空気中のガス濃度を測定してくれます。

BME280は 、ラズパイに接続しAmbientのクラウドに値を15分毎に送るのに使ってます。linuxでの設定は結構簡単だった記憶です。

BME280のドライバーは先人の知恵をいただきます。
https://github.com/catdog2/mpy_bme280_esp8266/blob/master/bme280.py

参考ページは、この辺で
https://qiita.com/tshimizu8/items/e64e1af656b3b00a92d9

 I2C接続のマスターはESP32なのでスレーブ側のセンサー等はバス接続でSCLとSDAの2線を共通にどんどん接続することが出来ます。
ただし、I2C アドレスが競合するとよくないので、その辺はそれぞれのデバイスのデーターシートをよく確認する必要があります。
 BM280の接続は、以下のとおりです。
1pin VDD
2pin GND
3pin CSB→VDD チップセレクトとありますが、I2Cは関係ないそうです。
4pin SDA
5pin SDO→GND I2C ADDR 0x76になります
6pin SCL

いきなり成果写真になってますが、BME280はOLEDの隣に設置し、SDAとSCLをOLED経由でバス接続で延ばして接続します。

 
OLED にセンサーから読み取った温度、湿度、気圧が30秒更新され表示されてます。
母艦PCのuPyCraftの通信状況部分にも確認のためprint文で表示させ、OLEDの表示とあってるか確認しました。モニター画面反射してますがすいません。
OLEDの日本語化とか最新データのグラフ化とか使い方はまだまだあります。
pythonコードは、以下のとおりです。

2年目のラズパイ...14日目...ESP32+OLED

ESP32続きます。

今日は仕事帰りに買ってきた大きなブレッドボードに ESP32を引越しして、
OLED(SSD1306)の表示を頑張ります。

OLEDとは、Organic Light Emitting Diodeの略称で、日本語で言うと有機ELダイオードでしょうか。最近は、テレビなどにも使われています。数年前までは、大きさとか寿命とか製造コスト等いろいろと問題ありでしたが、ようやく製品に採用されています。
液晶に比べて発色が綺麗とかバックライトがいらない等メリットは多いようです。

ちなみに購入したOLEDは、580円でした。

まずはブレッドボードの引越しです。センサーやOLED等配線すると狭くなってきたので。
こちらから


こちらへ


これで、接続して配線できるエリアが広がりました。もう2列くらい幅があるといいのですが。

次にOLEDです。参考にしたページはこちら。
https://qiita.com/inachi/items/ceb3e8e12022a7cbdf7b
 
接続は配線少ないI2Cで行います。 
VCC,GNDとSCL→IO4,SDA→IO5へ接続します。VCCは、3.3Vで大丈夫なようです。データシートには、Logic3.3V-5V、表示部7V-15Vとありましたが。

pythonのライブラリーは、先人の知恵を拝借します。
https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py

これで準備完了です。uPyCraftでまずはライブラリーをアップロードします。


①で状況確認できます。②の領域でファイルの中身の確認、③はシリアルコンソールでここからコマンドも入力できます。④でファイルアップロードと実行がワンクリックです。
Teratermでコマンドたたくと結構大変ですが、この統合環境は優れものです。中華ものですが。

まずは、英数字の表示です。結構簡単です。参考ページのコードをそのままたたくと表示されました。日本語は、フォントを入れると表示できるそうですが、そこはまた次回ということで。



サンプルの3D CUBEは、サンプルコードそのままで問題なく動きました。

2年目のラズパイ...13日目...ESP32でLチカ

ESP32ですが、micropythonが動くように環境整備が終りました。

手始めに基本のLチカです。

ブレッドボードのGNDとESP32のGNDを青線で接続し、ESP32の
IO02とGND間に抵抗入りLEDを接続します。
これでIO02の出力を変化させると、LEDが着いたり消えたりするはずです。

pythonコードはこちら。
しかし、LEDがうんともすんとも光りません。

pythonコードとIOピンの番号が違うのかとdatasheetを見直したり、WWWを調べたりといきなりつまずいてます。「故障探求は下位レイヤーから」が基本です。
わかってしまえばなんだなのですが、青線でESP32とブレッドボードのGNDラインを接続しているのですが、ブレッドボード側が接触悪く、皮膜を剥き直して指し直すと問題なくLEDは点滅しました。
動画はこんな感じです。

引き続き、PWMでもわっと光らせてみます。
コードは、こちら。
こちらの動画はこんな感じです。ちょっと周期が早くてわかりづらいですが。

母艦PCとESP32間は、USBケーブルで接続します。ソフトは、TeraTermでチコチココマンドたたくのもいいのですが、uPyCraftというのを使うとESP32へのファイル転送やpythonコードの実行を簡単に行えます。

2年目のラズパイ...12日目...ESP32始動

秋月で買ったものの長らく手付かずだったESP32ですが、始動します。
確か1,500円くらいだった記憶です。こちらです。
「ESP32」「micropython」というキーワードで先人の知恵を探します。
とりあえず、この辺が参考になるかと
http://www.zikko.net/micom/?p=152

ESP32のFlashを書き換えるツール
https://www.espressif.com/en/support/download/other-tools?keys=&field_type_tid%5B%5D=13

その前にCP210xというUSB-Serial変換するドライバーが必要だそうです。
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers 

ドライバー入れるとCOM7にて認識されました。
上記のFlash書き換えツールでバイナリーを書き換えます。

一番下の緑のバーが左から右へ進んで書き込み状況を表してます。
1分くらいかかります。書き込みは0x1000からと、おまじないがあります。

USBケーブルを再接続してリセットしてから、TeraTermでCOM7をたたいてみると
micropythonのターミナルが表示されており、環境はインストール完了です。
毎回シリアルでプログラムを書き込むのが面倒なので、便利なツールがあるようです。
「uPyCraft」というのが、Win,mac,unix用それぞれあります。

秋月で売ってるDEvkitCのpin配置はこちら。
とりあえずESP32のmicropython環境は、整いました。中身は次回からと言うことで

ラズパイ日記...esp32(arduino)+mpu6050

# esp32で6軸センサー読み出し esp32で6軸センサーを読み出し、値をグラフ表示して動作を確認します。 ## 準備 ハード的な接続は、センサーが3.3V駆動できるので、3.3VとGNDの2線で電源供給します。I2C用にSDAとSCLのデータ線が必要ですが、esp...