ラズパイPico W(Thonnyで)

ラズパイpicoを動かす環境には、

・Arduino IDE(Arduino言語)

・VScodeにPlatformIO(C言語)

gccを使うので、Arduino/M5StackのようなPlatformIOとの組み合わせでは無いですね。

https://qiita.com/n0bisuke/items/f4ff96bd74932c8def77

・Thonny(MicroPython)

が有力どころですが、以下を参考にThonny(4.1.2)、MacBook Airで動かしてみます。

https://krr910183393.wordpress.com/2021/02/15/raspberry-pi-pico-micropython-thonny-python-ide/

Thonnyのインストールは完了している前提で、

① シリアルポートを選択します

Thonnyの右下でインタプリタをインストールして、ファイルから切り離された状態で以下のように見えるはずなのでシリアルポートでラズパイpicoを選択する。シェル画面端のように接続状態になります。

Note : この時にはUSBシリアルで見えていなければならないので外部ファイルモードでは選択できません。Thonnyでは外部ファイルモードを使うのはMicroPythonのUF2ファイルを書き込むときだけです。

このように接続されています。

② サンプルコードを入力します(PICO本体搭載LEDの0.5秒毎ブリンク)

③ 緑矢印をクリックすると起動、停止させるには赤stopアイコンをクリック

ただしこの状態ではpicoにテンポラリーに保存されているだけのようなので、電源オンで自動起動させるためには次のステップが必要

④ 電源オンで自動起動させるには、『ファイル』『名前をつけて保存』でRaspberry Pi Picoにmain.pyの名前で保存すれば自動起動

ただしパソコンのUSB経由でファイルに見えている状態では、そちらが優先されます。コードの書き換え考えたら妥当な仕様ですが。

P.S. (2023/9/5)

Thonny(MicroPython)の実行環境からArduino IDEを使ってしまうと、再度Thonnyを使うときには再度MicroPythonの実行環境をインストールしないといけません。

 

admin

ラズパイPico W(Arduino IDEで)

タイトル通りですが、picoをArduino IDEで使ってみました。

参考は以下のサイトですが、微妙にUIは異なるので想像力を駆使してセットアップ。

https://logikara.blog/raspi-pico-arduinoide/#mokuji_4

ポイントはボード追加とシリアルポートの設定だろうと思います。ボードはリンクの通りのURLから設定すれば良くて、シリアルポートの設定はUF2 Boardを選択します。

白ボタン押しUSBコネクタ挿入で外部ファイルと認識できれば、サンプルプログラムをシリアルで送信、送信完了すると切り離されてプログラムが自動スタートします。

 

Thonnyでうまく点灯しなかったLEDの動作が確認できました。

 

admin

 

ラズパイPico W

今までどう使うかイマイチだったが、Rustで動かそうと思って初めて買ってみた。ピンヘッダーは付いていないから半田付けしてGroveアダプタに差し込んだところ。

動作確認はオンボードのLEDがRustでうまく点灯しないから、USBシリアル経由でメッセージを繰り返し送信するCのサンプルプログラムをビルドしてあるものを書き込んで確認。ビルドファイルがあるので、そのままPICOに書き込めば動くようになっている。

https://nkon.github.io/RasPico-Rust/

の情報から、

https://github.com/raspberrypi/pico-examples

のhello_usbからuf2ファイルをダウンロードしています。

こんな感じでメッセージを繰り返し送信します。

P.S. (2023/8/29)

Rustでうまく点灯できないのは、LEDのポートがbaisc PicoからPico Wで変わっているからでした。

 

admin

 

ようやく買えるようになったラズパイ

と言っても、まだzero wだけ(@switch science)でしたが早速購入。

ヘッダーピン無しなので、手持ちのGPIOコネクタをジグで打ち込んで準備完了。

最初はzero wのあり物のイメージカード突っ込んで動作確認、その後ラズパイimagerでヘッドレスイメージ書き込んで動作確認。

https://isehara-3lv.sakura.ne.jp/blog/2022/11/14/raspberry-pi-imager(最近変わった?)/

ロワーケースだけでも3Dプリンタで準備しようと思ったけど、この時期フィラメントの脱湿から始めないといけないので地べた置き。まだ使い道は決まっていないし、そもそもフラッシュカードが32GBではバックアップに時間かかりすぎるからオーダー中の8GBカード到着を待って運用用のイメージを焼き込む予定。

 

admin

ラズパイの需給も結構緩んで来たようです

スイッチサイエンスでraspberry pi zero wがオーダーできる状態だったので一枚オーダーしました。元々CPUは数十nmルールなので、競合するユーザーが多そうでコンシュマー用は優先度が下げられていたようですが、2023年の下期には改善と言われていたのでその通りでしょうか。

追加で買えるようになったので、ラズパイ1Bで動かしていたmifareカード/chatアプリをCO2センサーデータロガーで使っているラズパイzero wに移行しました。

sqlite3は入っていなかったので、それだけはインストールして、あとはDocker上のアプリディレクトリを丸ごと転送でそのまま動作しました。1Bとzero wでOSも同じ32bitだから当然と言えば当然ですが。USBはzero wはmicro-Bなのでtype-Aに変換が必要ですが、それは手持ち品を流用。

 

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でラズパイのGolang build環境を作る

https://isehara-3lv.sakura.ne.jp/blog/2023/04/19/golangアプリは単純にクロスビルドしても動かない(db/

の対応としてとりあえずラズパイ自身でbuildさせましたが、ラズパイModel B+でbuildに必要な時間は、実行ファイルのタイムスタンプからおよそ二時間。これでは実用的ではないので代替え方法を考えるけれども、一番楽そうなのはDockerを使うことでしょう。

自分の環境を汚染させないとか、イメージの配布とかではなく、ラズパイの環境を作るための使用(DockerはM1 Macにインストール、ターゲットのコンテナはraspbian32 OS)です。

多少以前の記事になりますが、以下を参考に実行。raspbianイメージとかは最新版、と言っても2020年度が最新ですが。

https://www.koatech.info/blog/raspbian-on-docker/

・イメージ取得と作成

% wget http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_armhf/root.tar.xz

% docker image import ./root.tar.xz raspbian-stretch-lite:2020

・以下のコマンドでwarningが出る、とりあえずは無視して大丈夫な様子(QEMUは元々Intel CPU用だからか、Apple siliconでも今のところ何とかなってるけど)

% docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

exec /register: exec format error

・コンテナ作成と起動(名前指定)

% docker run -it --name rasp32 raspbian-stretch-lite:2020 bash

・作成しているコンテナを起動するなら

% docker exec -it rasp32 bash

・Golang install

# wget https://golang.org/dl/go1.20.1.linux-armv6l.tar.gz

# sudo tar -C /usr/local -xzf go1.20.1.linux-armv6l.tar.gz

# /usr/local/go/bin/go version (パスが通っていない状態)

・Dockerのコンテナからファイルをクライアントにコピー(例)

% docker cp 21f2c6ce6eb8:/home/pi/hello .

・ディレクトリ指定すればその中全部をコピー(クライアントからコンテナへ)

% docker cp myfare 21f2c6ce6eb8:/home/pi/

コンテナ上のMacの該当ディレクトリを丸ごとコピー(gomodなど含めて)してきてbuild、できた実行ファイルをscpでラズパイに転送して起動するとちゃんと実行できました。実行ファイルの動作確認、最初は定番のハローワールドで確認しています。

エミュレーション(QEMU)なので、速度はMacでbuildするのに比較すると遥かに遅い、それでも二分ぐらいで終わっているからやはりラズパイで実行するよりはほぼ百倍速いから実用的です。

実行ファイルのサイズが微妙に違うのはライブラリの版数違いか、main1のほうがコンテナでbuildしたもの。

コンテナ上のraspbian、

ラズパイのbuild環境としてはおそらくデフォルトだと思う。カスタマイズしたコンテナを作る時にDcokerfileを記述しておけば、再現性確保できます。

 

admin

/etc/rc.localからsystemdになってました

ラズパイでmyfareアプリを起動時に立ち上げしようと思ってrc.localに記述しても起動しません。実は最近のLinuxのバージョンではrc.localは単にipアドレスの表示をするだけになっていて、アプリの起動はsystemdを使えということのようです。しかしsystemdに設定したつもりでも起動するとエラーになります。実行ファイルと同じディレクトリに配置しているファイルが見つからないと言われます。

$ sudo systemctl status myfare.service
● myfare.service - myfare
     Loaded: loaded (/etc/systemd/system/myfare.service; enabled; vendor preset>
     Active: failed (Result: exit-code) since Wed 2023-04-19 11:57:00 BST; 9s a>
    Process: 1805 ExecStart=/home/pi/myfare/main (code=exited, status=1/FAILURE)
   Main PID: 1805 (code=exited, status=1/FAILURE)
        CPU: 121ms

Apr 19 11:57:00 rasp-b systemd[1]: Started myfare.
Apr 19 11:57:00 rasp-b main[1805]: open uid.json: no such file or directory

事例検索して行き着いたのが、WorkingDirectory設定。

[Unit]
Description=myfare

[Service]
WorkingDirectory=/home/pi/myfare/
Type=simple
ExecStart=/home/pi/myfare/main

[Install]
WantedBy = multi-user.target

つまりこれを指定しないと、実行ファイルからファイルを見つけられなくなります。

systemdの記述方法はネットにたくさんありますが、ここに行き着くのに一時間以上。大本のマニュアル見た方が早かったかと思いますが、ともかくも以下の一連のコマンドの手順で自動起動できました。


サービスファイルを記述して、daemonのリロード
$ sudo systemctl daemon-reload
起動確認
$ sudo systemctl start myfare.service
正常に起動していることを確認
$ sudo systemctl status myfare.service
起動時にサービスを有効化
$ sudo systemctl enable myfare.service

 

admin