体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で 導通テスタ (4/20)

導通テスタが欲しかったのだが、簡単な回路がなかったのでATtiny13Aマイコンで作ってみた。

ブザーを鳴らす、ボタンをチャタリング無しで押す、プルアップ回路のスケッチを集めて適当にリファクタリングしてプログラムを作成。
ブザーが無かったのでイヤホンを分解してピンヘッダに半田付けしてグルーガンで固め、ブザー鳴動とLED点滅の2つの表現をタスクスイッチで切り替えるようにした。

単4電池ボックスやボタン電池、ACアダプタのいずれでも動作。回路に直接ライタを結線してもとりあえず動作。
ソースはArduino IDE 1.0.5-r2のスケッチで。Japanino上でATtiny13用にbitDuino導入済み。arduino Uno(Japanino)はardunio ISPライタ化済み。

【実体配線図】
a0034780_22515608.png
ライタ部分と比較しやすいように並べた。ポータブル時はarduino Unoからの6本の線をはずし、電源を繋ぐ。

【回路図】
a0034780_22521456.png
回路は簡単だが、電源GND間にセラコンとかいるのかな~。2入力2出力で8ピンマイコンで十分だ。

【写真】
a0034780_17393882.png
イヤホンやプローブは100均の園芸用の針金0.5mm(配線にも使用)で固定。

【ソース】
/*
* ATtiny13A 導通テスタ
*
* bitDuino + Arduino IDE 1.0.5-r2
*
* 機能:PB1とGNDに繋いだプローブで回路の導通チェックを行う
* タクトスイッチ押下で、導通時 ブザー鳴動 <=> LED点灯 のモード切替(切替時点滅)
*
* CPU:ATtiny13A VCC:3~5V PB0:ブザー PB1:プローブ+端子 PB3:LED+
* PB4:切替用タクトスイッチ GND:ブザー、プローブ、LED-、タクトスイッチ LED用1kΩ抵抗
*
* License:Free
*
* ※ただしプログラム容量削減のため pinMode関数、digitalWrite関数を置換
*/

#define M_Wait 250 // ブザー音程(鳴動時間:μs)
// ピン割り当て
// ただし、Arduino IDE(bitDuino)の ピン番号 と ATtiny13Aのデータシートの ピン番号 は同じ
#define M_Buzzer 0 // PB0:ブザー用
#define M_Probe 1 // PB1:プローブ+用
#define M_LED 3 // PB3:LED+用
#define M_Switch 4 // PB4:切替スイッチ用

// レジスタのビットクリア
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
// レジスタのビットセット
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// ピンの入出力方向設定
// 出力
sbi(DDRB, M_Buzzer); /* eq. pinMode(M_Buzzer, OUTPUT); */ // ブザー
sbi(DDRB, M_LED); /* eq. pinMode(M_LED, OUTPUT); */ // LED
// 入力 & プルアップ
cbi(DDRB, M_Probe); sbi(PORTB, M_Probe); // 導通テスタピン
/* eq. pinMode(M_Probe, INPUT_PULLUP); */
cbi(DDRB, M_Switch); sbi(PORTB, M_Switch); // タクトスイッチ
/* eq. pinMode(M_Switch, INPUT_PULLUP); */
}

void loop() {
  // タクトスイッチ 切替状態保持(mode=0:導通時 ブザー鳴動 / 1:導通時 LED点灯)
static int mode = 0;

// モード切替処理
  // 切替スイッチ押下か?(プルアップなので押下でLOW)
while( digitalRead(M_Switch) == LOW ) {
delay(10); // 10ms待ち(チャタリング排除のため)
if( digitalRead(M_Switch) == LOW ) { // 連続してスイッチ押下か?
mode = 1 - mode; // 状態反転
// LED点滅
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
delay(300); // 0.3秒点灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
break;
}
}

// プローブ導通チェック
  // プローブとGND間が導通している(プルアップなのでLOW)なら
if( digitalRead(M_Probe) == LOW ) {
if( mode == 1 ) {
// LED点灯
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
} else {
// ブザー鳴動(矩形波HI/LOW 1周期分)
sbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, HIGH); */
delayMicroseconds(M_Wait); // 矩形波HIの時間
cbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, LOW); */
delayMicroseconds(M_Wait); // 矩形波LOWの時間
}
} else {
// LED消灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
}
}



[PR]
by k1segawa | 2017-04-20 23:01 | arduino, AVR | Comments(0)