モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

手を振りかざすと白旗を上げて降参する Arduino

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/02/06
最終更新最終更新
2024/12/25
記事区分記事区分
一般公開

目次

    Arduinoが趣味のエンジニアです。電子工作やプログラミングを楽しんでいます!

    赤外線の距離センサは、超音波距離センサと比較して測定できる距離は短めですが、残響を気にする必要がないため短時間に連続して値を取得できます。そのため、接近する物体との距離に応じたサーボモータの制御をリアルタイムに行うことができたりします。

    必要なパーツ

    セロハンテープ、つまようじ、ティッシュペーパーは、サーボモータに持たせる白旗を作るためのものです。

    • シャープ測距モジュール GP2Y0A21YK x1
    • サーボモータ SG92R x1
    • 電解コンデンサ 10μF x1
    • Arduino UNO R3 x1
    • ブレッドボード x1
    • ジャンプワイヤ (適量)
    • 短めのジャンプワイヤ (適量)
    • セロハンテープ、つまようじ、ティッシュペーパー

    回路図

    GP2Y0A21YK は瞬間的に大きな電流が必要になることがあるため、電解コンデンサを付近に設置しています。出力電圧を A0 ピンで A/D 変換して読み取ります。Servo モーターはパルス幅によってその角度を指定します。Servo ライブラリを利用すれば Arduino の PWM ピンから簡単に制御できます。

    制御プログラム

    サーボモータの不要な振動を抑制するために、過去の距離センサの値を記憶して平均したり、一の位と十の位の値を切り捨てたりしています。servo.write() には 0-180 の値を入力できますが、距離センサが 3V 程度の電圧までしか出力しないため、実際に白旗が振り上がるのは 108 度程度までとなります。

    #include <Servo.h>
    
    #define SERVO_PWM_PIN 13
    #define DISTANCE_INPUT_PIN 0
    
    // サーボモータを制御するためのオブジェクトを生成
    Servo servo;
    
    // サーボモータをできるだけなめらかに制御するために、
    // 過去の距離センサの値を記憶します。
    const int BUF_SIZE = 64;
    int buf[BUF_SIZE];
    int k = 0;
    
    void setup() {
      // サーボモータの初期化
      servo.attach(SERVO_PWM_PIN);
    
      // 距離センサの値で配列を初期化
      for(int i = 0; i < BUF_SIZE; ++i) {
        buf[i] = analogRead(DISTANCE_INPUT_PIN);
      }
    }
    
    void loop() {
    
      // 距離センサから値を読み取ります。
      buf[k] = analogRead(DISTANCE_INPUT_PIN);
    
      // 過去の距離センサの値を平均します。
      long avg = 0;
      for(int i = 0; i < BUF_SIZE; ++i) {
        avg += buf[i];
      }
      avg /= BUF_SIZE;
    
      // サーボモータの角度を計算して PWM 制御します。
      // 一の位と十の位を切り捨てることで、サーボモータの不要な振動を抑制します。
      int deg = map(avg/100, 0, 10, 0, 180); // 0-1023 を 0-180 に変換
      servo.write(deg);
    
      // 次のインデックスに進めます。
      k = (k + 1) % BUF_SIZE;
    }
    
    Likeボタン(off)0
    詳細設定を開く/閉じる

    記事内で用いられたハードウェア

    アカウント プロフィール画像

    Arduinoが趣味のエンジニアです。電子工作やプログラミングを楽しんでいます!

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • 内蔵LEDを点灯させるまで (Arduino)
        サムネイル画像-2f49b4ad94
        Arduinoとは Arduino は初心者でも入門しやすいマイコンボードです。アルデュイーノと読みます。マイコンとは家電などに内蔵されている小さなコンピュータで、マイコンが必要とする周辺機器一式と一緒に一つのボードにまとめたものがマイコンボードです。数あるマイコンの中で特にArduinoにはAVRマイコンが使用されています。2005年にイタリアで開始されたオープンソースハードウェアのプロジェクト...
        ねこねこ12/27/2018に更新
        いいねアイコン画像0
      • 虚仮威しの防犯装置 (Arduino)
        サムネイル画像-ed824a48bf
        人が接近すると防犯用の音を鳴らします。インターネットに接続してメール送信機能を追加すれば、虚仮威しどころか立派な防犯装置になります。センサの性能は視野角が約 120 度と広範囲で、距離もおおよそ 2m まで検知可能です。赤外線を発する人体や動物などが動くと反応します。自動ドアや照明の自動点灯にも応用されています。
      • Arduino で作る温度と気圧の計測基板
        サムネイル画像-aca6d0091b
        専用の IC を利用すると、簡単に温度や気圧を測定できます。インターネットに接続してグラフ化したりボットを作ったりと応用先は様々ですが、ここでは LCD に結果を表示する測定基板を作成します。 必要なパーツ 以下のパーツが必要になります。画像ではコンデンサを直列に接続したり抵抗を並列に接続したりしていますが、これは手元に適切な値のパーツがなかったためです。 高精度
      • 電力の無駄遣い (定電圧電源)
        サムネイル画像-eebe29d9ae
        マイコンを含む様々な IC を動作させるためには定電圧電源が必要です。USB ケーブルなどで供給する場合を除き、定電圧を出力するための回路が必要になります。ここでは、乾電池 9V 形から得られる電圧を 5V に変換し、更に 3.3V に変換し、最後に 5V に昇圧するという電力の無駄遣いともとれる基板を作ります。動作させるものはマイコンではなく燦然と輝く LED です。汎用基板として様々な場面で利...
      • Arduino で作る 7 セグメント LED タイマー
        サムネイル画像-d000ba25fa
        Arduino の入門として、4 桁の 7 セグメント LED でカウントアップタイマーを作ってみます。PIN の電流制限を考慮してトランジスタを使用する必要があったり、桁数が多いためダイナミック点灯制御を用いなければならなかったりと、単なる LED 点灯制御と比較して考えなければならない事項は多めです。