あっきぃ日誌

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

脱着型2-in-1PCのキーボードの独自っぽそうな端子、どうせUSB説

先日秋葉原であひるさん、つぼさんのEjectコマンドユーザー会3人衆が集まる機会があり、ぶらぶら歩いていたところ、Lenovo IdeaPad D330(これ)のキーボードだけが500円で大量に投げ捨てられていました。接続部分を見ると5つのポゴピンが生えているわけですが、なんとなく、こいつがUSB接続だったらケーブルなりコネクターなりにすげ替えたら使えるんじゃね?という予感がして、買ってみました。

夕食で入ったサイゼリヤで取り出す、我慢できないタイプのオタクをやった図。奥の2つの突起の間にあるのがポゴピン。ディスプレイがあればココにドッキングして使えますが、本体はどこへやらと消えて行き、キーボードはオタクのおもちゃになろうとしています。

この日の買物。いかにもアキバに行ってきましたって感じで非常に良いですね。Pico Wの買い増しとか、uHAT Porter Pico Type-P Rev.3用のチップ抵抗とかジャンクのケーブルとか。

で、キーボードの裏ぶたをオープン。すると1分もせずかぐらぁから「これUSBですね」の反応が。やめてよ〜わたしの調べる楽しみ取らないでよ〜(笑)。

GL850GというのがUSBハブだそう。ググると4ポートのUSB2.0ハブチップのようでした。キーボード左右にUSB2.0ポートが1つずつと、キーボード、トラックパッドで4つとなるので、数も合いますね。

接続も確認。左からGND、D+、D-、(不明)、VDDの順でした。おそらく本体を逆に差し込んでも大丈夫なように設計されているはず?なので、不明の部分も多分D+なんじゃないかと思いますが、まあわかりきっている部分だけ引き出せばいいのでこれで十分です。

さて、あとはどうやってUSBを引き出すかですが、ケーブルだと持ち歩きとか耐久に難がありそうなので、できればコネクターを生やしたく、あわよくばType-Cだと嬉しいなあと思ったわけですが、あいにくキーボードを入手したのは秋月とかから遠ざかったときのことで、確信があったわけでもないのでUSB-Cブレイクアウトボードは買わずに帰ってきていました。ぐぬぬ、今度アキバ行ったときに買おう。

買ってきた。

んで、昨日のお誕生日にひとりでアキバに行ってひとりでぶらついて、帰ってくる寂しい35歳独身男性をやってきたわけですが、USB-Cブレイクアウトボードも無事調達してきました。秋月で180円。

もちろんポゴピンとは配列が違いますが、さてどう接続しようか。

当初は、3Dプリントで突起にかぶさるようなモノを作って、ポゴピンと接続できるアダプターとして設計しようと企んでいましたが、やはりいろいろが面倒なので、ポゴピンを取っ払って、ブレイクアウトボードを埋め込んじゃうことにしました。

うまいことカバーがはがせた様子。ポゴピンを外してケーブルを延ばして接続、絶縁しつつ上に板を乗せる方向でやってみましょう。


やっていき

あとはやるだけなので、まずは基板を取り出します。ハンダを吸い取って外せたら良さそうですね。

できました。どうせ再利用しないので良いですが、1ピンだけベースから外れちゃいましたね。

配線。最初はビニール線を使いましたが、分厚くなる上に、調整しているうちにちぎれてしまったので、エナメル線でやり直し。このあとはホットボンドで基板の上にブレイクアウトボードを接着しました。

カバーをホットナイフで適宜切り落として、再びはめ込んだら完成です。

ネクター部分の拡大。水平に抜き差しする分には問題ないですが、垂直方向に力が加わると当然はがれてしまうため、ちょっと心配ですね。あと、見栄えもいまいち。

ビニールテープを巻いて隠しつつ垂直方向に力がかかるやつを対策してみました。まあ、いいんじゃないでしょうか。

ネクター側から。コネクターが飛び出しているのがややシュールですが、まあいいんじゃないでしょうか。


まとめ

脱着型2-in-1PCのキーボードはやはりUSBデバイスでした。本当に使い物にならなかったらまずジャンクにも並ばないはずなので、まあそう言うことなんでしょうかね(?)。

というわけで、トラックパッドとUSBポートx2付きのUSBキーボードが680円でできあがりました。ラズピッピ用キーボードとして持ち歩けば、マウスを別途持たずに済む可能性があるので良さそうです。別メーカーの似たようなキーボードも転がっていたので、あれらUSBなんだろうか〜。もう買わないけど。

コミック

ためこんだのを書いて片付ける

ドラッグストア店員さっちゃんの日常

高校生幼馴染ウブウブ青春コミックです。同人版もよき。ほんとこれ系ばっか読んどるなわたしは。

亜人ちゃんは語りたい (11・完)

デミちゃんもついにおわってもた〜〜。1巻の表紙に惹かれ、気づけばアニメになり、大変に良き作品でした。あと完結のときに出た読み切りワロタ。

世話焼きキツネの仙狐さん (12・完)

仙狐さんも同じく完結。ハーレムからの正妻END!が、今後も不定期で続くそう。いいですね!

それでも歩は寄せてくる (14)

だいぶ凛がかわいい漫画に変わってきましたけど、どう続くのか……でもキョンシーうるしがかわいい。

ハンバーガーちゃん異世界転生絵日記 (1)

ハンバーガー先生のハンバーガーちゃんのコミックヤッター。ところどころスケベっぽいけど悲惨(褒め言葉)な展開でオチるのが実にハンバーガーちゃんでいい。魔王編も楽しみ

秋月の謎SoC基板付きケースに入ってたWi-SUNモジュールをRaspberry Pi Picoで使う基板の製作

これのおまけの続き。

akkiesoft.hatenablog.jp

秋月の謎SoC基板付きケースのWi-SUNモジュールを、Raspberry Pi Picoで使うためのブレイクアウト基板を製作しましたが、Rev.1ではコネクターのピン配置の向きを鏡にしてしまい失敗しました。基板データを修正して再度発注して届いたので、今度こそモジュールで遊んでいきます。

基板Rev.2がきた

ネクターの向きを修正した基板が届きました。Rev.1と比較はこんな感じ。修正とは別に、Resetピンの引き出したり、左側にはPicoで良く使うピンを引き出したりしました。LCDで電力を表示するのに使ったりすることを想定しています。

モジュールの物理搭載はRev.1に引き続き問題なし。

先にICクリップを使ってモジュールとシリアル通信が可能なことを確認していたので、ピンソケットもさくっと実装しちゃいました。

側面からはこう。構想段階ではピンソケットの間にはまればと思ったのですが、残念ながら数ミリ足りず、ボードの上に載せるかたちになりました。

裏面は何もなくさっぱりです。

Picoに搭載するとこう。しれっとアンテナも箱から剥がしてますが、裏面がベタベタなので微妙。別のアンテナを使うか……w

もう一枚は開発用としてピンヘッダを全部搭載。が、左側はピンソケットを載せないと使えないので無意味でした。この記事を書いている今はテストが終わったので、ソケットもつけましょうかね。


コードを書く

さて、弊ハウスでは、以前からUSBドングル版Wi-SUNモジュールをRaspberry Piに刺して電力の監視を運用しています。じゃあなんで箱を買ったんやという話は気にしてはいけない。

akkiesoft.hatenablog.jp

自宅動いているコードは以下の記事のスクリプトベースで、エラー処理の改善や、なんとなくコードを整理したつもりになったなどの改造が施されています。

qiita.com

秋月ケースを解析していた人の改造情報曰く、通信内容が一部違うそうなので、移植時に参考になりました。微妙にコマンドが違うことなんてあるんだ。

ゆな でぃじっく on Twitter: "MB-RL7023-11に対応するために必要な修正箇所 0追加 元:ser.write(str.encode("SKSCAN 2 FFFFFFFF " + str(scanDuration) + "\r\n")) 変:ser.write(str.encode("SKSCAN 2 FFFFFFFF " + str(scanDuration) + " 0\r\n")) 0追加 元:command = "SKSENDTO 1 {0} 0E1A 1 {1:04X} ".format(Address,…" / Twitter

これらをもとにイイカンジに移植して、Raspberry Pi Pico + CircuitPython用のコードができあがりました。↓のリポジトリに置いてあります。

github.com

書いていて気がつきましたが、Resetピンをスクリプトの開始時に「HIGH→LOW(ここでリセット)→HIGH」にしてモジュールをリセットすると、コードの再実行が確実で良かったので、スルーホール引き出しだけにして、PicoのGPIOには配線しなかったことをやや後悔しました。幸い、すぐ隣のGP15でOKそうだったので、エナメル線をちょろっと配線して対処しました。

動いた!

諸々調整やエラーの対応をしつつ、ついに動作!出力はシリアルでも見ていますが、適当なLCDにも出力して映えを演出。いや、小さくて読めねえ。いちおう、282Wと出ています。やったぜ。

なお、これ自体の消費電力は0.1Aほど。LCDを使わなければ0.6Aほど。さらにPico WではなくPicoを使えば0.03Aほどでした。ネットワークが不要なら、表示まわりは電子ペーパーと組み合わせると、消費電力少なめでメーターの値を監視できそうですね。

次?

やっと動かすことができたので、たいへん満足しました。が、基板デザイン的にはまだいじりたいなあという欲があり、Rev.3も作りたいなぁ〜!という気持ちになっています。リセットの配線も伸ばしたいし、OLEDモジュールで良くあるピン配置に揃えたりプルアップ抵抗にも対応したいです。いや、後者はもうデータ自体は作っちゃってるんですよね。あとはリセットの配線をやるだけで発注できちゃう。

でも、コネクター実装がコスト的に高いよナァと思っていたら、なぜか会社にヒートガン環境が整備されたので(なぜ???)、Rev.1の失敗基板からコネクターをぶんどって移植する練習ができるようになってしまい、なんだか機運が高まっています……??

あと、5枚のうち2枚は私、もう2枚はぶちょうと0.1t氏にそれぞれお渡ししたので、1枚が余っている状態です。私のテスト用の1枚もぶっちゃけ手放していいっちゃいいので、欲しい方がいたらお譲りできます。まあおらんと思いますが、いたらMastodonかMisskeyでお声がけください。Twitterは無視します(ひど〜い)。

ガーバーデータを公開するというのもできますが、表面実装サービスのクーポンを使って注文して5枚で約12ドルなので、そこまでしてでも作りたい方がいればという感じですネ。どうなんでしょ。これもMastodonかMisskeyで聞かせてください。Twitterは無視します(ひど〜い)。

Raspberry Pi Picoで赤外線学習リモコン

Raspberry Pi Pico用の赤外線学習リモコンライブラリで遊んでみる話です。

Raspberry Piではlircとかir-ctlを使う感じですが、まあ、動かすまでがわりと大変という印象があります。あと、Picoで動くなら待機の消費電力を削れるはずなので、いつか試してみたいなあと思って放置していました。で、きのう改めて探してみたら、いい感じに動かせるライブラリを見つけて可能性を感じたので、それを紹介します。

RemotePyという、日本の方が作られているライブラリ。Pico(WもOKでした)とMicroPythonで動くように作られていて、使い方もシンプルでした。

qiita.com

環境

uHAT Porter Picoに載っかったPico Wに、Raspbeery Pi向けの赤外線送受信モジュールを搭載したものを使いました。HATが浮いているように見えますが、写真で見やすくするためだけにBooster Headerを噛ましてあるせいです。HATはAVANTIのInfrared pHAT。もらい物ですが非常に重宝しています。


受信

デモから抜粋した、ひたすら受信するだけのコード。uHAT Porter Picoのピン読み替えが入ってますが、普通のPicoならimportを削り、Pinのときに数字を入れればOKです。

from machine import Pin
from UpyIrRx import UpyIrRx
import uhat_porter_pico_type_p as Pin_bcm

rx_pin = Pin(Pin_bcm.BCM18, Pin.IN)
rx = UpyIrRx(rx_pin)

while True:
    print(".\n")
    rx.record(3000)
    if rx.get_mode() == UpyIrRx.MODE_DONE_OK:
        signal_list = rx.get_calibrate_list()
        print(signal_list)

実行結果。ドットが出ている範囲内でリモコンの信号を読ませると、配列になった信号データが出力されます。今Raspberry Piで使用しているir-ctlのデータと見比べると、数値の並びが似ているので、少し加工すればir-ctlにも投入できそうです。

.

.

[2040, 1020, 5610, 1020, 1530, 510, 1530, 510, 510, 510, (略)]
.

.

[2028, 1014, 5577, 1014, 1521, 507, 1521, 507, 507, 507, (略)]
.

.

送信

これもデモから抜粋しつつ、WebサーバーのAPIにしてみました。/にアクセスするとAPI呼び出しボタンだけのページが表示され、/powerで制御ができる仕組みです。

from machine import Pin
from UpyIrTx import UpyIrTx
import uhat_porter_pico_type_p as Pin_bcm
import utime
import socket
import network

ssid = "SSID"
passwd = "PASSPHRASE"

html = """<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><title>Pico W 部屋の照明API</title></head>
<body><h1>Pico W 部屋の照明API</h1><button style="font-size:20pt;" onClick="fetch('/power');return false;">電気</button></body></html>
"""

light_power = [2032, 1016, 5588, 1016, 1524, 508, 1524, (略)]
tx_pin = Pin(Pin_bcm.BCM17, Pin.OUT)
tx = UpyIrTx(0, tx_pin)    # 0ch

def do_connect():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect(ssid, passwd)
        while not sta_if.isconnected():
            print(".")
            utime.sleep(1)
            pass
    print('network config:', sta_if.ifconfig())

do_connect()
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(1)

while True:
    cl, addr = s.accept()
    req = str(cl.recv(1024), "utf-8").split("\r\n")
    for l in req:
        if "GET" in l:
            path = l.split(" ")[1]
            break
    code = "200 OK"
    ct = "text/html"
    if path == "/":
        response = html
    elif path == "/power":
        tx.send(light_power)
        response = "ok"
    else:
        code = "404 Not Found"
        response = "Not Found"

    cl.send('HTTP/1.0 %s\r\nContent-type: %s\r\n\r\n' % (code,ct))
    cl.send(response)
    cl.close()

動作のようす。きちんと照明がオンオフできています。

youtu.be

他のリモコン

楽しくなって、手元にあるリモコンを引っ張りだしてみましたが、Blu-rayプレーヤーのリモコンも、エアコンのリモコンも、どれもバッチリ送受信できました。強いぞ、こいつ……!!!


ええなこれ

これは強力なライブラリを発見しましたね……!自宅でメイン機として常設しているラズピッピの一番肝になっている機能ですが、これをPicoに置き換えたらラズピッピ自体置き換えられそうな予感。まあ、他に動いているものが多いので、当面置き換えるプランはないですが。

これを常設化しようとしたときに、Pico Wで無線として動かすか、ネットワークの安定を求めてWIZNet W5500とかの有線LANモジュールでやるかは、人によって要検討かなと思います。私なら有線LANを使うかも。ちょうどこないだW5500+Tiny2040のやつを箱に詰めたばかりなので、それを使うとかはちょっと考えました。

akkiesoft.hatenablog.jp

uHAT Porter Pico Type-P Rev.3

届きました。Misskey.ioのウンチゲボザウルスステッカーも同時に届いたのでまとめ撮影

mofumofu-yasan.booth.pm

チップ抵抗の実装

今回の目玉機能のチップ抵抗をさっそく実装します。2mm x 1.2mmの超小さいサイズですが……まあ行けるじゃろ!

斜めった。やっぱ機械が実装したほうがきれいに付くよねえ。1つ目(上)は普通のピンセットによるものでしたが、2つ目(下)は毛抜きでやったら多少マシになりました。フーム。気が向いたらつけ直してみましょうかね?

PicoはWを載せて、ピンヘッダも淡々と実装。リセットボタンは、ボタンスイッチをアリエクでポチったので、届いたら実装予定です。

動かしてみる

まずは、チップ抵抗をつけたことによってプルアップ抵抗がうまくできているかのチェック。CircuitPythonではじかれていたPimoroniのLED SHIMを載せて、I2Cのスキャンをします。結果は[117]の表示。つまり0x75で、LED SHIMのものと確認できました。やったね。

Adafruitのサンプルもこの通り動作。

Simple test — Adafruit IS31FL3731 Library 1.0 documentation

youtu.be

つづけて、PimoroniのBlinkt!用にピン配置を変更した部分のテスト。こちらも想定通り、高速に動作するようになりました。よかった。

youtu.be

満足

多分これ以上改善することもないはずなので、一旦これで一区切りかなって感じです。

基板はのこり4枚あって、チップ抵抗も全部につけるだけ用意してあるので、抵抗を無くす前に全部実装しておこうかなと思っています。あとはどのPicoを載せるかですかねえ。必ずしもPico Wである必要もない気がしているので、普通のやつもまた買い増しましょうかね。一回uHAT Porter Picoに載せたら多分取れない気がしているので、剥がすのも難しいでしょうしネ。

頒布のほうは、まだRev.2の在庫があるので、そちらを販売継続します。別にひどく致命的な問題があるわけではないので〜。

Rev.3の頒布の予定は未定ですが、コミケ合わせではやるかも?な感じです。