2015年版:Arduinoで【デカい物理ボタン】を作る!!
※注意)Qiitaからの移転で、2015年10月25日に投稿した記事なので、内容はかなり古いです
もっと豪快にコマンドを実行したい
PCで何かしら決定的な操作を行う時に
誰か「では、実行しますよ…」
周囲「 (ゴクリ……) 」
といった場面は、業務中に意外とあるものです。
この時の“実行する”とは、すなわち“Enterキーを押下する”ことなワケですが、
「どうせ実行するなら、もっとド派手に Enter したい。」
なんて考えたこと、ありませんか。
何ごとも勢いは大切です。
覚悟を決めて、いざ行かん としている時こそ、
キーボード上のキー入力ではなく、別途設けられた専用の大きなスイッチで
『ッターーーーーーン!!』と、豪快にEnterしたいものです。
以前投稿した『ラズパイでの携帯パトランプ作り』以降、
PCと連動した電子工作に、いくらか興味が出てきていたので
「Arduinoで、大きく目立つ Enterキー を作ってみよう」
と考え、さっそく制作に取り掛かりました。
で、実際やってみると、びっくりするほど簡単にできたのです。
※ThinkPadキーボードとの相性が良すぎ
いやはや、Arduino すげー簡単です! 素敵です☆
用意したモノ
参考までに、用意したものをリストアップしてみました。
基本的にお好みのモノ(既にお持ちのモノ)で大丈夫だと思います。
必要経費は、こだわりを捨てれば、Arduino代くらいで済みます。
パソコン (お手持ちの端末で)
※WinでもMacでもいいですが、
今回はWindows7(Arduino IDE、VisualStudio2015)
を使う前提で話を進めます
Arduino『Arduino Uno』
今回は Arduino を使います
※もちろんラズパイでも出来るし、マイコン単体でもいいのですが
今回は手っ取り早く実現するために、Arduino Uno を使います
大きなボタンスイッチ
“物理スイッチ”を用意する必要があります
※大きいサイズのボタンスイッチは、いざ探してみると
やや高価だったり在庫切れだったりで、何気に入手が困難ですが
運良く3,000円程度でAbleNetのビッグスイッチを入手できました
※電流のON/OFFの切り替えができれば良いので
ボタンスイッチでなくても、何でもOKですが
なるべくインパクトのある見た目のモノがオススメです
※ぶっちゃけ、この“ボタン探し”作業が、
一番大変で、一番楽しい部分かもしれません
その他
スイッチとArduinoを接続するために用意したモノ。
接続出来れば、ジャンパワイヤでも何でも良いです。
ワニ口クリップ x 2個
※スイッチの端子部のモノラルミニプラグへ取り付けるために用意
ピンヘッダ x 2個
※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”のコードを上書きします。
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
※超便利 INPUT_PULLUP。■ シリアルポートの再接続でやらなければならないことはありますか?
アプリが起動しなくなる事があって、これが実はまだ解決できていない…
ので、↑の辺りを参考にする (つまり上記のコードにはバグがある…)
Discussion