シューティングタイマー 数珠つなぎ版

・電源電圧:9V
・子機接続可能数最大:31個
・消費電流
  親機:100mA
  子機:100mA/台

・Arduino、ケーブル、電源等はキットに付属していません。Aliexpress等で購入してください
・Arduinoは中国製の互換機で動きます
・LANケーブルは電力線として使っているので極端に細いものは良くない。シールド付きは硬いので柔らかいカテゴリー5かカテゴリー5eが最適
・ピエゾセンサーは壊れやすいセンサーです。10個¥100程度と安いので壊れたらAliexpress等で購入してください
・ハード、ソフト共に平凡な物なので著作権はありません。コピー、改変、量産販売は自由です

使い方:
・スイッチと動作
  SW1 スタートボタン、赤外線リモコンでも良い
  SW2 モード変更
  SW3 子機自動検出および子機リセット。電源投入時に自動検出されるので特に押す必要無い
     ケーブルの接触不良などの判断用
     SW3を押しても何の反応もない最も親機に近い子機もしくはそれを接続しているケーブルが断線していると判断する
・赤外線リモコンは何でも使える。デコードはしていないのでどのボタンを押したのか判断は出来ない
・モード
  5種類ある
  機能は動画を参照
・子機のLEDが点灯している物しか反応しない。当たるとLEDは消えるので同じ標的を2度撃つことは出来ない


2021-05-22

子機を接続するときはLANケーブルで数珠つなぎにする。親機側にセンサーを付けられるが機能しない。ケーブルは長くても良い。長すぎるとケーブルの抵抗分だけ電圧が落ちるので限界はある。通信機能そのものは100m程度伸ばしても問題無い
YouTube動画 シューティングタイマー数珠つなぎ版
商品ページ 親機
商品ページ 子機

R0049028.jpg

親機単体で使用することも可能。センサー本体間の電線は5m程度伸ばして問題無い。子機が無いのでスタートしてから的に当たるまでの時間計測しかできない

R0049035.jpg

親機。R4はこの写真では470Ωが付いていますが330Ωに設計変更

S3180013.jpg

2024-03-01発売ロットからブザーは小さいものに変更。音量は少し小さくなっているが同時に両方を使ってみないと分からないレベル

R0052315.jpg

子機R4はこの写真では470Ωが付いていますが親機同様330Ωに設計変更。子機も親機も通信ICとその周辺の抵抗が暖かくなる。高速通信機能はターミネーターに比較的小さな抵抗値の物を使うのでターミネーターの消費電電力が案外大きい

S3180016.jpg

LEDは基板から電線を出して別のところに配置しても問題無い

S3180017.jpg

部品表。子機を使う場合、親機のアンプ回路は無駄になってしまうがキットには付属している

buhinhyo2.png

子機にプログラムを書き込むときはこのように挿す。パソコンから見ると1つのポートにArduinoが2個つながっている状態になるがボードをArduino UNOにすれば親機、Arduino Pro Miniに変更すれば子機に書き込まれる。親機のプログラムがシリアル通信をしていると上手く書き込めなくなるが親機はシリアル通信ではなくソフトウェアシリアルを使うようにしてこの問題を回避している
プログラムの書き込み方はここ

R0049044.jpg

Arduino UNO。親機の下にある物はこれ

R0049122.jpg

センサーの白い部分は出来るだけ短時間で半田付けしてください。鉄板に直接センサーを貼り付けるとセンサーが壊れることがあるので磁石経由にするのがお勧めです。磁石は¥100ショップで購入できます

R0050320.jpg
プログラム
ファイル ファイルタイプ 添付ファイルの解説
electric_target_plate_master_ino.zip arduino 親機スケッチ Arduinoではプログラムのことをスケッチと呼ぶ
electric_target_plate_slave_ino.zip arduino 子機スケッチ すべての子機にこのプログラムを書き込む
electric_target_plate_kit_ino.zip arduino 親機スケッチ 親機単体で使う時はこのプログラムを書き込む
機能変更したい人のための参考
0001  //------------------------------------------------------ 2021-05-20 --------------
0002 // air-soft gun plate Target System Master (Arduino 1.8.13)
0003 //
0004 // Board: Arduino Uno
0005 // Library:
0006 // TM1637 by Avishay Orpaz V1.2.0
0007 //----------------------------- written by Hiroyuki Iizuka ---- Japan ------------
0008 #include <TM1637Display.h>
0009 #include <SoftwareSerial.h>
0010 #include <EEPROM.h>
0011
0012 #define MODE_ANY_LAST_TARGET_ID 1
0013 #define MODE_RANDOM_SHOT_COUNT 10
0014 #define MODE_RANDOM_TIMEOUT_SHOT_COUNT 6
0015 #define MODE_RANDOM_TIMEOUT_DISAPPEAR 1000 // msec 1000 = 1000 msec = 1.0 sec
0016 #define MODE_RANDOM_TIMEOUT_INTERVAL 2000 // msec
0017
0018 #define WAIT_MIN 20 // x 0.1 seconds 20 = 0.1 x 20 = 2.0 sec
0019 #define WAIT_MAX 40 // x 0.1 seconds
0020
0021 #define MAX_TARGET 10 // 1 to 31
0022
0023 #define MODE_RANDOM 1
0024 #define MODE_ANY 2
0025 #define MODE_LAST 3
0026 #define MODE_SEQUENTIAL 4
0027 #define MODE_RANDOM_TIMEOUT 5
0028 #define EEPROM_ADDRESS_MODE 0
0029
0030 #define SOFT_SERIAL_RX 7
0031 #define SOFT_SERIAL_TX 11
0032
0033 #define TM1637_CLK 4 // digital port 4
0034 #define TM1637_DIO 5 // digital port 5
0035
0036 #define TM1637_COLON_ON 0b01000000
0037 #define TM1637_COLON_OFF 0b00000000
0038
0039 #define BUZZER 8 // digital port 8
0040 #define BUZZER_ON 1
0041 #define BUZZER_OFF 0
0042 #define HALF_VOLUME
0043
0044 #define SENSOR 2 // interrupt 0 = pin2
0045
0046 #define IR 6 // digital port 6
0047 #define IR_ON 0
0048
0049 #define LED_RED 9 // digital port 9
0050 #define LED_GREEN 10 // digital port 10
0051 #define LED_ON 1
0052 #define LED_OFF 0
0053
0054 #define SW1 A5 // analog port A5
0055 #define SW2 A4 // analog port A4
0056 #define SW3 A3 // analog port A3
0057 #define SW_ON 0
0058 #define SW_OFF 1
0059
0060 #define DATA_IN 3 // digital port 3
0061
0062 #define MASK_LED_RED 0b10000000
0063 #define MASK_LED_GREEN 0b01000000
0064 #define MASK_RESET 0b00100000
0065 #define MASK_ECHO 0b01000000
0066 #define MASK_ID 0b00011111
0067
0068 TM1637Display display(TM1637_CLK, TM1637_DIO);
0069 SoftwareSerial slaveSerial(SOFT_SERIAL_RX, SOFT_SERIAL_TX);
0070
0071 unsigned char number_of_target = 0;
0072 unsigned long hit_time;
0073 unsigned char mode;
0074
0075 //----------------------- beep ------------------------------------
0076 void beep(void)
0077 {
0078 tone(BUZZER, 1000); // 1kHz
0079 delay(300);
0080 noTone(BUZZER);
0081 }
0082
0083 void beep_on(void)
0084 {
0085 #ifdef HALF_VOLUME
0086 tone(BUZZER, 1000); // 1kHz
0087 #else
0088 digitalWrite( BUZZER, BUZZER_ON );
0089 #endif
0090 }
0091
0092 void beep_off(void)
0093 {
0094 #ifdef HALF_VOLUME
0095 noTone(BUZZER);
0096 #else
0097 digitalWrite( BUZZER, BUZZER_OFF );
0098 #endif
0099 }
0100
0101 //----- hit target interrupts -----------------
0102 void slave_impact()
0103 {
0104 hit_time = millis();
0105 }
0106
0107 //------ get number of target -----------------
0108 unsigned char get_number_of_target()
0109 {
0110 unsigned char number_of_target;
0111 unsigned char slave_data;
0112
0113 number_of_target = 0;
0114 display.showNumberDec( number_of_target, false );
0115 slaveSerial.flush();
0116 digitalWrite( LED_RED, LED_ON );
0117 for( unsigned char id = 1 ; id <= MAX_TARGET ; id++ ) {
0118 slaveSerial.write( MASK_RESET | MASK_ECHO | id );
0119 delay(100); // wait 0.1sec
0120 if( slaveSerial.available() ) {
0121 number_of_target = slaveSerial.read();
0122 display.showNumberDec( number_of_target, false );
0123 }
0124 }
0125 slaveSerial.flush();
0126 digitalWrite( LED_RED, LED_OFF );
0127
0128 return number_of_target;
0129 }
0130
0131 //------------- reset target -----------------
0132 void reset_all_target()
0133 {
0134 for( unsigned char id = 1 ; id <= number_of_target ; id++ ) {
0135 slaveSerial.write( MASK_LED_RED | MASK_RESET | id );
0136 }
0137 }
0138
0139 //-------- show mode ----------------------------------
0140 void show_mode_number( unsigned char mode )
0141 {
0142 display.clear();
0143 display.showNumberDec( mode, false, 1, 4 );
0144 }
0145
0146 //----------------------- enable random target -----------------
0147 unsigned char random_target( boolean last_shot, unsigned char number_of_target )
0148 {
0149 unsigned char target_id;
0150 static unsigned char prev_target_id;
0151
0152 do {
0153 target_id = random( 10, number_of_target * 10 + 9 ) / 10 ;
0154 } while( target_id == prev_target_id );
0155
0156 if( last_shot ) {
0157 slaveSerial.write( MASK_LED_GREEN | MASK_LED_RED | target_id );
0158 } else {
0159 slaveSerial.write( MASK_LED_GREEN | target_id );
0160 }
0161 prev_target_id = target_id;
0162
0163 return target_id;
0164 }
0165
0166 //-------- enable target -----------------
0167 void enable_target( unsigned char target_id )
0168 {
0169 if( target_id == 1 ) {
0170 slaveSerial.write( MASK_LED_GREEN | MASK_LED_RED | target_id );
0171 } else {
0172 slaveSerial.write( MASK_LED_GREEN | target_id );
0173 }
0174 }
0175
0176
0177
0178 //------- wait routine ---------------------------------
0179 boolean wait_procedure( long wait_count )
0180 {
0181 while( wait_count > 0 ) {
0182 delay(100);
0183 digitalWrite( LED_RED, LED_ON );
0184 wait_count--;
0185 digitalWrite( LED_RED, LED_OFF );
0186 if( digitalRead( SW3 ) == SW_ON ) {
0187 return false; // abort
0188 }
0189 }
0190
0191 return true; // normal end
0192 }
0193
0194 //------- display time ---------------------------------
0195 void update_time_beep_off( unsigned long start_time )
0196 {
0197 static unsigned long prev_time;
0198 unsigned long diff_time;
0199 unsigned long now;
0200
0201 now = millis();
0202 if( (start_time + 300) < now ) {
0203 beep_off();
0204 }
0205 if( prev_time != now ) {
0206 diff_time = now - start_time;
0207 if( diff_time % 10 == 0 ) {
0208 display.showNumberDecEx( (now - start_time) / 10, TM1637_COLON_ON, false);
0209 }
0210 prev_time = now;
0211 }
0212 }
0213
0214 //------ MODE No1 RANDOM --------------------------------
0215 void exec_mode_random()
0216 {
0217 unsigned long start_time;
0218 unsigned char slave_data;
0219 unsigned char shot_count;
0220 boolean clock_run;
0221
0222 //----- start switch ----------------------
0223 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON ) {
0224 //---- setup ------
0225 reset_all_target();
0226 display.showNumberDec(8888, false);
0227 digitalWrite( LED_GREEN, LED_OFF );
0228 //---- wait -------
0229 if( wait_procedure( random( WAIT_MIN, WAIT_MAX ) ) == false ) {
0230 return; // abort
0231 }
0232 //---- start ------
0233 shot_count = MODE_RANDOM_SHOT_COUNT;
0234 start_time = millis();
0235 display.clear();
0236 digitalWrite( LED_GREEN, LED_ON );
0237 random_target( false, number_of_target );
0238 shot_count--;
0239 beep_on();
0240 clock_run = true;
0241 while( true ) {
0242 //----- hit data -------------------------
0243 if( slaveSerial.available() ) {
0244 slave_data = slaveSerial.read();
0245 if( shot_count == 0 ) {
0246 clock_run = false;
0247 digitalWrite( LED_GREEN, LED_OFF );
0248 display.showNumberDecEx( (hit_time - start_time) / 10, TM1637_COLON_ON, false); // result time
0249 break; // finish
0250 } else {
0251 if( shot_count == 1 ) {
0252 random_target( true, number_of_target );
0253 } else {
0254 random_target( false, number_of_target );
0255 }
0256 shot_count--;
0257 }
0258 }
0259 //----- update time display -------------------
0260 if( clock_run ) {
0261 update_time_beep_off( start_time );
0262 }
0263
0264 //----- forced termination -----
0265 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON or digitalRead( SW3 ) == SW_ON ) {
0266 return;
0267 }
0268 }
0269 }
0270 }
0271
0272 //------ MODE No2 ANY --------------------------------
0273 void exec_mode_any()
0274 {
0275 unsigned long start_time;
0276 unsigned char slave_data;
0277 boolean clock_run;
0278 unsigned int id_sum;
0279
0280 //----- start switch ----------------------
0281 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON ) {
0282 //---- setup ------
0283 reset_all_target();
0284 display.showNumberDec(8888, false);
0285 digitalWrite( LED_GREEN, LED_OFF );
0286 //---- wait -------
0287 if( wait_procedure( random( WAIT_MIN, WAIT_MAX ) ) == false ) {
0288 return; // abort
0289 }
0290 //---- start ------
0291 id_sum = 0;
0292 for( unsigned char id = 1 ; id <= number_of_target ; id++ ) {
0293 slaveSerial.write( MASK_LED_GREEN | id );
0294 id_sum += id;
0295 }
0296 start_time = millis();
0297 display.clear();
0298 digitalWrite( LED_GREEN, LED_ON );
0299 beep_on();
0300 clock_run = true;
0301 while( true ) {
0302 //----- hit data -------------------------
0303 if( slaveSerial.available() ) {
0304 slave_data = slaveSerial.read();
0305 id_sum -= slave_data;
0306 if( id_sum == 0 ) {
0307 clock_run = false;
0308 digitalWrite( LED_GREEN, LED_OFF );
0309 display.showNumberDecEx( (hit_time - start_time) / 10, TM1637_COLON_ON, false);
0310 break; // finish
0311 }
0312 }
0313 //----- update time display -------------------
0314 if( clock_run ) {
0315 update_time_beep_off( start_time );
0316 }
0317
0318 //----- forced termination -----
0319 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON or digitalRead( SW3 ) == SW_ON ) {
0320 return;
0321 }
0322 }
0323 }
0324 }
0325
0326 //------ MODE No3 LAST --------------------------------
0327 void exec_mode_last()
0328 {
0329 unsigned long start_time;
0330 unsigned char slave_data;
0331 boolean clock_run;
0332 unsigned int id_sum;
0333
0334 //----- start switch ----------------------
0335 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON ) {
0336 //---- setup ------
0337 reset_all_target();
0338 display.showNumberDec(8888, false);
0339 digitalWrite( LED_GREEN, LED_OFF );
0340 digitalWrite( LED_RED, LED_OFF );
0341 //---- wait -------
0342 if( wait_procedure( random( WAIT_MIN, WAIT_MAX ) ) == false ) {
0343 return; // abort
0344 }
0345 //---- start ------
0346 id_sum = 0;
0347 for( unsigned char id = 1 ; id <= number_of_target ; id++ ) {
0348 id_sum += id;
0349 if( id == MODE_ANY_LAST_TARGET_ID ) {
0350 slaveSerial.write( MASK_LED_GREEN | MASK_LED_RED | id );
0351 } else {
0352 slaveSerial.write( MASK_LED_GREEN | id );
0353 }
0354 }
0355 start_time = millis();
0356 display.clear();
0357 digitalWrite( LED_GREEN, LED_ON );
0358 beep_on();
0359 clock_run = true;
0360 while( true ) {
0361 //----- hit data -------------------------
0362 if( slaveSerial.available() ) {
0363 slave_data = slaveSerial.read();
0364 id_sum -= slave_data;
0365 if( slave_data == MODE_ANY_LAST_TARGET_ID ) {
0366 if( id_sum == 0 ) {
0367 clock_run = false;
0368 digitalWrite( LED_GREEN, LED_OFF );
0369 display.showNumberDecEx( (hit_time - start_time) / 10, TM1637_COLON_ON, false);
0370 break; // finish
0371 } else {
0372 digitalWrite( LED_RED, LED_ON );
0373 digitalWrite( LED_GREEN, LED_OFF );
0374 }
0375 }
0376 }
0377 //----- update time display -------------------
0378 if( clock_run ) {
0379 update_time_beep_off( start_time );
0380 }
0381
0382 //----- forced termination -----
0383 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON or digitalRead( SW3 ) == SW_ON ) {
0384 return;
0385 }
0386 }
0387 }
0388 }
0389
0390 //------ MODE No4 SEQURNTIAL --------------------------------
0391 void exec_mode_sequential()
0392 {
0393 unsigned long start_time;
0394 unsigned char slave_data;
0395 unsigned char target_id;
0396 boolean clock_run;
0397
0398 //----- start switch ----------------------
0399 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON ) {
0400 //---- setup ------
0401 reset_all_target();
0402 display.showNumberDec(8888, false);
0403 digitalWrite( LED_GREEN, LED_OFF );
0404 //---- wait -------
0405 if( wait_procedure( random( WAIT_MIN, WAIT_MAX ) ) == false ) {
0406 return; // abort
0407 }
0408 //---- start ------
0409 target_id = number_of_target;
0410 enable_target( target_id );
0411 target_id--;
0412 start_time = millis();
0413 display.clear();
0414 digitalWrite( LED_GREEN, LED_ON );
0415 beep_on();
0416 clock_run = true;
0417 while( true ) {
0418 //----- hit data -------------------------
0419 if( slaveSerial.available() ) {
0420 slave_data = slaveSerial.read();
0421 if( target_id == 0 ) {
0422 clock_run = false;
0423 digitalWrite( LED_GREEN, LED_OFF );
0424 display.showNumberDecEx( (hit_time - start_time) / 10, TM1637_COLON_ON, false);
0425 break; // finish
0426 } else {
0427 enable_target( target_id );
0428 target_id--;
0429 }
0430 }
0431 //----- update time display -------------------
0432 if( clock_run ) {
0433 update_time_beep_off( start_time );
0434 }
0435
0436 //----- forced termination -----
0437 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON or digitalRead( SW3 ) == SW_ON ) {
0438 return;
0439 }
0440 }
0441 }
0442 }
0443
0444 //------ MODE No5 RANDOM_TIMEOUT --------------------------------
0445 void exec_mode_random_timeout()
0446 {
0447 unsigned long start_time;
0448 unsigned long next_time;
0449 unsigned long disappear_target_time;
0450 unsigned long now;
0451 unsigned char slave_data;
0452 unsigned char shot_count;
0453 unsigned char hit_count = 0;
0454 unsigned char current_target_id;
0455
0456 //----- start switch ----------------------
0457 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON ) {
0458 //---- setup ------
0459 reset_all_target();
0460 display.showNumberDec(8888, false);
0461 digitalWrite( LED_GREEN, LED_OFF );
0462 //---- wait -------
0463 if( wait_procedure( random( WAIT_MIN, WAIT_MAX ) ) == false ) {
0464 return; // abort
0465 }
0466 //---- start ------
0467 shot_count = MODE_RANDOM_TIMEOUT_SHOT_COUNT;
0468 start_time = millis();
0469 display.clear();
0470 digitalWrite( LED_GREEN, LED_ON );
0471 current_target_id = random_target( false, number_of_target );
0472 next_time = start_time + MODE_RANDOM_TIMEOUT_INTERVAL;
0473 disappear_target_time = start_time + MODE_RANDOM_TIMEOUT_DISAPPEAR;
0474 shot_count--;
0475 beep_on();
0476 display.showNumberDec( 0, false );
0477 while( true ) {
0478 //----- hit data -------------------------
0479 if( slaveSerial.available() ) {
0480 slave_data = slaveSerial.read();
0481 hit_count++;
0482 display.showNumberDec( hit_count, false);
0483 }
0484
0485 //----- update target -------------------
0486 now = millis();
0487 if( (start_time + 300) < now ) {
0488 beep_off();
0489 }
0490 if( now > next_time ) {
0491 next_time = next_time + MODE_RANDOM_TIMEOUT_INTERVAL;
0492 if( shot_count > 0 ) {
0493 if( shot_count == 1 ) {
0494 current_target_id = random_target( true, number_of_target );
0495 } else {
0496 current_target_id = random_target( false, number_of_target );
0497 }
0498 shot_count--;
0499 } else {
0500 digitalWrite( LED_GREEN, LED_OFF );
0501 break; // finish
0502 }
0503 }
0504 if( now > disappear_target_time ) {
0505 disappear_target_time += MODE_RANDOM_TIMEOUT_INTERVAL;
0506 slaveSerial.write( MASK_RESET | current_target_id );
0507 }
0508
0509 //----- forced termination -----
0510 if( digitalRead( IR ) == IR_ON or digitalRead( SW1 ) == SW_ON or digitalRead( SW3 ) == SW_ON ) {
0511 return;
0512 }
0513 }
0514 }
0515 }
0516
0517 //----------------------- setup -----------------------------------
0518 void setup()
0519 {
0520 pinMode( IR, INPUT );
0521 pinMode( SENSOR, INPUT );
0522 pinMode( SW1, INPUT );
0523 pinMode( SW2, INPUT );
0524 pinMode( SW3, INPUT );
0525 pinMode( DATA_IN, INPUT );
0526 pinMode( LED_BUILTIN, OUTPUT );
0527 pinMode( BUZZER, OUTPUT );
0528 pinMode( LED_RED, OUTPUT );
0529 pinMode( LED_GREEN, OUTPUT );
0530
0531 digitalWrite( LED_BUILTIN, LED_ON );
0532 digitalWrite( LED_RED, LED_ON );
0533 digitalWrite( LED_GREEN, LED_ON );
0534 delay(300);
0535 digitalWrite( LED_BUILTIN, LED_OFF );
0536 digitalWrite( LED_RED, LED_OFF );
0537 digitalWrite( LED_GREEN, LED_OFF );
0538
0539 display.setBrightness(7);
0540 display.showNumberDec(8888, false);
0541 beep();
0542
0543 randomSeed(analogRead(0));
0544 slaveSerial.begin( 38400 );
0545 attachInterrupt(1, slave_impact, FALLING ); // 1 = digital port 3
0546
0547 delay(2500);
0548 display.clear();
0549 number_of_target = get_number_of_target();
0550 if( number_of_target == 0 ) {
0551 while( true) { // connection error
0552 digitalWrite( LED_GREEN, LED_OFF );
0553 digitalWrite( LED_RED, LED_ON );
0554 delay( 1000 );
0555 digitalWrite( LED_GREEN, LED_ON );
0556 digitalWrite( LED_RED, LED_OFF );
0557 delay( 1000 );
0558 }
0559 }
0560 delay(1000);
0561
0562 mode = EEPROM.read( EEPROM_ADDRESS_MODE );
0563 if( mode < 1 || 5 < mode ) {
0564 mode = MODE_RANDOM;
0565 }
0566 show_mode_number( mode );
0567 }
0568
0569 //----------------------- loop ------------------------------------
0570 void loop()
0571 {
0572 //------ daisy chain test -------------------------------
0573 if( digitalRead( SW3 ) == SW_ON ) {
0574 digitalWrite( LED_GREEN, LED_OFF );
0575 display.showNumberDec( 0, false );
0576 number_of_target = get_number_of_target();
0577 }
0578
0579 //------- mode change ------------------------
0580 if( digitalRead( SW2 ) == SW_ON ) {
0581 digitalWrite( LED_RED, LED_ON );
0582 digitalWrite( LED_GREEN, LED_OFF );
0583 if( mode == 5 ) {
0584 mode = 1;
0585 } else {
0586 mode++;
0587 }
0588 EEPROM.write( EEPROM_ADDRESS_MODE, mode );
0589 show_mode_number( mode );
0590 digitalWrite( LED_RED, LED_OFF );
0591 while( digitalRead( SW2 ) == SW_ON ) { ; }
0592 }
0593
0594 //------- execute ------------------------------
0595 switch( mode ) {
0596 case MODE_RANDOM: exec_mode_random(); break;
0597 case MODE_ANY: exec_mode_any(); break;
0598 case MODE_LAST: exec_mode_last(); break;
0599 case MODE_SEQUENTIAL: exec_mode_sequential(); break;
0600 case MODE_RANDOM_TIMEOUT: exec_mode_random_timeout(); break;
0601 }
0602 }
0603
0604 //--------------- E N D -------------------------------------------------------------------
行番号
解説
8
TM1637ライブラリーをインストールしないとコンパイルできない
12
モード3 で最後に撃つ標的番号。親機に一番近いものが1、その隣が2....
13
モード1 ランダムモードでの撃つ回数
14
モード5 時間制限モードでの撃つ回数
15,16
モード5 時間制限モードでの標的が切り替わる時間。緑LEDが点灯している時間が15行目、インターバルが16行目
18,19
スイッチ1を押してから射撃可能になるまでの待ち時間。ここで指定した範囲で待ち時間はランダム
21
子機を10個以上にしたいならここを大きくする。無駄に大きいと起動時の時間が長くなる

ご参考の回路図 親機。これは回路をいじりたい人用。通信はディファレンシャルなので電線2本で1つの信号を構成している。電線が1本余計に必要になるが対ノイズ性能が向上するので長距離伝送が可能な通信規格は大抵ディファレンシャルになっている

master_kairozu.png

ご参考の回路図 子機。これは回路をいじりたい人用。的に当たった時刻の計測はシリアル通信のバケツリレー方式だと親機がそれを検出するまでの時間遅れが大きくなるのでシリアルとは別回路になっている。LANコネクターの7,8番ピンが検出専用の信号線。親機ではこの信号を割り込み処理で受け取っている。親機のソフトから見ると的に当たったタイミング(時刻)が先にわかる。それがどの的の物なのかはシリアル通信で遅れて届くというしくみになっている。バケツリレー方式1ホップ分の遅れはほぼ一定なのでシリアル通信データの到着時刻から的に当たった時刻を逆算することも可能であるがプログラムではそのようにしていない

slave_kairozu.png
基板データー
ファイル ファイルタイプ 添付ファイルの解説
electronictarget_plate_master_rev1_GERBER.zip Gerber 親機ガーバーデーター FusionPCB用 他のメーカーでは使えない 基板を自分で発注したい人用
electronictarget_plate_rev1_panel_GERBER.zip Gerber 子機ガーバーデーター FusionPCB用 他のメーカーでは使えない 基板を自分で発注したい人用 1枚の基板に4回路面付してある。10枚発注すると40個基板が作られる
CADデーター
ファイル ファイルタイプ 添付ファイルの解説
electronictarget_plate_master_rev1.zip EAGLE 親機 プリント基板CAD EAGLE V4.15以降用
electronictarget_plate_rev1.zip EAGLE 子機 プリント基板CAD EAGLE V4.15以降用