2023Amazonで売っている中華ガジェット、ぶっちゃけハズレも多いのですが、なんかそそられるものがありますよね。今回は中華ガジェットを買ったらハズレだったので、自分で中身を入れ替えて使えるようにした、そんな話です。話を書いても良いのですが、動画にまとめてニコニコ動画にアップしたので、それを見てやってください。解説は動画を見ていただいた前提で書かせていただきます。見ていない方はご視聴頂ますようお願いします。ソースコード全体です。それを拾ってself.displayを使わないようにする。print("ディスプレイが見つからないので使わないことにします。main()行うことやっていることは単純です。USBキーボードとして動かして、ボタン入力に対してキーボードの状態を送るロータリーエンコーダーの変化に対してキーボードの状態を送るオマケ機能としてI2CインターフェイスでSSD1306のディスプレイに出力を出す。board.GP3定数のキモは、ボタンのIO配列とキーコードのリストです。この両方のリストのインデックスでボタンと送るキーコードを紐づけています。他の定数は、まぁ、定数名そのままって感じです。それを拾ってself.displayを使わないようにする。print("ディスプレイが見つからないので使わないことにします。print("初期化完了")動画中でも言ってますが、今回の作例では、ネット上にある作例ではあまり使われていないクラスを作ってます。クラスのコンストラクタでクラスの初期化とハードウェアの初期化もしています。ロータリーエンコーダーを見る部分を自分でつくろうと思ったら、エンコーダーのA相とB相の関係を色々見てあげないといけないのですが、CircuitPythonではrotaryio.IncrementalEncoderと宣言するだけで、ロータリーエンコーダーの現在位置をカウントしてくれます。例外処理が入っているのはI2Cの部分で、ディスプレイが接続されてI2CのI/Oがプルアップされていないと、RuntimeErrorがraiseしてくるので、それを捕まえてself.displayをNoneにしています。ディスプレイを使うメソッドなどでself.displayをチェックをしていてNoneならば処理をしないようにしています。一つのポイントは、self.showのリストです。これはメソッドの配列で、ボタンの番号とメソッド配列の番号が紐付けられるようにしています。)定数の配列で宣言されていたボタンのGPIOに対して初期化を行いつつ、self.buttonsというリストにadafruit_debouncer.Debouncerを割り当ててます。Debouncerはいわゆるチャタリング対策をして、その上で立ち上がり/立ち下がりを検出してくれるものです。実はadafruit_debouncer.Buttonというのもあるのですが、今回はDebouncerのほうが使いやすいです。詳細はadafruitのドキュメントを見てください。self.button_detect()2つのメソッドを無限に回すメインループです。情報系の人が見たらこんな無限ループはビビっちゃいますけど、組み込み系だと当たり前に使うやつですね。encoder_detect()でロータリーエンコーダーの動きを見て、button_detect()でボタンの動きを見てます。posself.encoder.positionで現在のロータリーエンコーダーの位置がint型で得られます。前回の位置と比較して、大きければ早送りのキーを、小さければ巻き戻しのキーを送ってます。同じならば何もしないで、最後に前回の位置self.preposに現在位置を入れてこのメソッドは終了です。self.keyboard.release(BUTTON_KEYCODE[btn_num])button_detect()では、ボタンリストのenumerateでforループで回します。btnをupdate()すると現在の状況と前回との差が得られます。ボタンは押されると立ち下がり離されると立ち上がります。それぞれbtn.fellとbtn.roseで検出できます。して、ボタンの番号と押されたのか離されたのかをis_pressedとしてsend_key()メソッドに送っています。send_key()ではis_pressedに応じてボタン番号で指定されたキーコードをキーボードに送っています。ボタン番号に応じてメソッドのリストshowsを実行しています。ディスプレイ出力のメソッドこれらはまぁ、見たまんまなので解説することもないでしょうか。三角形を描くメソッドがないのでいろいろな長さの線をいっぱい描く力技ぐらいでしょうねw解説は以上です。解説なのでわかりにくいところもあるかとは思いますが、あしからず。