ASCII倶楽部

このページの本文へ

週替わりギークス 第197回

IKEAのサメをロボットにする

2021年01月16日 09時00分更新

文● きゅんくん 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 筆者は、本名名義で「劇団ノーミーツ」というリモートで演劇をする劇団に所属している。

 劇団ノーミーツでは、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シールドにつなげることにした。

長いUEWの先に赤外線センサがある

 まずチュートリアルのサンプルコードを動かしてみたところ、リモコンのどのボタンを押したか、無事シリアルモニターに表示することができた。

無事シリアルモニターに押したボタンが映った

●リモコンをトリガーにサーボを動かす

 赤外線リモコンはこれで完了したので、次はサーボモーターを動かす。

 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();
  }
}

 雑にコードを描いたので、サーボが動くところが羅列系コードになっている。多分「ちゃんと何回繰り返す」というように書いた方がいい。

▲赤外線リモコンでサーボをコントロールする様子。上記のコードとは動きが異なっている。上記のコードは完成版のコードだ。

 これで原理試作はできたので、サメの中にうまく収納できるようにする。

カテゴリートップへ

この連載の記事

ASCII倶楽部の新着記事

会員専用動画の紹介も!