こんにちは、2回生P班のナベ(@nbJohns98)です。
津田沼祭では「Orche☆Star」と言う自作筐体の音楽ゲーム企画を展示していました。
今回はその企画の話を挟みつつ、どのようにArduino Leonardoで自作筐体を作成するか解説していきたいと思います。
※Arduino Leonardoの話が主軸となり、筐体に関しての話は少なめです。ご了承下さい。
ちなみにOrche☆Starで使われていた自作筐体のコントローラは以下のようなものです。
8つのボタンと2つのスライドセンサで構成されていました。
目次
この記事のターゲット
・Arduino Leonardoを使ってみたい人
・自作筐体に興味のある人
上記以外の方でも少しプログラミング経験があればわかる内容になっているはずです。
Arduino Leonardoってなに?
まずはArduino Leonardoの実物をご覧ください。
この青い機械がArduino Leonardoです。これをマイコンボードと呼びます。
マイコンボード上部の0, 1, 2,…, 13と書かれている近くにある黒い穴をIOポートと呼び、ここにボタンやセンサをつけたり、LEDをつけて光らせたりします。
Arduino LeonardoはPCに接続しプログラムを書き込むことで、キーボードやマウスとして振る舞う機能が搭載されています。
自作筐体ではこのキーボード機能をメインに使用することになります。実際にOrche☆Starの筐体にはこのArduino Leonardoが入っていました。
Arduinoについて
Arduinoには様々な種類がありますが、自作筐体で使うキーボードやマウスの操作が出来るものは主にこのArduino LeonardoとArduino Micro[注1]です。
Arduino MicroはArduino Leonardoより小さいマイコンボードで、狭いところで動作させることに向いていますが、IOポートの配線方法が通常と異なるため、決まった用途がない限りはArduino Leonardoをおすすめします。
また、電子工作入門用のマイコンボードにArduino Unoという物もよく目にします。
こちらにはキーボードを操作する機能などはありません[注2]が、Arduinoの中でもベーシックなタイプでネット上に多くの情報がある利点があります。
また、Arduinoには互換機と呼ばれるものがあります。
Arduinoはオープンソースハードウェアと呼ばれる形態で回路図やプログラムなどを誰でも見られる状態で公開しています。
そのため様々な会社が独自にカスタマイズをしたArduinoを出しています。これのことを「Arduino 互換機」と呼びます。
パーツを出来る限り安い構成で作った安価なボード、動作するスピードなどを変更したボードなどがありますが、ものによっては癖があるので購入する場合は慣れてきてからの購入をおすすめします。
Arduino Leonardoを使ってキーボードを操作してみる
1.開発環境のセットアップ
まずはArduinoの開発環境をインストールします。
ここではあまり詳しく解説しませんが、ざっくりとした環境構築までの手順をご紹介します。
Arduinoには「Arduino IDE」という専用の開発環境が用意されています。
まずは公式サイトのダウンロードページから開発環境をダウンロードします。
公式サイトダウンロードページ: https://www.arduino.cc/en/Main/Software
「Download the Arduino IDE」の項目からWindows, Mac, LinuxそれぞれのOSにあったものを選びます。
ダウンロードしたインストーラの指示に従いながらセットアップを行います。
インストールが終わりソフトウェアを起動すると以下のような画面が出てきます。
以上で開発環境のセットアップは終了です。
次はプログラムはこの画面に記述していきます。
2.基本プログラム
キーボードを操作するプログラムの前に、Arduinoのプログラムの基本の形をご紹介します。
Arduinoのプログラムの基本が以下のようになります。
void setup(){
//起動時に行う処理
}
void loop(){
//起動後、何度も行う処理
}
ArduinoではC言語のようなmain関数は登場せず、代わりにsetupとloopと言う関数が必須です。
setup関数はArduinoに電源が投入され、起動した時に一度のみ動作。
loop関数はsetup関数が終了後、電源を切るまで何度も実行されます。
3.キーを起動時に押すプログラム
基本プログラムにコード書き足し、起動時に「sofme」と入力するプログラムを作ってみます。以下のソースをご覧ください。
#include <Keyboard.h>
void setup(){
//起動時に行う処理
Keyboard.begin();
delay(1000);
Keyboard.print("sofme");
}
void loop(){
//起動後、何度も行う処理
}
4行追加されました。追加された行について解説していきます。#include <Keyboard.h>
キーボードを使う場合はKeyboard.hをインクルードします。Keyboard.begin()
はキーボードを使うための準備です。
Keyboard.begin()のすぐあとにキーボードを操作しても上手く動作しない場合があるのでdelay(1000)
の行で1000ms(=1秒)の待機をしています。Keyboard.print("sofme")
PCに「sofme」という文字列を送信します。
このプログラムを実際に書き込んでみます。
プログラムの書き込みを開始…
Arduino Leonardoに書き込み…
メモ帳などを開き待機していると…
出来ました!
はい。たったこれだけArduino Leonardoがキーボードとして動作します!
しかし、今の状態ではキーボードでタイピングをしているような形でキーを押し続ける動作が行なえません。
次に、キーを押し続けるプログラムを書いてみましょう。
4.スイッチを押し続けている間、キーを押し続けるプログラム
実際の自作筐体では文字列を送るだけのプログラムでは無く、何かしらのボタンを押している間キーを押し続けるような動作が必要になってきます。Orche☆Starのコントローラではボタンに1から8までの数字、スライドにqからiまでのキーを割り当てていました。
ボタンを押している間はキーボードのキーを押し込んでいる状態、ボタンを離せばキーを離した状態になります。
ボタン部分はそのままですが、スライド部分は片方4分割でキーを割り当て、ゲームプログラム側で数フレームの平均を取るという実装でした。
それでは、ボタンを押している間Aキーを押し続けるプログラムを書いてみましょう。ソースは以下のようになります。
#include <Keyboard.h>
boolean beforeState = false;
void setup(){
//起動時に行う処理
pinMode(12, INPUT_PULLUP);
Keyboard.begin();
}
void loop(){
//起動後、何度も行う処理
if(digitalRead(12) == LOW){
if(!beforeState){
Keyboard.press('A');
beforeState = true;
}
}else{
if(beforeState){
Keyboard.release('A');
beforeState = false;
}
}
}
先程より少し長くなりました。
重要な点はKeyboard.press('A')
とKeyboard.release('A')
の部分です。Keyboard.press()
は引数に指定した文字のキーを押した状態にする関数です。今回の場合「A」を押したことになります。Keyboard.release()
はKeyboard.press()とは逆に引数に指定した文字のキーを離した状態にする関数です。
プログラム全体の流れは12番のIOポートをGNDに繋げた時にKeyboard.press('A')
を一度送り、GNDから離した時にKeyboard.release('A')
を一度送るというプログラムになっています。
今度はこのプログラムを書き込んでみます。
IOポートの12とGNDをジャンパワイヤと呼ばれる配線に使う線で繋ぎます。
ボタンの代わりにこの線を抜き差ししてみます。
キーボードで(Shiftキーを押しながら)Aキーを押したり離したりしているような動作をしています。
文字のキー以外にもKEY_LEFT_CTRLやKEY_UP_ARROWといった定数を指定するとCtrlキーや上矢印キーを押すことも出来ます。
これを応用すれば予め設定したキーのマクロをボタン一つで実行させるようなことも可能です。
ゲームに組む際は通常のキーボード操作と同じ処理を使うことが出来るので、何か特殊なことなどはする必要がありません。
コントローラにWASDを設定してゲーム操作したり、既存のPC音楽ゲームのキーを割り当てて楽しんだり、何かのセンサーをトリガーにキーを送信する仕掛けを作ったりと色々なことが出来ます。
USBの仕様と注意点
ここまででArduino Leonardoでのキーボードでの扱い方を紹介してきました。
あとは自分の作りたい筐体に合わせたプログラムを工夫しながら行うだけなのですが、キーボードを操作する上での最大の注意点があります。
それは、「同時に押せるキーは6つまで」[注3]という点です。
これはUSBで扱うキーボード上の規格の問題で、「USBで扱う汎用的なキーボードは6キーまで」と決まっています。
こういった規格があるおかげでどのキーボードも特殊なソフトウェアなしに繋げられる反面、自作筐体を作る上での壁になります。
実際にOrche☆Starでは8つのボタンを全て押しても6ボタンまでしか反応しませんでした。
この仕様はUSBのキーボードである以上どうにもできない問題なためそこを踏まえて制作していかなくてはなりません。
どのように自作筐体の外装を作るか
この記事ではArduino Leonardoの話がメインとなりますが筐体の部分に関しても軽く触れていきます。
プログラムが完成したあとは見栄えのためにもArduinoなどを収めるケースが必要になってきます。
どのように外装部分を作るか、例として以下のようなものが挙げられます。
- 既製品のケースを改造
- 板を買って組む
- 3Dプリンタを用いて造形
既製品のケースを改造
電子パーツを扱う店ではシンプルなケースが購入できます。
ケースに穴を開けたり切ったりして形を作っていきます。
素材により労力を使いますが一番無難な方法です。
見た目は少し悪くなりますが柔らかいタッパなど、カッターの刃が通るようなものを加工すると簡単に作ることが出来ます。
ケースは千石電商という店で多く扱っています。
板を買って組む
こちらも穴を開けたり切ったりといった作業が必要になってきます。
木材などであればドライバーやノコギリを使うことになりますがプラスチックを加工するより労力を抑えることが出来ます。
また、グルーガンとアクリル板などを使い箱を作っていくことも出来ます。
3Dプリンタを用いて造形
Orche☆Starでは3Dプリンタを用いて筐体を作成しました。
3Dプリンタではどんなものでも造形できるかというとそうではなく、印刷可能範囲や印刷時間、設計技術など様々な制限があります。
今回使った3Dプリンタは20x20x20cm程度の範囲で印刷出来るものですが、立方体の1面ずつ印刷しそれを合わせていく方式にしました。
造形物が大きくなればそれだけ印刷時間も長くなり、今回の場合コントローラ片方で全てを一度に印刷すると5時間から10時間ほどかかります。
印刷時間が大きくなれば印刷に失敗する確率も高くなるため、1面ずつ1時間以内で印刷が終わるように設計しました。
この方法は初期費用が大きく、慣れや経験を必要とします。
なので気軽におすすめ出来る方法ではありませんが、電子工作を行う方や創作意欲のある方は持っていて決して損はないと思います。
使用した3DプリンタはAnycubic Mega-Sというものです。
価格は海外経由で購入し約2万5000円ほどです。個人用の3Dプリンタとしては安めのグレードですが使った感想としては問題のないクオリティです。
Anycubic公式サイト: Anycubic Mega-S
まとめ
今回は記事を通してArduino Leonardoと一部自作筐体について触れていきました。
この記事を見て自作筐体や電子工作に興味を持つ方がいましたら幸いです。
自作筐体を始めるハードルは少し高いですが自分のプログラムに自作のコントローラを付けることで可能なことが増え制作の幅が広がります。
何か疑問点や始めてみたいけどイマイチ流れがわからないなどありましたら気軽にTwitterなどでご連絡下さい。
@nbJohns98
番外
最後に自作筐体や電子工作をはじめてみたいというか向けの情報をまとめておきます。
Arduino Leonardoの購入
Arduino Leonardoの購入はSwitch Scienceや秋月電子をおすすめします。
Switch Scienceの商品ページ
秋月電子の商品ページ
その他、PCとの接続にMicroUSBケーブルも必要なのでない方は別途ご用意下さい。
その他、あったほうが良いもの
電子工作を始めるにあたって以下のものがあると便利です。
- ブレッドボード
はんだ付けなしで配線が可能で試作品を作るのに向いています。 - ジャンパワイヤ
ブレッドボードやスイッチの配線に使います。 - タクトスイッチ
マウスのクリックなどに使われるカチカチと押すスイッチです。
慣れてきたら以下のものもあると便利です。
- はんだこて/はんだ
ブレッドボードで全て配線できると楽ですが、最終的にはスイッチなどの配線に必要になります。私が使っているものはDAISOで500円で購入したものです。はんだは秋月電子で購入したものを使っています。 - 導線
はんだでスイッチとピンや別のスイッチなどに配線する時に使います。
電子工作をする際に役に立つサイト
- 秋月電子通商
基本的な電子パーツが手に入ります。 - 千石電商
ケースやゲームに使うスイッチなどの品揃えが豊富です。 - マルツ
様々なセンサなどのモジュールを多く扱っています。 - Arduino Keyboad.hのリファレンス
基本的にはこの記事で紹介した関数しか使いませんが、どのようなことが出来るのか確認できます。
注釈
※1 一部機種、また他の会社が作っているArduino(通称「Arduino互換機」)は含んでいません。
※2 本来はキーボードを操作する機能のないArduino Unoなどでキーボードを操作する方法もありますが、非推奨なので割愛。
※3 キーボードの中にはゲーム向けに「Nキーロールオーバー」というキーの同時押しに対応したキーボードがありますが、そういった製品でも6キー同時押しが最大になります。
コメント