Picoprobeを導入した話

Raspberry Pi picoはもう一台、別のpicoのプローブとして使用することができる。この仕組みはPicoprobeと呼ばれていたけど現在はDebugprobe on picoと呼ばれるようになったらしい。
github.com

オープンソースのデバッガツールOpenocdを利用する必要があるが、この導入はmacを開発に使う場合だと、brewでインストールする方法とラズベリーパイ財団が公表するgithubリポジトリを利用する方法がある。Raspberry pi picoのマニュアルではbrewを使えと書いてあるが、今回は財団の公開するリポジトリを使用した。
github.com

このリポジトリはrp2040チップに関するデバッグに必要な情報が書かれているopenocd/target/rp2040.cfgというファイルとopenocd/interface/cmsis-dap.cfgというファイルが含まれている。念の為これらの設定ファイルの財団版とbrew版でdiffを取ってみたが、本質的な差はなかった(rp2040のほうはコメントで、半角スペースがアンダースコアに変わっているという一文字の違いがあったのみ。)
結果から振り返ると財団版を選択したことで少し無駄な手間が増した。私の使用しているM3 MacではネイティブでのOpenocdビルドができずld: symbol(s) not found for architecture arm64とかいうエラーが出てしまう。なのでRosettaという仕組みを利用してx86_64向けのソースをビルドする必要があるらしい。ターミナルを一旦終了し、ターミナルの「情報を見る」→「Rosettaを使用して開く」にチェックをつけて再度起動。./configure以下ビルドを行うことで解決できる。brew版ではこんな手間は発生しないはずなので、事前に調べてから取り掛かれば良かったかもしれない。
またOpenocdをインストール後のテストで、ターミナル上からopenocdでpicoに接続しようとしたのだけどError: CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.とかいうエラーが出続けた。ライブラリ周りとか、USBのtype-Cの変換アダプタとか色々チェックしたのだけど、結局openocdの実行時に-c "adapter speed 100"というスピード指定オプションをつけたらうまく通信ができた。SWDの配線が、ツイストになっていないので(配線は10 cmもなく十分短いと思うのだけど)ノイズが乗ってしまっていたのかもしれない。


山を越えながらopenocdをインストールして、今回はVSCodeデバッグ環境として使ってみたかったので、VSCode拡張機能Cortex-Debugをインストールした。それから動作検証するバイナリファイルが置いてあるフォルダに.vscodeというフォルダを設置して、launch.jsonなるファイルを以下のように設定。(実際にはconfigFilesとsearchDirは絶対パスで通した。)

{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Pico Debug",
        "cwd": "${workspaceRoot}",
        "executable": "${workspaceRoot}/hello_dma.elf",
        "request": "launch",
        "type": "cortex-debug",
        "servertype": "openocd",
        "runToMain": true,
        "device": "RP2040",
        "configFiles": [
          "openocd/tcl/interface/cmsis-dap.cfg",
          "openocd/tcl/target/rp2040.cfg"
        ],
        "searchDir": [
            "openocd/tcl"
        ],
        "openOCDLaunchCommands": [
          "adapter speed 100"
        ],
        "svdFile": "${workspaceRoot}/.vscode/RP2040.svd"
      }
    ]
  }

こちらはそれほど悩むことなく環境構築できました。

PicoのPIO遊び

PIOを使うことで、MicroPythonでも厳密な波形を簡単に生成できる。やはりRaspberry Pi Picoは面白い。

例えばMicroPythonのGPIO制御で全速力でゼロイチを切り替えて矩形波を生成するプログラムを書いてみる。

import machine

led_onboard = machine.Pin(3, machine.Pin.OUT)

while True:
    led_onboard.value(0)
    led_onboard.value(1)

出力される波形はこんな感じ。

周波数は59 kHzしかでず、ジッタが2 μsほどある。用途によるが、たとえばGPIOピンを介したを使った通信・データ転送などには厳しいように思う。

PIOを利用した厳密なタイミング制御

これをPIOを使うと厳密なタイミング制御ができる。

import time
from rp2 import PIO, StateMachine, asm_pio
from machine import Pin

@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def rect_gen():
    wrap_target()
    set(pins, 1) [4]
    set(pins, 0) [4]
    wrap()

sm = rp2.StateMachine(0, rect_gen, freq=1_000_000, set_base=Pin(3))
sm.active(1)

while True:
    pass

1 MHzを10クロックのサイクルで繰り返している。

素晴らしい・・
出力周波数を上げてみよう。動作周波数をクロック周波数の125 MHzにして、ディレイを0にしてみる。

流石に矩形波という感じではなくなっている。寄生容量とプルダウン抵抗でLPFが形成されているせいか、使っているオシロのせいか分からんが波形が鈍っているが、確かに理論的な周波数がきっちり実現できていて素晴らしい。


なお、下のように出力ピンを複数化すると、1/2周期の矩形波を同時出力するのもお手のものである。

import time
from rp2 import PIO, StateMachine, asm_pio
from machine import Pin

@rp2.asm_pio(set_init=(rp2.PIO.OUT_LOW,)*2)
def rect_gen():
    wrap_target()
    set(pins, 0b00)
    set(pins, 0b01)
    set(pins, 0b10)
    set(pins, 0b11)
    wrap()

sm = rp2.StateMachine(0, rect_gen, freq=125_000_000, set_base=Pin(3))
sm.active(1)

while True:
    pass

遊びがいがある。

自宅の温湿度モニタシステムを飛躍的に発展させた話

背景

昔から自宅の環境をモニタリングしたいという欲求があり、温湿度センサを動かしたりして遊んでいた。
yanatsuba.hatenablog.com

その後引っ越ししたりして、複数の部屋の温度を取得するシステムを作りたいと思っていたのだけど、センサーへのワイヤリングが面倒臭いとか色々と思案しているだけで結局着手しないままであった。ところが最近良さげな商品を見つけて、また自宅の環境モニタを高度化したいと思いはじめた。
INKBIRDのBluetooth高精度温湿度計である。

単4乾電池2本を使い、それなりに広い温度レンジで動作可能なワイヤレスセンサ。これが2024年7月20日現在、なんと一つ1839円で買えると。はっきり言って激安なので、即三つ買った。しばらく使ってみたところ、とても良いものであったので追加で二つ注文した。


結果

問題はこのモジュールで取得したデータを、自由に読み出しし、解析に使える形で扱えるのかというところであるが、調べてみると下のような技術解説記事があり、ひとまず買って試してみようじゃないかと考えた。
qiita.com
3つのInkbirdモジュールを買って、基本的なところはこの記事に従ってシステムを構築してみることにして、理解はしていないが見よう見まねでやってみた。

  • Raspberry Pi 2B + Bluetoothアダプタを母機とする。
  • Pythonモジュール"Bluepy"でInkbirdと通信
  • 測定温湿度データを、オープンソースシステム監視ツールPrometheusへ送信
  • モニタリング指標可視化ツールGrafanaによるコンソール表示
  • 測定データはCSVでファイル保存もする。
  • 元記事にあったInfluxDBはひとまず利用しない

ところでこのやり方に至るまでのところで、いくつも試行錯誤があった。

  • Inkbirdの温湿度モジュールは内部に測定データをストアしていて、スマホアプリなどをして取得できる。初めはこのようなデータ取得スキームを想定していたが、今のところやり方がわからないので、crontabを利用した定期実行に頼っている。
  • 使い慣れたMini PCとWSLを使ってシステムを作ろうとしたが、WSLからBluetoothを操作するのは難しかったので、引き出しの奥にあったラズパイ引っ張り出して使用した。昔インストールしたRaspberry Pi OSが乗っていたのでこれをそのまま使用しようとしたが、bluepyが動かせなかった。`apt install`できるpythonが3.9までしかないのが原因かと思い、Python 3.12や3.13をソースからビルドしたりもしたのだが、そもそもlibstdc++6などが根こそぎ古いらしく、どうにも更新できない・・・ということで最新のRaspberry Pi OSをインストールし直したところ、すんなりインストール完了。
  • Prometheusに関する知識が皆無だったのでやや苦労した。というよりserviceのことをよくわかっていなかった。`--collector.textfile.directory`オプションで、外部モニタリング指標を読み込めるのだがこれがうまくいかない・・・Chat-GPTに相談して、Prometheusサービスに権限付与する必要があると教えてもらい、なんとか解決。
  • Prometheusがきちんと動くようになってからは簡単で、Grafanaの設定はかなり直感的だった。

Inkbirdは居間、寝室、物置部屋の三箇所においてデータ収集。ラズパイのIPにアクセスすると、Grafanaが提供するwebページの形でコンソール画面が提示される。この画面がカスタマイズできる上に表示範囲の変更などやりやすく、使いやすい。


まとめ

いいBluetoothモジュールが安く出現したので、夢見ていたような家中のマルチセンサーモニタリングが現実になった。モジュールが安いので、かなり色々な使い方ができる。モジュールを買い増しして、ベランダに設置したり冷蔵庫の庫内温度のデータもとってみたいと思っている。

Mac版Powerpointの数式入力

職場でMacbook Airの中古を譲ってもらった。私用では2016年版MBPを使っているため基本的な操作には全く戸惑うところはないのだが、Mac版Officeを使うのは初めてで戸惑った。飛行機の中で数式モードを使おうと思ったところ、`\mu`などと打ってもギリシャ文字が出ず混乱。太平洋の真ん中ではインターネットで検索することもできず、途方に暮れていた。
帰国後調べてみると、MicrosoftOfficeに関する設定ファイルなどを消せというQ&Aなどがヒットしたので試してみたが解決せず。


結局、バックスラッシュの入力ができておらず、エンマーク¥になっていたということであった。システムによっては¥で\を表現することも多いので気づかなかった。MacOSのシステム環境設定→キーボード→入力ソースの「日本語ーローマ字入力」で、入力モード:英字にチェックし、「"¥"キーで入力する文字」で「"\"(バックスラッシュ)」を選択。さらにキーボード一覧から英語を削除して設定完了。

新NISA枠を使うために特定口座の株式等を売却すべきか

はてなブックマークでこんな記事が話題になっていた。

dot.asahi.com

直感的にはNISA枠で課税運用した方が良いと思われる。この記事には面倒臭い数表が載っているが、こういう数表は読ませる気があるのかというくらいわかりづらく、もう少し一般的に見た方が却って行動原則が見えてきたりすることがよくあr。そう思っていたらコメント欄でそういう観点で計算をやってくれている人がいた。

新NISA「特定口座からお金を移すべきか」が一発でわかる早見表 | AERA dot. (アエラドット)

数値例でなく一般的に→ <a href="https://luke-randomwalker.hatenablog.com/entry/2023/06/30/220347" target="_blank" rel="noopener nofollow">https://luke-randomwalker.hatenablog.com/entry/2023/06/30/220347</a> なお、非課税期間が長い方が得なのでさっさと乗り換えるべき。(長期投資スタンスの人ならこの数年の株価上昇局面で含み損なんて無いはず。)

2023/11/20 15:40

こちらの方が記事本編よりずっと見通しが良いと思う。基本的にはこの記事で尽きているが、ここではさらなる納得のため、これを図示してみる。その結果がこちら。

これは、特定口座の株式を持ち続けた場合と、それを今すぐ売却し新NISAで買い直した場合の差額を、割合(%)で示したコンタープロットである。横軸は現在所有している株式の現在価格(買ったときの価格を1とする)で、縦軸は将来その株式を売却する場合の価格(現在の価格を1とする)で示したものである。目安のために横軸と縦軸の1の箇所に点線を引いた。これを見ると、高い確率で値上がりが見込める買い方においてどう行動するべきか一目瞭然ではなかろうか。
なお細かいことであるが、プロットの色区分の都合のため持ち続けても買い直しても同じ(数値が0%である)にもかかわらず、薄いブルーで表示されている部分があり注意が必要である。具体的には点線より左側の青領域である。

ゼロから作るOS

Interface誌の特集がRaspberry Pi Picoで動くOSを作るとのことで、買ってみた。Picoについてはこれまでに公式のSDKのexamplesなどをいじってみたものの、C言語に抵抗がありわかった感じがしなかったので、もう少し詳しくなりたいと思っていたところだ。そこに渡りに舟の特集だったのだが、御多分に漏れず環境構築から手こずった。


プログラム対象のPicoともう一台別のPicoを用意してOpenOCDでのデバッグが可能なのだけど、このOpenOCDをどうやってインストールするかという所からして、大いにてこずった。Picoの公式ドキュメントにはGitHubからダウンロードしてmakeせよと書いてあったがなぜか動かず、結局brew installした。またEclipse IDEを使用せよという話だけど、組み込みシステム用のアドオンをインストールできておらず設定画面で困ったり。IDEに頼らずまずコマンドラインからコンパイラを叩いてみたのは、どういうオプションが必要かとか、Makefileのご利益とか、ちょっと勉強になった。
なんとか環境構築が完了したのだけど当然ここからも難儀している。著者の書いたコードは動くのだけど、中身がかなーりわからない。C言語にも不慣れだし、リンカスクリプトに至っては何を読んだら理解できるのかすらわからない。というわけでバシバシChatGPTに聞きながらコードを解読している。ChatGPTというのはコード読みに関しては本当に頼りになる存在で、かなり心強い。下は関数ポインタの配列宣言について細かく説明をお願いしてみたところ。

無尽蔵の忍耐力を持った知識豊富な先生が専属でついてくれているようなもので、非常に助かる。(もちろん100 %信用できないところはあるが。)

実力不足を感じながらやっているが、なかなか面白くやっております。

TeXの表示

下のような記事を見つけたので、このブログでも設定してみた。はてなTeX記法は使いにくかったので、ありがたい。
テスト。単関数の積分


\begin{align}
\int_{S} f(x)\mu{}(dx) = \sum_{j = 1}^{n} a_{j} \mu(B_{j})
\end{align}

kennz0.hatenablog.com