2021-01-17
・機械的スイッチを使うと手元まで電線を這わせないといけないので代わりに赤外線センサーを使用している
リモコンは家電用なら何でも使える
・圧電ブザーを使用している。音は小さめ
・7セグメントディスプレイドライバーはTM1637
これ以外のドライバーを使った類似品は以下のプログラムを改造しないと動かないので注意
・ピエゾセンサーはホットボンドで鉄板に貼り付けてある
標的の大きさを変えたいときは磁石経由にすると良い
・木やプラスチック板でも標的に使える
・aliexpressでの価格
arduinoUNO互換機約¥500
7セグメントディスプレイ約¥200(7Segment TM1637のキーワードで検索するとすぐ見つかる)
ピエゾセンサー 10枚で¥100 直径15mm 大きさが異なると感度が変わるので回路の抵抗値を変更する必要がある
赤外線センサーHX1838 10個約¥100
arduino互換機以外は秋月電子で買っても価格差は小さいはず
オペアンプはNJU7043Dでも問題無いはず(実験していないので不明であるが性能大体同じはず)
Youtube動画 自作シューティングタイマー
実態配線図。arduinoはatmega328の物ならUNO以外でも動く
アンプ部の配線図。基板を上から見た物。基板が透明なら配線は黄色い線のように見える
抵抗は1/6W
C2の容量は0.1~10μF何でも良い
アンプ表面
アンプ裏面
アンプ部の回路図
・MCP6002は5Vのrail-to-railオペアンプなら他メーカーの物でも大抵問題なく動くはず。8ピン2回路入りであればメーカーが違ってもピン配列は同じ
・感度はR3/R4になる。R3を大きくすれば感度が上がる、小さくすれば感度は下がる
R4を大きくすると感度は下がる、小さくすると感度は上がる
もっと単純な回路でも実用にはなるがこの回路構成にすると感度調整が容易になる
・D1,D2は電源が入っていないときに的を撃った時に発生する高電圧を吸収させる保護ダイオード
センサーに何も回路が繋がっていないときにエアガンで標的を撃つと100V近い電圧が発生する
電源が入っているときはオペアンプが電力を吸収する
センサーの解放電圧は大きくでも発生する電力は小さいのでオペアンプで吸収できる
・IC1Aは電流-電圧変換回路。ピエゾセンサーを流れる電流が電圧に変換されて1番ピンに出力される
・R2,C1はローパスフィルター
・IC1Bが約20倍の非反転増幅回路
リモコンは家電用の物なら大抵なんにでも反応する
どのボタンを押してもよい
・ボタンを押すと3~5秒後にブザーが鳴って時計が動き始める
・的に当たると時計が止まる
・的に当たった時、リモコンを押したときにarduinoのLEDを点灯させている
arduino UNOのLEDは暗いので点灯していることは遠くからは見えないと思う
0001 //------------------------------------------------------ 2021-01-17 --------------
0002 // air-soft gun plate Target Systems
0003 //
0004 // Library
0005 // TimerOne
0006 // TM1637 by Avishay Orpaz V1.2.0
0007 //----------------------------- written by Hiroyuki Iizuka ---- Japan ------------
0008 #include <TimerOne.h>
0009 #include <TM1637Display.h>
0010
0011 boolean time_update = false;
0012 unsigned long millisecond10 = 0;
0013 boolean clock_run = false;
0014 unsigned char wait;
0015
0016 #define CLK 4
0017 #define DIO 5
0018 TM1637Display display(CLK, DIO);
0019
0020 #define BUZZER 8
0021 #define SENSOR 2 // interrupt 0 = pin2
0022
0023 #define IR 6 // pin 6
0024 #define IR_ON 0
0025
0026 #define LED 13 // pin 13
0027 #define LED_ON 1
0028 #define LED_OFF 0
0029
0030 #define WAIT_MAX 5 // seconds
0031 #define WAIT_MIN 3 // seconds
0032
0033 //----------------------- timer1 interrupts -----------------------
0034 void TimingISR()
0035 {
0036 if( clock_run ) {
0037 time_update = true;
0038 millisecond10++;
0039 }
0040 }
0041
0042 //----------------------- piezo sensor interrupts -----------------
0043 void impact()
0044 {
0045 clock_run = false;
0046 digitalWrite( LED, LED_ON );
0047 delay(50);
0048 digitalWrite( LED, LED_OFF );
0049 }
0050
0051 //----------------------- beep ------------------------------------
0052 void beep()
0053 {
0054 tone(BUZZER, 5000); // 5kHz
0055 delay(500);
0056 noTone(BUZZER);
0057 }
0058
0059 //----------------------- setup -----------------------------------
0060 void setup()
0061 {
0062 pinMode( IR, INPUT );
0063 pinMode( SENSOR, INPUT );
0064 pinMode( LED, OUTPUT );
0065 pinMode( BUZZER, OUTPUT );
0066
0067 display.setBrightness(0x0f);
0068 Timer1.initialize(10000); // 10ms period
0069 Timer1.attachInterrupt(TimingISR);
0070
0071 display.showNumberDec(8888, false);
0072 beep();
0073 display.clear();
0074
0075 clock_run = false;
0076 randomSeed(analogRead(0));
0077
0078 attachInterrupt(0, impact, RISING ); // 0 = pin2
0079 }
0080
0081 //----------------------- loop ------------------------------------
0082 void loop()
0083 {
0084 if( time_update ) {
0085 display.showNumberDec(millisecond10, false);
0086 time_update = false;
0087 }
0088
0089 if( digitalRead( IR ) == IR_ON ) {
0090 digitalWrite( LED, LED_ON );
0091 clock_run = false;
0092 millisecond10 = 0;
0093 display.showNumberDec(millisecond10, false);
0094 wait = random( WAIT_MIN, WAIT_MAX );
0095 digitalWrite( LED, LED_OFF );
0096 }
0097
0098 if( wait != 0 ) {
0099 while( wait > 0 ) {
0100 delay(1000);
0101 wait--;
0102 }
0103 clock_run = true;
0104 beep();
0105 }
0106 }
0107
0108 //--------------- E N D -------------------------------------------------------------------