完全自作キーボードへの道6:プルアップ抵抗でブレッドボードの抵抗を取り除く編

いったん、本体ケース作成のためにblenderなどを勉強し、3Dプリントの方もやってみているのですが、Arduinoを使った回路もまだ覚えなくてはならないことがあります。
引き続きゆかり氏の教科書を見ながらArduinoで自作キーボードを作るための知識を学んでいきます。

オリジナルキーボードを作ってみる その8「アクティブロー回路への変更」 – ゆかりメモ
http://eucalyn.hatenadiary.jp/entry/original-keyboard-08

前回までの回路では、スイッチを経由した後に読み取り用のピンに向かう線から分岐し、抵抗を挟んでGNDに向かう線がありました。「キーはひとつでも完全自作キーボード編」で、なんで抵抗を挟む必要があるんだろう?と頭を捻ったアレです。
この抵抗をなくし、回路を少しスッキリさせる方法があるようです。

ArduinoのpinMode指定にはこれまでOUTPUT, INPUTを使っていましたが、もう一つにINPUT_PULLUPというものがあり、これを指定するとArduino内部にある抵抗を使うようなイメージで、Arduinoの前にある物理的な抵抗を省略できるそうです。

ただし、このArduino内部の抵抗を使うにはこれまでの「スイッチを押した時にHIGHが読み取りピンに到達し、キー押下とする」だったものを、「スイッチが押されていない時は常にHIGHで、LOWになった時にキー押下とする」という全く逆の仕組みにする必要があります。

前者をアクティブハイに対して、後者をアクティブローと言うそうです。プログラム的にも、真はHIGHという感じがありますし、falseの時にキー押下とするのはなんだか気持ち悪いのですが、歴史的にそういうものらしいです。単純にArduino内部のINPUT_PULLUPを使うにはそうする必要があると飲み込みましょう。

ソースコードの対応作業はHIGHLOWを逆にするだけです。簡単。
回路の方は今までGNDに向かっていた抵抗が要らなくなるので取り外します。
もう一点、ダイオードの向きが逆になります。アクティブローでは、スイッチを押した時に、INPUT_PULLUPのピンからLOWであるOUTPUTの方に電気が流れるようになるためです。何となくわかるのですが、付け焼き刃であるためふわふわした理解です。とにかく! 全部逆にすると……

Arduino 2x3 Keymatrix
というわけで、しっかりと理解したとは言えないのですが、とにかく写真のような回路と、下記のソースコードで動いています。手元にあったタクトスイッチ全部を使って、2×3の回路で作ってみました。
ブレッドボードの外側にある長い線が2本ずつしかないので、黄色いボタンと黒いボタンから伸びる3列目の線がちょっとキツキツになってしまいましたが、抵抗はなくなったのでArduino本体の周りはスッキリしました。

#include "Keyboard.h"

const int ROWS = 2;
const int COLS = 3;

const int rowPins[ROWS] = {3, 4};
const int colPins[COLS] = {10, 11, 12};

const byte keyMap[ROWS][COLS] =
{
	{0x61, 0x62, 0x63},
	{0x64, 0x65, 0x66}
};

bool currentStates[ROWS][COLS];
bool beforeStates[ROWS][COLS];

void setup()
{
	for (int i = 0; i < ROWS; i++)
		pinMode(rowPins[i], OUTPUT);

	for (int i = 0; i < COLS; i++)
		pinMode(colPins[i], INPUT_PULLUP);

	for (int row = 0; row < ROWS; row++)
	{
		for (int c = 0; c < COLS; c++)
		{
			currentStates[row][c] = HIGH;
			beforeStates[row][c] = HIGH;
		}
		digitalWrite(rowPins[row], HIGH);
	}

	Serial.begin(9600);
	Keyboard.begin();
}

void loop()
{
	for (int row = 0; row < ROWS; row++)
	{
		digitalWrite(rowPins[row], LOW);

		for (int col = 0; col < COLS; col++)
		{
			currentStates[row][col] = digitalRead(colPins[col]);

			if (currentStates[row][col] != beforeStates[row][col])
			{
				Serial.print("key(");
				Serial.print(rowPins[row]);
				Serial.print(",");
				Serial.print(colPins[col]);
				Serial.print(")");

				if (currentStates[row][col] == LOW)
				{
					Serial.println(" Push");
					Keyboard.press(keyMap[row][col]);
				}
				else
				{
					Serial.println(" Release");
					Keyboard.release(keyMap[row][col]);
				}

				beforeStates[row][col] = currentStates[row][col];
			}
		}

		digitalWrite(rowPins[row], HIGH);
	}
}

これで、あとはキーを増やしていけば、少なくとも左右に分かれていないキーボードなら作れるわけです。
ゆかり氏の教科書はまだまだ続き、次にシリアル通信というものを使って2台のArduinoで通信し、左右分割型のキーボードを作る方法に進みます。

さて、ブレッドボードにタクトスイッチのままシリアル通信もやってみるか、実際にCherry MX互換のキースイッチを使って片方だけでもキーボードを作ってみるか、迷っちゃいますね。3Dプリントも楽しみだし……

これだけの知見を公開して下さったゆかり氏にこの場を借りて感謝させていただきながら、自分だけのキーボードの配列を考えてニマニマしたいと思います。

これまでの完全自作キーボードへの道はこちらです。
http://romly.com/archives/tag/build-my-own-keyboard

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください