あっきぃ日誌

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

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リリース記念号に載ったのは、やっちまった感あるよな!🤣

Pimoroniからおもちゃ着弾!マイクロスコープ楽しぇぇぇッ〜〜!

7日目です。昨日の記事がはてブでバズったのでちょっと良かったですが、参加者は増えておらず。さておき、明日の記事はもうできてるので、今日を乗り越えたら少しゆったりできますね……!

adventar.org

おもちゃ着弾

Pimoroniのブラックフライデーでポチっていたブツが着弾しました。ネタが切れ書けていたのでこれは助かります。数日は生き延びれます(?????)

f:id:Akkiesoft:20211207002513j:plain

1日目の記事でも紹介していますが、今回の目玉はマイクロスコープと血中酸素センサーの2つです。リピートのDS18B20水温センサーも、Picoで使うとかできるとたのしいかなーと思ってますがやり方は軽く調査したきりです。

今日はマイクロスコープレンズ

マイクロスコープレンズは、Raspberry PiのHQカメラで使えるレンズです。ラズピッピ用とは言えレンズは増やすまいと思っていましたが、ついに増やしてしまったので、C/CSマウントレンズ沼につま先がハマった感じがあります。

Microscope lens for the Raspberry Pi High Quality Camera - 0.12-1.8x – Pimoroni

早速取り付け。うーんゴツい。いいぞ。

f:id:Akkiesoft:20211207002920j:plain

Pimoroniの製品ページにもあるとおり、基板を見たりするのに便利なブツなので、基板を見てみましょう。

f:id:Akkiesoft:20211207003037j:plain

くらい……。まあ、製品ページに、UnicornHATかなんかで照らすとええでとあったので、何かしらの光源は必要っぽそうです。

続けて、以前買ったジャンクラズピッピの修理箇所。これもLEDライトは当ててみたものの暗い画像になってしまいましたが、画像編集でガッツリ明るくしてみました。こうしてみると、修理した箇所以外もパターンにうっすら傷がありそうですね。多分根本的にはメインの損傷箇所の下のレイヤーがやられていると思っていますが。

f:id:Akkiesoft:20211207003305j:plain

なんでも超どアップで見られるので楽しい……!!メダカとかもこれで観察できたら楽しそうですが、泳いでるところを捉えるのはさすがに難しいかな……。

あと、今回はスタンドを買わなかったんですが、手持ちだと流石に辛いことがもうわかったので、やはりスタンドもほしいですね。多分AliExpressでもっと安く買えるだろうなあと思って探してみたら、やはりお安いスタンドが色々出てきました。スタンドはAliExpressでポチってみましょうかね〜。

HQCamの近況

ネタが薄いので普段のHQCamの使いかたを紹介します。。天気のいい日にベランダに出してメダカの水槽をストリーミング配信しています。電源ケーブルを通す都合で窓を少し開けないといけないので、冬はちょっとやりたくないかもです。

f:id:Akkiesoft:20211207004454j:plain

PiZero一体型になっているのは、10月くらいにネットから拾ってきたプレートの3Dモデルを3Dプリンターで作成して組み立てたものです。

akkiesoft.hatenablog.jp

メダカは結構恥ずかしがり屋なので、直接覗き込むと隠れてしまうのですが、ストリーミングならゆうゆうと泳ぐ姿を眺めることができます。すぐちかくにいるのに、なんて寂しいことだ……。

f:id:Akkiesoft:20211207004617j:plain

夜になってもこんな感じで、意外と部屋の明かりのおかげで見られたりします。

f:id:Akkiesoft:20211207004720j:plain

メダカメラはこちら。常設の鉢勢の下に不定期の第二カメラがあります。晴れてる日は見られるかも?です。

shrimp.marokun.net

PythonとguizeroでGUIアプリケーションを手軽に作ってみる

Raspberry Pi Advent Calendar 6日目です。3枠ほど参加してくださる方が現れてありがてえ〜。皆様のご参加はいつでも歓迎です。

adventar.org

告知も打ってるけど……増えないンゴねえ

PythonとguizeroでGUIアプリを書く?

さて、PythonGUIアプリケーションを書こうとすると、たぶんPyGTKとかPyQtあたりがメジャーになると思うのですが(しらんけど)、guizeroというライブラリがあるらしく、去年あたりにRaspberry Piのブログで「Create Graphical User Interfaces with Pythonって本ができたで!」って出たときに知って、いつかこれでGUIアプリケーションを書いてみたいなと思っていたのでした。

www.raspberrypi.com

guizeroは、TkinterというTkのPython用ライブラリをさらに噛み砕いたようなもの(ラッパーっぽい?)らしく、簡単にGUIアプリケーションが書けるようです。

用意

GUIアプリケーションを書くので、Raspberry PiはDesktop版が必要です。そして、guizeroのインストールはpipコマンドでのインストールします。aptでインストールもできますが、パッケージバージョンが古くてドキュメントと噛み合わないところがあるため、pipでのインストールしたほうが良いです。

sudo apt install python3-pip
sudo pip3 install guizero

Hello, World!

画面を出してなんかテキストとボタンを出して押されたら文字を出したり終わったりするサンプルを書くとこんな感じになります。

import sys
from guizero import App, PushButton, Text

app = App(title="Hello")

def button_clicked():
    clicked_label.clear()
    clicked_label.append("Button clicked!")

def exit_app():
    sys.exit()

Text(app, text="Hello!")
button = PushButton(app, text="NYAN!", command=button_clicked)
button2 = PushButton(app, text="EXIT", command=exit_app)
clicked_label = Text(app, text="")

app.display()

結果はこんな感じ。手軽やん。

f:id:Akkiesoft:20211205230838j:plain

コミケで販売するときのレジアプリ的なのが欲しい

話が突然変わりますが、コミケでは100円玉払い専用投入機を用意したいと思っています。だいぶ昔にヤフオクでコインセレクターをゲットしていて、同人イベントで使おうと思っていたらコロナ禍になってしまい、今冬久々のコミケでは手渡しは非推奨みたいな感じになってるので、今こそ使うチャンスではと思った次第です。ちなみに、500円にも対応していますが、旧500円玉(今年古くなったやつではなく、2000年までの初代のやつ)だけだったので、実質的には使えません。

で、コインセレクターをRaspberry Piにつないで、投入金額の設定とか投入金額のカウントとかをするためのコードを書いていたのですが、なんとなく自販機的というかレジアプリ的というかな感じにしてみたくなり、guizeroでアプリを書いてみました。ドン!

f:id:Akkiesoft:20211205231846j:plain

本の表紙などの商品画像がボタンになっていて、欲しいものを欲しいだけタップすると画面右のリストに追加されて、合計金額が表示されます。ちなみに商品リストはjsonファイルで書かれているので簡単に増やせます。増やしすぎると画面からはみ出しますが。

支払いボタンを押すと、画面が切り替わって支払い方法を選択できます。100円玉以外のときはコイントレーか、久々に使おうと準備中のSquare(VISA/MASTERカード払い可。JCBSuicaは審査中)で支払いしてもらう感じになります。

f:id:Akkiesoft:20211205233249j:plain

100円玉を選択すると投入画面になるので、100円玉をチャリチャリ入れます。投入されたら投入金額がカウントアップされて、合計額と一緒になったら完了……みたいな感じです。

f:id:Akkiesoft:20211205233339j:plain

以上のコードは書きかけなので、販売記録ファイルの書き込みとか細かい調整とかをやりたく、まだ増える見込みですが、現時点では画面遷移を含めて1スクリプトで書けていて、140行程度で表現できています。すごいやん……。完成したらコードを公開できればと思っているところです。

簡易的なGUIアプリならこれでいいかも

触ってみた感じ、ウィジェットの配置に若干クセがあるような気もしつつ、シンプルで意外とかゆいところも届き、さっくりGUIアプリが書ける面白いライブラリでした。開発中のレジアプリ(仮)の写真でしれっとRaspberry Pi公式ディスプレイを使っているように、タッチスクリーンでももちろん使えるので、対話型のサイネージ作成にもヨサゲです。ちなみにレジアプリ(仮)ではRaspberry Pi 3 A+を使用していますが、メモリが少ないモデルでも問題なく使えるのも強みかもしれません(サイネージ的に使うようにちょっとだけチューニングしてあります。あっきぃのラズピッピいじり4の記事を参照。私もよく参照してる)。

レジアプリの完成品はぜひコミケで見に来てさわってもらえたらと思っています。100円玉を握りしめて12/31の東ホール「テ」23a、こくだランドまで遊びに来てね。

ところで、Squareを使うならレジアプリはそっちでいいんじゃねえかという説があります。どうする!?🤔

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

Raspberry Pi Advent Calendar 5日目です。別に途切れてもいいんだけれど、なんかもったいない気がして5日目です。皆様のご参加をいつでもお待ちしております。。

adventar.org

TOTP表示機

お仕事でもプライベートでも、どこかにログインしたりなんだりするときにワンタイムパスワードを使うことは増えているかと思います。が、ワンタイムパスワードを使うところが増えすぎて、スマホGoogle Authenticatorが数字まみれになっているので、ちょっと困りものです。あれ、フォルダ分けとかできると嬉しいんですけどね〜。

アプリを開いてよく使うやつをパッと見つけ出すのも辛くなってきたので、Picoでなんか出しっぱなしにできたらいいかなーと思った次第です。

あった

CircuitPythonで作るTOTP表示機はもうすでにAdafruitがチュートリアルを作成済みでした。もう本当になんでもあるわ。サービス選択にコードの入力まで実装されているので、同じハードを揃えたら普通に便利に使えそうです。

learn.adafruit.com

Breakout Gardenでつくりたいが、部材がない

が、できれば先日ケースを自作したBreakout Garden Packで作りたいので、その線でがんばります。LCDはあるとして、TOTPの生成には欠かせないRTCが……ないですね……。昔いくつか買った記憶があるものの、発掘に失敗したため、多分いらないと判断して放出した可能性がデカいです。Raspberry Piでは気軽にインターネットにつながってしまうのでNTPで拾って済む分、RTCいらんわとなりがちですが、Picoではなかなかそうもいかないので、RTCの需要復活と言った感じです。

というわけで、RTCモジュールをAliExpressで注文しつつ、それだといつ来るかわからないのでスイッチサイエンスでも注文しました(こちらもタイミングが遅く、週明け発送に)。ので、続きは来週です。

ちなみに、一つだけ時刻を得られるGPSモジュールというブツは持っていて、ちょっとやってみようとしたのですが、ベランダに出ないと時刻が取得できず、役に立たなかったためボツとなりました。知ってた。

見た目だけ整えておく

こうなるといま時点で私にできることは、コードをいい感じに参考にさせてもらいつつ、見た目を自分好みにカスタマイズするくらいなので、せめてそれをやります。

サンプルコードではTOTPを生成するHMACとかbase32のコードが一緒になってしまっているので、これらは別ファイルにしてimportするように変更しました。あと、キー入力とかTOTP送出とかの機能はないのでゴリゴリ削りました。

残りは本当に見た目のカスタマイズ。240x240のLCDサイズに合わせたテキスト配置に変えて、プログレスバー(これもライブラリになっていてほんとすげえ)の配色をTOTPの使用期限が近づいたら黄色とか赤とかに変えてみたり、ビットマップ画像を壁紙にできるようにしてみたりしました。

こんな感じに。

f:id:Akkiesoft:20211205011901j:plain

ところで、LCDはST7789というドライバーで動くものですが、同じドライバーで動く円形ディスプレイもあるので、こいつでも動かしてみました。表示位置調整でパラメーターは少し変わりますが、ちゃんと出ました。保護シートがもったいなくていまだに剥がせてない。

f:id:Akkiesoft:20211205012227j:plain

コードは最終形になったらGithubにぽいぽいしましょうね。

RTCが届いたら、そいつを実装して最低限は完成です。

OTPをキーボードとして振る舞ってTOTPを送出する機能は欲しい気がするので、ボタンを実装してみたいですね。Breakout GardenのI2CソケットにはINTピンがある(Raspberry PiのGPIOで3V3, SDA,SCL,GPIO4,GNDと並んでいるやつのGPIO4の部分)ので、ここを使えばいけそうです。これは作れるな。