概要
市販のネズミ撃退器を設置してみたがあまり効果がないので自作してみた。
ATtiny202を用いて下記のような動作をする。
- ランダムな周波数でPWMを出力する。(25kHzから50kHz)
- ランダムな時間待つ。(0.1秒から3秒)
- PWM出力を停止する。
- ランダムな時間待つ。(0.1秒から1秒)
- 1に戻る。
動作条件
- CPUはATtiny202
- 開発ツールはArduino IDE
- Arduino IDEのツールタブから10MHz内部発信の設定をする。 ”Clock: 10 MHz Internal”
- ATtiny202の「8ビットPWM動作」機能を使う。
- CTRLA – 制御A (Control A)のクロック選択で”CLK_PER/2”を選択する。
- 周波数を8ビットで設定できるように計算する。
回路図

ソースプログラム
//
// 20kHzから40kHzのPWMをランダムな時間で制御するプログラム
//
// ATtiny202 用のプログラム
// Arduino IDEでの設定は"Clock: 10MHz internal"で動作する。
// 書き込み装置: “SerialUPDI - SLOW 57600 baud”
// これらを設定したら”ブートローダーを書き込む”をクリックする。
//
#define PWM_PIN PIN_PA6 // 矩形波の出力ピン (ICの2ピン)
// CCMPL の範囲を定義
#define CCMPL_MAX 255 // 20kHz
#define CCMPL_MIN 100 // 50kHz
// 矩形波出力を開始
void startPWM(uint8_t ccmpl) {
TCB0.CTRLA = 0; // TCB0を無効化 (リセット)
TCB0.CCMPL = ccmpl; // 周波数設定 (8ビット分解能)
TCB0.CCMPH = ccmpl / 2; // 50% デューティ比
TCB0.CTRLB = TCB_CCMPEN_bm | TCB_CNTMODE_PWM8_gc; // 8ビットPWMモード
TCB0.CTRLA = TCB_ENABLE_bm | TCB_CLKSEL_CLKDIV2_gc; // 分周2 (10MHzクロック)
}
// 矩形波出力を停止
void stopPWM() {
TCB0.CTRLA = 0; // TCBを無効化
}
void setup() {
pinMode(PWM_PIN, OUTPUT); // 出力ピンの設定 (PA6, ICの2ピン)
while (1) {
uint8_t ccmpl = random(CCMPL_MIN, CCMPL_MAX + 1); // CCMPL範囲でランダム選択
startPWM(ccmpl);
uint16_t onTime = random(100, 5001); // 0.1秒~5秒
delay(onTime);
stopPWM();
uint16_t offTime = random(100, 2001); // 0.1秒~2秒
delay(offTime);
}
}
void loop() {
// メインループは使用しない (while内で動作)
}
結果・検証・課題
(実行結果や改善点)