Micro:bitでライントレース

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に割り当てられるメモリが少な過ぎれば当然動いて欲しいものも動かないということになりますが、メモリサイズを指定しないで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

 

Goのアップデート

すでに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からの呼び出し(以下のコード切り出し)の追加。

r.Static(“/static”, “./go_chat/view/static”)
r.LoadHTMLGlob(“./go_chat/view/*.html”)
Static/LoadHTMLGlob()のリンクディレクトリ呼び出しは、Run()を起動したmain.goが基準になるのでそこからの相対ディレクトリに変更、関連処理のmain.goからの呼び出しを移動しただけです。
<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

GolangでHTML escape処理

HTML escapeはほとんどのケースで入口、つまりHTMLでFORM入力された文字列のチェック、でのJavaScriptの仕事です。もしGolangがフロントエンドの役割を果たす時にはhtmlパッケージにある、

func EscapeString(s string) string

関数が使えます。もしunescapeするならば、

func UnescapeString(s string) string

になります。docのリンクは、

https://pkg.go.dev/html

 

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

Goのビルド時間を条件同じにして計測してみた

以下の記事で、Intel MacとM1 Macでビルド時間が違うことに気づいたので、条件を同じにして比較。

https://isehara-3lv.sakura.ne.jp/blog/2023/04/23/dockerコンテナからイメージを作成する/

<時間計測の条件>

一度ビルドを完了した状態で、実行ファイルを削除して再度ビルドに要する時間を計測(実際行っていることはリンケージですね)

スクリプトファイルで、

% go build main.go

の前後のタイムスタンプで計測

M1 Mac native build time -> 2 seconds

 % ./build.sh 
2023年 4月24日 月曜日 13時12分41秒 JST
2023年 4月24日 月曜日 13時12分43秒 JST


M1 Mac Docker container build time -> 11 seconds

# ./build.sh
Mon Apr 24 05:00:53 BST 2023
Mon Apr 24 05:01:04 BST 2023


Intel mac Docker container build time -> 61 seconds

# ./build.sh
Mon Apr 24 04:18:53 BST 2023
Mon Apr 24 04:19:54 BST 2023


Raspberry Pi model B+ native build time -> 118 seconds

$ ./build.sh
Mon 24 Apr 13:05:53 JST 2023
Mon 24 Apr 13:07:51 JST 2023

 

Intel/M1 Macは他のタスクではほぼ同じパーフォーマンスなので、Intel CPUではarm CPUのエミュレーションが明らかに速度が遅いようで、M1 MacでのDockerだけがクロスビルドの許容内、規模にもよりますが。

 

admin

Wi-Fi無しのラズパイにWi-Fi機能追加

元々Linux用のUSBドングルでまともなものは無いのは知っているから、Wi-Fi機能のない初代に近いモデルにWi-Fi機能を追加するのはおそらくこれが一番手っ取り早い。

TP-LINKの携帯用のWi-Fiルーターを天板に両面テープで貼り付けただけ。元々このモデルはルーター/中継機/クライアントの三つのモードがあるので、クライアントモードを設定すれば良い。

 

電源にtype-b2本のUSB必要だけど、見た目一体感はありそう、ちょいダサいけど。

 

admin

Dockerコンテナからイメージを作成する

誤ってコンテナ削除すると、それまでに適用したアップデートが全て消えるので、コンテナからイメージを作成する方法。

コンテナを停止、docker psで見えない状態、してからたとえば以下のようなコマンドを実行すればrasp32_image_goという名前のイメージが作成されます。作成後はrunでコンテナ(ここではrasp32_go)を作成して内容を確認しておけば大丈夫です。

% docker commit rasp32 rasp32_image_go

<image>

<container>

rasp32コンテナに適用した変更を保存するために、rasp32_image_goというイメージを作成しています。簡単ですね、

必要ならDockerhubにアップロードしておけば共有やバックアップができます。個人で使う分にはDockerhubはバックアップでしかないですが。

共同作業をする対象ならば、historyが見えなくなるので使いづらいでしょうが、個人で使う分にはDcokerfileを使わなくてもこれで十分だろうと思う。

 

admin