あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

コミックマーケット99 こくだランドのおしながき

Raspberry Pi Advent Calendar 15日目です。12日目〜14日目にご参加くださった方々、本当にありがとうございました!あしゅりーおじさんの餌やりシステムは私も作りたい……。

adventar.org

コミケの告知

ネタ薄めっぽい感もありますが、コミケの告知です。コミックマーケット99 2日目(12/31)の東5ホール "テ"-23a「こくだランド」にて出店します。

f:id:Akkiesoft:20211215100521j:plain

新刊はコピー誌「あっきぃのラズピッピいじり Petit-3」です。価格は100円ですが、単品購入不可とさせてください。既刊もしくはグッズいずれか1つと合わせて購入ください。電子版は後日発行予定です。内容については、ブログでも人気だった節電ネタとCM4の記事をアップデートor加筆修正したものを収録しています。頒布予定数は18部です。表紙用の紙が20枚だったので。表紙の印刷だけは終わったー。

f:id:Akkiesoft:20211215104751j:plain

自作キーボード基板「TinyPicoKey」もネタ的に頒布します。ロープロファイルのピンヘッダ(TinyPicoKey用)・ピンソケット(Tiny2040用)が付属するほうは300円、基板単品は200円です。こちらも10枚程度と少数なのでお早めに。

f:id:Akkiesoft:20211215104720j:plain

エアコミケでほぼ全く売れなかったEjectのうすい本も持ち込みます。コピー誌はこれと合わせ買いしてもらえるとかなり嬉しいです。ラズピッピいじり4・5も歓迎。まとめ本のEJECTOは重いのでごく少数を持ち込み予定です。麦子アクキーは100円プライスダウンの500円に改定です。

支払い方法に交通ICを導入します

しばらく休眠状態だったSquareアカウントを叩き起こして審査を通すことに成功したので、クレジットカード・交通IC各種・iDの支払いが可能になりました(JCBカードは審査中)。現金についてももちろん対応いたします。100円硬貨払いの人はコイン投入機を使って遊べます。

購入はタッチパネルを使ってえらぶ方式をやってみようとしていますが、当日はわたしが面倒になっている可能性もあります(やらねば……)。

akkiesoft.hatenablog.jp

気をつけてきてね

新型コロナウイルス新株の状況がまだ読みにくいところですが、開催中止にならない限りは一応参加予定です。体調などに気をつけておこしください。

Raspberry Pi 4 EEPROMの今年のアップデートを振り返る

11日目です。明日からはついに私以外の方が書いてくれるので、数日はコミケの作業とかラズピッピの裏方仕事に集中できそうです。

adventar.org

Raspberry Pi 4 EEPROMとは

Raspberry Pi 4 EEPROMは、PCでいうBIOS的なもので、起動に関するハードウェア制御のプログラムと、起動に関する設定がここに収められています。Pi 4以外のモデルではbootcode.binがその役割を担っています。

www.raspberrypi.com

Pi 4 EEPROMは、Raspberry Pi OSを使用していれば、OSのアップデート時に最新のPi 4 EEPROMイメージが収録されたパッケージがインストールされて、次回起動時に適用されるようになっているため、普段の使い方では意識する必要はありません。ちなみに、USB3.0ハブであるVL805チップのファームウェアもここでついでに管理されています。

Pi 4リリース以降、Pi 4 EEPROMのアップデートによって、発熱の改善や、PXEブートやUSB MSDブートの昨日追加、OS起動前に診断画面が表示されるようになるなどの改善がされてきました。

3つのリリース形態

Pi 4 EEPROMはBeta、Stable、Criticalの3つにリリース形態が分かれており、Betaは最新の機能をすぐにでも試したい物好き向け、StableはCriticalリリースは待てないけど新しい機能を使いたい人向け、Criticalは工場で生産時に書き込まれる超安定版で、先述のOSアップデート後の起動時に自動適用されるのもデフォルトではこのCriticalリリースです。

最新のCriticalリリースは2021-04-29版で、一つ前のリリースから1ヶ月しかたっていませんが、Pi400のEthernetの安定化のための改善が含まれています。

自動適用されるリリースを変更するには、raspi-configコマンドで「Advanced Options」→「Bootloader Version」を選択して、 Latest(== Stable)もしくはDefault(== Critical)を選択します。Betaがないのは……そういうことです。設定ファイルを手で書き換えれば適用できますが、Betaは自動適用にせず、必要に応じて手動で適用したほうが無難です。

EEPROMのリリースノート

EEPROMはGitHubで公開されており、リリースノートもここで確認できます。わたしは自宅サーバーでRSS化するスクリプトを置いていて、RSSリーダーで更新を追っています。

github.com

2021年のアップデートを見ていく

では、ベータやStableレベルで今年のアップデートを追ってみます。

2021-01-16版(BetaとStableの同時リリース)では、Pi 4のRev1.1で起きていたらしいSDの電圧設定のミスが修正されています。このように、Pi 4でもリビジョン単位での修正が入ることがあります。なお、Rev1.1は技適マークが入る前のリビジョンなので、待てずに海外から買ってしまった人たちしか持っていないはずです。同様に、2021-03-18版(Beta)ではRev1.1〜1.3で再起動に失敗することがある問題が修正されています。

2021-03-04版(Beta)ではNVMeブート機能が追加されました。これはPi 4ではなくCompute Module 4向けの対応です。 Compute Module 4ではVL805が搭載されない代わりにPCIeが自由に使えるため、NVMeブートを有効にした上でNVMe SSDを搭載すれば、爆速ストレージ環境を構築できるようになりました。この機能は最新のCriticalリリースには含まれていませんが、2021-07-07版でStableに昇格しています。WaveShareのIOボードを使うとPi 4サイズでNVMe SSDが使えて最強です。2230サイズのSSDヤフオクとかで適当に入手できます。

akkiesoft.hatenablog.jp

2021-06-11版(Beta)では、USB MSDブート時のディレイオプションが追加されています。USBブートはSSDUSBメモリに限らず、HDDブートも可能なので、例えばスピンアップしている間にタイム・アウトしてしまうなどの場合には、ディレイオプションを使って少し待つなどの対策が取れるようになりました。

2021-09-23版(Beta)は、ファイルシステム周りの改善に着手したようで、パフォーマンス改善によって起動時間の短縮したとのことです。2021-10-04版(Beta)ではGPT FAT16パーティションのサポートも追加されています。これはあまり意識することはないような気もしますが。。また、ここでもMSDブートのSCSIコマンドタイムアウト値が調整されています。

2021-10-27版(Beta)でセキュアブート対応が追加されています。産業の顧客向けに用意されたベータ機能とのことで、普通のユーザーは特に気にする必要はないようですが、必要な方はウォッチの価値はあるかもしれません。ベータを有効にするための詳細な情報はusbbootリポジトリに解説があるようです。

github.com

2021-11-22版(Beta)ではSabrent Rocket Nano というNVMe SSDの相性問題への対応が入ったようです。日本でもふつうに買えるブランドのSSDのようなので、もし持っていてうまく動かんかったという方がいればこれで治るようです後述の最新のStableにももう含まれています。

最後に、最新のStableリリースである2021-11-29版です。Beta扱いのセキュアブートを含め、9月からの変更がひととおり含まれているので、気になる機能があった場合はこのバージョンを適用して試すと良いでしょう。

自分のPi4 EEPROMイメージのバージョンを知るには

Raspberry Pi OS上からrpi-eeprom-updateをオプション無しで実行すると、現在のバージョンが確認できます。

pi@usbpi32:~$ rpi-eeprom-update
BOOTLOADER: up to date
   CURRENT: 2021年  7月  6日 火曜日 10:44:53 UTC (1625568293)
    LATEST: 2021年  7月  6日 火曜日 10:44:53 UTC (1625568293)
   RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: version unknown. Try sudo rpi-eeprom-update
   CURRENT: 
    LATEST: 

あるいは、MicroSDカードはUSB MSDを接続せずにHDMIだけつないだ状態で起動すると、診断画面が表示されて、そこでバージョンを確認することもできます。診断画面が出ない人はかなり古いので、アップデートして診断画面を見られるようにしておくと良いでしょう。

UbuntuとかFedoraとか、とにかくRaspberry Pi OS使ってないひとは、おそらくEEPROM更新がサードパーティディストリビューションに入っていない可能性がある(逆にわたしがRaspberry Pi OSしか触ってないのでわかってないです。詳しい人がいればぜひ。)ので、たまに最新のRaspberry Pi OSを用意して起動してあげると良いかもしれません。

なんかいろいろ変わってるでしょ

Pi 4 EEPROMが導入されたことにより、ハードウェア近辺やブート周りの変更が柔軟に対応できるようになったようで、リリースから2年たっても新機能やサポートが追加され続けています。いろいろなデバイスからのブート対応が落ち着いたので出揃ったのかなと思っていたら、パーティションファイルシステムの改善や産業向けのセキュアブートまで入り始めたので、活発だなあという印象があります。

リリースノートに変更があって面白い変更があった時には今回のブログみたいなひとくちメモをMastodonに投稿しているので、よかったらそちらも見てみてください。あー、ハッシュタグでもつければよかったなと今更思うなど……。他の言及も多々ありますがざっくりは↓のログからたどれます。

notestock.osa-p.net

Raspberry Pi Picoで1-Wireの温度センサーを使いつつZabbixに送りつける

10日目です。今年のAdvent CalendarはPicoとCircuitPythonを擦りすぎな気がしていてアレ。

adventar.org

水温センサーもPicoとCircuitPythonで動かしてみる

先日Pimoroniから着弾したDS18B20の水温計型センサーは、なんとなく室内で飼育中の稚魚バケツで使いたいなあと思っているところですが、いつもどおりRaspberry Piでやるのもなんなので、これもPicoでやってみます。

DS18B20組み立て

DS18B20は水温計のかたちでも、4.7KΩの抵抗が必要です。そもそも、ケーブルの先端がワイヤーぶった切り状態なので、ピンヘッダなりピンソケットの取り付けも必要なので案外手間です。が、まあ見てなさい。こうじゃ!

f:id:Akkiesoft:20211209005614j:plain

ちくしょう!だいなしにしやがった!お前はいつもそうだ。お前はいつもうろ覚えでぶっつけ本番で作って失敗する。

f:id:Akkiesoft:20211209005640p:plain

誰もお前を愛さない。

f:id:Akkiesoft:20211209005724p:plain

正しい配線はこちらです。

f:id:Akkiesoft:20211209005745j:plain

あっ、こないだの有線LANを流用したろw

温度センサーだけつないで取得して終わるのは面白くないので、ネットワークと絡めたいです。先日遊んだW5500有線LANモジュールを片付けずに残してあったので、これにセンサーを付け足して、Zabbixにでも送りつけられるようにしてみましょう。

akkiesoft.hatenablog.jp

センサーを空いているGP6に配線しました。

f:id:Akkiesoft:20211209010052j:plain

いや、もっとだ……。適当なOLEDモジュールもぶっ刺して、IPアドレスと温度も見られるようにしよう。などと欲張った結果、ジャンパーケーブルが不足したので一本だけメチャクチャな配線ができてしまいましたが、まあいいでしょう。I2CのSDAとSCLをそれぞれGP4とGP5に配線しました。これでTiny2040のデジタル入出力GPIOは全部使い切りました。いいぞ。

f:id:Akkiesoft:20211209010318j:plain

というわけで、コード的にはこんな内容のものを作りました。

  • ネットワーク接続
  • 1-Wire初期化
  • OLEDディスプレイ初期化
  • IPアドレス表示
  • 無限ループで
    • 毎秒温度を取得
    • Zabbixサーバーのアドレス変数にIPアドレスがあったら、60秒に1回温度のデータをZabbixに送りつける
    • 温度をOLEDに表示

出来上がったコードはこちらです。先日のTOTP表示機もそうでしたが、ディスプレイ周りがコードの量をふくらませてしまう感じがあります。

github.com

Zabbixにデータを送りつけるコードは、以前PicoWirelessPackで送ったときのものが流用できると思っていたのですが、残念ながらあちらはMicroPythonかつPicoWirelessPackのライブラリでネットワーク通信をしていたので、socketライブラリを使って一部書き直しをしました。結果的には書き直したあとのが短くできました。どちらにせよ、MicroPythonとCircuitPythonの両方でZabbixにデータを送るやつができたのでヨシということで。

akkiesoft.hatenablog.jp

Zabbix側の設定

Zabbix側では、適当なホスト(スクリプトで「pico-w5500」と指定したのでそうする)を作り、作ったホストにZabbixトラッパータイプのアイテムを「ds18b20.temp」という名前で作っておきます。

f:id:Akkiesoft:20211209012158j:plain

あとはスクリプトを実行して、データが送られてくることを確認できればOKです。

f:id:Akkiesoft:20211209012317j:plain

まとめ

水温センサーのおかげで、前回作ったけど特に何もやらなかったW5500有線LANモジュールがそれっぽいことをする役立ちそうな物体に変身しました。たぶん。

CircuitPythonはAdafruitがかなり作り込んでくれているおかげで、何でもできるし何でもすでに用意されているので、サクサクやりたいことができてしまう。プログラミングと言うよりパズルっぽいレベル。本当にありがたいですね。

さて、実際に水温計を稚魚バケツに放り込んだ様子はこちらです。日中は20度あるっぽいですね。べランドにいる親の水槽と比べるとぬくぬくしてやがるな……(?)

f:id:Akkiesoft:20211209110623j:plain

Raspberry Pi PicoでTOTP表示機をつくりたい (2)

9日目です。

adventar.org

RTCモジュールが来た

スイッチサイエンスで注文したRTCモジュールが来ました。電池交換式なので、電池が切れても安心です。サイズはCR1220という、CR2032と比べて聞き慣れない型番ですが、100円ショップで買える型番です。WaveShare製CM4向けIOボードのときに買ったやつの余りがあったので買いに行かずにすみました。

www.switch-science.com

f:id:Akkiesoft:20211208235952j:plain

ちなみに、となりのやつはスマホとかの画面にタッチできるらしいなにかです。面白そうだったので買ってみました。これもそのうちにネタになります。たぶん。

RTCモジュールの取り付け

このDS3231は3.3Vで動作するため、Raspberry Piの1,3,5,7,9ピンにつながればOKです。よって、Breakout Gardenのエクステンダーを使えばこんな感じに接続できます。

f:id:Akkiesoft:20211209000020j:plain

なんか……微妙くなってしまった……。ディスプレイと水平に立っていて欲しい感がありますね。というわけで、Breakout Gardenのモジュールを買うとついてくるヘッダーとソケットを使って90度曲げるやつを作りました。

f:id:Akkiesoft:20211209000048j:plain

f:id:Akkiesoft:20211209000226j:plain

こんな感じ。収まりは良い感じがします。が、RTCモジュールが目立っちゃう感じがしなくもないですね。

f:id:Akkiesoft:20211209000108j:plain

反転させてるとこう。こちらだとバランスが不安定な感じですが、ディスプレイが一番前に来るので良さそうです。これでいってみましょう。

f:id:Akkiesoft:20211209000241j:plain

コード入力用ボタンをまとめる

Breakout Gardenのエクステンダーを2つも使うのはもったいないので、さきほどの90度曲げるやつのコーナー部分にむりやりピンを生やしてしまいました。アア……だいぶバカっぽいビジュアルになった気がする……。

f:id:Akkiesoft:20211209000310j:plain

物理的な最終形態はこうなりました。禍々しい。

f:id:Akkiesoft:20211209000319j:plain

RTCモジュールの時刻合わせ

最初の時刻設定は、Circuitpythonにシリアル接続をして、REPLから設定すると良いでしょう。コードが実行中ならCtrl+Cを押せば、REPLの「>>> 」が表示されるので、表示されたら以下のコードを入力して時刻を合わせます。設定後はCtrl+Dでcode.pyの実行に戻ります。

import board
import busio
import time
import adafruit_ds3231

i2c = busio.I2C(board.GP5, board.GP4)
ds3231 = adafruit_ds3231.DS3231(i2c)
ds3231.datetime = time.struct_time((2021, 12, 9, 0, 15, 23, 0, -1, -1))
# structure_timeの最後の0, -1, -1は曜日、週数、夏時間なのでこのままでOK

コードの実装

RTCモジュールの部分は、RTC3231用のライブラリがあるのでそれを使って終わりです。

import board
import busio
import rtc
import adafruit_ds3231

i2c = busio.I2C(board.GP5, board.GP4)
ds3231 = adafruit_ds3231.DS3231(i2c)
rtc.set_time_source(ds3231)

ボタンを押したときの処理は、Adafruitのオリジナルのコードとこちらでは違いそうだったので、普通のGPIO入力検知を使って実装しました。

from digitalio import DigitalInOut, Direction, Pull

code_sent = False

btn = DigitalInOut(board.GP3)
btn.direction = Direction.INPUT
btn.pull = Pull.UP

while True:
    if not btn.value:
        if not code_sent:
            code_sent = True
            # 抜粋なので動かないけど実際にはここで
            # TOTPの数字をPCに打ち込んでいる
            # keyboard_layout.write(totp_code)
    else:
        code_sent = False

動作のようす

入力ボックス(画像ではテキストエディター)にフォーカスを合わせて、TOTP表示機のボタンを押せば、表示されているコードがPCに打ち込まれます。オリジナルにはあったEnterキーの送出は省略してしまいましたが、含めれば実際の運用時にはより便利そうです。

f:id:Akkiesoft:20211209000758g:plain

まとめ

Adafruitの作例ベースで、Raspberry Pi PicoとBreakout GardenのLCDを使ったちょいオシャレなTOTP表示機&入力装置ができました。

ソースコードはこちらに放り投げたので興味のある方はどうぞ。

https://github.com/Akkiesoft/akkiesoft-pico/tree/main/CircuitPython/totp-displaygithub.com

あと、これを言うとぶち壊しな感じなんですが、時刻==TOTPがあってる前提で言えば、表示部分なくてもいいかなあ……?という気持ちにちょっとなりました。

MagPi Issue 111に掲載されたインタビューの日本語原稿

Raspberry Pi Advent Calendar 2021の8日目です。

adventar.org

10月末に発行されたMagPi Issue 111で掲載された私のインタビュー記事で、英訳して貰う前の日本語の原稿を上げておきます。書いたけどカットされた部分は省略しています。

magpi.raspberrypi.com

上のページからPDF版がダウンロードできるので、テキストと合わせて見てみてもらえると幸いです。また、写真は目次のページにマジョカアイリスLCDの画像が掲載されています。

f:id:Akkiesoft:20211208000608j:plain

もしくは、Web再編集版もあるのでお好きな方で〜。

magpi.raspberrypi.com

冒頭

Raspberry Piを触るまでは電子工作が全くできなかったので、PCのデバイスを改造していました。はんだ付けはできたので、ジャンクのマウスにペンを突き刺してペンタブレットの代わりになりそうな物体を作っていました。

2009年からは、当時飼っていたハムスターを出張先からお世話するための工作を、光学ドライブを作って作り始めました。2009年はまだIoTという言葉はまだあまり知られていませんでしたが、光学ドライブのトレイの動きと、ダンボールやバネなどを組み合わせて、ハムスターにえさを与えたり、エアコンの電源ボタンをトレイで小突いて操作したりしていました。今ならRaspberry Piとサーバーモーター・赤外線LEDでかんたんかつスマートに実装できてしまうので、とても良い時代になりました。

Raspberry Pi をいつ知りましたか?

Twitterのログをさがしたところ、2012年3月12日にRSコンポーネンツのページでRaspberry Piを見つけていました。当時は光学ドライブを使ったIoTをイベントでデモするために、Linuxを入れたネットブックを使っていたので、Raspberry Piを使えば非常にコンパクトにできるだろうと思いました。実際にRaspberry Piに置き換えたあとは、そのコンパクトさを活かしてヘルメットにくくりつけてウェアラブル光学ドライブを作ったり、Raspberry Pi光学ドライブに内蔵したりできました。

これまでに作ったプロジェクトでお気に入りのものはありますか?

プラレールという日本の子供向けの鉄道のおもちゃにPiZeroとカメラを搭載して、スマートフォンから映像を見ながら操作できるようにしたプロジェクトがお気に入りです。モータードライバーとリポバッテリーを内蔵して、車体はPiZeroとカメラを貼り付けています。

モータードライバーを使って加速と減速を制御したり、WebUIのデザインを工夫したところが楽しかったです。

日本のメイカーコミュニティとUS/UKのメイカーコミュニティの違いについてなにか気づくことはありますか?

海外のコミュニティは(日本のコミュニティも実は)それほど詳しくはないですが、海外のメイカーイベントの様子を見ると、日本では法律や場所の広さの問題でできないようなスケールの大きいものもよく作られている印象がありました。日本は家が広くないので大きなものが作りにくいせいかもしれませんね。

日本は電源や電波に関する独自の認証制度があり、海外の製品が日本で使えるようになるまでに時間がかかるか、そもそも製造メーカーが認証を取得しないために日本で使用できないことがよく起こるため、アメリカ(FCC)やイギリス(EC?)などと比べると、日本は特に電波を扱うプロジェクトの自由度が低い(作品が出てきにくい)かもしれません。*1

ジャンク部品を手にしたときのコミュニティの団結感はすごいと思っています。2021年の初め頃には、子供向けの玩具に内蔵されていた640x48ピクセルLCDを取り出して解析するのがTwitterにいる日本のメイカーで流行しましたが、知り合いでもそうでなくても、TwitterGithubに情報を持ち寄って、数週間で自由に制御できるようになる様子はすごいなと思いました。もちろん今ではRaspberry Piでも使えます。写真は、私も購入してコミュニティの情報を参考に動かしたものです。

あなたの活動はどこで見られますか?

今はCOVID-19の影響でオフラインイベントが開催されていませんが、日本の各地で開催していたオープンソースカンファレンス( https://ospn.jp/ )では、Japanese Raspberry Pi Users GroupとしてRaspberry Piの作例を紹介する展示をしたり、セッションでRaspberry Piの情報を発信したりしていました。また、日本のMaker Faireでも展示をしていました。

オンラインでは、私のブログやMastodonでプロジェクトの紹介をしたり、制作過程を投稿したりしています。

*1:これがPiZero2リリース記念号に載ったのは、やっちまった感あるよな!🤣