Posted at

Arduinoで物理ボタンを作る (目立つボタンで「ッターーン!」しよう)

More than 3 years have passed since last update.


もっと豪快にコマンドを実行したい

PCで何かしら決定的な操作を行う時に

誰か「では、実行しますよ…」

周囲「
(ゴクリ……)

といった場面は、業務中に意外とあるものです。

この時の“実行する”とは、すなわち“Enterキーを押下する”ことなワケですが、

「どうせ実行するなら、もっとド派手に Enter したい。」

なんて考えたこと、ありませんか。

何ごとも勢いは大切です。

覚悟を決めて、いざ行かん としている時こそ、

キーボード上のキー入力ではなく、別途設けられた専用の大きなスイッチで

ッターーーーーーン!!』と、豪快にEnterしたいものです。

以前投稿した『ラズパイでの携帯パトランプ作り』以降、

PCと連動した電子工作に、いくらか興味が出てきていたので

「Arduinoで、大きく目立つ Enterキー を作ってみよう」

と考え、さっそく制作に取り掛かりました。

で、実際やってみると、びっくりするほど簡単にできたのです。



※ThinkPadキーボードとの相性が良すぎ

いやはや、Arduino すげー簡単です! 素敵です☆


用意したモノ

参考までに、用意したものをリストアップしてみました。

基本的にお好みのモノ(既にお持ちのモノ)で大丈夫だと思います。

必要経費は、こだわりを捨てれば、Arduino代くらいで済みます。


パソコン (お手持ちの端末で)



※WinでもMacでもいいですが、

 今回はWindows7(Arduino IDE、VisualStudio2015)

 を使う前提で話を進めます


Arduino『Arduino Uno』



http://www.amazon.co.jp/dp/B0044X2E5S/

※ボタンのONとOFFを読み取るマシンが必要なので、

 今回は Arduino を使います

※もちろんラズパイでも出来るし、マイコン単体でもいいのですが

 今回は手っ取り早く実現するために、Arduino Uno を使います


大きなボタンスイッチ



http://www.shimada-ryoiku.or.jp/piko/hard/switch.html

※『ひとつの機能に特化した物理スイッチ』を作るワケなので、

 “物理スイッチ”を用意する必要があります

※大きいサイズのボタンスイッチは、いざ探してみると

 やや高価だったり在庫切れだったりで、何気に入手が困難ですが

 運良く3,000円程度でAbleNetのビッグスイッチを入手できました

※電流のON/OFFの切り替えができれば良いので

 ボタンスイッチでなくても、何でもOKですが

 なるべくインパクトのある見た目のモノがオススメです

※ぶっちゃけ、この“ボタン探し”作業が、

 一番大変で、一番楽しい部分かもしれません


その他

スイッチとArduinoを接続するために用意したモノ。

接続出来れば、ジャンパワイヤでも何でも良いです。


ワニ口クリップ x 2個



https://www.switch-science.com/catalog/2132/

http://www.amazon.co.jp/dp/B0014US43A/

※スイッチの端子部のモノラルミニプラグへ取り付けるために用意


ピンヘッダ x 2個



https://www.switch-science.com/catalog/1938/

※Arduinoのピンソケットに挿して、ワニ口クリップで接続するために用意


ArduinoでボタンのON/OFF状態を取得

Arduinoとパソコンの接続方法などは、Web上にいくらでも情報があるので、ここでは割愛します。

Lチカレベルのチュートリアルが完了していれば、本件のArduino設定は、非常に簡単です。

まず、Arduino Uno の12番ピン及びGNDピンへ、スイッチの端子を接続します。



※図に起こすまでもない程のシンプルさ…

そして、Arduinoへ下記スケッチを書き込みます。

const int buttonPin = 12;

void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
Serial.println("Enter!!");
delay(200);
}
}

軽く説明をすると、

・12番ピンをプルアップ設定で入力待ち受け状態にする

・スイッチがOFFの時は、12番ピンはプルアップ状態なので HIGH の状態である

・スイッチがONになると、12番ピンはGNDと繋がって、LOW の状態になる

・12番ピンが LOW になったら、「Enter!!」という行をシリアル出力する

・そして、チャタリングを回避する為、0.2秒間処理を止める

という感じの処理をしています。

色々ツッコミどころはあるのですが、説明を端折るために一番分かり易いスケッチにしました。

実際に動作を確認してみます。

書き込みボタンを押して、Arduinoへの書き込みが成功すると、ボタンのON/OFFを検知できるようになります。

ボタンを何度か押してみましょう。

Arduino Uno に接続したボタンを押すたびに、シリアルモニタに「Enter!!」という文字が出力されるようになったかと思います。


パソコンでボタンのON/OFFを監視し、Enter入力

Windowsで外付けボタンからの入力を得るには、シリアルポート(COMポート)を監視する必要があるので、その為のアプリケーションを作成する必要があります。

※前述のArduinoの設定で、外付けボタンを押すと、

 シリアルポートへ「Enter!!」という行が出力されます

 その出力を、パソコン側で監視するワケです

アプリケーションがシリアルポートに接続し、コンソール出力があったら、Enter操作を発行する、というアプリケーションをVisual Studio 2015で作成します。使用する言語は C# を選択しました。


Visual Studio 2015 のインストール

インストール方法は、例によってWeb上の他の記事に丸投げしちゃいます。

インストールには、何気に時間がかかるので、サクッと終わると思ったら、意外と時間を取られてイライラする、って事になりかねないので、穏やかな気持ちで挑める時にやった方が良いかもしれません。


ボタン連動Enter入力アプリケーションの作成

VisualStudio2015を起動したら、“ ファイル > 新規作成 > プロジェクト ” から、

下記のように “Windows フォーム アプリケーション Visual C#” を作成します。



※今回、プロジェクト名は「BigEnterKey」にしました。

フォームデザイン画面が表示されます。

まずは、ツールボックスからComboBoxをフォームに追加します。

ComboBoxが追加されたら、位置を整え、

フォームのサイズを適宜変更します。

次に、ComboBoxをダブルクリックします。

すると、「Form1.cs」というタブが新しく表示され、Form1クラスに新しくメソッドが追加されます。

再び、[デザイン]タブへ戻り、ツールボックスから、今度はSerialPortを追加します。

下記のように、“SerialPort”が追加されているので、それをクリックし、プロパティウィンドウを確認します。

プロパティウィンドウでは、稲妻のマークをクリックします。

項目「DataRecieved」をダブルクリックします。

“Form1.cs”に、新たにメソッドが追加されました。

ここまで出来たら、下記のコードで“Form1.cs”のコードを上書きします。


Form1.cs

using System;

using System.Windows.Forms;
using System.IO.Ports;

namespace BigEnterKey
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
comboBox1.Items.Add(port);
Console.WriteLine(port);
comboBox1.SelectedItem = port;
serialPort1.Close();
serialPort1.PortName = port;
serialPort1.Open();
}
}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
string data = serialPort1.ReadLine();
if (!string.IsNullOrEmpty(data))
{
Console.WriteLine(data);
SendKeys.SendWait("{ENTER}");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
serialPort1.Close();
string port = (String)comboBox1.SelectedItem;
Console.WriteLine(port);
serialPort1.PortName = port;
serialPort1.Open();
}
}
}


コピペ完了。

では、ウィンドウ上部の実行ボタンを押して、さっそく実行してみましょう。

下記のようなウィンドウが立ち上がります。



※プルダウン内のCOM*は、現在有効なCOMポートの一覧です

これで準備は完了です。

ウィンドウを閉じて、デバッグを終了します。


外付けビッグEnterキーで、いざコマンド実行!

サーバー上に「Hello Wold !!」と書かれたテキストファイル(test.txt)が用意してあるとして、そのテキストファイルの内容をターミナルに表示してみましょう。

ターミナルでサーバーへログインし、該当の階層へ移動して、

cat test.txt とプロンプトへキーボードから入力してから、一息つきます。



※落ち着いてください。ここで Enterキー を押しては、いけません。

今回 VisualStudio2015 で作成した実行ファイル(BigEnterKey.exe)は、 C:\Users\ユーザー名\Documents\Visual Studio 2015\Projects\BigEnterKey\BigEnterKey\bin\Debug に保存されています。

※環境次第ですが、基本、この辺です

※“ユーザー名”部分は適宜、読み替えてください

※BigEnterKey.exe 単体で動作するので、別の場所にコピーしてもOKです

外付けビッグEnterキーを有効にするには、シリアルポート(COMポート)を監視する必要があるので、この BigEnterKey.exe を実行しておきましょう。

では、準備が整ったところで、さっそくビッグEnterキーッターーン!!してみましょう。

表示されました!!

というか、外付けビッグEnterキーでコマンドが実行されました!!

・・・ま、それだけなんですが、

「こういう事も出来る」という事を知ることは重要です。

そして、その実現方法を知ることは、更に有意義です。


最後に

今回は、“Enterの入力”という、あまり意味のない実装でしたが、当然、Windows側で発行できるコマンドは、“Enterの入力”だけではないので、外付けボタンの押下きっかけで、“画面のロック”、“スクリーンセーバーの起動”、“スクリーンショットの取得”、“HTTP通信してあんな事やこんな事”等など、色々なアクションを実行する事ができそうです(未調査…)。

更にいえば、入力用のハードウェア側も色々試せそうです。

「昔懐かしのゲームコントローラー」や「ボタンいっぱいの自作コントロールパッド」、「そもそもスイッチとして生まれてきたワケじゃないモノ」等など、キーボードやマウス以外のモノでパソコンを操作できる、ただそれだけのことで、なんとも不思議に夢が広がります。


参考URL

■ 意外と知られていない?INPUT_PULLUP

http://mag.switch-science.com/2013/05/23/input_pullup/

※超便利 INPUT_PULLUP。

■ シリアルポートの再接続でやらなければならないことはありますか?

https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/590463a5-fda0-434f-b616-d3ef0fcbd2ce?forum=csharpgeneralja

■ C#(VS2013 Community, .NET4.5.1)でArduinoとシリアル通信する

http://qiita.com/SAM_tak/items/48b89e7e19abf121071b

※何度かアプリの起動を繰り返していると UnauthorizedAccess で

 アプリが起動しなくなる事があって、これが実はまだ解決できていない…

 ので、↑の辺りを参考にする (つまり上記のコードにはバグがある…)