Arduino ライブラリとは?(製作編)

目次

ライブラリ付属のスケッチ例動作確認

動画内で使用したライブラリ「HCSR04 ultrasonic sensor」に付属しているスケッチ例の動作確認のために、ブレッドボード回路に合わせて変更したスケッチです。

スケッチ変更は以下の2点です。

  • オブジェクト生成時のトリガーピンとエコーピンの接続端子を(5,6)から(2, 3)に変更
  • delayの引数を60から200に変更
#include <HCSR04.h>

HCSR04 hc(2, 3); //initialisation class HCSR04 (trig pin , echo pin)

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    Serial.println(hc.dist()); // return curent distance in serial
    delay(200);                 // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.
}

距離に応じたLED制御のスケッチ

/*
    Arduino ライブラリとは?(製作編)
    距離に応じてLEDを制御する
*/

#include <HCSR04.h>

#define TRIG_PIN 2 // トリガーピンの接続端子
#define ECHO_PIN 3 // エコーピンの接続端子

#define NEAR 10.0 // この値以下だったら「近い」判定(単位:cm)
#define MID  30.0 // この値以下だったら「中間」判定(単位:cm)

// LED接続端子
#define LED_NEAR 4 // 近い
#define LED_MID  6 // 中間
#define LED_FAR  8 // 遠い

HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN); // 距離センサーオブジェクト生成

void setup(){
  // シリアルモニタ初期化
  Serial.begin(9600);

  // 端子設定
  pinMode(LED_NEAR, OUTPUT);
  pinMode(LED_MID,  OUTPUT);
  pinMode(LED_FAR,  OUTPUT);
}

void loop() {
  // 距離測定&シリアルモニタ表示
  float distance = kyoriSensor.dist();
  Serial.println(distance);

  if( distance > 0.0 ) { // 測定できた時の処理
    if( distance <= NEAR ){ // 近い場合
      digitalWrite(LED_NEAR, HIGH);
      digitalWrite(LED_MID,  LOW);
      digitalWrite(LED_FAR,  LOW);
    } else if( distance <= MID ) { // 中間の場合
        digitalWrite(LED_NEAR, LOW);
        digitalWrite(LED_MID,  HIGH);
        digitalWrite(LED_FAR,  LOW);
      } else { //それ以外の場合
        digitalWrite(LED_NEAR, LOW);
        digitalWrite(LED_MID,  LOW);
        digitalWrite(LED_FAR,  HIGH);
      }
  } else {
    digitalWrite(LED_NEAR, HIGH);
    digitalWrite(LED_MID,  HIGH);
    digitalWrite(LED_FAR,  HIGH);
  }
  
  // 時間待ち
  delay(200);
}

距離に応じたスピーカー制御(改善前)

距離に応じたスピーカー制御をする場合、センサーからの距離を5cmごとに区切ると、一番近いブロックの音がでにくくになります。

これは、センサーから2cmまでの距離は測定保証していないためです。

このスケッチは5cmごとに区切って音を出すようにしているため、センサーに一番近い音(ド)がでにくくなっています。

/* Arduino ライブラリとは?(製作編)
     距離に応じてスピーカを制御する(ブロック位置の調整なし)
*/
#include <HCSR04.h>

#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子

#define SPEAKER_PIN A0 // スピーカー接続端子

#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)

// ド〜ドの音程の周波数
//            ド    レ   ミ   ファ  ソ   ラ    シ   ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};

// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);

void setup(){
  // シリアルモニタ初期化
  Serial.begin(9600);
}

void loop() {
  // 距離測定&シリアルモニタ表示
  float distance = kyoriSensor.dist();
  Serial.println(distance);

  if( distance > 0.0 ) { // 測定できた時の処理
    // どのブロックに障害物があるか計算
    //(計算結果は整数にするため結果を代入する変数はint型にする)
    int block = distance / BLOCK_LENGTH;

    // ブロック位置に対応する音程を鳴らす
    if( block>=0 && block<=7 ) {
      tone(SPEAKER_PIN, note[block]);
    } else {
      noTone(SPEAKER_PIN);
    }
  } else {
    noTone(SPEAKER_PIN);
  }

  // 時間待ち
  delay(200);
}

距離に応じたスピーカー制御(改善後)

上のスケッチでは一番近い音程が出しにくいため、一番近いブロックはセンサーから2ブロック分、つまり10cmまでをドの音に割り当てました。

/* Arduino ライブラリとは?(製作編)
     距離に応じてスピーカを制御する(ブロック位置の調整あり)
*/
#include <HCSR04.h>

#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子

#define SPEAKER_PIN A0 // スピーカー接続端子

#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)

// ド〜ドの音程の周波数
//            ド    レ   ミ   ファ  ソ   ラ    シ   ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};

// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);

void setup(){
  // シリアルモニタ初期化
  Serial.begin(9600);
}

void loop() {
  // 距離測定&シリアルモニタ表示
  float distance = kyoriSensor.dist();
  Serial.println(distance);

  if( distance > 0.0 ) { // 測定できた時の処理
    // どのブロックに障害物があるか計算
    //(計算結果は整数にするため結果を代入する変数はint型にする)
    int block = distance / BLOCK_LENGTH;

    // ブロック位置に対応する音程を鳴らす
    if( block==0 || block==1 ){
      tone(SPEAKER_PIN, note[0]);
    } else if( block>=2 && block<=8 ) {
      tone(SPEAKER_PIN, note[block-1]);
    } else {
      noTone(SPEAKER_PIN);
    }
  } else {
    noTone(SPEAKER_PIN);
  }

  // 時間待ち
  delay(200);
}

別ライブラリでの実装例

今回使用した「HCSR04 ultrasonic sensor」を使うと、tone関数で発生している音がプツプツ切れることがわかりました。

これは、ライブラリ側の制御が tone関数 の信号発生に影響していることが原因です。

そこで、別のライブラリを使用したところ、音の途切れがなくなりました。ライブラリとスケッチは以下になります。

使用したライブラリ

「Bifrost library for HC-SR04」というライブラリを使用しました。

スケッチ

スケッチは、使用するライブラリに合わせて以下の2点変更しています。

  • ヘッダファイル名
  • メソッド呼び出し
/* Arduino ライブラリとは?(製作編)
     距離に応じてスピーカを制御する(他のライブラリを利用)
*/
#include <hcsr04.h>

#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子

#define SPEAKER_PIN A0 // スピーカー接続端子

#define BLOCK_LENGTH 5 // 1ブロックの長さ(単位:cm)

// ド〜ドの音程の周波数
//            ド    レ   ミ   ファ  ソ   ラ    シ   ド
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};

// HC-SR04のオブジェクト生成
HCSR04 kyoriSensor(TRIG_PIN, ECHO_PIN);

void setup(){
  // シリアルモニタ初期化
  Serial.begin(9600);
}

void loop() {
  // 距離測定&シリアルモニタ表示
  float distance = kyoriSensor.distanceInMillimeters() / 10.0;
  Serial.println(distance);

  if( distance > 0.0 ) { // 測定できた時の処理
    // どのブロックに障害物があるか計算
    //(計算結果は整数にするため結果を代入する変数はint型にする)
    int block = distance / BLOCK_LENGTH;

    // ブロック位置に対応する音程を鳴らす
    if( block==0 || block==1 ){
      tone(SPEAKER_PIN, note[0]);
    } else if( block>=2 && block<=8 ) {
      tone(SPEAKER_PIN, note[block-1]);
    } else {
      noTone(SPEAKER_PIN);
    }
  } else {
    noTone(SPEAKER_PIN);
  }

  // 時間待ち
  delay(200);
}
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次