VScode起動時にDockerも起動されるようになっているので、その都度8GBも消費するのは無駄だろうから割り当てを変えます。実メモリ16GBでDockerに8GB割り当ててしまうと、状況によってはメモリプレッシャがwarningレベルになります。4GBあれば当面十分だろうからDockerの設定画面で変更。
アクティビティモニターで見ると、
割り当てサイズが変更されました。
admin
la vie libre
以下で作成した倒立振子、
https://isehara-3lv.sakura.ne.jp/blog/2022/12/30/倒立振子(pi制御でハンチングなくした)/
Wi-Fi環境無いところのために、Wi-Fi関連の処理(Pose情報をudpで送信)を削除すると、PIDパラメータの最適値が変わってきます。
モーターの駆動力を計算しているところをloop処理から切り出すと以下のような処理ですが、
// calc motor power
float Duty, P, D, now, dt, Time;
now = TARGET - roll_data; // calc delta
if (-25 < now && now < 25) { if (abs(now) >= 0){
Time = micros();
dt = (Time - preTime)/1000000;
preTime = Time;
P = now/90; // (-90~90) → (-1.0~1.0)
I += P*dt;
D = (P - preP)/dt;
preP = P;
power = P_val * P + I_val * I + D_val * D;
//Serial.println(power);
if (power < -1) power = -1; // limit the max value
if (1 < power) power = 1;
if (power < 0){
dir = 1;
}else{
dir = -1;
} // set forward/reverse
}
時間で正規化されてるわけでも無いから、powerの値そのものが変動してしまうからでしょう。
電池電圧変動でも同じpower指定しても実際のモーター駆動力は変化して、調整点がズレるのと似ていると言えば似ているかもしれません。
admin
直前のブログでLED表示時間が異様に長い件、micro:bitのドキュメントにその理由と思われる記載がありました。
overviewの最後にある通り、
“In it’s normal mode, the display will update every 18ms (55 Hz). If the display is in light saving mode the period is changed to 15ms (66 Hz).”
18ms毎にupdateされるようなので、この時間がLED表示データ書き込み時間として見えて来ているようです。マルチタスク動作ではないだろうmicrobitのファームウェアでは。
admin
Arduinoベースの車では、簡単に軌跡を外れるので、Micro:bit carにセンサを外付けしてあたりを付けてみた。Arduino(VScodeのPlatformIO)ではmicro:bit(makecode)に比較して開発のループ時間が長くなるので。
3Dプリンタでアタッチメントを作成して、センサーを両面テープで貼り付けました。アナログ入力はP0とP2を使っています。
動きを遅くするために、モーターの動作時間を限定してフィードバックが確実にかかるようにしてやると『カメモード』ですがトレースできるようになりましたが、動かすにはパラメータが多いので調整は大変そうです。ましてP.I.D制御までやろうとすると。
makecodeのコードは以下に、
https://github.com/chateight/trace_microbit
2023/5/18 LED表示に時間が掛かっている
LED表示にステータス、前進/右旋回/左旋回の数字を表示させるだけで数十ms必要で制御が間に合わなくてコースアウトしていたので、LED表示を削除して『ネズミモード』ぐらいまで高速化、展開時のモーター駆動にはP制御も追加しました。P制御の原理はフォトトランジスタの読み取り差をモーター駆動力にリニアに反映(下限と上限は決めていますが)しています。
admin
ライントレースはロボット構成の基本要素なので、一度はやってみます。
一年半前に作った自走車(超音波センサーで障害物回避)にライントレース機能を付加するのが便利そうなのでそれでやります。
センサーは、
https://resources.kitronik.co.uk/pdf/56111-kitronik-move-line-following-board-datasheet.pdf
ですが、フォトダイオードと光センサートランジスターを組み合わせた出来合いのモジュールを使います。電源電圧3V時に黒で3V、白で0Vが出力されます。
取り付け位置は中央ネジで3Dプリンタで造形したアタッチメント経由で取り付けの予定。
ラインマットとセンサーの距離が重要だろうから、事前にM5Stack使って距離を決めてやります。
<黒>
<白>
もちろん白黒で理想的に0Vや3Vにはならないから、ダイナミックレンジが取れそうなところで距離を設定します。どちらにしても近すぎても(シートに接触するぐらいに知るとかえってダイナミックレンジは悪化)遠すぎても(もちろん反射光を拾うのが動作原理なので論外)いけません。
で、概ね5mmあたりが適切のようです。
P.S. 2023/5/11
ArduinoのADCで読み込むと黒と白の値が反転してます。なぜだろう?
admin
あまり気にしたことはなかったのですが、Dockerに割り当てられるメモリが少な過ぎれば当然動いて欲しいものも動かないということになりますが、メモリサイズを指定しないでDockerを起動して割り当てられるメモリサイズを確認してみました。
条件はM1MacBook Airでメモリは16GBです。
# free
total used free shared buff/cache available
Mem: 8040052 436668 6207184 352068 1396200 7070628
Swap: 1048572 0 1048572
アクティビティモニターで見ても確かに8GB割り当てられているので、デフォルトではおそらく物理メモリサイズの半分が割り当てられるようです。Linuxで普通に使っていて何ら問題になりそうもないサイズです。
現実的には実メモリが8GBあればDockerの動作に問題は無いというのが一般的な記事に書かれていることですが、それだとデフォルトでおそらく4GB割り当てられてMac側が4GBでは他のアプリの動作が厳しくなりそうですからVMにしろDockerのようなコンテナにしろ実メモリが多くて困ることはありません。
admin
すでに2月に1.20になっていますが今さら。homebrewでインストールしているので、
% brew upgrade go
で1.19 -> 1.20へ、
==> Running `brew cleanup go`…
で1.19は関連ファイルが削除されます。
$GOROOTを確認すると、
% go env GOROOT
/opt/homebrew/Cellar/go/1.20.3/libexec
1.20にupgradeされました。$GOROOTはこのように自動的に更新されるので、直接手を入れる必要はないようです。以上はcuiモードで有効で、VScodeだと、以下のGo xxをクリックすれば、インストール済みの版数の選択あるいは新規ダウンロードができます。
admin
チャット機能は以下の記事の通り独立モジュールとして開発していましたが、
https://isehara-3lv.sakura.ne.jp/blog/2023/04/28/ラズパイにチャット機能を追加/
mifareカードアプリと分ける必要もなくなったので統合しました。ソースコードのリンクは以下になります。
https://github.com/chateight/myfare-copy
修正箇所は、router.goの以下の2行と、myfareのブラウザ画面からのリンクボタン追加とmain.goからの呼び出し(以下のコード切り出し)の追加。
func main() {
// to call card reader function()
go uidSerial.SerialMain()
// chat data base create and make table to store chat messages
sql_db.DbCreate()
// start chat service
go chat.Run()
// start myfare card service
wevServer()
}
admin
ラズベリーパイでMyfareカードのアプリを動かすのと同時にWi-Fi内でのチャット機能も追加しました。
https://www.cetus-media.info/article/2021/line-chat/
雛形は上のリンクですが、いくつかカスタマイズしています。
一番大きな部分は、チャット内容をSQLite3に保存して、新たな参加者が入ったらそれまでの履歴を表示するようにしたことでしょうか。
普通に提供されているHTML renderingはテキストしか対応出来ないので、タグが使えるようにginのWriter.WriteStringでHTMLページを組み立ててroom.htmlリクエストに対応しています。
<router.goの該当部分抜き出し>
r.GET("/room/:name", func(c *gin.Context) {
chattername := c.Query("name")
pmsg := chatbuild(chattername)
c.Writer.WriteString(pmsg) // to genrate initial chat page instead of the static html
全部のソースは、
https://github.com/chateight/golang/tree/master/go_chat
になります。ginとmelody使っているので、制御そのものはシンプルに出来ています。
画面はこんな感じです、ブラウザはsafariはJavascriptのサポートレベルがイマイチ(チャット画面に移動時、投稿の最新にスクロールしない)なのでchromeがおすすめです。
admin