AlT-Modのススメ

おひさしぶりです。

自キー界の皆さんは、市販のキーボードに不満があると、ご自身でキーボードを設計されているかと思います。とはいえ、市販のキーボードは市販のキーボードならではの良さがありますよね?私はもちろん自作のキーボードも使っているのですが、古いFilcoのMajestouch Miniを(前に書いたを改造して )使ってもいます。

ほかにも、HHKB Proとかわりと好きなのですが、好きと普段使いできるかは、また別問題だったりもします。HHKB発案者の和田英一先生のような真のハッカーでしたら、カーソルキーとかいらないんでしょうが、諸般の事情でWordやExcelと長い時間すごさざるをえない、ハッカーどころかIT技術者でもない私には、HHKBは好きとはいえ、常用するにはつらい面があります。特に、カーソルキーがなくて、Fnとのコンビネーションも使いにくいこと、スペースバーがやたら大きいことなどです。(HHKB日本語版があるじゃないか、という意見があると思いますが、タッチタイプをSun3やSPARCstationでおぼえたとか、HHKB初代からのユーザということもあって、HHKBはASCII版しか持っていません。)

一方、最近の自キー界のトレンドをみると、60%や40%キーボードであっても(だからこそ?)、親指で押せるキーを増やして、各種モディファイヤキーやバックスペースに割り当てている方が結構いらっしゃるようです(私もそうしてます)。親指はそんなに器用な指ではないとはいえ、押しやすい位置にスペースバーだけというのも、スペース的にはなんとももったいないですよね。

とはいえ、HHKB Proはキータッチ等、捨てがたいんですよね。

AlT-Mod

そこで、なんとか実質的にキーを増やせないかと考えたのが、今回提案するアルミテープを使ったキーボードのモディファイ方法、名付けてAlT-Mod(Aluminum Tape Modification、あるともっど)です。銅テープだとCuT-Mod(かっともっど)ですかね? 見てのとおりHHKB Proのスペースバーとコントロールキーのところにアルミテープがベタベタと貼ってあります。これとキーボードのUSB端子が、スイッチサイエンスのPicossci USBホストに繋がっています。Picossci側にはせきごんさんのKeyboard Quantizer Miniのソースに少々手を加えて、アルミテープがタッチセンサとして機能するための回路(といっても抵抗だけ)とコードが仕込んであります。Keyboard Quantizerシリーズは、USBキーボードから送られてくるキーコードを適宜変換して、キーをマップを変更するものですが、これにタッチキーを組み合わせて、タッチキーが押されると対応するレイヤに変更するようになっています。

例えば、写真のスペースバーには3個のタッチキーがあるので、同じスペースバーを押しても、押す位置によって、レイヤ切り替えで(通常のスペースを含めて)最大4つのキーコードに変更することができます。(私は、アルミテープを張った部分を、左から全角/半角、Enter、Backspaceに割り当てています。)本来のキーがオンになる前に、必ずタッチキーはオンになりレイヤーが変わるのがミソですね。(触れずに押すことはできないので。)

私としても、この技法を多くの方に試して頂きたいので、情報は公開していきたいのですが、私がGitHubの使い方を良く分かっていないことや、一部のファイルのライセンスが不明なこともあり、ソースの公開は少々お待ちを。 5月の天下一キーボードわいわい会で紹介したかったのですが、当日別の予定があるので行けず。7月に行われるキー部で紹介できればなぁ、と思っています。

QMK Firmware: Understanding Split Keyboards

QMK Firmware での分割キーボードの仕組み

皆さんお久しぶりです。気が付いたら2年以上もブログを放置していました。X(Twitter)では、多少呟いてたりはしてたのですが。

キーボードも細々と作っていまして、先日はキー部7%に作りかけのキーボードを持ち込んでみたりしました。

youtu.be

(Daifuku Keyboard さんのアーカイブです。)

 

パームレストに仕込んだタッチセンサで、キーボードモードとトラックボールモードを切り替える点が意外に評判良くて、ちょっと気を良くしました!が、他の方の作品は、どれも見た目も美しくて、私にはとても無理なので落ち込んだり。

まぁ、何れにせよ刺激になりました。スタッフの皆さん、参加された皆さん、ありがとうございました。

 

さて、この作りかけのキーボードでは、上述のとおりマスタ側である右側のキーボードにタッチセンサを組み込んであるんですが、どうせななら、スレーブ(左)側にもタッチセンサを組み込みたい、と思ったのですが、そもそもQMKでの分割キーボードの仕組みが良く分かっていない。仕方がないので、QMKの関連しそうなソースをちょっと探ってみました。

 

QMKの処理の流れ

まず、QMKの処理の大きな流れは、Understanding QMKに書いてありまして、ざっくり言うと、メインループから、protocol_task()を呼び、そこから、keyboard_task()を呼び、keyboard_task()がマトリクスのスキャニング、マウスのハンドリング、LEDなどのキーボードステータスの処理を行う、とあります。より具体的な関数の呼び出し階層なんかも書いてますが、これはマスタ側の処理で、スレーブ側ではどういう処理をしているのかまるで書いていません。しかも、どういうデータが通信されるのかも書いていません。

で、その辺どうなってるの?というのがこの記事の主旨です。

 

分割キーボードのデータ構造

まず、QMK内部で分割キーボードの各種データはどのような構造になっているか見てみます。

qmk_firmware/quantum/split_common/transport.h

に _split_shared_memory_t という構造体が定義されていて、

typedef struct _split_shared_memory_t {
#ifdef USE_I2C
    int8_t transaction_id;
#endif // USE_I2C

    split_slave_matrix_sync_t smatrix;

#ifdef SPLIT_TRANSPORT_MIRROR
    split_master_matrix_sync_t mmatrix;
#endif // SPLIT_TRANSPORT_MIRROR

(以下略)

といった感じになっています。ここで、smatrixがスレーブ側のキーボードマトリクスの値、mmatrixがマスタ側のマトリクスの値になります。

他のLEDの情報やポインティングデバイス等の情報もマスタ、スレーブそれぞれのデータ構造が定義されています。

マスタ・スレーブそれぞれはこのshared memoryの自信の担当領域にマトリクスのスキャン結果などを書き込んでいき、(必要に応じて)特定のタイミングで他方のマトリクススキャン結果を要求して、送られてきた通信結果をshared memoryに書き込み、その後の処理を行うという流れになります。

マトリクスに関しては、これらのshared memoryのデータは、matrix.c等で用いられる、

extern matrix_row_t matrix[MATRIX_ROWS]; 

に(左、右の順で)マップされていて、マスタ・スレーブのどちらのマトリクスであるか意識することなく、読み出して、それをもとに処理(例えばLED処理)できるようになっています。

マトリクスの値を変更したい場合も、このmatrixのマスタ・スレーブそれぞれの担当の領域に書き込みすれば、他方が読み出した時に、転送されるようになっています。(自身の担当外の領域は、読み出し専用で、書き込んでも、相手側のデータは反映されないようです。)

 

スレーブ側のマトリクススキャン処理の流れ

マスタ側は先に見たようにUnderstanding QMKのとおりなのですが、スレーブ側も基本的な流れは同様のようです。(#defineされた機能の定義によりますが)

マスタと同様、matrix.c の matrix_scan()が呼ばれ、マトリクスをスキャンします。この中で、分割キーボードの場合は、matrix_common.c の matrix_post_scan()が呼ばれ、#defineされた内容に応じて、必要なマスタ側のデータを取得したのち、matrix_slave_scan_kb() が呼ばれ、さらに matrix_slave_scan_user() が呼ばれます。

matrix_slave_scan_user()は

__attribute__((weak)) void matrix_slave_scan_user(void) {}

と定義されているので、ユーザは、このmatrix_slave_scan_user()を(keymap.cの中などで)オーバーライドして、そこでマトリクスに読み書きすることができます。例えば、(マトリクススキャンされない)タッチキーのオン・オフデータをマトリクスに反映させるためには、このmatrix_slave_scan_user()中で、matrixの所望の位置のビットを操作すればよいことになります。

matrix[]のデータの持ち方は、キーボードによりますが、テンプレートから生成されたものの場合、左側キーボードは奥がmatrix[0]で、手前に向かって引数が1ずつ増加、LSBが左端に対応、右側キーボードは左側の次の引数から手前に向かって引数が1ずつ増加、LSBが右端に対応かと思います(たぶん。これはキーボードによるので、適宜確認してください。)

私の場合、この操作でスレーブ側のタッチキーのオン・オフをマトリクスに反映し、マトリクス側のキー操作に対応することができました。

 

マトリクスについては以上ですが、LED等の他の機能についても、QMKは一体型のキーボードを基本としているようで、各機能毎にそれぞれ分割型の処理がそれぞれ実装されており、上のレイヤでは、分割型・一体型の違いを意識させずにプログラミングできるようになっているようです。逆にいうと、スレーブ側でちょっと変わったことをしようとすると、いろいろ調べて自前で実装しないといけないようです。分散型ではなく中央集権的、といった感じでしょうか。(これはこれである意味わかりやすいのですが、個人的な趣味とは違うというか。)

 

 

USB2BT+

f:id:EdoBall:20211031125618p:plain

USB2BT+


Bit Trade One のBTOSショップでハロウィーンセール開催、ということで、USB2BT+

ADU2B02P USB2BT PLUS | Bit Trade One, LTD (bit-trade-one.co.jp)

を買って、長年使ってきたFilco Majestouch Miniに接続して試してみましたので、ちょっとご紹介します。

 

このキーボードは日本語キーボードですが、私は英語キーボード配列に慣れているので、OS(Windows/Mac両方に切り替え機を介して接続)には英語キーボードとして認識させる、というちょっと変わった使い方をしていました。(ハード的に日本語配列のノートPCで、英語配列っぽく使うためにこの手法(配列)に慣れた、というのがこんな使い方をしている大きな理由です。)

さて、右下のあたりに変な(汚いw)キーキャップが見えると思います。これは先日Twitterには書いたのですが、シフトキーとカーソルキー周りの配列を変えるため、3Dプリントしたものです。このMajestouch Mini、元の配列ではシフトキーが一番右にあって、右シフトが押しにくかったんですね。これを改善するため、キーキャップを3Dプリンタでプリントして、基板に物理パッチをあて

元は  \ 上 シ だったものを シ 上 上

    左 下 右        左 下 右 (「シ」=シフトキー)

と配列したものです。シフトキーの幅を右に広げるため、カーソルキーは軸から右にオフセットして配置してあります。押し心地は良くありませんが、そんなに多用するキーでもないので今のところそんなに問題は感じていません。ただまぁ、プリントがうまくいかず、だいぶ見た目が悪いのが難ですが。

 

この改造をした後で、USB2BT+が届いたので、さらに、USB2BT+のReplay Key機能を使って、EmacsっぽいControl-F -> 右などのカーソル移動や、無変換キーをEnter、変換キーをBackspaceなど、EdoBall KB-I で試した親指多用なキー配列を試してみたところ、なかなか使い勝手が良くなりました。作成したReplace Key機能のためのCSVファイルの内容は以下のとおりです。上書きしたControl + (X)はShift + Control + (X)に割り当ててみました。これでも実使用上はあまり問題なさそうです。Kanaキーによる変換モードの切り替えは、ブラウザなど、アプリによってはうまく動かない場合があるようです。

// Emacs Like key bindings          
version 1       // 常に1    
device_bitmap 7       // (7)全デバイス/(1)device1のみ/(2)device2のみ/(4)device3のみ
ctrl_capslock 0       // (1)CTRL/CAPSLOCK入れ替え
// 入力シフト キーコード 出力シフト キーコード    
convert[0] 0x00 0x8B 0x00 0x28 // 無変換   - Enter  
convert[1] 0x00 0x8A 0x00 0x2a // 変換     - Backspace
convert[2] 0x01 0x09 0x00 0x4f // C-f - Right  
convert[3] 0x01 0x05 0x00 0x50 // C-b -Left  
convert[4] 0x01 0x13 0x00 0x52 // C-p - Up  
convert[5] 0x01 0x11 0x00 0x51 // C-n - Down  
convert[6] 0x01 0x07 0x00 0x4c // C-d - Delete  
convert[7] 0x01 0x04 0x00 0x4a // C-a - Home  
convert[8] 0x01 0x08 0x00 0x4d // C-e - End  
convert[9] 0x03 0x09 0x01 0x09 // C-S-f - C-f  
convert[10] 0x03 0x05 0x01 0x05 // C-S-b - C-b  
convert[11] 0x03 0x13 0x01 0x13 // C-S-p - C-p  
convert[12] 0x03 0x11 0x01 0x11 // C-S-n - C-n  
convert[13] 0x03 0x07 0x01 0x07 // C-S-d - C-d  
convert[14] 0x03 0x04 0x01 0x4a // C-S-a - C-a  
convert[15] 0x03 0x08 0x01 0x4d // C-S-e - C-e  
convert[16] 0x00 0x88 0x04 0x35 // kana - Alt + 全角/半角

Replay Key機能だけならArduinoを使えば自分でも簡単に作れそうですが、USB Host Shieldが必要だったりで、結構材料費がかかりそう。なによりコンパクトで、デザインもカッコいいので買って満足な製品でした。(BT機能は今のところ使ってませんが、使うこともあるでしょう。)

A TRRS Cable w/ A OLED Display

最近はわりと快調に使えている、自作キーボード付きトラックボール EdoBall KB-I なんですが、面倒なのでLED等の表示機構を全く付けなかったところ、やはり、レイヤ等の状態の確認に少々不便を感じていました。

f:id:EdoBall:20210920132104j:plain

A TRRS Cable w/ A OLED Display

そんな折、遊舎工房で販売しているOLED DisplayI2Cで制御できると聞き、それなら元々、I2CでPro Micro間の通信をしている自作のKB-I には簡単に追加できるなと思い、このディスプレイ付きケーブルを作ってみました。やってみたら、I2C接続の分離型キーボードなら大概のものに応用できるし、わりと実用的なようなので、作り方を含めて紹介します。ちょっとコツが必要なところもありますが、自作キーボード(キット)を作成し、keymap.cをカスタマイズしたことがある方なら作成できると思います。費用も以下だと千数百円といったところで、手頃です。

 

材料

OLEDディスプレイモジュール(遊舎工房で販売)

https://shop.yushakobo.jp/products/oled

型番等はよく分かりません。コントローラにSSD1306を用いたものなら、Amazonなど、他から入手可能なものでも使えるかも?(自己責任でお願いします。)

 

TRRS(4極)ケーブルな百均イヤホン*2

(私はDAISOのこども用イヤホンを使用しました。TRRSプラグとリッツ線を別に買うより安価で作業が楽です。

f:id:EdoBall:20210920130005j:plain

こども用イヤホン



なお、間違って、最初こっちを買ったのですが、

f:id:EdoBall:20210920130114j:plain

スマートフォンイヤホンマイク

使えなかったので注意!)

 

筐体

私は3Dプリンタでプリントしましたが、アクリル板やプラ板、なんなら厚紙でもOKだと思います。

 

細いハンダ

リッツ線のハンダ付けのハンダは細い方がやりやすいです。

 

必要な工具

自作キーボード組み立てに必要な工具(ニッパー、ハンダゴテなど。)

テスター(クリップがあると楽です。)

 

あった方が良い工具

ワイヤストリッパ

(ニッパーでもいいんですが、こちらを使った方がイヤホンの被覆剥きの失敗が少なくなります。)

 

自動温度調節機能付きのハンダゴテ

(イヤホンに使われているリッツ線のハンダ付けに便利です。)

ホットボンド

 

作業

・まず、イヤホンのケーブルを端子から15〜30cm(お好みの長さ)に切ります。

・ワイヤストリッパを使って、切断端から10-12mmの長さで被覆を除去します。

リッツ線を傷つけないように気をつけてください。

リッツ線の先端部をハンダ付け(予備ハンダ)します。

私は370°Cの高めの温度で作業しました。(リッツ線の皮膜を溶かさないとハンダがのらなため、温度は高め、作業は素早く、の方が良いようです。)

・結線を調べる。

下準備

ここが超重要なところ、間違えやすいところでもあります。

まず、ご自身の分離型キーボードがシリアル接続ではなく、I2C接続されていることをマニュアルやビルドガイド等を参照の上、実機で確認してください。

I2C接続の場合、

https://docs.qmk.fm/#/feature_split_keyboard

にある、下図のように配線されているので、適宜テスター等を使って確認して下さい。

https://user-images.githubusercontent.com/2170248/92297182-92b98580-ef77-11ea-9d7d-d6033914af43.JPG

ケーブルの確認

次に、予備ハンダをしたTRRSケーブルをキーボード本体に繋ぎ、Pro MicroのSDA/(2/PD1), SCL(3/PD0), GND, VCCがそれぞれどの線に接続されているかテスターを使って確認します。

ちなみに、KB-Iのキーボード部はkeebio/Nyquistなので、Nyquistこども用イヤホンの場合は、

赤:GND、銅:VCC、青:SDA、緑:SCL

でした。プラグの端子との関係では、先端からSCL(3、緑)、SDL(2、青)、VCC(銅)、GND(赤)、でした。

このあたり、デファクトスタンダードな結線とかあるんですかね?あれば汎用品が作れるんですが。

f:id:EdoBall:20210920130327j:plain

こども用イヤホンのリッツ線

・調べた結線のとおり、ディスプレイの端子にリッツ線をハンダ付けする。

この時、1組のケーブルのリッツ線は、ディスプレイ側から基板の裏側にとおし、裏側でハンダ付けすると、ディスプレイ面を傷つける可能性が減ります。

温度は高め(私は370°Cにしました。)で、基板とリッツ線を温めて、手早くハンダをあて、リッツ線をなぞるようにハンダゴテを外すと(私は)うまくいきました。

とはいえ、リッツ線のハンダ付けというのは慣れるまでなかなか大変です。初めての方は、別な基板等で練習してからの本番に望むのが良いかも知れません。

もう1組のケーブルは、基板の裏側のハンダ付けした上にさらにハンダ付けします。

・筐体の組み込みと補強。

私は、3Dプリンタで、犬の形をテキトーに作って、ホットボンドで無理やり固定しました(全体的にテキトーで雑w)。この時、ハンダ付け部が断線しやすいので、ホットボンドで補強します。

f:id:EdoBall:20210920130042j:plain

裏側

・ソフトウェアの準備

ソフトウェアは、QMK Firmwareを使っている場合、ドキュメント (https://docs.qmk.fm/#/feature_oled_driver )のサンプルコードを適宜御自身の使っているレイヤーに合わせて変更すれば動くと思います。ただし、QMK Firmwareのバージョンがちょっと古い場合は、

Rules.mk や keymap.c で

OLED_ENABLE

ではなく、

OLED_DRIVER_ENABLE

として下さい。

・完成!

最後にテスターで結線が繋がれているか、ショートしていないかを確認して、TRRSケーブルとして接続します。

f:id:EdoBall:20210920130447j:plain

A TRRS Cable w/ A OLED Display

簡単、とまでは言いませんが、わりと気軽に作れるし、そんなに費用も掛からないので、皆さんもぜひ作ってみて下さい!

小変更

f:id:EdoBall:20210404223955j:plain

キーキャップも3Dプリンタで自作しました。

最近、キーキャップを3Dプリンタで作成するのが流行っているようなので、私もやってみた。とはいえ、単なる13x13x2mmの四角い板。軸はKailh Box Redのデータシート(

https://cdn.shopify.com/s/files/1/3099/8088/files/CPG1511F01S04-BOX_Red.pdf)を見て適当に。これ以上はないというぐらいに、シンプルなキーキャップ。でも、案外打ちやすい。黒青2色なのは、黒のフィラメントがなくなったため。あまりかっこよくないので、黒のフィラメントが手に入ったら作り直そうかと思ってはいる。

QMK FirmwareでのI2C通信

さて、また随分と間が開いてしまってすみません。引き続き仕事が忙しかった&年を取るとなかなか集中力も続かず、なかなか面倒な作業は進みが遅くなりがちです。

さて、今回は、ADNS-5050の使い方( https://edoball.hatenablog.com/entry/2021/01/24/154514 )の続き、I2C通信を使ってQMK Firmware(の動いているProMicro)にProMicro + ADNS-5050を追加する方法について見ていきたい。

I2Cは、QMK Firmwareでの左右分離型のキーボードの接続によく使われているので、概要をご存じの方も多いと思う。ざっくり言うと、バス型のデバイス間通信の規格で、各デバイスはアドレスを持ち、マスタデバイスからのクロックに同期して、マスタとスレイブ間でデータのやり取りをする、というものだ。詳しいことは良い解説ページが幾つもある(例えば、kurobekoblog.com)ので、そちらを参照してほしい。

QMK Firmwareで何かカスタマイズする時は、だいたいkeymap.cを修正すればいいようになっているけど、I2Cで他のデバイスと通信する際もkeymap.cを書き換えるだけで良いようだ。今回はポインティングデバイスの追加なので、追加する内容としては、I2Cとポインティングデバイス関係で、I2Cとポインティングデバイスを初期化し,あとは適宜I2Cを使ってデバイスからのデータを読み込み,ホストにポインティングデバイス関係のイベントを送る、というものだ。

以前書いたADNS-5050コントロール側のProMiciroでは

Wire.onRequest(requestEvent);

という関数で、リクエストイベント関数を登録し、

requestEvent()

関数内で

Wire.write(-mouse_dx);
Wire.write(-mouse_dy);

などとI2Cで送信するデータを登録している。

一方、読み出し側のQMK Firmware側では、メインループから読み出される関数であるpointing_device_task()関数内で、
status = i2c_readReg(I2C_SLAVE_2_ADDR, 0x1, buff, sizeof(buff), TIMEOUT);
といった風に読み出してやればいい。


もう少し、具体的に見てみよう。

#include QMK_KEYBOARD_H
#include <stdint.h>
#include "report.h"
#include "host.h"
#include "timer.h"
#include "print.h"
#include "debug.h"
#include "pointing_device.h"
#include "i2c_master.h"
#include "i2c_slave.h"

// I2C_SALVE_2(8bit address)
#define I2C_SLAVE_2_ADDR 0x20
#define TIMEOUT 100
static report_mouse_t mouseReport = {};

まずは、こののように,pointing_device.h, i2c_master.h, i2c_slave.h などのポインティングデバイスや,I2C関係のヘッダをインクルードしておく。前の記事でADNS-5050コントローラ側のPro Microのアドレスを 7ビットで 0x10と定義したが,QMK Firmware側では8bitで表すので、上の例では
#define I2C_SLAVE_2_ADDR 0x20
と定義している。

次に、ポインティングデバイスの初期化等:

void pointing_device_init(void){
  mouseReport.x = 0;
  mouseReport.y = 0;
  mouseReport.v = 0;
  mouseReport.h = 0;
  mouseReport.buttons = 0;
}

void pointing_device_send(void){
  host_mouse_send(&mouseReport);
  mouseReport.x = 0;
  mouseReport.y = 0;
  mouseReport.v = 0;
  mouseReport.h = 0;
}

pointing_device_task()関数の実装:

void pointing_device_task(void){
  uint8_t buff[4];
  i2c_status_t status;
  int8_t dX, dY;
  static uint8_t prev_buff_state = 0;
  static uint8_t prev_buff_state_touch = 0; 
  static int8_t v_movement = 0;
  static float v_movement_mag = 0.05;
  mouseReport.x = 0; // x方向移動量
  mouseReport.y = 0; // y方向移動量
  mouseReport.v = 0; // 縦スクロール量
  mouseReport.h = 0; // 横スクロール量

// I2Cからの読み出し。
  status = i2c_readReg(I2C_SLAVE_2_ADDR, 0x1, buff, sizeof(buff), TIMEOUT);

  if (status == I2C_STATUS_SUCCESS) { //   正常に読み出せ場合
    dX = (int8_t) buff[0];
    dY = (int8_t) buff[1];
    // ハードウェアスイッチ(3バイト目のデータのLSB)についての処理。
    // オンの時RAISEレイヤをオンにする。
    if (prev_buff_state != buff[2]) {
      if (buff[2] & 1) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
     }
    }
    prev_buff_state = buff[2];
    // タッチスイッチ1(4バイト目のデータのLSB)についての処理。
    // オンの時MOUSEレイヤをオンにする。
    if (prev_buff_state_touch != buff[3]) {
      if (buff[3] & 1) {
        layer_on(_MOUSE);
      } else {
        layer_off(_MOUSE);
      }
    }
    prev_buff_state_touch = buff[3];
    if ((buff[3] & 1) && ((buff[3] & 1<<1) == 0)) { // タッチスイッチ1がオンでタッチスイッチ2がオフの時、x,y 座標の移動量をマウスの移動量にする。
      // mouse x y movement
      mouseReport.x = dX;
      mouseReport.y = dY;
    } else {
      // それ以外の時(タッチスイッチ1がオフ、又は、タッチスイッチ2がオン)のときは、y座標の移動量を縦スクロールの移動量にする。
      v_movement += dY;
      if (abs(v_movement * v_movement_mag) >= 1) {
mouseReport.v = -(v_movement * v_movement_mag);
v_movement = v_movement + mouseReport.v / v_movement_mag;
      }
    }
    pointing_device_send();
  } else {
    // I2C 失敗。
  }
}

前の記事では、ADNS-5050 コントローラ側でのタッチスイッチ関係のコードを省略していたので、上のコードと対応していない点があるが、ざっくりこんな感じで、割と簡単にProMicroとI2C通信ができることがお分かりいただけたかと思う

QIDI TECH X-smartのビルドシートとレベリングペーパ

I2Cの記事を書こうと思いつつも、なかなかかけずにいるので、その前に小ネタ。

私はQIDI TECH X-smartという3Dプリンタを使っている。

http:// https://www.amazon.co.jp/dp/B078Q5HKLR/ref=cm_sw_em_r_mt_dp_AP9BGSFXJCHFPPB0XBQQ

マグネット式のビルドシートと専用のレベリングペーパが付いてきて大変便利なのだが私の使い方が荒いので劣化してきた。新しいのが欲しいと思い、本体を購入したamazon.co.jpを検索してみたところ、在庫切れ。そこで、QIDIのサポートにメールで連絡したら土曜日にもかかわらずすぐ返事が来て、eBayで買えるとのこと。(AliExpressは事前に検索していたのだけれど、eBayは盲点だった。)

https://www.ebay.com/itm/Platform-sticker-PC-board-Magnetic-for-QIDI-TECH-X-smart-3D-Printer-3-pcs-kit/333210500484?hash=item4d94e4bd84:g:-ZgAAOSwqu1atgsw

 https://www.ebay.com/itm/QIDI-TECHNOLOGY-leveling-papers-for-QIDI-3d-printer-One-Piece/333210480489?hash=item4d94e46f69:g:r1EAAOSwf4JdjaI6

2000年代初頭までは海外通販もよく使ってたけど、何時しかamazon.co.jpで事足りるようになり、著名なサービスではあるけれど、eBayはアカウントすら持っていなかった。まぁ、せっかくなので利用してみますかね。