あおしまの日記

あおしまさんの日記らしいです。個人的に興味がある事を時々書きます。スマートウォッチPebble日本語パックを作成、公開しています。

ADBキーボードUSB変換器(2020年)

ADBキーボード変換器

ATmega32U4周りを調べてQMKという存在にぶち当たりまして、
ADBキーボードをUSBに変換するのもできると知りました。
それ以前ですとTMKという仕組みや、別のコードがあった
ようですが、この2020年的にはQMKなんでしょう、ということで、
QMKな仕組みに基づく、ADB-USB変換を製作してみることにした。
(ちなみに、この記録はMacwayキーボードで書いている。売り飛ばさなくてよかった。)

QMKとは?

自作キーボードと、その基盤としてのATmega32U4向け統一コード集
ということでしょうか?
QMK Firmware - AVR と ARM ベースのキーボード用オープンソースファームウェア

環境整備

とりあえず、変換回路の妥当性を知るためには、開発環境全て必要ではない。

  • QMK Toolkit(キーマップバイナリの書き込みツール)
  • Arduinoドライバ集(QMKの環境整備で出てくる)
  • QMK Configurator(オンラインFirmwareビルドサービス)

もげないProMicroとQMKToolkit

Switch-ScienceさんのもげないProMicroを購入して使おうとしました。
しかし、いくらリセットしてもQMKToolkitが反応しません。
おそらくはベンダーコードあたりで見ているんだろうと思いますが、
反応しないので書き込みができないので、とりあえず何か試しのコードを
LEONARD名義で書き込んだりしたところ、いきなり文鎮化しましたorz

文鎮化からの復活

仕方がないので、ArduinoNanoをArduino as ISP (AVR書き込み器)にして
復活させました。

  • ArduinoIDE環境を整備した上で、以下のものを用意して、一時的に半田付けして書き込み。

ht-deko.com
ht-deko.com

  • LEONARDをはじめ、いろいろ試しましたが、QMKToolboxが反応しないのは変わりないので、結局はProMicroのFirmwareを書き込み。
  • ProMicroのfirmwareを書き込んでも、QMKToolkitは反応しないので、いよいよmsys2から始まる厄介な環境構築が必要かと思いましたが、よくよく考えると「avrdudeが動けばいいんでねえの?」と思い当たり、いろいろ調べ回りました。

( ここが参考になりました。http://riv-mk.hateblo.jp/entry/pro_micro_and_qmk )
そこで、ファームウェア転送を実行する要素がわかりました。

  • WIndows環境ですと、ArduinoIDEのセット中にavrdudeが入っている!
  • avrdude.confもある
  • プラットフォームはatmega32u4 (-p)
  • ProMicroでは、書き込みはavr109と指定するっぽい (-c)
  • リセットした時に使うポートはCOM8(これは私の環境での話)(-P)
    • Macの場合は/dev/ttyXX?とかになると想像
  • 速度は19200で十分(-b)
  • 書き込みファイル(hex)は -U flash:w:(ファイルの置き場所とファイル名) で指定
  • 以上をエディタで各自環境に合わせて編集、数珠繋ぎして、コピペできるようにしておきます。
(置き場所)¥arduino¥hardware¥tools¥avr¥bin¥avrdude
-C(置き場所)\Arduino\hardware\tools\avr/etc/avrdude.conf
-p atmega32u4 
-c avr109 
-PCOM8
-b19200 
-U flash:w:.\converter_adb_usb_default.hex
  • QMKのデフォルトファームウェアは、ここからダウンロードできます。(converter/adb_usbの右のΨのリンク)

qmk.fm

  • コマンドプロンプト(cmd)を起動しておき、
  • USBで繋いで、RST-GNDをピンセット等で短絡させてリセット
  • ProMicroではなく、別のデバイスとして認識されたら、コマンドラインからコピペ実行します。
  • 書き込みがエラーになるのは、ProMicro側が書き込み待ちになっていない場合かCOMポートが違う場合なので、リセットを再度行い、書き込み待ちにしてから上キーで直前に実行したコマンドを呼び出してすかさず再実行するといいです。
  • USBデバイスの名前が「ADB keyboard converter」になれば書き込み成功です。
> C:\Arduino\hardware\tools\avr/bin/avrdude -CC:\Arduino\hardware\tools\avr/etc/avrdude.conf -p atmega32u4 -c avr109 -PCOM8 -b19200 
-U flash:w:.\converter_adb_usb_default.hex  
 
 Connecting to programmer: .
 Found programmer: Id = "CATERIN"; type = S
     Software Version = 1.0; No Hardware Version given.
 Programmer supports auto addr increment.
 Programmer supports buffered memory access with buffersize=128 bytes.
 
 Programmer supports the following devices:
     Device code: 0x44
 
 avrdude: AVR device initialized and ready to accept instructions
 
 Reading | ################################################## | 100% 0.00s
 
 avrdude: Device signature = 0x1e9587 (probably m32u4)
 avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
          To disable this feature, specify the -D option.
 avrdude: erasing chip
 avrdude: reading input file ".\converter_adb_usb_default.hex"
 avrdude: input file .\converter_adb_usb_default.hex auto detected as Intel Hex
 avrdude: writing flash (14770 bytes):
 
 Writing | ################################################## | 100% 1.87s
 
 avrdude: 14770 bytes of flash written
 avrdude: verifying flash memory against .\converter_adb_usb_default.hex:
 avrdude: load data flash data from input file .\converter_adb_usb_default.hex:
 avrdude: input file .\converter_adb_usb_default.hex auto detected as Intel Hex
 avrdude: input file .\converter_adb_usb_default.hex contains 14770 bytes
 avrdude: reading on-chip flash data:
 
 Reading | ################################################## | 100% 0.74s
 
 avrdude: verifying ...
 avrdude: 14770 bytes of flash verified
 
 avrdude: safemode: Fuses OK (E:F3, H:D8, L:FF)
 
 avrdude done.  Thank you.

配線

  • そんなこんなで、書き込みされたら、今度は配線です。
  • 配線はSビデオケーブルと行いました。
  • 結線方法はQMKのadb_usbのところに書かれています。

github.com

  • ProMicroの場合、プルアップ抵抗を先に端子シルク3(PD0)と向かいのVCCとに接続しておくと、配線が楽です。
  • 残り3つの線も配線します。シグナルは3に繋ぎます。*1
  • 配線後に動作確認します。キーボードを繋いで入力を見ます。無事動けばOK。

完成

3Dプリンタで簡素なボックスを作って回路を収めました。
f:id:aoshimak:20200820125136j:plain

カスタマイズ

QMKのメリットはカスタマイズが充実していることです。
QMK configuratorサイトで、adb_usbを選び、カスタマイズを行います。
私の場合はMacwayキーボードがターゲットなので、CAPSをCTRLにし、[~`]とESCを交換、[|¥]を上キーと置き換えた上で、矢印キーをviキーマップに合わせて再配置しました。
これも画面上でドラッグでできるので便利です。
サイト上でコンパイルして出来上がったFirmwareのダウンロードを行い、また先のコマンドを実行して書き込みしました。

*1:最初2に繋いでいて動かないと悩んでましたorz

NewtonキーボードUSB化(2020年)

自作キーボードを作ってみたい!からの変節

自作キーボードを作りたいなあと思っては居るものの、腰が重いところがありまして。

  • スイッチがCherryか、その中華互換かあ、とか、
  • 別に分離じゃなくていいんだけどなあ、とか、
  • 手元のALPSキーボードを自作のためにバラすのも勿体ないなあ、とか、

そんなこんなしているうちに変節してまいりまして、

  • じゃあとりあえずProMicroというか、32U4が乗った基板を買ってみよう、とか、
  • Newtonキーボードの実験台が手に入った、とか、
  • QMKっていう仕組みがあるらしい。予備調査をしてみよう、とか、
  • QMKに、コンバーターとかいうのがあるぞ、とか

そんな延長で、NewtonキーボードのUSB化を調べてやってみましたので、
その記録です。

NewtonキーボードのUSB化

調べてみると、主に2012年ごろ流行ったみたいです。
現在検索した時点で候補は3つ。

1番目の海外のものは、ソースが一部消失してコンパイルできないのと、Teensy意外と割高なので、候補にならず。
2番目のは特にソースもなく、販売の状況も現在よくわからないので、あまり参考にはならず、コネクタなどの部品も多いので、とりあえず方向性の参考程度に。
3番目は、ソースも公開されていて、アプローチもスマートなのでこれを目指して再現することに。

材料

作り方

ハードウェア的には、Riversidesoftさんの通りでOK。

f:id:aoshimak:20200819110458j:plain

ソフトウェア的には、DaVinciをArduino的に使う設定の手順で

  • ArduinoIDEにDaVinciの設定を追加
  • DaVinciの書き込み設定
  • Riversidesoftさんのソースを読み込み
    • ソースそのままだとエラーで止まる。先頭にinclude文を追加した方が良い。(Keyboard.hの導入)
  • コンパイル、転送書き込み

動作確認

ハードウェア的に認識が切り替わるので、そうなるとHIDキーボードとして認識されて使えるようになります。だめならUSB ケーブルの挿し直しで、認識を確認します。
ケーブルと基板は、キーボード内部に固定してあげると収まりが良いです。USBケーブルには、元のシリアルケーブル同様、小さなタイラップを巻いて抜け留めを作ってあげた方が良いでしょう。

ソースの改造

ソースは大まかに、キーボードの定義、NKで始まるNewtonキーボードのキーコードの定義、Shift/Optionキーの押下状態、特別キーの対応、一部特殊キーの読み取りに分かれているので、特別キーの対応を変えたり、`キーを何と組み合わせてEscキーを発生させる方法、などに手が入れられます。

私は個人的な趣味嗜好で、Commandキーの押下状態を追加して、Escをそちらと組み合わせたり、矢印キーの配列をviキーマップ的に並べ替えたり(←↓↑→)しています。キーボードを繋いだ状態のままで、ArduinoIDEからの修正、転送、即書き換え反映ができるので、カスタマイズはやりやすいです。

残念ながら自分にはBSキーの組み合わせでDeleteを生み出すことはできませんでした。(Shift-BSでDelete発生させたいんですが出来ませんでした。)

他の方法

使用基板はDaVinciでもいいんですが、5VなProMicroでも代替可能です。5V,GND,RXの3端子があるものであれば、だいたい使えると思います。ここまで色々な手間をかけずに、差し替えだけで導入できる半完成品が欲しい方がいらっしゃいましたら、コメント欄にご連絡いただければ頒布も可能です。(あと数個分の材料があるので製作可能です。)
f:id:aoshimak:20200819110051j:plain

RaspberryPiを使った動画再生ボックス製作

16:9な動画を流して展示する話が持ち上がり、従来使っていた動画再生ボックスもそろそろ更新するか?という話になったので、いい機会だからRaspberryPiで作ってみようかというのが発端です。
さすがに10年前の4:3映像を今でも流すのも何ですし、流しているテレビはすでにHDMIありの16:9画面なので、自分の頭の体操を兼ねてやって見た記録です。
aoshimak.hatenadiary.jp

条件は?

  • 電気入れたら動画をぐるぐるさせたい。タイマーでブチッと切れたら次回再起動で手間なく管理したい。
  • 全画面で動画を流すので、X動かなくても良い。コンソールで動画流れるならその方が良い。
  • 動画の差し替えが簡単にできる仕組みを考えたい。

機種をどうするか?

RaspberryPi4が出たタイミングなのでもちろんこれにしたかったのですが、2020年6月時点だと諸々の問題点がありました。

動画をどう再生するか問題

  • Raspi3/4は64bit対応OSが出てきたが、コンソール動画再生はVLCに変わっている。CPUパワーで押し切る形だが、動きは良い。ただし発熱すごい。
    • vlcの場合のメリットとしては、m3u形式のプレイリストが使えて、それをループ再生できる。データ領域にplaylistを置いておき、それを指し示して-Lでループさせると便利。-Rだとプレイリストの先頭のものだけ繰り返すので1ファイルの繰り返しになってしまうので注意。
  • Raspi1/2/3は従来の32bitOSを使えて、コンソール動画再生はomxplayerを使用する。素晴らしいライブラリだが、64bit環境には移植されない方向。発熱は少ない。

github.com

  • omxplayerはRaspi1/2/3どれでも、用意した5分/45MBのmpeg4をぬるぬる再生できた。しかし、動画のローディングは機械のCPU能力に比例した。複数動画の切り替わりにはRaspi3の方が向いている。

動画をどう配置するか問題

  • SDカードを使い捨てと割り切って、RaspiのSDカード内に専用区画を作って、そこに動画を置くことにした。
  • 専用区画をFAT32にすることで、このSDカードをパソコンに差し込めば、目的の区画へのファイル出し入れは簡単に行えるようにした。
  • 具体的には、32GBのSDを用意し、RaspiOSを書き込み直後、gpartedなどでOSエリアを後ろ16GBに移動拡張した。
  • すると、boot領域の区画1と、後ろ16GBの区画2の間に、15GB強の領域が設定できる。ここをFAT32の区画3として確保する。(これもgpartedでやった)
  • そのあと、RaspiOSを起動する。
  • ディレクトリ/mnt/dataを作成する。ここにデータ領域をマウントさせたい。
  • /etc/fstabに/dev/mmcblk0p3のマウント情報を書き足す。形式vfat、partuuidXXXXX-03としておくと楽。もちろん自動でマウントさせたい。(noautoつけない)

自動再生のためのお膳立て

  • raspi-configで起動レベルをコンソール+自動ログインに設定。アカウントpiの自動ログイン。キーボード繋がないし、networkも繋がない、普段隠して置く展示機なのでこれで良い。
  • アカウントpiの.bashircの末尾に、動画再生スクリプトの実行のために、sh movieplay.shみたいな行を足しておく。
  • movieplay.shの内容は以下の通り。内容はここから拝借。

nomolk.hatenablog.com

 #!/bin/sh
 
 setterm -cursor off -blank 0
 VIDEOPATH="動画ファイルのディレクトリ" 
 SERVICE="omxplayer"
 
 while true; do
         if ps ax | grep -v grep | grep $SERVICE > /dev/null
         then
                 sleep 1;
         else
                 for entry in $VIDEOPATH/*
                 do
                         clear
                         omxplayer --refresh -o both $entry > /dev/null
                 done
         fi
 done
    • キーボードも繋がないので、省電力設定が働いて表示が出なくなった。対策として、settermの行に-blank 0を足してある。

設置

  • 最終的には手元に余っていたRaspi1(mpeg2アクセルコードあり)を利用することにした。
  • コンセントにタイマーを置き、そこから延長コードで2口に分け、テレビとRaspiにつないだ。
  • HDMIケーブルでRaspi-TVを接続
  • SDカードを差し込んで、起動。
  • 一定時刻になると再生を開始し、一定時刻になると電源が落ちる。

追記

  • 結局Raspi4買っちゃったので、それはそれで、KODI用にセットしてみた記録

  • HDMIケーブルがmicroHDMIになった。変換ケーブルで対応した。
  • 電源がUSB-Cになった。microB-USBC変換コネクタで対応した。
  • 電気を食うデバイスを使わないので、電源は従来から使っている2.1Aのものをそのまま使ったが、KODI動画再生には問題なかった。
  • 2020年6月現在だと、LibreELEC−64bitではRaspi4のCEC対応がない。リモコンを別に用意することになる。今後の対応に期待して待ち。
  • Raspi4は発熱がすごい。ファン導入も検討したが居間に置くので音が出るのはやめた。全身放熱フィンのようなケースを用意した。Amazonに似たようなのが多いので、日本国内から送られる物を探すと良い。*1

  • 同じSDカードをRaspi3に差し込んでもLibreElec−64bitが起動した。こちらはCEC対応もあり、動画再生能力も向上した。32bitの時に比べて、NASにある生TSの倍速再生でストレスがなくなったので、今のところはこれでいいやということになった。

Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品

Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品

  • 発売日: 2016/02/29
  • メディア: Tools & Hardware

*1:自分はAliから買った。5月末〜6月ごろはAmazonに中華からの物品が軒並み品切れ、またはバカ高になっていた。コロナの影響と、大規模な関税脱税の反動で中国→日本の物流が滞っていたタイミングだった模様。それとAmazon側のサクラチェッカー対策での中華出品者のFBA移行が組み合わさって、日本国内の在庫がなくて軒並み売り切れか、中国発送のものしかない状況に当たってしまっていた。そこで、源流であるAliに探しに行って購入した。6月頭に買って、6月末に到着。

scrapboxのbookmarkletを改造した

scrapboxをブクマ以上web情報蓄積未満として有効活用したいと考えて、scrapboxbookmarkletを改造した。

  • 日付を入れた箇条書きのために先頭に空白を入れてある
  • 日付、タイトルで1行、なぞった部分のテキストをcode:txtで囲ってその下に格納する
  • 1ブクマ1ページではなく、bookmarkというページに追記していく形式
    • 必要だったらなぞってNewPageすれば個別ページにできるので、自分的にはこれでよい。

コードは以下の通り。改行を取って数珠つなぎにしてbookmarkletにすると動作する。
最後の出力行のURLを自分の使っているscrapbox名に書き換えること。

 javascript:(function(){
 var title=document.title.replace('[','').replace(']','');
 var url=window.location.href;
 var lines=['','['+url+']'];
 var quote=window.getSelection().toString();
 if (quote.trim()){
 lines=lines.concat('code:txt');
 lines=lines.concat(quote.replace('\r','').split(/\n/g).map(function(line){return ' '+line}));
 }
 lines.push('');
 var body=encodeURIComponent(lines.join('\n'));
 
 var dt = new Date();var year = dt.getFullYear();var  month = ("0"+(dt.getMonth() + 1)).slice(-2);var  date =  ("0"+dt.getDate()).slice(-2);var makedate = year+'-'+month+'-'+date;
 
window.open('https://scrapbox.io/(scrapbox名)/bookmark'+'?body= '+makedate+' : '+title+body);}
 
 })();


サイト名やURL、条件によって、追記先を分けようと思えば分けることもできるので、分野ごとのページなどに分けると便利だったりします。

ScrapboxにInterWikiっぽいものを入れてみた

過去Wikiデータの再活用

別のscrapboxページに過去のWIkiデータをimportしたものを持っているのだが、その時点でInterWikiがリンクにならない事が不便であった。

aoshimak.hatenadiary.jp
aoshimak.hatenadiary.jp


特に、本の情報にAmazonのリンクと書影をつけていたのが、すぐ飛べない、書影が出てこないのがどうにも惜しい。そこで、とりあえずjavascriptってそれ何おいしいの?というレベルの自分ですが、UserScriptという仕組みを使ってそれっぽい事が出来るか挑戦してみた記録です。

InterWikiとは?

InterWikiとは、Wiki間の相互リンクを簡便化する仕組みです(でした)。例えば「Wikipedia:日本」と書き込むと、InterWikiNameページ内の定義リストを使って内部的に「URL+引数」に書き換えられたリンク( https://ja.wikipedia.org/wiki/日本 )が生成され、これをクリックすると当該ページに飛ぶ事ができた。他の用法としては、他WIkiのページに飛ぶときに、エンコードされたページ名を含むフルURL等だと可読性に乏しく、入力も楽になるために便利に使われた。

また個人的には、「URL+引数」の自動変換で他の一義的なリンクが生成できることから、検索や商品サイト等へのリンク、特に書籍が絡むメモでAmazonのページやGoogleの検索結果へのジャンプを積極活用していた。そうした補完を前提とした形式で記述された記録が手元に残っているが、scrapboxにはInterWikiのようなリンクの自動生成機能がないため、これをUserScriptで補うことで、昔の記録のリンク情報等を再活用したい。

コード

とりあえず、Amazonへのリンク変換を作ってみよう、ということで、右も左も分からないながら作ってみた。
前提として、以下のような記法のデータがあるものとする。Scrapbox内では[]で囲われているが該当するページは無いため、empty-page-linkである事が前提でコードを書いてある。

[Amazon:4-756-10120-8]

Scrapboxで動作させるには、自分ページを作り、そこにscript.jsとして貼り付け、リロードすることで、自分だけにScrapboxに作用するようになる。

現状では課題も多い(後述)

  $('a:contains(Amazon:).empty-page-link').each(function() {
  	//リンクからISBN番号を取得
     var str = $(this).attr('href').replace(".", "").replace("/", "").replace("-", "").replace(/Amazon:(.*)/g, "$1");
  
  	//AmazonのURLを生成
 		var amaurl = "http://www.amazon.co.jp/exec/obidos/ASIN/"+ str ;
 		var img = 'http://images-jp.amazon.com/images/P/'+str+'.09.TZZZZZZZ.jpg';
 	
 		var imgsrc = '<img class="image" src=' + img + ' >';
 		
     //上記で格納した文字列で上書き
     $(this).attr('href', amaurl);
     $(this).text('Amazon-'+str);
     // $(this).html(imgsrc);
 	});

課題

  • javascriptまだまだよくわからん
  • scrapboxの中身もよくわからん
    • これにまつわる事だが、リンク近くをクリックすると書き換えたリンクが元に戻ってしまう問題(重大)
  • 書影出せない問題
  • 他のInterWikiNameに拡張したいけど、汎用性を持たせられないか?
  • InterWikiNameのページを読み込んで、自動変換すれば完璧だが、今の自分にその技術はない。
  • Amazonの書影を取ってきて埋め込みたいが、ASIN一義で画像が取って来れなくなったので、敷居がすごく高くて自分では難しそう。
  • Amazonから書籍メモをscrapboxに貼り付けるbookmarkletのコードをどう活用すれば良いのだろうか?

自作カレンダーについてのまとめ

カレンダーを自作して6年目になりました

2015年に致し方なく始めた自作カレンダー作りも、気が付いたら6回目になりました。

aoshimak.hatenadiary.jp

基本的には自宅、勤務先、身内の欲しい人に配るだけに作っていました。
毎年数枚余るので、今年ははじめて、メルカリでも頒布する事にしました。
余るよりマシかな?と思って、ほぼ実費でお配りしている状態ですが、ありがたい事に数枚出て行きました。
毎年SNSには画像をあげていたんですが、こちらでは特に何も出していませんでしたので、これを機会に
まとめてみる事にしました。

大まかな設計方針

初回の設計方針は以下でした。

  • 数字は手持ちフォントで見やすいということで小塚ゴシックを中心に使用
  • 枠の色合いを暖色系に
  • 西暦と和暦をひと目で見てわかるように(今年は平成何年だっけ?とよく思うので)
  • 土曜日曜祝日を赤青で色分け(本家は青のみ)
  • 仕事上、六曜は欲しい
  • 満月新月の日は把握したい
  • 月末のはみ出た日を/でまとめない

その後、以下の問題がありまして、翌年からは少し方針転換をします。

  • A2/A3で作り分けをすると高い。特にA2の単独印刷は高くつく。
    • A2の時の文字の大きさをA3に詰めたら、A3用デザインひとつで済む
  • アラベール高い。湿気でよれる。
    • 湿気に強く、風合いの良い紙をということで、ここ数年はグランヌーボーに落ち着いています。
  • 六曜は遠くから見たときに日付を見る邪魔にならないように、近くで確認したらわかる程度に。
  • 新月、満月だけで充分で、その中間は要らない。
  • 外枠は明るい2色の濃淡で選んでましたが、2019からは開運カラー?を2つ選んで組み合わせる形に

歴代カレンダー画像

この6年のカレンダーをまとめてみました。
f:id:aoshimak:20200202102622j:plain

2020年のカレンダー

f:id:aoshimak:20191207143245j:plain
f:id:aoshimak:20191207143213j:plain

今年もカレンダーを自作しました。
毎年余っているので、今年はメルカリさんで売ってみる事にしました。
送料込みで300円です。(メルカリの最低出品価格が300円なので)

ご興味がある方はこちらからどうぞ。
https://www.mercari.com/jp/items/m82465863790/

追記

丸めて定形外郵便で送る方針に変えました。
その為、送料が嵩みまして、400円での販売に変わりました。
ありがたい事に、数枚売れました!びっくりです。
まだあります。