最近のマイブームは電子工作なgoldear@goldear820です。
以前に左手デバイスのキットを組み立ててから、キットではなく自力でキー入力可能なデバイスを作れないか検討しました。
ハードウェア、ソフトウェアと広く浅い知識で作れそうなので、まずはマイコンボードの取り扱いについて基礎的知識を身に付けるべく、先人の知恵も借りつつ実践で勉強してみました。
目次
マイコンボード
マイコンは「Micro Controller」や「Micro Computer」の略称で、電気機器の制御に使用されるコントローラーです。「何かしらを入力すると、何かしらを出力する」動作を行います。
ここでは、キーボード入力を例としており、3つのキースイッチの入力パターンをマイコンが判断して、入力デバイスに対して判断結果を出力します。
入力パターンは全8通りあり、その内の1パターンである(SW0=1, SW1=0, SW2=0) をマイコンに入力すると、マイコンは”A”と判断して、入力デバイスに出力します。マイコンの判断はプログラミングでいかようにも変更できます。
自作キーボード界隈では Arduino Leonardo の互換ボードや RassberyPi Pico (RP2040) が使用される傾向にあり、私も Arduino 互換ボードで勉強を進めます。
Sparkfun製 promicro
日本の自作キーボードで主流なマイコンボードであるSparkfun製の「promicro」です。
ArduinoはOSS(Open Source Software) & OSH(Open Source Hardware)であるため、Arduino以外から互換ボードが多数作成されています。Sparkfun製 promicro もその一つです。
ベースとなったArduino Leonardo と比較すると非常に小さいボードになっています。
promicro互換ボード
Sparkfun製のpromicroをさらにベースにした互換ボードが存在します。オリジナルSparkfun製promicroと比較すると、値段が半額以下と非常に安価です。
ただし、オリジナルpromicroから電源回路周辺が変更されていることがあり、突っ込んで調べていくと混乱すること間違いなしです。悪く言えばコピーのコピーなので回路図も公開されていません。
私は自作キーボード関連の製品を販売する遊舎工房さんで購入しているのですが、詳細仕様は記載されていません。仕様として USB Micro B、ATmega32U4、5V/16MHz と記載されていますので、分かる人が見れば十分なのかもしれない。
勉強用なので、まずは安価なpromicro互換ボードで十分です。Amazonでもpromicro互換ボードは購入可能なので、入手性も良いです。
キースイッチ入力
マイコンの信号入力は、しきい値以上の電圧が入力されるとHIGHレベル、しきい値未満の電圧が入力されるとLOWレベルと認識します。頭空っぽで考えると以下の図のように回路を組めば入力できるはず。。。
SW0を押した時はVcc(正電源電圧)がマイコンに入力されますが、SW0を押していない時はマイコンの入力が「浮いた」状態になります。
マイコンは入力電圧からHIGHレベルなのかLOWレベルなのか判断できず、ノイズ等で動作が不安定になります。
マイコンへの入力電圧はVcc, GNDどちらかにする必要があり、そのためにプルアップ抵抗/プルダウン抵抗を回路に追加します。
プルアップ抵抗
R1がプルアップ抵抗、R2がマイコンの内部抵抗です。実際promicroのR2は数十kΩですが、理論上R2はR1よりも大きな抵抗値を持つと考えます。
SW0を押さない時、R2でVccの電圧降下が発生して、R1ではほぼ電圧降下が発生しません。そのためマイコンの入力電圧はVccとなります。
SW0を押した時、R1でVccの電圧降下が発生して、R2では電圧降下が発生しません。マイコンの入力電圧はGNDとなります。そもそもSW0を押したらGNDと直結します。
後述するプルダウン抵抗を追加する方法もありますが、プルアップ抵抗を追加する方法の方がよく見かけます。
プルダウン抵抗
SW0を押さない時、R1,R2では電圧降下が発生しません。そのためマイコンの入力電圧はGNDとなります。
SW0を押した時、R1,R2でVccの電圧降下が発生します。そのためマイコンの入力電圧はVccとなります。そもそもSW0を押したらVccと直結します。
キースイッチ DIP化
キースイッチはブレッドボードには実装することができないため、DIP化基板にキースイッチを実装してブレッドボードで使用できるようにします。
私が知る限り、DIP化基板は個人で作成されているものを購入するしか入手方法がありません。今回はBOOTHで販売している kotohさん作成のkeyBread v2 scone を購入しました。
あとは魔界鍵盤製作所さん作成の 無限の可能性 でも同じ事はできるかもしれないです。
1枚で25キー分になります。表面実装タイプのダイオードと、LEDを取り付けることができます。
もともとLEDで光るのは好きではないので、今回はLEDは実装せずにダイオードのみ実装します。ダイオードの実装は必須です。
ブレッドボードで使用するため、スイッチ毎に切り離しました。カッターで切り目を入れて、折り曲げると簡単に切り離しできます。
ブレッドボードに足を挿して、その上に基板を載せて固定します。表面実装タイプのダイオードは初めてハンダ付けしたのですが、少し手こずりました。
ダイオードは極性があるので、実装には注意が必要なのですが、いかんせんダイオード表面の印字が見にくい。。。
全くハンダ付けしたことない人は多分無理ですね。
キースイッチと足をはんだ付けして完成です。なかなか良い感じですが、果たしてスイッチとして問題なく動作してくれるのだろうか。
私は形から入る方なので、キースイッチを使用しましたが、タクトスイッチのほうが手軽かつ安価に実装できます。
回路設計
回路設計ツールは Fritzing を使用します。2020年頃に有償化されたらしいのですが、Githubに公開されている旧バージョンはダウンロード可能なので、そちらを利用します。
ブレッドボードの実装図です。赤線:Vcc, 黒線:GND, 青線:マイコン入力, 黄線:マイコン出力 で結線しています。キースイッチは特殊なので代替品のタクトスイッチを利用して記載しています。
2つあるスイッチのうち、どちらかのスイッチを押すことでLEDが光る回路です。
ブレッドボード実装の電子回路図になります。プルアップ抵抗回路をよく使うと前述しましたが、今回はプルダウン抵抗回路で作ってみました。抵抗値は適当です。手持ちの10kΩを使用しています。
プログラミング
キースイッチを押したときの動作をプログラムします。統合開発環境はArduino IDEを利用します。Arduino社以外のマイコンボードでも利用でき、マイコンボード情報を追加することで promicro も利用できます。
Arduino IDE
まずは Arduino IDE をダウンロードします。Windows, MacOS, Linuxで利用可能なので、環境に合わせてダウンロードしてください。
インストールが完了したら、promicro を利用できるようにボード情報を追加します。「ファイル」->「基本設定」に進みます。
「追加のボードマネージャのURL」から以下のURLを追加します。
“https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json”
SparkfunがArduino IDE向けボード情報をGithubに公開しているので、そこから情報をもらってきます。
左の上から2つ目のアイコンをクリックして、ボードマネージャを開きます。「Sparkfun AVR」と検索するとSparkfun製のマイコンボード情報を一括インストールできます。
使用するボードを設定します。「ツール」-> 「ボード “XXX”」->「Sparkfun AVR Boards」->「Sparkfun Pro Micro」を選択します。
promicroには「3.3V, 8MHz」と「5V, 16MHz」の2種類のプロセッサタイプがあります。間違えて書き込むとリセット処理をしないと復旧しなくなり面倒なことになるので、購入したpromicroがどちらなのか確認してから設定します。
互換ボードでも、こちらの情報は必ず明示されています。ボード上から読み取ることもできますが、回路構成がSparkfun製と異なることがあるのでおすすめしません。特に電源周辺回路、J1のジャンパーピンは謎です。
ソースコード
キースイッチを押して、LEDを光らせるだけなので、大したコードではありません。DIP化したキースイッチが正しく動作するか確認するためのプログラムです。
#define SW0_PIN 5 #define SW1_PIN 6 #define LED_PIN 7 char sw0 = 0; char sw1 = 0; void setup() { // Pin Assgin pinMode(SW0_PIN, INPUT); pinMode(SW1_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } void loop() { // 入力の読み取り sw0 = digitalRead(SW0_PIN); sw1 = digitalRead(SW1_PIN); // スイッチ押下時の動作 if(sw0 == HIGH || sw1 == HIGH){ digitalWrite(LED_PIN, HIGH); } else if (sw0 == LOW || sw1 == LOW) { digitalWrite(LED_PIN, LOW); } else { digitalWrite(LED_PIN, LOW); } }
動作確認
奥3つのキースイッチは飾りです。手前2つのキースイッチを押して、右側にあるLEDが点灯することが確認できました。ダイオードの表面実装は問題なくハンダ付けできていたようです。
まとめ
promicro互換ボードを使って、マイコンボードの使い方・キースイッチ入力の基本的な部分の理解を深めてみました。アイデア次第ではキーボードだけではなくて色々な使い方ができそうです。
promicroをHID(Human Interface Device)として認識させてみたり、私の大好きGPSロガーも作れないか、模索していこうと思います。
コメント