2025年7月20日日曜日

ピコをudevを制御して区別する

 システムで、dshot信号を作るのをpicoでやらせていた。UARTの使用の関係で、pico1台で、2つのモータに信号を送っていたので、2つのpicoを使っていた。それまでは、pico二信号を送って、あなたはどちらのpicoですかと問い合わせして、その答えを聞いて /dev/ttyACM0か/dev/ttyACM1であるかを区別した。プログラムは面倒だが、正しくソースがかければ、難なく区別できた。

しかし、ここに来て、ラズパイをやめて、ミニPCに変えた。GPIO的ピン操作やI2Cのやりとりなどを、PC自体ではできないので、picoを経由でやるのが、手っ取り早くて柔軟にできるので、さらに2つpicoを追加した。すると、4つのpicoがどのデバイスファイルになっているのか、を区別しなければならなくなった。2つのときと同じでもできなくはないが、色々面倒になる。しかも、imuからi2c経由でデータを取るときは、 picoに対して制御信号は送らなくていいのに、区別のためだけに信号の送受信手続きをプログラムしなければならない。これが痛く面倒だ。

しらべると、Linuxのudevというデーモンが、デバイスファイルの割り振りを制御していることを知った。今頃知るのはおそすぎだと言われそうだ。そこで、/etc/udev/rules.d/に、90-picos.rulesというファイルを用意し以下のように書いた。 

SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000a", ATTRS{serial}=="E660C062134F4F27", SYMLINK+="ttyPi\
coA", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000a", ATTRS{serial}=="E663AC91D371B438", SYMLINK+="ttyPi\
coB", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000a", ATTRS{serial}=="E660D4A0A7933224", SYMLINK+="ttyPi\
coC", MODE="0666"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0003", ATTRS{serial}=="E0C9125B0D9B", SYMLINK+="ttyPicoD"\
, MODE="0666"

これで、  それぞれのデバイスが

/dev/ttyPicoA

 /dev/ttyPicoB

/dev/ttyPicoC

/dev/ttyPicoD

にシンボリックリンクをはられていた。

2025年7月16日水曜日

UbuntuにQtCreatorをインストールする

結局、Qtのグラフィックインストーラーを使ってやった。

https://www.qt.io/download-qt-installer-oss 

ソースからのコンパイル、何度も挑戦した。失敗した。時間かかった。 

独特の通過儀礼がある。最も基礎的なものは、QtそのものとQtCreatorが別々のものだということ。それぞれ独立にインストールすべきものだということ。ほぼ常識的なことなのだが、ここをきちんと頭に入れておかないとおかしくなる。QtCreatorからみてQtのバージョン区別は、Qtのqmakeによって行われること。これも以前は意識しなかった。それらもふくめて、キットで適切な指定がなされないと、キットが利用不可になる。

MiniPCは以上で問題なくインストールできたが、MacにVirtualBoxでインストールしたUbuntuにインストールしたとき、OpenGLがなんちゃらというエラーがいっぱい出てきた。よくわからないが、以下のコマンドでエラーがなくなった。

 sudo apt install libegl1-mesa-dev

2025年7月3日木曜日

RaspberryPi5にQtCreatorをインストールした

 RaspberryPi4には、3で使っていたSDカードを援用していたので、QtCreatorをどうインストールしたか忘れていた。ときどき、さらのSDカードを使って、Qtを入れようとしたが、ことごとく失敗した。

今回、4号機の、電源配線をミスして、ラズパイそのものやIMU、無線ユニットなどを全て壊してしまった。数万円の損をした。色々考えた末、期待の乗せるラズパイを5にすることにした。グラフィックユーザーインターフェイスは、QtをあきらめてJAVAにしようかとも思った。JAVAは、よほど使い慣れている。だが、期待の基本システムはすべてC++で書いていて、メインのシステムはそのライブラリになっている。JAVAからC++のライブラリを呼び出すのはとてもとても面倒くさい。やはり、Qtでなければならないと、最新のQtをソースからコンパイルして、言い訳できないようにしようと考えた。

参考にするサイトは、かかっこさんの

https://note.com/bsoft/n/nadcad4db7454 Qt開発環境をソースコードからビルド(ラズパイ5)

にした。参考といういよりも、これそのものを実行すれば良いと判断した。QtWebEngineは、コンパイルに一週間かかるということなので、当然スキップなど、6のサンプルなど省略できるものは省いた。

このサイト通り行かなかったところだけは以下に示しておく。

(1)qt-everywhere-src-6.7.0.tar.xzは、なぜか消えていた。ので、qt-everywhere-src-6.9.1.tar.xzという、この時点で最新のものにした。サンプル絡みでエラーが出たので、それを排除してコンパイルした。

(2)qt-creator-opensource-src-13.0.0.tar.gzをダウンロードして、コンパイルしていたら、createという関数のリターン値が不整合というエラーで止まってしまった。細かいことなので、大きなところは間違っていないようだったが、コンパイルできなければ話にならない。6のバージョンを最新のものにしたからだと思った。だから少し古いものを入れ直そうかと、一瞬思ったが、あのコンパイル時間の長さをもう一度体験する気にならなかったので、creatorの方を最新のqt-creator-opensource-src-17.0.0.tar.gzにした。これでうまくコンパイルがしのげた。

(3)これが最も重要なものかもしれない。いざ全て整って、プロジェクトを作成しようとしたとき、非Qtのプロジェクトは難なく作成して、実行できたが、WidgetのGUIプロジェクトを作成しようとしたら、キットが見つかりませんというエラーになった。このエラーには何度も出会って、インストールを諦めた経緯がある。今回は、先の参考サイトを基本的になぞってきたので、そうかんたんには諦めるわけには行かなかった。色々やった結果、Qtのバージョン設定をやったら、解決した。

設定は、まず、編集のPrfferenceから、キットの設定画面を開く。Qtバージョンのタブで、追加をクリック。ここでは、Qt5とQt6の2つのバージョンが使えるようになっているので、それぞれを追加する。追加の仕方は、追加のボタンを押すとファイルの選択になるので、Qtがインストールされているフォルダにある、binフォルダのqmakeを選択すると、そのバージョンが追加される。追加した後に、キットのタブで、Qtバージョンのドロップダウンリストに、それぞれのバージョンが選択できるようになるので、必要なバージョンを選べばよい。これで、キットがないというエラーは消えた。

 ただし、上記以外の方オフでインストールした場合は、この方法は役立たない。

ピコをudevを制御して区別する

 システムで、dshot信号を作るのをpicoでやらせていた。UARTの使用の関係で、pico1台で、2つのモータに信号を送っていたので、2つのpicoを使っていた。それまでは、pico二信号を送って、あなたはどちらのpicoですかと問い合わせして、その答えを聞いて /dev/t...