フォトリフレクタRPR-220をArduinoで使う/人造ネコの作り方【動画解説】

ねこじゃらしでかわいいネコと遊びたい。今日はネコを自作するよ。

動画の技術解説、8本目です。

www.youtube.com

www.nicovideo.jp

今回のトピックはこんな感じ。

※ちなみに7本目は解説することがないので書きません。動画だけ見てね。
www.youtube.com

登場した部品について

動画中でほとんど説明しているのであんまり書くことないですが、型番等一応載せておきます。

サーボモーター

上のは GWS PICO STD です。普通に手に入る中では一番小さいかな?
GWSサーボ PIC/STD/F(フタバ): 制御部品・駆動部品 秋月電子通商-電子部品・ネット通販

下の方は個人的お気に入りの EMAX ES08MAII です。金属ギアで壊れにくいのに安い!

Amazonのリンクを貼りましたが実は高いので、Aliexpressで買うのがおすすめです

電子工作用のサーボモーターについてはここにまとめてあるので見てください。

ちなみにサーボモーターをつないでキュイキュイやっている基板ですが、サーボ用のテスターです。
自作なので同じものは売ってませんが、似たようなものはAmazonで買えます。

自作のはツマミと連動して「プログラム上で何度に設定すればそのポジションにできるか」の数字を出していて便利なのですが、そういうのは売ってないみたいですね。
上のリンクのものはディスプレイがありますがただの電圧表示みたいです。残念!でも中心出せるだけでも便利だと思います。

フォトリフレクタ

RPR-220というのを使っています。
反射型フォトセンサー(フォトリフレクター) RPR-220: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販

家にあったのでこれを使いましたが、Arduinoとかで使うならこういうモジュール化されているものを使った方が楽かも。

一応RPR-220の使い方を説明します。

こんな感じで繋ぎます。100Ωの抵抗はLED用ですが、ちょっと小さめなので150Ωくらいの方が無難かも。
10kΩの方はセンサー(正確にはフォトトランジスタという部品です)の感度に関わるので、うまく動かない場合はここをいろいろ変えてみるといいと思います。
(モジュール化されてるやつを使えばこういう面倒な抵抗選びをスキップできます。)

#define LED_PIN 12

void setup() {
  pinMode(LED_PIN, OUTPUT); 
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A0)); //ここで値読み取り

  delay(100);
}

Arduinoにこんなコードを書き込んでシリアルモニタで見るとセンサーの値が見られます。

ちなみに上手く動かないときは、スマホのカメラで見ると赤外線が見えるので、LEDがちゃんと光っているか確認できます。


圧電スピーカー

圧電スピーカー(圧電サウンダー) PT08: 受動部品 秋月電子通商-電子部品・ネット通販

電圧を加えると変形するピエゾ素子というものを使っているので、ピエゾスピーカーとか呼ばれることもあります。
自分で選ぶ場合は、同じ見た目でパッシブ(他励式)とアクティブ(自励式)の2種類があるので注意です。アクティブは電圧を加えるとブザー音が鳴るというもので、自由に音が鳴らせるのはパッシブのほうです。

つなぎ方はArduinoのデジタル端子に赤い線(+の足)、GNDに黒い線(ーの足)をつなぐだけです。アクティブブザーと違ってプログラム側で波形を送ってやる必要があります。

回路

完成したネコの回路を載せておきます。
載せておくのですが、めちゃくちゃ雑なので以下の問題があります。

  • 動画終盤にサーボモーターがずっとジリジリいってることに触れていますが、Arduinoの5Vピンから電源取りまくってるせいな気がします。モーター類は別ルートで電源取った方がいいです。
  • フォトリフレクタに200kΩの抵抗付けてますがさすがにデカすぎる

とはいえ、安全上やばい場合を除けば電子工作なんて「とりあえず動く」が最重要なので、動けばOKのマインドでやっていきましょう!
長時間動かすとかイベントで展示するとかやることになったらそのとき見直しましょう。

※回路的に同じなだけで動画と全く同じ配置ではありません。ごめん!

コード

そのまま貼ります。鳴き声も出るよ。

#include <Servo.h>

Servo servoD5;
Servo servoD6;

const int servoPinD5 = 5;
const int servoPinD6 = 6;
const int sensorPin = A0;
const int buzzerPin = 9;  // 圧電スピーカーを接続

void setup() {
  Serial.begin(9600);
  servoD5.attach(servoPinD5);
  servoD6.attach(servoPinD6);

  // 初期角度
  servoD5.write(50);
  servoD6.write(40);
}

void loop() {
  int sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);

  // A0が800以下なら発動
  if (sensorValue <= 300) {
    // D6を120度に
    servoD6.write(120);
    delay(500); // 少し間を置く

    // D5を4回上下させる
    for (int i = 0; i < 4; i++) {
      // 上(120~150度ランダム)
      int upAngle = random(120, 151);
      servoD5.write(upAngle);
      delay(500);

      // 下(50~80度ランダム)
      int downAngle = random(50, 81);
      servoD5.write(downAngle);
      delay(500);
    }

    // 元に戻す
    servoD5.write(50);
    servoD6.write(40);

    // 鳴き声「にゃー」
    meow();
  }

  // A0を200msごとに読み取る
  delay(200);
}

void meow() {
  // 「にゃ」部分(短く高め)
  tone(buzzerPin, 700, 120);
  delay(130);
  tone(buzzerPin, 650, 120);
  delay(130);

  // 「ー」部分(少しずつ下げながらビブラートをかける)
  for (int f = 600; f >= 380; f -= 10) {
    int vibrato = random(-15, 15); // ビブラート
    tone(buzzerPin, f + vibrato, 40);
    delay(40);
  }

  noTone(buzzerPin);
  delay(200);
}

動画では長くなりそうなので触れませんでしたが、鳴き声を出すところが
「// 「にゃ」部分(短く高め)」
「// 「ー」部分(少しずつ下げながらビブラートをかける)」
と処理がわかれているところにAIのこだわりを感じます。

そのうち書く

電子工作の話題ではないのですが、今回「なにかを貼る」という作業に

  • マスキングテープ
  • 木工用接着剤
  • 両面テープ
  • セロハンテープ
  • 両面テープ
  • セメダイン スーパーX
  • グルーガン

これだけ使い分けていて、なんか「最速で作るための接着術」みたいなのがある気がしてきました。

でもこれは単体でエントリ書いた方がいい気がするのでそのうち書きます。

以上、技術解説でした。

www.youtube.com

高評価とチャンネル登録してもいいからね。
またね。