改良倍マトリクス
はじめに
倍マトリクスはダイオードの順電圧Vfについて Vf<Vth<3Vf の制限があり、駆動電圧が5Vでないマイコンを使用すると3Vfが条件を満たさずゴーストが出ることがあると言われます。 そこで、動作条件が 2Vf<Vth<4Vf である改良2乗マトリクスを倍マトリクスに導入する方法を考えました。
既存の倍マトリクス
赤丸で囲んだ3つのキーを同時に押すと、3VfがVthを下回った場合青丸で囲んだキーが入力されてしまいます。
動作条件: Vf<Vth<3Vf
改良倍マトリクス
3つキーを押したときにゴーストが出る条件は 6Vf<Vth となります。一方でキーが入力できる条件も 2Vf<Vth となります。
動作条件: 2Vf<Vth<6Vf
改良倍マトリクス(その2)
1列あたりダイオードを2個追加するのは大変ということでダイオードが1個で済む設計も考えました。
ここまで述べてきた「ゴースト経路」とは青線の経路です。
動作条件: 2Vf<Vth<4Vf
まとめ
いかがでしたか? 既存の倍マトリクスでゴーストが出るのはVfの少しの差だと思うので、追加のダイオードはVfが小さいショットキーバリアダイオードが良いと思います。
LinuxでQMatrixを使ったUSB HIDアプリケーションを開発する
Atmel Startで
- start.atmel.com を開く
- "CREATE NEW PROJECT"をクリック
- ATSAMD21G18Aを選択して"CREATE NEW PROJECT"をクリック
- "Add software component"から"Middleware/QTouch Library"や"Middleware/USB Stack/USB Device COMPOSITE"を追加
- "QTouch"タブを開く
- "Sensors"から"Button"を選び、"Mutualcap"を選択して個数を選ぶ
- クロックの設定変更画面が出てくるので"Yes"を選択
- "Pins"を開いてボタンを配置
- "CLOCKS"タブを開いて"Digital Frequency Locked Loop"をのチェックを外す
- "Fractional Digital Phase Locked Loop"のチェックを入れて歯車ボタンから"DPLL LDRFRAC"を
0
, "DPLL LDR"を1499
にする - "Generic clock generator 0"の歯車ボタンから"Generic clock generator 0 source"を"Fractional Digital Phase Locked Loop"に変更
- "Export Project"からMakefileを有効にして出力
変更
- DFLLをUSB用にして有効化:
config/hpl_gclk_config.h
を変更CONF_GCLK_GENERATOR_7_CONFIG
を1
にCONF_GCLK_GEN_7_GENEN
を1
にCONF_GCLK_GEN_7_SRC
をGCLK_GENCTRL_SRC_DFLL48M
に
config/hpl_sysctrl_config.h
を変更CONF_DFLL_CONFIG
を1
にCONF_DFLL_GCLK
をGCLK_CLKCTRL_GEN_GCLK4_Val
にCONF_DFLL_ENABLE
を1
にCONF_DFLL_BPLCKC
を1
にCONF_DFLL_CCDIS
を1
にCONF_DFLL_USBCRM
を1
にCONF_DFLL_MUL
を48000
に
config/peripheral_clk_config.h
を変更CONF_GCLK_USB_SRC
をGCLK_CLKCTRL_GEN_GCLK7_Val
に
- USBの最大EP数を拡大
config/hpl_usb_config.h
を変更CONF_USB_D_NUM_EP_SP
をCONF_USB_D_N_EP_MAX
にCONF_USB_D_MAX_EP_N
をCONF_USB_N_5
に
- HID Keyboardを有効化
config/usbd_config.h
を変更CONF_USB_COMPOSITE_HID_KEYBOARD_EN
を1
に
- LDファイルのFLASH_STARTを0x2000に:
rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
をrom (rx) : ORIGIN = 0x00002000, LENGTH = 0x0003E000
に変更 - UF2への変換を追加:
gcc/Makefile
の$(OUTPUT_FILE_PATH): $(OBJS)
の項目の最後に{{path to uf2conv.py}} $(OUTPUT_FILE_NAME).hex -c -o $(OUTPUT_FILE_NAME).uf2
を追加
main()
- メインループ前に
composite_device_start()
を追加
メインループ
while(1) { touch_process(); if(measurement_done_touch) { uint8_t state = get_sensor_state(i) & KEY_TOUCHED_MASK; if(state) { // key i press } else { // key i release } } }
ビルド
cd gcc/ && make -j4
マジョカアイリスを温度表示機能付きのリモコンにする
(書けたところまでで順次公開します)
試作
ブレッドボードで作る
プログラミング
あとで上げる
基板を起こす
至難。特に2つのFFC端子の間で信号線の左右を入れ替えるところが。
発注する
基板をOSHParkに, 部品をマルツ(Digi-key)や秋月に発注。
組み立て
0.5mmピッチのFFC端子のはんだづけができる気がしなかったが, 雑にはんだづけしてからハンダ吸い取り線で吸い取るとうまくいった。
GPIO0をLEDの信号に使っているのが気になっていたため, LEDが点灯しっぱなしになる原因になっていると考えTXに, 細長液晶に表示されない原因を探していた際, データシートでIO15にI/Oの印がなかったためRXにつなぎ替えるなどした。細長液晶に表示されなかったのはFFCケーブルの端子が剥がれていたせいだと思われる。
失敗点
緑液晶を破壊する
緑液晶に取り付けるFFCケーブルを間違えて, 信号線に12Vを掛けてしまったようで緑液晶が破壊されてしまった。しばらく触ってない部品を配線するときには特に気をつけよう。
部品の取り付け誤り
Q1とQ2のシルクを逆に置いていたせいでNch MOSFETとPch MOSFETを逆に取り付けてしまい, LEDが常時点灯するようになっていた。
赤外線LEDを焼き切る
リモコンとして動作しないのを出力不足だと決めつけて電流制限抵抗を短絡したため赤外線LEDが焼き切れた。赤外線LEDは特にVfが小さいので注意が必要だった。5Vに繋ぐなら27Ωくらいは電流制限しようね
完成
できた pic.twitter.com/67SLyyy7aX
— すに@妖怪キーボード自作 (@ysni_pub) October 18, 2021
今後に向けて
- せっかくESP32を積んでるのに温度を表示してリモコンとして動作するだけではもったいない気持ちになってきた
- SENSOR_VPとSENSOR_VNも入力ピンとして使えるようなのでもう一つのボタンも入力につかえるようにしたい。
- 前述の通りIO15とGPIO0も余っているのでセンサーを付けるなりLEDの点灯を個別制御できるようにするなりしたい。
- シルクの修正
ママチャリのボスフリースプロケットを外して車軸にグリスを注す
動機
自転車のサドルをスポーツタイプに交換しハンドルポストを下げたらまだ戦える感じになったので, 最大の問題である後輪ハブのグリスアップをすることにした
前日譚
後輪が空走中も異音を出すので次の自転車を発注した。納期6ヶ月…
昨年末にサイクルベースあさひでタイヤ・チューブ交換のついでに「ボスフリーに注油」してもらって以後1週間ほどは異音が収まっていたが, また鳴るようになった。
サドルが破れたので交換用サドルを物色していたが, 一般車用はクソでかいふかふかサドルかレザーっぽいやつをビス止めしたようなやつしかなかった。調べてみるとシートポストも交換すればスポーツ用サドルを付けられることがわかった。スポーツ用サドルだと前後位置も傾斜も変更できるのでいいよね!
買ったもの
- シートポストΦ27.2mm×長さ300mm
- スポーツ用サドル
- アーレンキー(六角レンチ)セット (6mmしか使わないが)
計7000円
サドルの固定に使ったアーレンキーでハンドルポストの固定を外すことができたのでハンドルを下げた。
さて本題
買ったもの-工具
ボスフリー外し
スプロケット側のハブに注油するのに必要。1000円。
超ロングメガネレンチ 24mm
ボスフリー外しを回すのに必要。これで体重を掛けても回らなかったので, 普通のメガネレンチ+金属管のほうが長くていいかもしれない。3000円。
15mmレンチ
車軸を外すのに使う。15mmのメガネの裏に14mmのメガネが付いているものを使ったが, 車軸が通りにくくて大変だったので15mm単体のほうがいいと思う。2000円。
17mmレンチ
ローラーブレーキを外すのなどに使う。ディスクグラインダー用が安い。ホームセンターで取り扱い。200円。締めるために2本買っておこう。(後述)
ハブコーンレンチのほうが薄くて汎用性あるんだろうけどめっちゃ高い。(3000円)
あさひなら1100円やんけ!!
10mmレンチ
ローラーブレーキのワイヤー固定ネジを外すのに使う。はんだごてのこて先の交換のために持ってた。
プラスドライバー #2
ローラーブレーキのワイヤー固定ネジを外すのに使う。600円。
精密マイナスドライバー
車軸の端を覆ってるプラカバーを外すのに使う。
ハンマー
硬いナットを開けるのにあったほうがいいと思う。重いレンチで叩いた…
自転車用万能レンチ
いらないかもしれないけど使ったかもしれない(曖昧)。ハンドルバーの前カゴを止めてるナット(32)を回せて便利だった。評価1か…
ケーキバット 8インチ
工具を置いたり, 外した部品を入れてパーツクリーナーを掛けたりする。
買ったもの-消耗品
グリス
円錐形のノズルの先を切って使うことになかなか気づかなかった。400円。
パーツクリーナー
わからないので良さげなのを選んでください(わからない)
スポークプロテクター
3年くらいで欠けるので消耗品。400円。
キムタオル
相手は油の塊なので10枚くらい使った。50枚入りで400円。
手袋
着けないと爪の間などが真っ黒になるので対策に必須。
着けたままタッチパネルを使える薄手のビニール手袋を使ったけど, スプロケットを握ったら破れたのでゴム手袋のほうがいいのかなあ
買い方
今回は営業時間の都合(ホームセンターは9時から開いているが, サイクルベースあさひは10時から)でホームセンターでできるだけ工具を買い集めてからあさひに行ったが, 逆にあさひでできるだけ買い集めてからホームセンターに行ったほうが良さげ。自転車用の工具は自転車店のほうがいいので(当たり前体操)
作業の流れ
自転車を裏返す
新品のサドルは大切なのでそこだけボロ布を敷いてひっくり返した。
後輪のネジを外す
隙間に精密マイナスドライバーを突っ込んでこじ開けてプラカバーを外す。15mmのスパナでナットを外す。そういえば今回逆ネジに遭ってないな。
ドロヨケステーやスタンド, ディレイラーガードといった非機構部品を車軸から外す。
ローラーブレーキを車体から外す
車軸以外にプラスネジと10番ナットで車体に取り付けられているのでドライバーでプラスネジを固定して10番ナットを回して開ける。ドライバーのサイズが合っていなかったのか, プラスネジを回したら舐めてしまった。ブレーキワイヤーをローラーブレーキに固定している部分も外す。
チェーンを外す
がんばれ
車軸を外す
後ろに引っ張ると外れる。車軸がチェーンに引っかって外れにくい。がんばれ。
ローラーブレーキを車軸から外す
17mmレンチでナットを回して外す。これで車輪が車体から外れる。
車輪を分解する
どうしてこれを1項目にしたんですか?
ローラーブレーキ側のナット2つ(ロックナットと玉押しかな?)を外す。仁丹が見えるが, 車軸が刺さっている限り出てこれない程度の隙間になっている。これ後でもいいな。
ボスフリースプロケットを外す。一番上の薄いナットを回そうと四苦八苦していたが, ボスフリーとは関係がなかった。(外すと「センター出し」が必要になるらしいので外さないほうが良い)。専用工具を使う。40cmのレンチに体重を掛けても足りず, 別のレンチで何度も殴ったらやっと開いた。
車軸を抜く。ローラーブレーキ側の固定を外しているので抜けるはず。グリスが切れていると両側の仁丹がバラ撒けるので注意。(今回はローラーブレーキ側には十分にグリスがあった。)水平に注意して裏側だけが撒ける程度に車軸を抜けばええんかな。
清掃
パーツクリーナーを使って洗う。こってりした油汚れなのでウエスで拭い取るのが主になる。 スプロケットは洗わないこと。スプロケット内のベアリングの油分が取れる・異物が入る。分解しようと小さな穴にドライバーを当てて叩いたが外れなかった。ここは逆ネジらしい。しばらく回したら異音なくなったのでヨシ!
組み立てる
仁丹のところにたっぷりグリスを塗って組み立てる。車軸を入れた後にローラーブレーキ側の仁丹を入れることはできないので手順に注意。
- ローラーブレーキ側にグリスを塗る
- 粘度を利用して仁丹を貼り付ける
- 車軸を入れる
- スプロケット側にグリスを塗り, 仁丹を入れる
- ローラーブレーキ側のナットを適度に締める。緩いとガタガタする, キツいとホイールが回らない。
- チェーンガードとスプロケットを組み付ける。
さあ自転車に取り付け
- フレームにはめる。ローラーブレーキのワイヤーがチェーンステーに絡まないように注意する。
- スプロケット側を最大限前に押し,チェーンをかける
- ローラーブレーキ側の車軸を前後に調整することで, 車輪がまっすぐになるようにする
- ローラーブレーキを固定する
- 車体に固定する。
- ローラーブレーキの腕をブレーキワイヤーに引かれたように押して, ワイヤーを締め付ける。
- テンション調整のナットを回す?
- 各ナットを締める
- カバーを付ける。レンチで叩いて付けた。1週間くらい使って異常がないことを確認してからのほうがいいかもしれない。
お疲れ様でした!
まとめ
チェーンへの注油で流れたのかもしれないけど, スプロケット側のグリスが切れてた。
5万円の自転車の修理に2万円かけるとかアホちゃう?(本音)
撮った写真を全部載せようと思ったけど, HEICからの変換が必要で諦めた
YouTubeで配信すればよかった〜〜〜〜〜
Adafruit nrf52 Bootloader の機器向けに Segger Embedded Studio で開発して書き込む
機器
ソフトウェア
- Segger Embedded Studio
- uf2conv.py
- nRF SDK
やったこと
設定画面
Segger Embedded Studioで Project>Options を開く。多くの項目がCommonで設定されている。
ボード定義
nRF52840ボードがP0_13にLEDを搭載していることが多い中, MDBT50Q開発用USBドングルはP1_13のみにLEDを搭載しているため, ボード定義を作成する。
ボード定義の作成
(SDK_TOP)/components/boards/mdbt50q_dongle.h
#ifndef MDBT50Q_DONGLE_H #define MDBT50Q_DONGLE_H #ifdef __cplusplus extern "C" { #endif #include "nrf_gpio.h" // LEDs definitions for DONGLE #define LEDS_NUMBER 1 #define LED_1 NRF_GPIO_PIN_MAP(1,13) #define LED_START LED_1 #define LED_STOP LED_1 #define LEDS_ACTIVE_STATE 0 #define LEDS_LIST { LED_1 } #define LEDS_INV_MASK LEDS_MASK #define BSP_LED_0 NRF_GPIO_PIN_MAP(1,13) #define BUTTONS_NUMBER 1 #define BUTTON_1 NRF_GPIO_PIN_MAP(0,15) #define BUTTON_PULL NRF_GPIO_PIN_PULLUP #define BUTTONS_ACTIVE_STATE 0 #define BUTTONS_LIST { BUTTON_1 } #define BSP_BUTTON_0 BUTTON_1 #ifdef __cplusplus } #endif #endif // MDBT50Q_DONGLE_H
マクロの変更
(SDK_TOP)/components/boards/boards.h
ボード指定マクロによる分岐が書き連ねられているところの#else
の前に書き加える。
#elif defined(BOARD_MDBT50Q_DONGLE) #include "mdbt50q_dongle.h"
作成後, 設定画面の Preprocessor>Preprocessor Definitionsで BOARD_ から始まるボード指定マクロを変更する。
メモリマップ定義
Linker>Memory Segmentsを編集する。
FLASH_STARTを0x26000にすると動いた。0x27000では動かなかった。
uf2conv
Linker>Additional Output Format で bin
を指定する。
uf2/uf2conv.py at master · microsoft/uf2 · GitHub の1ファイルのみをダウンロードしたら動いた。
chmod +x uf2conv.py uf2conv.py blinky.bin -c -b 0x26000 -f 0xADA52840
自動変換設定
User Build Step>Post-Build Command に uf2conv.py $(SolutionDir)/$(OutDir)/$(ProjectName).bin -c -b 0x26000 -f 0xADA52840 -o $(OutDir)/$(ProjectName).uf2
を指定すると,
ビルド時に自動でuf2ファイルが生成されるようになる。
MS88SF2にCircuitPythonをインストールする
動機
端面スルーホールで1.1mmピッチ, USBスタックとBLE搭載, これならマトリックススキャンでキーボードを作れそう!!
機器
あとで書く
やったこと
- MbedのJ-Link化
- Segger Embedded Studio のインストール
- Adafruit_nrf52_bootloader のインストール
- CircuitPythonのビルド・インストール
内容
MbedのJ-Link化
Segger Embedded Studio のインストール
Target>Download>Download intel Hexからブートローダーを書き込むために使う
Adafruit_nrf52_bootloaderのインストール
PCA10056用のをJ-Linkで導入したら動いた
CircuitPythonのビルド・インストール
持ってきて, 適当なプロジェクトをMS88SF2の名前でコピーして, ピン定義を書き換えた(あとで詳しく書くかもしれない)
Adafruit_nrf52_Bootloaderを書き込んだMS88SF2はUSBマスストレージとして通信できるので, firmware.uf2をドラッグ・アンド・ドロップするだけ
フリーウェイ PC充電変換アダプタ付属 GaN 65W USB-C充電器 レビュー 【おすすめ】
これなに
USB-IF認証付きのUSB充電器に, USB-C出力を旧来のPCの充電プラグに変換するアダプタの付いたセット
要約
こんな人におすすめ
- 少し古いPCを持ち歩いている人
- USB-C(反QuickCharge)過激派
おすすめできない人
注意点
- 付属のPC充電変換アダプタは他のUSB-C充電器では使えない
パッケージ
底面に「Manufacture: APE Technology Ltd.」との記載がある。
USB-C充電器本体のレビュー
使用しているテスター(TC66)のAliexpress販売ページ
USB-IF認証が付いていることもあり, 5Vも3Aで, 規格違反は見られない。
PDOは本体の印刷のとおり, 5V, 9V, 12V, 15V, 20V であった。PPSには対応していない。
USB-C→PC電源端子アダプタのレビュー
- 他のUSB充電器(45W)に挿しても変換部の赤いランプが点灯して使えなかった
- e-Markerの付いてなさそうなUSB-Cケーブルを使うと赤いランプが点灯して使えなかった
- PCでしばらく使っていると赤いランプが点滅してUSB充電器の出力が5Vになり使えなくなることがあった
要するに
- 付属のUSB充電器とのセットで
- 5A対応の? e-Marker付きのUSB-Cケーブルで
- 最大消費電力が65Wまで?のPCで
しか使えないことがわかった。
あと, 通電するとしばらく15Vがかかったあとに20V超になっていた。
余談になるが, ThinkPad/NECの角型充電端子に変換すると真っ直ぐになってかなり取り回しが悪い。
結局のところこれは何
検索すると APE Technologyの製品紹介ページ が出てきた。説明を雑に読むと, USB-C充電器とPC充電端子変換アダプタの間で通信して, USB-C充電器が適切な電圧(15V, 16V, 19V, 20V)を出力しているようだ。USB充電器とPC充電端子変換アダプタの共通部分の間はPDの標準規格で通信するとして, PC充電端子変換アダプタの共通部分とそれぞれのPC充電端子の間は通信線はないように見えるので, 2線で給電と通信を同時に行う, 鉄道模型におけるDCCのようなことをしているのだろうか。
上に少し書いたが, 旧来のPC向けに適切な電圧を出力するのはUSB充電器側が担っている。標準規格で必須とされている電圧でない16V, 19Vは独自に設定しているようだ。テスターのみを接続してPDOを確認したときは表示されなかったのでSplitted PDOだろうか。
このようにUSB-C充電器側がOptional PDOで適切な電圧にしているので他の充電器ではこの変換アダプタは使用できない。PPSでやっていれば汎用的になっただろうに…
なんでUSB-IF認証を貰えてるの
(標準以外の電圧を喋ることも規格違反ではないが, )Splitted PDOで専用アダプタ以外にはあくまで標準の電圧しか喋らず, また, 認証はあくまでUSB-C充電器単体へのものなのではないでしょうか。USB-Cメスを規定外の端子(例: USB-Aオス)に変換するのは規格違反らしいので。