■動物除けの超音波を発生させる

人間には聞こえないが、動物には聞こえる音を作り動物除けができないかと思い色々試行錯誤したいと思います。
まずは、基本となる回路は LEDを点滅させる で使用した回路をつかいました。
人の可聴域は10Hz〜20KHzとされ、猫では60Hz〜65kHzほどの音が聞こえるそうです。
そこで、人間には聞こえなくて猫に聞こえる周波数を発信するプログラムを作成しました。
今回はPIC16F84を使っています。

#include <stdio.h>
#include <stdlib.h>

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

#include <xc.h>
#define _XTAL_FREQ 10000000 //クロック周波数 __delay_ms()に必要
#define _OFFSET 1
volatile unsigned int i = 0 + _OFFSET;

int main(int argc, char** argv) {
    TRISA = 0b00000000; //portAを1:入力、0:出力 全てを出力に設定
    TRISB = 0b00000000; //portBを1:入力、0:出力 全てを出力に設定

    OPTION_REG = 0b00000111; //プリスケーラ1:256
    TMR0IF = 0; // TMR0 レジスタのオーバーフローフラグをリセット
    TMR0IE = 1; // Timer0 割り込みを有効にする
    //   GIE = 1; // 割り込み許可
    while (1) {
        PORTA = 0b00000000; //portAに出力
        PORTB = 0b00000000;
        for (unsigned int j = 0; j < i; j++) {
        }
        PORTA = 0b11111111;
        PORTB = 0b11111111;
        for (unsigned int j = 0; j < i; j++) {
        }
    }
    return (EXIT_SUCCESS);
}

void __interrupt() isr(void) {
    if (TMR0IF) { // TMR0 レジスタがオーバーフローした
        TMR0IF = 0; // TMR0 レジスタのオーバーフローフラグをリセット
        if (i < 2 + _OFFSET) {
            i++;
        } else {
            i = 0 + _OFFSET;
        }
    }
}
赤文字部分の _OFFSET の値を変更してLEDの端子にオシロスコープを接続し、周波数を確認したのが次の表です。

_OFFSET 周波数
0 67.6kHz
1 35.7kHz
2 24kHz
3 18.1kHz
4 14.5kHz
5 12.1kHz
6 10.4kHz
7 9.14kHz
8 8.12kHz
9 7.31kHz
10 6.65kHz
11 6.1kHz
12 5.64kHz

オシロスコープの誤差などで、計算による周波数とは違っていると思いますが、大体の値がつかめると思います。
もう一つの赤文字で表した割り込み許可のコメントアウトを外すと 1秒間に3回程度、(38.146Hz)で _OFFSET + 0 〜 2 の周波数に変化します。

時間ができたら更新します。


▲トップページ > マイコンなど