一口3000円以下でキーボードを作る
きっかけ
Novelkeysの送料が最低$15-で高いと思った
単価3000円以下で自作キーボードを作る
- はんだづけセット
- PCB
- キースイッチ
- キーキャップ
- プレート or ケース
どこかのPython課題について
https://twitter.com/y_sni/status/964842009327427584
正規化の前後で変数を使い回しているのが気持ち悪いと思った。P言語の入門なんだからもっとわかりやすい変数名にしてほしい。
書いた(問13-1)
def bloodAB( AA, AB, BB, n ): sum = AA + AB + BB AA /= sum AB /= sum BB /= sum for i in range(0, n): nAA = AA*AA + AA*AB/2 + AB*AA/2 + AB*AB/4 nAB = AA*BB + AA*AB/2 + AB*AA/2 + AB*AB/2 + AB*BB/2 + BB*AA + BB*AB/2 nBB = BB*BB + AB*AB/4 + AB*BB/2 + BB*AB/2 AA = nAA AB = nAB BB = nBB return( [AA, AB, BB] )
コード例ではAB型同士からはAA型, BB型は生まれないことになっている。謎。生物学わからない。
AB型同士からもAA型,BB型が生まれることにすると結果の正規化が必要なくなり, 次世代の確率を次のループの確率に代入するだけの見通しがいいコードになる。 (めちゃくちゃな入力がされる可能性がある最初だけ正規化している)
正規化したいなら〇〇=n〇〇のところでするときれい
(確率の合計を1にすることを「正規化」と呼んでいたが, 本当にそうなのか不安になってきた)
感想
スイッチを交換したキーボードを試すいい機会になった。
https://twitter.com/y_sni/status/964848216263962624
大学生は何らかの繋がりで情報学群生を頼るだろうから, N高のTAにでも応募してみますかね(来学期は忙しいからしない・できない)
学び
メカニカルキーボードのスイッチ交換(続き)
地味〜に進めていたけど, 3日目にしていよいよ進捗しなくなったから諦めて新しいスイッチを取り付けた
右手全部をSpeedSwitchに替えられれば良かったんだが, 5キー残したところでギブアップ
未交換部分の青色LEDが眩しい
感想
- Enterキーが浅くなって良い
- 元のoutemu青軸より静か
- スペックシートからわかる事実だが, Copperスイッチはアクチュエートポイントの後にタクタイルポイントがあるから, 「カチッ」という前に入力される。 気持ち悪いからLiniarスイッチのほうが良さそう
- 押してないつもりなのに入力される事例が多発している
- Uがチャタってる?
- 青軸で入力点の手前まで押しておく癖がついていると, 勝手に入力されて苦労する
- カチッと言うだけで, タクタイル感がないような??
- スペースキーも軸交換すればもっと満足度が上がっただろう
- Magicforce標準のキーキャップはSpeedスイッチへの取り付けが硬い。
これから
はんだづけなしで軸交換できるキーボード良いなあって眺めてる。本体(キーキャップ・スイッチなし)で60ドルだから送料無料なら買っているだろう。
メカニカルキーボードのスイッチ交換
Kailh Speed Switchを使いたいから Magicforce 49key のスイッチを交換しようとした。
使った工具
スイッチ交換に失敗しても自作キーボードの組み立てにも使うと考えて買った。こて先はHAKKOの?900Mシリーズが使えるらしい。
参考
簡単にできるように見えるやん??
過程
1つ目はめっちゃ苦労した
- 300℃くらいでやってたけど, 400℃にしたら吸い取りがうまくいくようになった
- LEDは再取り付けしないことにしてはんだを温めながらドライバーでゴネて外した
- はんだをうまく吸い取れなくて困る
- 400℃だとはんだが飛び散って危ない。
結果
夕食前までの進捗: 5個 (キーが外れたのが嬉しくてSpeed Switchを付けたら外れなくなった……)
進捗です。完成品キーボードのスイッチを交換するのはとても大変だとわかった() #自作キーボード pic.twitter.com/xAY6eNl234
— 倫理観なんてない (@y_sni) 2018年2月15日
今日の進捗: 14個
中華の吸い取り器ではなくちゃんとハッコースッポンを使ったらもう少しうまくいくのかな? 吸い取り口の内径は3mmだから変わらなそうだけど。
吸い取り方が雑で導通しなくなったのではないかと懸念していたが, ブレッドボード用のジャンパワイヤで短絡したらスイッチを外した全キーちゃんと反応していた。もう少しがんばってみるか……
あと3分の2じゃん!! すぐできそう!!
余談
はんだ吸い取りがうまくいくと現代芸術のようになる
世界一簡単な5000兆円ほしい!ボタンの作り方
5000兆円ほしい!ボタンができた pic.twitter.com/m8xobMRDRa
— 優しく殺められたい (@y_sni) 2018年2月3日
ブレッドボードビュー
コード
layout.write()
の引数に"\n"
を入れるとEnterキーを押す扱いになるらしい。
from digitalio import DigitalInOut, Direction, Pull import touchio import board import time from adafruit_hid.keyboard import Keyboard from adafruit_hid.keycode import Keycode from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS buttonpin = board.D0 kbd = Keyboard() layout = KeyboardLayoutUS(kbd) button = DigitalInOut(buttonpin) button.direction = Direction.INPUT button.pull = Pull.UP led = DigitalInOut(board.D13) led.direction = Direction.OUTPUT time.sleep(5) print("Waiting for button presses") press = False; while True: if not button.value: if not press: led.value = True layout.write("5000chouenhoshii! \n\n") press = True #kbd.press else: if press: press = False led.value = False time.sleep(0.01)
ProMicroでポインティングスティックを作った
動作
- ジョイスティックを傾けるとマウスポインタがその向きに動く
- 2番ピンのボタンを押すとジョイスティックの初期位置がリセットされる
- 3番ピンのボタンを押すとジョイスティックを傾けた方向にスクロールする
- 4番ピンのボタンでマウスの左クリック
配線図
使ってるジョイスティックがライブラリになかったため, テキトーに繋いでる。
コード
#include "Mouse.h" const int _UDPIN = A2; // UD入力 const int _LRPIN = A1; // LR入力 //const int _SWPIN = 7; // デジタルピン const int RESET_PIN = 2; const int CENTER_PIN = 3; const int CLICK_PIN = 4; int range = 12; int responseDelay = 20; int threshold = 1; int center = range / 2; int init_lr = 512; int init_ud = 512; char scroll_count = 0; void setup() { Serial.begin(9600); // pinMode(_SWPIN,INPUT) ; pinMode(RESET_PIN, INPUT_PULLUP); pinMode(CENTER_PIN, INPUT_PULLUP); pinMode(CLICK_PIN, INPUT_PULLUP); init_lr = analogRead(_LRPIN); init_ud = analogRead(_UDPIN); Mouse.begin(); } void loop() { if(digitalRead(RESET_PIN) == LOW) { init_lr = analogRead(_LRPIN); init_ud = analogRead(_UDPIN); } int ud = readAxis(_UDPIN, init_ud); int lr = -readAxis(_LRPIN, init_lr); Serial.print("UP-DOWN:"); Serial.print(ud, DEC); //DECは10進数フォーマットを表す Serial.print(" - Left-Rright:"); Serial.println(lr, DEC); // if (digitalRead(_SWPIN) == HIGH) { // Serial.println("switch on"); // } if(digitalRead(CENTER_PIN) == LOW) { if( scroll_count == 3) { Mouse.move(0, 0, -lr); scroll_count = 0; } else { scroll_count++; } } else { Mouse.move(ud, lr, 0); } // read the mouse button and click or not click: // if the mouse button is pressed: if (digitalRead(CLICK_PIN) == LOW) { // if the mouse is not pressed, press it: if (!Mouse.isPressed(MOUSE_LEFT)) { Mouse.press(MOUSE_LEFT); } } // else the mouse button is not pressed: else { // if the mouse is pressed, release it: if (Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } } delay(responseDelay); } int readAxis(int pin, int init) { int reading = analogRead(pin); // reading = reading * range / 1023; // int distance = reading - center; int distance = NumLog( reading - init ); if( abs(distance) < threshold ) { distance = 0; } return distance; } int NumLog(int i) { int tei = 2; int sign = 1; if(i<0) { sign = -1; i = -i; } int j=0; for(; i>tei; j++) { i /= tei; } return sign*j; }
ちょっと長い区間の乗車券を買うことで往復割引の有効期間を延ばす
東京都区内から善通寺までは791kmで往復割引乗車券の有効期間が10日間になりギリギリ使えなかったが, あと9km付け足せば有効期間が12日に伸びて使うことができる。
さらに区間を秋葉原を通る経路で東京都区外側に伸ばせば秋葉原での下車を途中下車扱いにできる。600km超だと運賃計算のキロ数が40kmごとに区切られているので思いの外遠くまで同じ運賃で行くことができる。
今回は南浦和経由で南流山まで買うことにした。越谷レイクタウンや新三郷で途中下車できる。 時間があるかは別の問題
往復割引乗車券の有効期間が少し足りないときは乗車券の購入区間の延長を検討してみるといいと思う。
ツイートまとめ
東京都区内から実家最寄りまでが790kmなのであと10km足せば往復乗車券で帰省できることになる。丸亀―児島間の坂出経由を考慮しない計算特例を利用しなければ800kmになってちょうどいいんだが……
— 留年確定しました (@y_sni) 2017年12月14日
800km鉄道で移動するのが頭おかしいですね
— 留年確定しました (@y_sni) 2017年12月14日
松戸(東京都区外)発着の乗車券を買って東京や秋葉原で"""途中下車"""したいですね
— 留年確定しました (@y_sni) 2017年12月14日
600km超の長距離においては運賃が40kmごとに離散化されているので813kmの松戸駅からでも824kmの新三郷駅からでも同じ運賃で乗ることができる
— 留年確定しました (@y_sni) 2017年12月14日
乗車券で途中駅から乗れる規則は第148条3項でした。
— 留年確定しました (@y_sni) 2017年12月14日
JR東日本:旅客営業規則>第2編 旅客営業 -第4章 乗車券類の効力 -第1節 通則 https://t.co/SMcxofwgtv
840kmまでの範囲で南流山→南浦和→東京を追加できるらしい
— 留年確定しました (@y_sni) 2017年12月14日