パルス&ラッチボックス   



【使い方】

  外部スイッチと電池オモチャ等の間に挟んで使用
  ① 電源スイッチを入れる(赤LED点灯)
  ② 外部スイッチを押すとリレーON(緑LED点灯)

    [パルス モード] 外部SWONでリレー0.1秒間ON
    [ラッチ モード] 外部SWをONするたびにリレー交互にON ・OFF

   モードの切り替え:青のジャンパー線の位置で切り替え

       


【部品】  (  )は入手先 判然としないものあり

  ATtiny13A-PU(秋月電商)、リレーモジュール(アマゾン中華製5V)
  乾電池ボックス(シリコンハウス、オルタネイトスイッチ(シリコンハウス or 100均タッチライトから?)
  ブレッドボード(アマゾン中華製)、ジャンパー線(シリコンハウス ブレッドボード用)
  3.5φモノラルジャック・プラグ、ケース(100均or ホームセンター?)

【回路】

   


【スケッチ】 → sketch のダウンロード

/*
  ==================================
  one shot helper by ATtiny13.ino
  ==================================
  ATtiny13A-PU
    電源電圧:1.8~5.5V、コアサイズ:8bit、クロック:20MHz、プログラムメモリ:1kB
    ピン配置
                 RESET・ ・VCC
                 A3 D3・ ・D2 A1   SCK <= SW
        RELAY => A2 D4・ ・D1(PWM) MISO
                   GND・ ・D0(PWM) MOSI <= dip
    書き込み
        学習回路:HIDaspx(トップマン製ヒダピオ学習回路)
                or Arduino as ISP
        ボード:ATtiny13(bitduino13)
        Clock:★9.6MHzのみが無難
*/
#define SW 2
#define RELAY 4
#define dip 0

//状態の定義
#define SW_ON LOW    //入力:ONのときLOW(pullup抵抗なので)
#define SW_OFF HIGH  //      OFFのときHIGH
#define OUT_ON LOW   //出力:LOWでON
#define OUT_OFF HIGH //      HIGHでOFF
#define FLG_ON 1     //フラグ
#define FLG_OFF 0

//変数の定義
int SW_state = SW_OFF;    //外部スイッチ入力の入力状態
int old_SW_state = SW_OFF;// 古い外部スイッチの状態 (初期設定はOFF)
int RELAY_state = FLG_OFF;  // LED点滅の状態 (初期設定はOFF)
int pulse_time = 100;    //パルス出力時間(ミリ秒)

void setup() {
  pinMode(SW, INPUT_PULLUP);
  pinMode(dip, INPUT_PULLUP);
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, HIGH);   //リレー出力OFF
}

void loop() {
  if (digitalRead(dip) == SW_OFF) { //ディップスイッチがオフの時、パルスモード
    if (digitalRead(SW) == SW_ON) { //外部スイッチが押されて、かつ
      if (SW_state == 0) { //OFFからONになったときだけパルス出力する
        SW_state = 1;
        digitalWrite(RELAY, OUT_ON);    //LED出力ON
        delay(pulse_time);
        digitalWrite(RELAY, OUT_OFF);   //LED出力OFF
      }
    }
    else if (SW_state == 1) { //ONからOFFになったとき
      SW_state = 0;
      delay(50);              //チャタリング対策
    }
  }
  else if (digitalRead(dip) == SW_ON){  //  ディップスイッチがオンの時、ラッチモード
    //  外部スイッチをONするたびに出力のON・OFFが切り替わる
    SW_state = digitalRead(SW);    // 外部スイッチの状態を読み取る
    //スイッチがON、前回がOFFだったとき
    if ( SW_state == SW_ON && old_SW_state == SW_OFF ) {
      //RELAY点滅の状態を切り替える
      if (RELAY_state == FLG_ON) {  // フラグがONのとき
        RELAY_state = FLG_OFF;        // OFF
      }
      else {                  // フラグがOFFのとき
        RELAY_state = FLG_ON;        // ON
      }
      delay(50);                // チャタリング防止のウエイト
    }
    old_SW_state = SW_state;        // スイッチの状態をold_SW_stateへ保存
    if (RELAY_state == FLG_ON) {      // LEDの点滅状態がONのとき
      digitalWrite(RELAY, OUT_ON);  //リレー出力ON
    }
    else {                          // OFFのとき
      digitalWrite(RELAY, OUT_OFF); //リレー出力OFF
    }
  }
}