Raspberry PI 5活用術(害獣撃退音強化編)

組み込みシステム

撃退音強化の方針

 機器設置後の検出機会が多くないが、何度か撃退できていないと思われる写真が撮影されていたので、撃退音発生部の強化を行う。

強化法としては、

  1. 撃退音の周波数変更又は追加
    • 低周波音波追加
  2. 撃退音の音量増大
    • 駆動電圧を上げる(現状+10V)
    • 追加低音波は大音量可能に(オーディオアンプ駆動)

撃退音発生部の変更

  • 新規追加部
    • 低音音源(Arduino Uno + 分電圧回路)
    • オーディオアンプ(小型で数ワット以上)
    • スピーカー(屋外設置可能)
    • アンプ用電源(+12V)
    • より大きな筐体(追加部の組み込みの為)
  • 修正部
    • 高音発生部(低音部とまとめてArduino Unoの上部拡張基板に)

音源生成

 高音及び低音音源を発生させるArduino Unoの組み込みソフトウェア(Arduino IDE)を以下に載せます。

#include <math.h>
#include <float.h>

#define DISABLE_PIN 3
#define HFREQ_PIN 6
#define LFREQ0_PIN 9
#define LFREQ1_PIN 10
#define LED_PIN 13

#define COUNT_TIMER1 1500
#define HIGH_FREQUENCY 99
#define LOW_FREQUENCY_DUTY1 750
#define LOW_FREQUENCY_DUTY2 150

int disable;
int disable_prev;

void setup() {
  // ディスエブル入力ピンモード設定
  pinMode(DISABLE_PIN,INPUT);

  // 高音出力ピンモード設定
  pinMode(HFREQ_PIN,OUTPUT);

  //タイマー0 の設定
  TCCR0B = 0x00;                    // タイマー0 いったん停止
  TCCR0A = 0b01000010;              // モード設定

  TCCR0B = 0b00000010;              // 8分周

  OCR0A = HIGH_FREQUENCY;         // 16M/2/8 = 1MHz x 100カウントで 10KHz

  // 低音出力ピンモード設定
  pinMode(LFREQ0_PIN,OUTPUT);
  pinMode(LFREQ1_PIN,OUTPUT);

  //タイマー1 の設定
  TCCR1B = 0x00;                    // タイマー1 いったん停止
  // タイマー1 制御レジスタB
  TCCR1A = 0b10100010;              //10:コンペアマッチAでLOW,10:高速PWM動作
  // タイマー1 制御レジスタB
  TCCR1B = 0b00011101;              //11:高速PWM動作, 101:1024分周
 
  // タイマー1 のカウント数設定
  ICR1 = COUNT_TIMER1;              //0から数える. 全体時間 16M/1024 Hz -> 64us x 1500 = 0.096s = 10.4Hz
  // HIGHの時間(クロック数)
  OCR1A = LOW_FREQUENCY_DUTY1;      //0から数える. High時間 Duty OCR1A/ICR1 = 1/2 = 50% pin9
  OCR1B = LOW_FREQUENCY_DUTY2;      //0から数える. High時間 Duty OCR1A/ICR1 = 1/10 = 10% pin10

  // LED出力ピンモード設定
  pinMode(LED_PIN,OUTPUT);
  digitalWrite(LED_PIN, 0);
}

void loop() {
  // ディスエブル入力取得
  disable = digitalRead(DISABLE_PIN);
  
  // イネーブル入力立ち上がり
  if ((disable == 0) && (disable_prev == 1)) {
      //タイマー0 の設定
    TCCR0B = 0x00;                    // タイマー0 いったん停止
    TCCR0A = 0b01000010;              // モード設定

    TCCR0B = 0b00000010;              // 8分周

    OCR0A = HIGH_FREQUENCY;      // 16M/2/8 = 1MHz x 100カウントで 10KHz


    TCCR1B = 0x00; 
    TCCR1A = 0b10100010;              //10:コンペアマッチAでLOW,10:高速PWM動作
    TCCR1B = 0b00011101;
      // タイマー1 のカウント数設定
    ICR1 = COUNT_TIMER1;              //0から数える. 全体時間 16M/1024 Hz -> 64us x 1500 = 0.096s = 10.4Hz
    // HIGHの時間(クロック数)
    OCR1A = LOW_FREQUENCY_DUTY1;      //0から数える. High時間 Duty OCR1A/ICR1 = 1/2 = 50% pin9
    OCR1B = LOW_FREQUENCY_DUTY2;      //0から数える. High時間 Duty OCR1A/ICR1 = 1/10 = 10% pin10

    digitalWrite(LED_PIN, 1);
  }
  else if (disable == 1) {
    TCCR0A = 0x00;
    TCCR0B = 0x00;
    TCCR1A = 0x00;
    TCCR1B = 0x00;

    digitalWrite(LED_PIN, 0);
  }
  // ディスエブル入力保存
  disable_prev = disable;
}

 Raspberry Piよりの音波発生イネーブル信号は、Raspberry Piからのノイズ対策フォトカプラーにて論理反転される為、ディスエブル信号に。

 また、発熱を抑えるためにEFT及びアンプへの入力は、ディスエブル時強制的に0Vに。

 ここでは、高周波を10kHzに、低周波を10Hzとしているが、それぞれは [HIGH_FREQUENCY]と[COUNT_TIMER1]を変更する事で変える事ができる。

音波発生回路

回路図を以下に示す。

 R2は、FETオン時に+12Vが印加されるので抵抗値と容量(ワット数)の選択に注意の事。

 基本的に抵抗値が低いほど、超音波スピーカーに印加される電圧が大きくなります(数十kHzの周波数ではインピーダンスが数百Ω)。

筐体への組み込み

 新規筐体に全ての部品を組み込んだ写真を以下に示す。

 筐体の側面上部には、冷却用換気穴を多数設け、Arduino Uno上部には、音波発生回路を実装している。

# 防水、内部温度管理を考慮の上、故障や漏電に気を付けて、ご自分の責任で行ってください

コメント

タイトルとURLをコピーしました