スイッチの入力検知で受付ロボットを作ってみる

2021年8月17日

ArduinoのdigitalReadを使うことでスイッチの入力を検知することは理解できたので、実際にタクトスイッチをロボットに取り付けて受付ロボットを作ってみます。

digitalReadで制御してみます。

Arduinoでこんなものを作ってみます

クムクムロボットのボードはArduino Leonardo互換のボードで、既にボード内にはArduinoのブートローダーが標準で搭載されています。
そのため、クムクムロボットの背面のUSBコネクタとパソコンをUSBケーブルで接続し、パソコンではArduinoのIDEを起動すればそのまま簡単にArduinoのプログラミングができてしまします。

今日はこんなものを作ってみます。

Arduinoのプログラムと実際の動き

実際に動いている様子の動画です。(Arduinoのソースコードは後でダウンロードできます)
クムクムのポートなどの説明は 以前の投稿記事「クムクムロボット[QX-001R3J]の回路構成とArduinoプログラミング」 を見ながらプログラミングすることができます。

ブレッドボードでの接続図

クムクムロボットのサーボモータが接続されているポートはArduinoのデジタル入出力端子です。

クムクムロボットでの動きは、モータを回転させるために出力として使用していますが、入力にもセットして使えるため、このモーター接続ポートの一つをスイッチの入力として使用してみます。

実際には一番左(クムクムロボットでの右腕)の部分を今回は入力ポートとして、ArduinoのpinMode関数ではINPUTとして使用しています。

この回路では、このポートに常にデジタル信号のHIGH(+5V)が入力されていて、スイッチを押されたときデジタル信号のLOW(0V)になるので、このタイミングで目的の動作をするようなプログラムを作ってみます。

プログラム

//
//  スイッチ入力に反応するクムクム
//
#include <Servo.h>
#include "AquesTalk.h"

#define AQT_I2C_ADDR        0x2E    // AquesTalkのI2Cスレーブアドレス
#define AQT_SPEED           (100)   // 発話速度(100=標準、50:最遅 300:最速)
#define AQT_PITCH           (16)    // 声の高さ(64=標準、0:高い 254:低い)
#define AQT_ACCENT          (0)     // アクセントの強さ(64=標準、0:なし 255:強い)

#define MT_RARM  4
#define MT_RFOOT 5
#define MT_RANK  6
#define MT_FACE  7
#define MT_LANK  8
#define MT_LFOOT 9
#define MT_LARM  10
#define MT_POWER 11
#define LED_R    A0
#define LED_G    A1
#define LED_B    A2

//クラスの宣言///////////////////////////////////////////////////////////
Servo       MT[7] ;                //7個のサーボクラス
AquesTalk   AQ(AQT_I2C_ADDR) ;      //発話(AquesTalk)クラスオブジェクト

//-------------------------------------------------------
//セットアップ
//-------------------------------------------------------
void setup() {
    //ポートセット
    pinMode(MT_RARM,INPUT) ;
    pinMode(MT_FACE,OUTPUT) ;
    pinMode(MT_POWER,OUTPUT) ;
    pinMode(LED_R ,OUTPUT) ;
    //モータセット
    MT[0].attach(MT_FACE) ;
    digitalWrite(MT_POWER,HIGH) ;
    //お喋りセット
    AQ.SetSpeed(AQT_SPEED);   // 発話速度
    AQ.SetPitch(AQT_PITCH);   // 声の高さ
    AQ.SetAccent(AQT_ACCENT); // アクセントの強さ
    //初期状態
    digitalWrite(LED_R,LOW);   //LED赤消灯
    MT[0].write(90) ;         //サーボモータ顔まっすぐ
}  
//
//メインプログラム
//
void loop() {
    int sw_status ;
    
    sw_status = digitalRead(MT_RARM) ;  //左腕のピンに接続されたスイッチ

    //スイッチが押されたら
    if(sw_status==LOW){
        digitalWrite(LED_R,HIGH) ;      //LED赤点灯
        AQ.Synthe("#J") ;               //ポンと音を鳴らして
        AQ.Synthe("irrasyaimase") ;     //いらっしゃいませと喋って
        MT[0].write(70) ;               //ちょっと右向いて
        delay(500) ;                    //500m秒待って
        MT[0].write(110) ;              //ちょっと左向いて
        delay(500) ;                    //500m秒待って
        MT[0].write(90) ;               //まっすぐ向く
        digitalWrite(LED_R,LOW) ;       //LED赤消灯
    }
}

プログラムの主要部分の説明
※ソースコード内にコメントを記載ていますのでここでは主要部分を説明します。

5行目 #include “AquesTalk.h”
Arduino用AquesTalkライブラリーはArduinoにインストールせずプログラムソースのある部分に置いていますのでインクルード分では<>を使わず””を使っています。

25行目 Servo MT[7] ;
モータは7個あるので7個分のクラスを配列で宣言しました。
今回は1個しか使いませんが、反応で腕や足などを動かしたい場合に配列宣言しておくと便利に使えます。

33行目 pinMode(MT_RARM,INPUT) ;
受付のピンポン入力スイッチはクムクムモータポートの右腕モータ部分のポートを使用します。
そのためArduino標準関数でこのポートをINPUT(入力)に設定しました。

39行目 digitalWrite(MT_POWER,HIGH) ;
モータへ電源を与えます。
この命令を送っておかないと、検出用のスイッチで使っている右腕モータの電源部分に5Vが出力されないためスイッチ検出ができません。

ArduinoIDEで読み込めるソースコードはここをクリックするとダウンロードできます。