ヤマネコ目線

大体独り言、たまに写真その他、レビュー等

キーボードを作ってみる

 これこそ自由研究のお題で書くべきだったと後悔しているが、左手デバイスを自作しようと思って電子工作を始めた。ArduinoLeonard (ProMicro)を使用すれば誰でも簡単にちょっとしたキーボード程度なら作ることが出来る。

 今回は初歩の初歩として3つのキーを打つことが出来るキーボードの作り方について書く。一部ではんだづけが必要になるが何もビビることは無い。やってみれば簡単。火事にならないようには注意。

ざっくりとした流れ

 回路を組む

  ↓

 パソコンでマイコン(マイクロコンピュータ)で動作させるプログラムを書く

  ↓

 マイコンにプログラムを書き込む

  ↓

 スイッチを押して動作チェック

必要なもの

<注意事項>

 使用するマイコンは他のものでも良いが、電圧は5V対応のものを選ぶこと。3.3Vのものを買ってしまうとそのままではUSBでパソコンに繋げない。USB機器の標準電圧は5V。

 タクトスイッチやダイオードAmazonで買ってもいいが結構なボッタクリ価格で販売されているので、秋月電子通商さんから買った方が良い。梱包もかなり丁寧。ただし送料600円がかかる。Amazonでボッタクられるよりはそれでも安い。

akizukidenshi.com

 なお、ダイオードと言うのはざっくり言えば「電流を決まった向きにしか流さない」パーツ。ここから先は一方通行だ!回路は全体的に繋がっているので、流れていない時に流れて欲しくない場所に電気が流れる可能性がある。それを防ぐための部品。ダイオードにも種類があるのだが詳しい解説は省く。LED(発光ダイオード)もダイオードの一種だが主な役割は光ること。ただしちゃんとダイオードなので、向きを間違えると点灯しない。あと電圧高すぎると壊れる。

はんだづけをする

 上に貼ったタイプのマイコンは、まずブレッドボードに差し込めるようにピンヘッダ(付属)をはんだづけする必要がある。

 ブレッドボードはこういう穴がたくさん開いた試作用の板。

 この板の内部は上の図、赤線のように配線が通っている。穴に配線やらパーツやらを差し込むだけで配線ができるので、試作品を作るのによく使われる。

 ジャンパーワイヤーはこんな感じ。これの両端をブレッドボードの穴に差し込んで配線する。ある地点からある地点までこのワイヤーを使ってジャンプするように配線するから”ジャンパー”。

 モノによってはジャンパーワイヤーとパーツの端子を直接はんだ付けする場合もあるかも知れないが、先端のピンに直接はんだ付けしようとしても付かない場合が多い。弾かれる。金属ならば何でも付けられる訳でも無いので、適当なところで切って被覆(表面のゴム)を剥き、内部の配線に直接はんだ付けしよう。ピンの部分に直でやろうとしてもムダ。やった事があるから分かる。

 ピンヘッダはこんなやつ。上に貼ったマイコンはこれの黒い部分が黄色ものが付属している。はんだづけはブレッドボードに刺して行うと安定してやりやすい。こいつはピンに直接はんだ付けOK。

 はんだごては上のものを使用した。温度調整機能つきの方が何かと便利。上のもので370℃に設定しておけばいい。はんだ付けの際などは煙などが出るがそういうもの。アクセサリーセットあるいはスタンド込みで買うことをおすすめする。あと”はんだ”も必須。それが無いとそもそもはんだ付けは出来ない。ペンでいえばインクにあたる。

 あと常識だがはんだごての金属部分は持たないこと。熱くなるので。上のはんだごてで言えば青い持ち手の部分を持つ。

 今回は必要無いが、このようなはんだ付け補助の道具も買っておくと便利。はんだ付けの際は部品はどこかに固定するとして、はんだごて、リード線、はんだの3つは固定しづらい。私は腕が4本ある*1ので大丈夫だが、そうでない人はこういう補助ツールを使った方が圧倒的に作業が楽。

 はんだ付けをした後のマイコン。雑。

 ホットボンドがあれば上の画像、明るく抜いた所を補強しておくと良い。たまにこのUSB端子がもげるらしいので。ホットボンドのスティックは樹脂で絶縁性なので基盤に直接盛っても問題ない。USB端子自体を埋めてしまわないように注意。

 はんだ付けが出来たらとりあえず付属のUSBケーブルでパソコンと接続し、はんだごての熱で基盤が壊れてなさそうか確認する。基盤上に直接載っているLEDが結構眩しい。自分でプログラムすればこのLEDは消灯できる。今回はあえてやらない。調べてみよう。

回路を組む

回路の模式図

 ブレッドボード上で上の図のように配線する。赤線をそれぞれマイコンのデジタルピン2、3、4番に、黒線をマイコンのGNDに。オレンジに黒い帯がついているものはダイオード。向きを間違えないように注意。

Arduino IDEのインストール

 下のリンクからパソコンにArduino IDEという、マイコンに書き込むプログラムを書くためのソフトをインストールする。無料で利用可能。

www.arduino.cc

 下へスクロールしてDownloadOptionsから自分のPCに合わせたものを選んでインストールすること。「Windows Win10 and newer, 64bit」を選ぶとこんな画面が出てきた。余裕がある人は「CONTRIBUTE & DOWNLOAD (寄付してダウンロード)」、そのまま無料ダウンロードしたい場合は「JUST DOWNLOAD」をクリック。

 ネットワークへのアクセスで「プライベートかパブリックか?」みたいな事をガタガタ言われたら「プライベート」を選択。

 初期設定ではあらゆる表示が英語になっている。日本語化は左上の「File」から「Preferences」→「Settings」で「Language」に日本語を選ぶ。別に英語のままでも問題は無い。

 使用するボードは適宜、選んでおく。今回はArduinoLeonardの互換機を使用しているので「ArduinoLeonard」を選択。プログラム自体は変わらないので基本的にArduino系を選んでおけば問題無いのでは?とも思うが。

コードを打ち込む

 最初に書いておくが大文字と小文字は区別される。間違っているとエラーが出るし、Officeのマクロ(VBA)のように自動で修正はしてくれない。

 各行、基本的に終わりにセミコロン「;」を付ける。忘れるとエラーが出るので注意。

 準備が出来たらコードを書いていく。全体像が上の図。はてなブログでコピペ可能なコードの貼り方が分からないのでとりあえず画像で。それぞれの行ずつ説明していくと

#include <Keyboard.h>

 「キーボードとしての機能を含めますよ」という意味。Kは大文字。「#include "Keyboard.h"」でもいける。上に貼った画像ではさっそくKが大文字ではなく小文字になってしまった。注意。

const int KeyIn1 = 2;ほか

 「マイコン2番のピンを変数"KeyIn1"として割り当てます」以下同文という意味。「KeyIn1」の部分は変数の名前なので、自分が分かりやすい文字にしても良い。「Key1」でも良いし「Button1」でも良い。「int」は変数の型。型によって入れられるものとそうでないものがある。

void setup( )  {~}内

 マイコンを動かす際、最初に1度だけ実行される処理を書く部分。最初のセットアップ。

pinMode(KeyIn1, INPUT_PULLUP);ほか

 const intで割り当てたそれぞれのピン2、3、4のモードを「INPUT_PULLUP」に設定する。「OUTPUT」が出力、「INPUT」が入力用のモードで、「INPUT_PULLUP」は「INPUT」に加えてマイコン内部の抵抗を使用するモード。何が良いかというと”INPUT"を使用する場合と比べて必要な部品が減らせる。「INPUT」を使用したい場合、抵抗のパーツが必要(何Ωのが必要なのかは知らん)。

 「PinMode」ではなく「pinMode」なのも注意。中途半端なところが大文字の場合がまあまあある。

void loop ()  {~}内

 void setupの処理が終わった後、この「void loop」内の処理が延々と実行され続ける。マイコンが「キー1は押されてるかな?キー2はどうかな?キー3はどうかな?」と、延々と1秒間にものすごい回数のチェックをし続ける。たまに人間がボタンを押すと、それに反応して処理を行うという感じ。

 処理は上から順に行われるが、マイコンの処理はすごく速いので順番待ちが発生してもそこまで気にならない。その順番をすっ飛ばして最優先で処理を行う「割り込み」というのもあるが今回は割愛する。調べれば割と簡単。

if (digitalRead(KeyIn1) == LOW) {

 if文。KeyIn1、つまり2番ピンがLOWならば{ の後を実行する。「digitalRead(KeyIn1)」はKeyIn1(=2番ピン)の状態を確認します、という意味。確認して「==LOW」なら真、「HIGH」なら偽。

 普通に考えると「(KeyIn1) == HIGH」と書きたくなるが、「INPUT_PULLUP」では部品点数が減らせる一方、この判定が逆転する。スイッチが押されていると「LOW」、離していると「HIGH」。

 「DigitalRead」ではなく「digitalRead」なのも注意。

Keyboard.press ( 'a' )ほか

 if文で( )内が”真”だった場合の処理。キーボードの「a」を押すという処理をしているだけ。今回は単純なコードなのであえて「( 'a' )」のように書いたが、この括弧内を変数にしておくのも手。最初に「const int Char1 = 'a';」などとしておいて、「Keyboard.press( Char1 );」とすれば同じ。

 「変数にする意味ある?」と思うかも知れないが、これがもっと複雑なコードの場合は後から手直しするのに役立つ。

} else {

 if 文の内容が偽だった場合の処理を「else {」の後に書く。「Keyboard.release」はキーボードの特定の文字を離す処理をしているだけ。

 コードを書き終わったらArduinoとパソコンをUSBで接続し、「→」ボタンを押せば書き込みが始まる。問題が無ければマイコンが再起動し、キーボードとして使えるようになる。問題があった場合はエラー文が出るので修正する。大抵は綴りの間違い、大文字小文字が違っているくらい。

 「ツール」から「ポート」を選ばないと書き込めないかも知れないので、エラーが出たら確認する。

 ここまで長々と書いたが、やってみればどうって事はない。簡単な部類。これがモーターを動かすとかロータリエンコーダ(グルグルと回せるつまみ)を使おうだとか言い出すと面倒くさい。特にロータリエンコーダは見た目以上にくせ者でチャタリング(誤動作)が多い。回避するためにはそれなりのパーツが必要と邪魔くさいことこの上無い。

 いずれBluetoothスマホから操作できるラジコンとか作りたいな。

*1:嘘です。AA略