アスキーの会員サービスASCII倶楽部では、会員の方だけが読めるさまざまな連載や特集が毎日更新中。
本日は、ASCII倶楽部の人気記事「IKEAのサメをロボットにする」を紹介します。
筆者は、本名名義で「劇団ノーミーツ」というリモートで演劇をする劇団に所属している。
劇団ノーミーツでは、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();
}
}
雑にコードを描いたので、サーボが動くところが羅列系コードになっている。多分「ちゃんと何回繰り返す」というように書いた方がいい。
▲赤外線リモコンでサーボをコントロールする様子。上記のコードとは動きが異なっている。上記のコードは完成版のコードだ。
これで原理試作はできたので、サメの中にうまく収納できるようにする。
続きは「IKEAのサメをロボットにする」でお楽しみください。
なお、こちらの記事の続きを読めるのはASCII倶楽部会員の方限定です。
ASCII倶楽部には、今回紹介した記事だけでなく、PCやスマホ、カメラ、テレビ、オーディオなどの会員だけが読める連載が更新されております! さらに、週刊アスキー 電子版の最新号から過去4年ぶん以上のバックナンバーが読み放題となっております。
会員制読み放題サービス
ASCII倶楽部(アスキークラブ)
■利用料金
月額 税込1080円
※毎月1日~末日までの利用料金として
■支払方法等
●クレジットカード
* VISAカード/MasterCard/アメリカン・エキスプレスカード/JCBカード
●auかんたん決済
●ドコモケータイ払い
●Amazon アカウント
※auかんたん決済、ドコモケータイ払いを選択された方は、3日間無料キャンペーンをご利用いただけません。 ※ご利用になる決済機関によって決済時期及び決済方法が異なります。
それぞれの決済機関が定める利用規約等をご確認ください。
■提供時期
月額利用料金の支払い後、すぐに利用可能。
■推奨環境 <端末・ブラウザ>
【PC】
・OS
Windows 7 以上 , Mac OS X 10.10以上
・ブラウザ
(Windows)Internet Explorer 11※Edgeは除く , Google Chrome最新版 , Firefox最新版
(Mac)Safari最新版
【スマートフォン】
・OS
iOS 8 以上 , Android 4.x以上
・ブラウザ
(iOS)Safari
(Android)Google Chrome
URL ASCII倶楽部