2019年04月09日
電子トリガーを作る その2
その1の続き。
今回はセミオート射撃をできるようにします。
セミオート射撃のために、カットオフを検出できるようにします。
セクターギアに開いている穴に直径5mmの磁石を埋め込み、これをホールICで検出します。


メカボックス越しでは磁力を検出できなかったので、穴を開けます。

ユニバーサル基板にホールICを半田付けし、取り付けのためにメカボックスにネジを切りました。


プログラムは以下の通り。
今回はセミオート射撃をできるようにします。
セミオート射撃のために、カットオフを検出できるようにします。
セクターギアに開いている穴に直径5mmの磁石を埋め込み、これをホールICで検出します。
メカボックス越しでは磁力を検出できなかったので、穴を開けます。
ユニバーサル基板にホールICを半田付けし、取り付けのためにメカボックスにネジを切りました。
プログラムは以下の通り。
//カットオフテスト用
//入出力ピンの名称変更
#define SEMI_SW 4 //セミオートスイッチ
#define CUTOFF_SW 3 //カットオフセンサー
#define MOTOR 9 //モーター制御出力
#define LED 13 //マイコンLED
//定数の宣言
const int Chata = 0; //チャタリング防止(マイクロ秒)
const bool ON = LOW; //スイッチ用定数、混乱防止のため
const bool OFF = HIGH;
//変数の宣言
int Fire = 0; //発射制御用変数
bool Coff = LOW; //カットオフセンサー用変数
bool Old_Coff = LOW;
bool SemiTrg = HIGH; //セミオートスイッチ用変数
bool Old_SemiTrg = HIGH;
void setup() {
//入出力ピンの設定
pinMode(SEMI_SW,INPUT);
pinMode(CUTOFF_SW,INPUT);
pinMode(LED,OUTPUT);
}
void loop() {
//現在の各スイッチの状態を検知
Coff = digitalRead(CUTOFF_SW);
SemiTrg = digitalRead(SEMI_SW);
//カットオフスイッチの状態をLEDで表示
if(Coff == HIGH){
digitalWrite(LED,HIGH);
}
if(Coff == LOW){
digitalWrite(LED,LOW);
}
if(Fire >= 1){
analogWrite(MOTOR,254); //変数Fireが1以上のときモーター作動
}
if(Fire > 1){
//カットオフ処理
if(Coff == HIGH && Old_Coff == LOW){
Fire = Fire - 1;
/*カットオフスイッチがLOWからHIGHなったときに
*変数Fireの数字を1引く
*/
}
if(Coff == LOW && Old_Coff == HIGH){
/*物理スイッチを使用する際のチャタリング防止用
*/
}
Old_Coff = Coff;
}
if(Fire == 1){
if(Coff == HIGH && Old_Coff == LOW){
analogWrite(MOTOR,0);
Fire = 0;
/*変数Fireが1に等しい場合、
*カットオフスイッチがLOWからHIGHになったとき
*モーターを停止する
*/
}
if(Coff == LOW && Old_Coff == HIGH ){
/*物理スイッチを使用する際のチャタリング防止用
*/
}
Old_Coff = Coff;
}
if(Fire == 0){
/*トリガー処理、変数Fireの値が0の時のみ
*トリガー入力を受け付ける
*/
analogWrite(MOTOR,0);
if(SemiTrg == ON && Old_SemiTrg == OFF){
Fire = 1;
/*トリガーがOFFからONになったとき
*変数Fireに1を代入する
*/
}
if(SemiTrg == OFF && Old_SemiTrg == ON){
delayMicroseconds(Chata);
/*トリガーがONからOFFになったとき
*チャタリング防止のため
*変数chataマイクロ秒停止する
*/
}
Old_SemiTrg = SemiTrg;
}
if(Fire < 0){
Fire = 0;
}
}
動かすとこんな感じ。