chakokuのブログ(rev4) (original) (raw)

このブログでは主に以下の内容を記載しています(自分の記録用)。

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。
とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。へこんでも創造の力で進みたい
■2023年修正
当初は「あほ道」を進む予定だったが、「あほ道」は情熱と強い信念がないと進めない。自分は歳と共に情熱が落ちてきた。残りの人生は「ワクワク」や「面白い」ものを追いかけたい。ワクワク+面白体験に人生残りの時間とお金をかける*1
定年再雇用後はこれまでの仕事を少し減らして、プログラミング学習の支援活動を行う予定(愛想悪くて生徒様からチェンジ要望が出されるかもしれないが)
■2024年目標再設定
これまで仕事とか趣味はデジタル分野であった。アナログ回路とか電磁気は全く分かっていない。残りの人生は、微積電磁気学、ベクトル解析?を学んで、音、音楽、波形、FFT、アナログ回路、フィルタ回路、アンプ設計等、アナログ方面の理解と作成に取り組みたい。それに、、(来るか来ないか分からいけど)量子コンピューティングは量子の挙動を行列で表現して演算するらしいし。。ちょうどいい。

*1:ちなみに7月で定年・再雇用

やりたいこと:RPi等からWSL上のMQTT BrokerにPublishしたい
課題:普通にBrokerを起動しただけでは接続できない(原因は、(1)Broker本体の設定の問題、(2)PC内のルーティングの問題、(3)Windows Firewallの問題)
結論:先人の記事を参考に設定した結果、RPi --> mosquitto on WSLの疎通確認まではできた
詳細:

普通にMQTT Broker(Mosquitto)を動かすと同一ネットワークしか接続を許さないので、外部ネットワークからも接続できるようにconfig を修正する
file: /etc/mosquitto/conf.d/permit.conf

listener 1883 allow_anonymous true

次に、Windows環境に接続に来たパケットをWSLに流すための仕組みなのだが、、mirroredのモードで起動するとフォワーダ等を動かさなくても接続できるらしい
要点だけ書くと以下を.wslconfig に設定しておくとミラーモードになるらしい(ミラーモードとは?? WindowsのIPに接続に来たらWSLにもパケットが流れるということか??)
file: Windowsの個人フォルダ .wslconfig

[wsl2] networkingMode=mirrored

WSL2 2.0.x時代の外部PCからWSLに接続する方法

ただ、自分の環境では上記フラグを設定すると、WSLの起動時エラーになるのであった。何度かWSLを再起動するとエラーが出なくなった(なぜかは分からない)

Microsoft Defender ファイアウォールに対して、手動で1883ポートのみ受信許可に設定する(1883ポートについて inbound/outboundの両方を許可)

New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 1883 -Action Allow -Protocol TCP New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 1883 -Action Allow -Protocol TCP

この状態で、RPiから1883番ポートで接続テスト

raspberrypi:~ $ telnet 192.168.10.100 1883 Trying 192.168.10.100... Connected to 192.168.10.100. Escape character is '^]'. ^CConnection closed by foreign host.

上記の通り、RPiからWSL上のMQTT Brokerに1883で接続することができた(MQTT Publishまでは見ていないが多分大丈夫だろう)
MQTTに接続できたので、今後はRPi Pico等で収集したセンサーデータ等をMQTT PublishでPCに送付、PC側でSubscribeしてデータを取得、各種解析が可能になる。

■追記
WSLのネットワーク設定をmirrored modeにするとLocalhostwindows環境からWSLに接続できなくなった。
この件は以下でも議論されている
Localhost is not accessible from windows in mirrored mode · Issue #11172 · microsoft/WSL · GitHub
mirrored modeを使わずNATモード?で運用するか、Workaroundとして、「Windows でシステムのモバイル ホットスポットをオンにする」方法もあるらしいが、特殊すぎてこれはちょっとどうかという気がする。WSLではなく、すなおに RPi3等の上でMQTT Brokerを走らせるのが無難なんだろうか。

もう少し試した結果、以下のIP指定だとmirrored network設定されているWSLに接続できるようであった。

$ telnet 0.0.0.0 1883 Trying 0.0.0.0... Connected to 0.0.0.0. Escape character is '^]'. Connection closed by foreign host.

$ telnet 127.0.0.1 1883 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Connection closed by foreign host.

Workaroundで、127.0.0.1: 1883を指定することで、Windows上のMQTT ClientからUbuntu(WSL)上のMQTT Brokerに接続できた。今後センサの試作は以下の構成で行う予定。

■参考URL
WSL2 2.0.x時代の外部PCからWSLに接続する方法
Authentication methods | Eclipse Mosquitto
Windows Subsystem for Linuxガイド 第34回 ミラードネットワークモード | マイナビニュース
自作ドローンの制御系設計 vol. 1 | Remma's Laboratory
ドローンの自作|姿勢制御プログラム(PID制御編) – imo Lab.
【Arduinoドローン自作】NO.6 PID制御実装編 - とある科学の備忘録
わかりやすいPID制御 | 組込み技術ラボ
PID制御のプログラム例。仕組みと考え方を詳しく解説!
PID Explained • Proportional Integral Derivative
PID Without a PhD Tim Wescott, Wescott Design Services

背景:MicroPythonに接続したセンサーデータを手軽にグラフ化したい
取り組み:MQTTを介してMicroPythonのデータをPCに転送する。PC側ではNode-REDのNodeを組み合わせてMQTT Subscribeして得られた値をグラフ化する
結論:追従できる速度に課題があるが*1、仕組みとしては実現できた。以下は構成図

詳細:
ESP32版のMicroPythonなら最初からMQTT Clientが入っているのだが、RP2040用のMicroPythonにはMQTT Clientが入っていない様である。umqtt.simpleパッケージが提供されているので、パッケージで入れてみる。
CPythonだとpipコマンドでパッケージインストールできるが、MicroPythonの場合、ホスト側からmpremoteコマンドを使って、ターゲット(RP2040)のFlashにパッケージをインストールすることができる。

自分の場合、諸般の事情により、mpremoteコマンドはUbuntu(WSL)上に入っているので、まずはUSBを透過する必要がある。

PS C:\Windows\system32> usbipd list Connected: BUSID VID:PID DEVICE STATE 2-1 2e8a:0005 USB シリアル デバイス (COM20) Not shared 2-3 046d:c058 USB 入力デバイス Not shared 2-5 1199:90b1 Sierra Wireless EM7431 Qualcomm® Snapdragon™ X16 LTE-A, S... Not shared 2-7 5986:118f USB FHD Camera, IR Camera, Camera DFU Device Not shared 2-8 06cb:00c6 Synaptics UWP WBDI Not shared 2-10 8087:0033 インテル(R) ワイヤレス Bluetooth(R) Not shared

Persisted: GUID DEVICE 2a4f2781-19c5-4922-a1dd-e96106844633 USB シリアル デバイス (COM14), USB JTAG debug unit 6b9e6ec4-1707-401f-8d5d-8ac0b21d899c USB シリアル デバイス (COM18), USB JTAG/serial debug unit 820033e8-df76-408a-b5b9-8807c63590eb USB-Enhanced-SERIAL CH9102 (COM19) b24984ee-275b-44bd-905e-387f22edb9c5 USB シリアル デバイス (COM17), USB JTAG/serial debug unit c8df5152-439b-47bc-b8b6-de2c8a0e55f2 USB シリアル デバイス (COM13), USB JTAG/serial debug unit

PS C:\Windows\system32> usbipd bind --busid 2-1 PS C:\Windows\system32> usbipd attach --wsl --busid=2-1 usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions. usbipd: info: Using IP address 172.17.96.1 to reach the host.

上記操作によりUbuntu(WSL)からPC上のCOMポートが参照可能になった。

$ ls /dev/ttyACM0 /dev/ttyACM0

mpremoteコマンドを使って、umqtt.simpleパッケージをインストールする

$ mpremote mip install umqtt.simple Install umqtt.simple Installing umqtt.simple (latest) from https://micropython.org/pi/v2 to /lib Installing: /lib/umqtt/simple.mpy Done

Windows環境からTereTermでMicroPythonコンソールに接続したいので、一旦透過を戻す

usbipd detach --busid 2-1

MicroPythonコンソールから、umqttが入ったことを確認。確認の方法がイマイチだが、一応パッケージが入ったようである。

import umqtt dir(umqtt) ['class', 'name', 'dict', 'file', 'path']

MQTT Clientのセットアップ等は省略しますが、、以下の内容で50msec周期でpublish(テストなのでセンサーデータはRandom値)

import random import json while True: value = int(100*random.random()) msg = {"data" : value} print(f'send message {msg} on topic: {TOPIC}') client.publish(TOPIC, json.dumps(msg), qos=0) time.sleep_ms(50)

Node-REDにより、MQTTでSubscribeしてグラフに描画するプログラムは以下

描画されたグラフは以下(欠損なく50msec周期で描けているのかは未確認)

欠損状態が分かりやすいように、センサデータとして、周期1秒のSin波を描いてみる
50msec周期でsin波をpublishするサンプル。1波20publish(sin波の周期は1秒)として実装

import random import json import math while True: for nth in range(20): value = 100 * math.sin(2 * math.pi * nth / 20) msg = {"data" : value} print(f'send message {msg} on topic: {TOPIC}') client.publish(TOPIC, json.dumps(msg), qos=0) time.sleep_ms(50)

Node-REDによって描画される波は以下

50msec周期だと大幅な乱れもなく描画できている。さらにPublishの周期を短くして、10msec 周期にしてみた。
ソースコードは以下

import random import json import math while True: for nth in range(100): value = 100 * math.sin(2 * math.pi * nth / 100) msg = {"data" : value} print(f'send message {msg} on topic: {TOPIC}') client.publish(TOPIC, json.dumps(msg), qos=0) time.sleep_ms(10)

ここまで周期が短くなるとさすがに描画も苦しくなって以下のように波形もひずんでいる。

■追記
やはりNode-RED/dashboard/MQTT Clientの組み合わせだと、性能的にちょっと心配な所がある(しかもデータ集計はPythonで行う予定なので、どうにかしてPythonと接続必要)。そんな中、WSLではGUIアプリが動かせると知りまして、だったら、PC上のUbuntu(WSL)でPython + tkinterの組み合わせで自作グラフ描画させたらいいのではと思った。 UbuntuでPython3用 tkinterパッケージのインストールは以下

$ sudo apt-get install python3-tk

パッケージを入れた状態で、以下tkinterモジュールを指定してPythonを起動すると、WSLの環境からTkのWindowが表示できた。

$ python3 -m tkinter

Node-RED環境ではなく、Python3 + MQTT Client + tkinterの組み合わせでグラフ描画させる取り組みを行う。Python環境でデータが取り込めたら、データ解析も同時に行えるので効率が良い。

■追記
RP2040にセンサを取り付けMicroPythonからMQTTでPublishしてUbuntu(WSL)上のNode-REDでSubscribeしてdashboardでグラフ化した例

■参考URL
Tkinterでグラフを表示したい! #Python - Qiita
(tkinterでグラフをリアルタイムに描画する方法が紹介されている)
python - Using MQTT to update Tkinter GUI? - Stack Overflow
tkinterとMQTTを組み合わせる実装例

*1:50msec周期でpublishされるデータは遅延なく描画可能

背景:RPi Picoのセンサデータを手軽に集計してグラフ化したい
取り組み:RPiに液晶モニタをつけてもいいけど、集計の試行錯誤はできたらPC上で行いたいので、収集データをPCに取り込みたい。PC上でMQTT Brokerを走らせて、RPiからはMQTT でpublishする。PC上のMQTT ClientでSubscribeしてデータを受信してグラフ化する。そして集計する。
手順:
MQTT BrokerアプリをUbuntuにインストール手順としては、普通のaptで入るようであった。手順に沿って入れてみる。

apt-get install mosquitto

ps aux | grep mos

mosquit+ 9941 0.0 0.0 15732 7984 ? Ss 16:16 0:00 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

netstat -na | grep LISTEN

tcp 0 0 10.255.255.254:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:1883 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp6 0 0 ::1:1883 :::* LISTEN

MQTTのTCP接続ポートは1883らしいので、上記でListenがなされていると理解

MQTTで得られた値をグラフ化する方法としていろいろあるのだろうけど、自分はNode-RED + Dashboardぐらいか思い浮かばないので、Ubuntuにnode-red を入れる

sudo npm install -g --unsafe-perm node-red

実行すると、npmも上げろとメッセージが出たので、npmも上げる

npm notice New minor version of npm available! 10.4.0 -> 10.8.3 npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.3 npm notice Run npm install -g npm@10.8.3 to update!

ユーザ権限でnode-redを起動する

$ node-red 29 Sep 17:11:21 - [info]

Welcome to Node-RED

29 Sep 17:11:21 - [info] Node-RED version: v4.0.3 29 Sep 17:11:21 - [info] Node.js version: v18.17.1 29 Sep 17:11:21 - [info] Linux 5.15.153.1-microsoft-standard-WSL2 x64 LE 29 Sep 17:11:21 - [info] Loading palette nodes 29 Sep 17:11:22 - [info] Settings file : /home/sumi/.node-red/settings.js 29 Sep 17:11:22 - [info] Context store : 'default' [module=memory] 29 Sep 17:11:22 - [info] User directory : /home/sumi/.node-red 29 Sep 17:11:22 - [warn] Projects disabled : editorTheme.projects.enabled=false 29 Sep 17:11:22 - [info] Flows file : /home/sumi/.node-red/flows.json 29 Sep 17:11:22 - [warn]


Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials file will not be recoverable, you will have to delete it and re-enter your credentials.

You should set your own key using the 'credentialSecret' option in your settings file. Node-RED will then re-encrypt your credentials file using your chosen key the next time you deploy a change.

29 Sep 17:11:22 - [info] Server now running at http://127.0.0.1:1880/ 29 Sep 17:11:22 - [info] Starting flows 29 Sep 17:11:22 - [info] Started flows

Node-REDを使ってMQTTをしゃべらせてみる
ローカルPC上でMQTT Brokerが走っているのでlocalhost:1883と指定してみる

Node-REDでPublish/Subscribeさせて、折り返しできるかをテスト、HelloWorldとPublishして、Subscribeできるのを確認

MQTT Brokerのログも一応確認、以下のようにnoderedから接続されました・・とログが出ている

1727597734: New connection from 127.0.0.1:43078 on port 1883. 1727597734: New client connected from 127.0.0.1:43078 as nodered_b4f00373eb656159 (p2, c1, k60). 1727597807: Saving in-memory database to /var/lib/mosquitto//mosquitto.db.

次は、RP2040のMicroPython側からセンサ取得情報をMQTTでPublishさせるとPCまでは届くと・・ 届いたデータをNode-REDのDashboardでグラフ化したら波形が見えるはず。
■追記
当初PC上のUbuntu(WSL)にMQTT Brokerを入れたのだけど、WindowsFireWall等に遮断されて疎通できない状況であった。FireWallの設定を変更して1883ポートを通過させてもいいのだが、いろいろ面倒そうなので、RaspberryPy(多分Raspbian)にmosquittoを入れた。
自ホスト内の接続であればそのままの設定で通信が確立できるが、自ホスト以外の端末から接続を許すには追加設定が必要
例: file: /etc/mosquitto/conf.d/custom.conf

listener 1883 allow_anonymous true

■追記
WSLとWindowsとの接続はPC内でVirtualNetworkで接続されているらしい。だからPC外のClientからWSL上で稼働するサーバや各種Webサービスに接続することはできない。だったらどうするか、、Windows環境でポートフォワーダを走らせて、Windows環境に接続した接続をWSLのネットワークに転送させることで接続可能になるそうだ。
【WSL2】外部からWSL2のサービスに接続する
例えば、WiFi搭載のマイコンでデータ収集した時、MQTTを使ってWSL上のMQTTブローカにPublishできれば、Windows環境でログ収集することが可能になる。前回テストした結果では結構高速にデータ収集が可能であり、マイコンのデータをリアルタイムにPCに取り込むことが可能になると期待できる。
■参考URL
Install Mosquitto MQTT Broker on Ubuntu | Litmus Automation Documentation - Litmus Technical Documentation

背景:子供からSASをやる必要があると相談を受ける(特にマクロ定義)。SASはクセ強言語でワケが分からない*1
取り組み:SAS言語処理系は普通には買えないので、無料で使える、SAS Studioでmacroを少し勉強
結論:SASのmacroはSASソースコードが実行される前にテキストベースでソースコードに対して置換が行われる(SASのTutorialではコンパイルと書かれている)。置換された新しいソースコードSASのコードとして実行されると理解。だから、Pythonのdef(関数定義)と誤解すると大いにハマる。Lispのmacroと同じと思えばいいのではないかと*2

以下はテストコード

%putを使う必要はないけど、デバッグ用に利用

■追記
上記の理解だと、Cコンパイラのpre processorのように書いているが、よく考えると、SASプログラム実行に応じてmacroが呼ばれたり呼ばれなかったり、さらに、引数付きのmacroは引数に応じて処理が変わるので、マクロが実行された後、SASプログラムが実行されるような解釈は間違っていて、SAS本体プログラムの実行に合わせてmacroによる置換?がその都度実行されていると理解すべき。だからやっぱりLispのmacroから類推して理解すべきだと。

■追記
マクロはテキストベースの処理なんだと確認するため、まったく何の助けにならない代入だけのマクロを試作

実行結果は以下の通り、新しい列(hello)が作成され、値が25になっている。

もしSASのマクロが関数のようなものだったら、myassignの引数としてhelloと指定した段階で、そんな変数知らんと言ってエラーになるだろう。

■参考資料
以下は厳密な定義なので、読んでも理解できない
マクロの定義および呼び出し
SASのmacro tutorial
マクロ変数を使用した文字列の置換
無料で使えるSAS実行環境
SAS Studio | SAS

再現テストできないので、一体何が起きたのかよく分からないが、WindowsUpdateの案内が出たので、適用して再起動した。
当てたのは以下と思われる
2024 年 9 月 26 日 — KB5043145 (OS ビルド 22621.4249 および 22631.4249)

再起動後、「ログイン(認証?)に失敗しました」といったメッセージが出てWindows11にログインできなくなった。普段は顔認証でログインしているのだけど、顔認証は使えない状況であり、PINによる認証も失敗した。何度か失敗していると、リカバリーモードになったのか、スマフォのAuthenticatorと連動して、PIN再設定するモードになった。PINを適当なのに置き換えて再登録することでログインは可能になった。

ユーザ認証で確認すると、顔認証とか指紋認証の登録が消えているようだった(正常に登録されている状態とは何か?自信がないけど、初期登録みたいな画面になったたので、すでに登録した情報は消えたと思われる)
個人のPCだからいいけど、社用のPCでアカウントが飛んだらかなりトラブルになりそうだ。

■追記
やっぱり、KB5043145はまずいパッチのようだった。
Windows 11, version 23H2 known issues and notifications | Microsoft Learn

AbletonLiveを勉強しようと思って、評価の高いLive11 攻略BOOKをAmazon Kindle版で買った。音源を入手しようとサイトに行ったけど、どうも閉鎖されているようだった。音源や作成があるとよく理解できて助かるのだけど、どうも事業縮小のようで、サイトもどんどん閉鎖するようであった。
少し検索すると、前のバージョン、Live10の作例がsoundcloud.comに上がっているようだった。Live11攻略の内容は前作のLive10攻略とほとんど変わらないと書いている人もいて、Live10攻略でも参考になるかと思い、聞いてみることにした。

soundcloud.com

■その他関連URL
Ableton Liveの使い方!初心者が作曲するための基本操作はコレ。
https://www.ableton.com/ja/live/learn-live/
https://youtu.be/UBgoCvxo4Ew?si=o5Ne0qZF2yl4XD3S