製作動機
プログラムなどをするときに、ノートパソコンなどの一部のPCやキーボードでは上部キーでの入力で数列の入力に難があったり、日本語入力時に全角表示になってしまうためスマート?ではありません。
しかし、市販のキーボードは高い物は良いのでしょうが低価格帯だと厚さがあり持ち運びに難があります。
ただでさえ13Inchのラップトップに外付けM2、M570にバッテリと持ち運ぶのにこれ以上は増やせません。 どこからか「PC買い替えなよ」と言われた気がしましたが誇り高きsandyおじさん(おじさん?)な私は意地でもsandyを使います。 バッテリ持ちが悪いならPDで充電するので問題ないです(あります)
設計条件
HWの設計条件として以下が挙げられました
- 大型の場合は本体を複数のASSYで構成し、分割運搬できること。または厚さが25mm以下の物
- 検知方式は厚さの関係上、静電容量式無接点方式、静電容量式、パンタグラフとする。
- 有線接続とする(バッテリ充電が面倒)
- そうそう壊れない
- 基本持ってなさそうでロマンがある物
↑ここ重要
材料選定
パンタグラフについてはCAD起こして3Dプリンタの予定でしたがプリンタの調整は当たってうまく印刷出来ていたのですが組立てが無理でした。諦めます。
静電容量無接点式は、名前がかっこいいですね厨二心くすぐられますが現実問題コスト考えて却下
静電容量式は何となくフラットな板をタッチすれば入力ができるイメージでカッコいいですし、チップが大陸産でとてつもなく安いので採用。
薄くもできるし加工も楽
(なにより某「魔法で隣国の港を一人の高校生が破壊する俺TUEEEE系」アニメでタッチパネルキーボードが出ててアリだな と思ったのも要因の一つ)
arduinoはHIDが付いてるので楽
使用部品
スイッチ | TTP223系列チップ搭載センサ |
---|---|
制御基板 | Arduino pro micro互換品 |
ボディ素材 | アクリル板3mm |
塗料 | Mrカラーブラックつや消し |
製作過程
まず大陸産なので動作確認をします。センサ自体はGND IO VCCの三つで非常に単純です。
ジャンパ設定次第ではモーメンタリ動作やオルタネイト動作と切り替えることが出来ます。非常に便利です。
また、反応しているときは本体に搭載されているLEDが光るので検証も楽です。
pro microはドライバをどこからか拾ってきていた当方は問題ありませんでしたが無い場合は拾って入れておきましょう
アクリルは1mmでも良い気がします。ただ、微妙に感度が高すぎる気がするので3mm推奨です。間にPPのシートを挟んで距離調整すれば使えるかもしれません。
自分はコンターが使えたので3mmのアクリルを採用し、コンターでバリバリ切ってました。穴あけはボール盤でも良いのでしょうがケガキが面倒なのでNCフライスでぱぱっと開けていきます
この時回転数高いと溶けます。やっぱり樹脂ですね
キー配列とキーの刻印はCNCで付けようか悩んだのですが9のバランスが悪かったり;と:の表現が出来なかったので止めました。近くのローソンでシールプリントが良いと思います。
配線は適当に組んでも動きました。回路図と言えるほどの回路でもないです。
今回は空中配線をしたのでごっちゃごちゃになりました。
見苦しいし汚いです。次回があれば基板を使います
Arduino に書き込むプログラムは
スケッチ例→09 USB→キーボードにあるライブラリをベースにコピペを繰り返します
しかし、これではうまく動作しませんでした。チャタリングのようなものが発生します
その為以下の関数を使いました
- delayの追加
- Keyboard.releaseAll();(全てのキーがクリアな状態)
- 長押ししないキー(;など)はKeyboard.write()を使用
- Keyboard.press()により押している時間処理を行う
これらの追加で実用性が担保できた。
また、コマンド操作のショートカットなども割り振れる。
例えばctrl Alt Del や ママキタボタンことWINDOWSキー+D。エスケープ押せば緊急回避あるだろっていうゆずそふとファンの皆様には必要ないかもしれないですが。
if(digitalRead(SW1) == HIGH){
Keyboard.write(0xC5); //F4
delay(120);
↑これの組み合わせです。
これはF4 の入力例です。
アスキー以外にも英列認識なのでキーには注意が必要です。
Keyboard.press(KEY_LEFT_GUI); // 緊急回避
Keyboard.press('D');
Keyboard.releaseAll();
delay(120);
delayについて
他の型の制作例を拝見させていただくと、どうやらdelayは100が相場らしいですが100だとなぜか荒ぶります。自分の場合だけっぽいので個体差なのかもしれません。個体に合わせて流動的に数値は変えてみてください。
感想
これを書くより
作る方が
楽です
それぐらい簡単なのでぜひ一度チャレンジすることをお勧めしますがヤル気が起きてパーツを大陸に発注すると1か月かかるのでそのころには熱が冷めてしまいます
悲しいですね。
シールは実はまだ作ってません.... 出来たら改めてアナウンスするかもしれませんがシール紙印刷代の2.5PIC(250円)が高く感じてしまいなかなかできない次第です
参考文献
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/
Arduino公式
https://qiita.com/MergeCells/items/17bdc1c1fb35949195b5
qiita.com様
追記
2021/2/26 使用したプログラムを張っておきます
#include "Keyboard.h"
void setup() {
arduino:Lチカの例
#define LED_PIN 13
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
``` Keyboard.begin();
pinMode(0,INPUT);
pinMode(1,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(16,INPUT);
pinMode(14,INPUT);
pinMode(15,INPUT);
pinMode(18,INPUT);
pinMode(19,INPUT);
}
void loop() {
if(digitalRead(0) == HIGH){
Keyboard.press(0x38);//8
delay(100);
Keyboard.releaseAll();
while(digitalRead(0) == HIGH);
}
if(digitalRead(1) == HIGH){
Keyboard.press(0x36);//6
delay(100);
Keyboard.releaseAll();
while(digitalRead(1) == HIGH);
}
if(digitalRead(2) == HIGH){
Keyboard.press(0x32);//2
delay(100);
Keyboard.releaseAll();
while(digitalRead(2) == HIGH);
}
if(digitalRead(3) == HIGH){
Keyboard.press(0x33);//3
delay(100);
Keyboard.releaseAll();
while(digitalRead(3) == HIGH);
}
if(digitalRead(4) == HIGH){
Keyboard.press(0x28);//)
delay(100);
Keyboard.releaseAll();
while(digitalRead(4) == HIGH);
}
if(digitalRead(5) == HIGH){
Keyboard.press(0x34);//4
delay(100);
Keyboard.releaseAll();
while(digitalRead(5) == HIGH);
}
if(digitalRead(6) == HIGH){
Keyboard.press(0x35);//5
delay(100);
Keyboard.releaseAll();
while(digitalRead(6) == HIGH);
}
if(digitalRead(7) == HIGH){
Keyboard.press(051);//(
delay(100);
Keyboard.releaseAll();
while(digitalRead(7) == HIGH);
}
if(digitalRead(8) == HIGH){
Keyboard.press(0x37);//7
delay(100);
Keyboard.releaseAll();
while(digitalRead(8) == HIGH);
}
if(digitalRead(9) == HIGH){
Keyboard.press(0x39);//9
delay(100);
Keyboard.releaseAll();
while(digitalRead(9) == HIGH);
}
if(digitalRead(16) == HIGH){
Keyboard.press(0x31);//1
delay(100);
Keyboard.releaseAll();
while(digitalRead(16) == HIGH);
}
if(digitalRead(14) == HIGH){ // デスクトップの表示
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('d');
delay(100);
Keyboard.releaseAll();
while(digitalRead(14) ==HIGH);
}
if(digitalRead(15) == HIGH){
Keyboard.press(0x3B);//;
delay(100);
Keyboard.releaseAll();
while(digitalRead(15) == HIGH);
}
if(digitalRead(18) == HIGH){
Keyboard.press(0x2E);//.
delay(100);
Keyboard.releaseAll();
while(digitalRead(18) == HIGH);
}
if(digitalRead(19) == HIGH){
Keyboard.press(0x30);//0
delay(100);
Keyboard.releaseAll();
while(digitalRead(19) == HIGH);
}
delay(100);
}++
投稿者の人気記事
-
sycom2600
さんが
2021/02/24
に
編集
をしました。
(メッセージ: 初版)
-
sycom2600
さんが
2021/02/26
に
編集
をしました。
-
sycom2600
さんが
2021/02/27
に
編集
をしました。
ログインしてコメントを投稿する