筆者は、本名名義で「劇団ノーミーツ」というリモートで演劇をする劇団に所属している。
劇団ノーミーツでは、Zoomなどを使った長編公演のほかに、Twitterでリモート演劇の動画も不定期に掲載している。
そんなTwitter用の動画として、「ポルターガイストオツハタ」という企画が持ち上がった。
ポルターガイストとは、ドイツ語で「騒々しい音を立てる霊」のこと。何もないように見えるのに部屋の中のものが動いたりする現象を指す。
オツハタとは、劇団ノーミーツの所属俳優オツハタさんのこと。
つまり、オツハタさんの家の中の物が勝手に動いて、困惑するオツハタさんを撮ろうという企画だ。
以前からオツハタさんがZoomをしているとき、背景に映り込んでいるベッドにIKEAのサメのぬいぐるみがあるのが気になっていた。
視聴者が見慣れているオツハタさんのサメが動き出したら、みんなびっくりするんじゃないか!? そう考え、サメを購入するためIKEAに向かった。
●リモコンでサメを動かしたい
今回は「赤外線リモコンをトリガーにしてサメのしっぽが動く」ようにする。
なぜ赤外線リモコンなのかというと、リモート演劇はリモートでなくてはならないからだ。赤外線リモコンで動かせるようにしておくと、スマートホーム用のHubを使ってリモートで動かせる。演者のそばにオペレーターがいなくても、どんなに遠いところにいても動かせるというワケだ。
サメを購入した翌日、IKEAの袋にサメを入れて秋葉原のシェアファクトリーDMM.make AKIBAへ向かった。
サメの中に入れるマイコンやら何やらは秋葉原の電子部品屋、秋月電子通商で揃えようと思っていたのだが、感染症対策で秋月電子通商は祝日休業になっていた。そこで隣の千石電商で揃えた。最近は電子部品を買う時は事前に買い物リストを作って行くのだが、その場で、頭の中で組み立てながら買い物するのは久々で懐かしかった。頭の中で組み立てながら買い物したもので、今回はかなり雑な工作になっている。ラクちんにできるようにオーバースペックなキットを買ったりしたし。
●買ったもの(サメ1個あたり)
・サメのぬいぐるみ *1体(IKEA)
・HS-8380TH High Voltage, Ultra Responsive, Ultra Torque Titanium Gear Servo *1個(スーパーラジコン)
・Arduino UNO R3 *1個(千石電商)
・Arduino Uno プロトタイプ基板 *1枚(千石電商)
・足の長いヘッダーソケット6P *1個(千石電商)
・足の長いヘッダーソケット8P *2個(千石電商)
・足の長いヘッダーソケット10P *1個(千石電商)
・赤外線リモコンキット *1個(千石電商)
・ACアダプタ9V2A *1個(千石電商)
・ACアダプタ5.9V2A *1個(千石電商)
・USB2.0ケーブル(A-B) B端子L型 1.8m *1個(千石電商)
・M3ナベネジ8mmくらい*4個(千石電商)
・M3黄銅スペーサー(六角・オス-メス) 30mm *4個(千石電商)
・適当な20mm*20mmくらいのスルーホール基板 *1個(千石電商)
・【UEW】エナメル線(2種ポリウレタン銅線) たしか0.5mm *1個(千石電商)
・TWF9-6-17D TWF型フランジ足付難燃性プラスチックケース *1個(千石電商)
・白いファスナー50cmくらい *1個(ユザワヤ)
とっても雑に買い物したので、ちゃんとおぼえていないところもところどころある。サーボの選定も、スーパーラジコンの特価の中から適当に合いそうなのを選んだ。やはり買い忘れというのはあって、予備で何とかしたりシェアオフィスの友人からもらったりした。
●買い忘れたもの
・DCジャック
・Arduinoをケースに固定する用のネジ
・サーボホーン用のネジ(M2タッピング)
まずはサメを動かす原理試作をする。
赤外線リモコンをトリガーにしてサメのしっぽを動かしたいので、まず赤外線リモコンの送信をArduino UNOが受け取れるようにした。
SparkFunの赤外線リモコンキットを購入したので、公式チュートリアルの通りにはんだづけをする。Arduino用のスルーホール基板を買ったのでそこにはんだづけをしていく。
しかし今回はArduinoをぬいぐるみの中に入れるので、Arduinoのシールドにセンサをつけると赤外線が届かなくなってしまう。そこで、赤外線センサは別の小さいスルーホール基板にはんだづけをして、長いポリウレタン銅線(UEW)でAuduinoシールドにつなげることにした。
まずチュートリアルのサンプルコードを動かしてみたところ、リモコンのどのボタンを押したか、無事シリアルモニターに表示することができた。
●リモコンをトリガーにサーボを動かす
赤外線リモコンはこれで完了したので、次はサーボモーターを動かす。
DCジャックを先程のシールドにつなげて、電源をサーボに供給する。
サンプルコードを参考に、赤外線リモコンをトリガーにサーボを動かすコードを書いた。
#include
#include
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int angle; // variable to hold the angle for the servo motor
int pos = 0; // variable to store the servo position
Servo myServo; // create a servo object
#define POWER 0x00FF629D
#define A 0x00FF22DD
#define B 0x00FF02FD
#define C 0x00FFC23D
#define UP 0x00FF9867
#define DOWN 0x00FF38C7
#define LEFT 0x00FF30CF
#define RIGHT 0x00FF7A85
#define SELECT 0x00FF18E7
void setup() {
myServo.attach(9); // attaches the servo on pin 9 to the servo object
myServo.write(pos);
Serial.begin(9600); // open a serial connection to your computer
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results))
{
if (results.value == POWER)
{
Serial.println("POWER");
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(3); // waits 15ms for the servo to reach the position
}
}
// wait for the servo to get there
delay(3);
irrecv.resume();
}
}
雑にコードを描いたので、サーボが動くところが羅列系コードになっている。多分「ちゃんと何回繰り返す」というように書いた方がいい。
▲赤外線リモコンでサーボをコントロールする様子。上記のコードとは動きが異なっている。上記のコードは完成版のコードだ。
これで原理試作はできたので、サメの中にうまく収納できるようにする。
この連載の記事
- 第319回 歌声合成ソフト「UTAU」でオリジナルキャラを歌わせてみた
- 第318回 DTM勢がAIで作曲したら、AIの得意分野と苦手分野が見えてきた
- 第317回 ものづくり版コミケ「Makerフェア」2024年は面白かった。出展者の世代交代もなされているように見えた
- 第315回 0歳児、いつから保育園に? 女性の働き方、とことん考えてみました
- 第315回 推しの細胞がついた指輪を作ってもらった
- 第314回 おしゃれすぎるファン付きウェアを買って重要な問題に気付いた
- 第313回 0歳児がいながら、働く。ベストなやり方は?
- 第312回 パートナーの反対で転職できない問題
- 第311回 YouTubeの再生を止めないために画面を自動でタップする機械を作った
- 第310回 地方に移住したいが、東京にとどまるべきか
- この連載の一覧へ