話しかけると踊る「ダンシング植物」を作ってみた


ルネサス製のマイコン「GR-CITRUS」を使ったミニハッカソンに参加してきました。
GR-CITRUS ミニハッカソン in OSAKA - RubyとIoTでアイデアをカタチに

そこで話しかけると踊る観葉植物「ダンシング植物」を作ってみたので、その作り方を投稿します。
GR-CITRUSでマイクで音声入力する記事が意外とあまりなかったので、参考になれば幸いです。

ダンシング植物ってこんなもの

話しかける声をマイクで拾い、マイコンのGR-CITRUSで音圧レベルを判定し、一定値を超えるとサーボモーターを回して観葉植物がわさわさ動いて反応します。
(萌えキャラシールはハッカソンでもらったのでつけてます...)
子供が面白がってよく話しかけています。

用意するもの

種類 メーカー 品名 個数
マイコン     ルネサス GR-CITRUS 1
マイク     AnalogDevices ADMP401 1
サーボモーター Tower Pro Pte Ltd SG90 1
観葉植物 百均など お好みで 1

GR-CITRUS

がじぇっとるねさすさんから発売されているマイコンボードGR-CITRUSを使います。

マイク

ハッカソン当日は、大阪日本橋のシリコンハウスで、¥1,000ちょっとで購入しました。
MEMSマイク ADMP401@Strawberry Linux

サーボモーター

SG90というサーボモーターを使用します。
参考:秋月電子のSG90画像とデータシート

観葉植物

お好みで!私はDAISOで揺れやすそうな子を選びました。
あと途中でふらっと寄ったお店でゲットした、子トトロの鈴をつけてみました。

GR-CITRUSの環境構築

GR-CITRUS ミニハッカソン in OSAKA のページに紹介されている、たろサさんが作成された手順に沿って構築します。下記に転載させていただきます。
たろサさん、ありがとうございます!
1.初めてのRubyプログラム
 1.1.Visual Studio Codeのインストール
 1.2.拡張機能 Rubicのインストール
 1.3.新規Rubyプログラムの開始
  1.3.1.GR-CITRUSの接続準備
  1.3.2.GR-CITRUSのセットアップ
 1.4.RubyプログラムをGR-CITRUSで動かす

配線

こんな感じで、ブレッドボードを使って配線します。
GR-CITRUSとPCはMicroUSBケーブルで接続し、電源供給も行います。

マイクの配線

GR-CITRUS特設 Rubyでセンシングのページに記載の照度センサーと同じで、オーディオ入力を14番ピンのアナログ入力で読み取ればOKです。
ADMP401のVCCをGR-CITRUSの3.3Vピンに、GNDをGNDピンに、AUDを14番ピンに接続します。

サーボモーターの配線

SG90の茶色をGR-CITRUSのGNDに、赤を5Vに、橙を8番ピンに接続します。
こちらのページを参考にさせていただきました。
体験的マイコン学習(GR-CITRUS編) 第2回 サーボモーターを試してみる

プログラム

配線時に参照したページに記載のコードを参考にし、下記のコードを作成しました。
これをデバッグ実行すれば、音圧センシングを開始します。
音圧が一定値を超えるとモーターが作動し、植物がわさわさします!

DancingPlant.rb
#!mruby
ch = 0
servo_pin = 8
angle = 0
angle_int =180
servo_status = 0

# 8番ピンをサーボ用ピンに割り当てる
Servo.attach(ch, servo_pin)
# サーボの角度設定
Servo.write(ch, angle)
# USB通信でprintfするための設定
usb = Serial.new(0)

# 14番ピンにオーディオ入力を割り当てる 
pinMode(14, 2) #INPUT_PULLUP

# 100ms間隔でループ
loop do
    delay(100)
    # マイクから音圧取得 音圧は平均330-340程度 小さいほど音圧が大きい
    audio_level = analogRead(14)
    usb.println(audio_level.to_s)
    # 音圧がしきい値を越えればサーボモーター動作
    if (audio_level < 330) then
        usb.print("Big Sound")
        if servo_status == 0
            angle = angle + angle_int
        else
            angle = angle - angle_int
        end
        if angle >= 180
            servo_status = 1
        elsif angle <= 0
            servo_status = 0
        end
        Servo.write(0, angle)        
    end
end

今後

私としては、WA-MIKANと組み合わせて植物がツイートするようにもしたい。
あるいはツイートしたら、わさわさ動くようにすると面白いかも。
観葉植物にちょっとした人格を持たせるような面白さがありますので、ご興味ある方いかがでしょうか?

ちなみにこの作品で特別賞として、トランジスタ技術2018年3月号とAIスピーカー製作キットいただいたので、また作ってみたいと思います。