пеинтбольный маркер на ардуино

maximooos
Offline
Зарегистрирован: 15.09.2016

Имеется дешевый электронный маркер JT. Вся его электронность заключается в срабатывании спускового солиеоида при нажатии на курок.Это делает мягким курок, но никакой скорострельности и режимов стрельбы не дает. Задумал проапгрейдить его с помощью про мини. По скольку с железом я более-менее дружу, а с программированием я только научился мигать светодиодом, прошу у вас помощи с написанием скетча.

Имеется две кнопки курок и предохранитель, двухцветный диод индикации состояния предохранителя и сам соленоид с электронным ключом. Все уже это собрано в кучу с ардуиной и написан простейший скетч. Стандартные свои функции маркер уже выполняет (стреляет при нажатии на курок), а вот как написать ему режимы ума не приложу.
Вот скетч
int button = 2;
int sol = 8;
void setup() {
pinMode(sol, OUTPUT);
pinMode(button, INPUT);
}
void loop(){
if (digitalRead(button) == HIGH) {
digitalWrite(sol, HIGH);
}
else {
digitalWrite(sol, LOW);
}
}

По примеру мигания светодиода при нажатии кнопки.

maximooos
Offline
Зарегистрирован: 15.09.2016

Курок у меня на втором порту, предохранитель на третьем, соленоид на восьмом, девятый пин -красный светодиод, десятый- зеленый светодиод.
Как заставить по нажатию на предохранитель (пин 3) блокировать срабатывание, зажигать красный диод и при повторном нажатии снова разблокировать и зажечь зеленый диод?
Я так думаю мой кривой скетч для этого не подходит, да?)

vvadim
Offline
Зарегистрирован: 23.05.2012

напишите полностью что вы хотите получить от вашей стрелялки, обсудим

7808543@gmail.com

maximooos
Offline
Зарегистрирован: 15.09.2016

В иделе хочу, чтоб после загрузки ардуино устройство было заблокировано и загорался красный диод, при нажатии на предохранитель загорался зеленый и устройство разблокировалось.
Затем при нажатии на курок на миллисекунду на соленоид подавался сигнал длительностью в одню миллисекунду, а если удерживать курок в течении 500 миллисекунд подавалось еще два импульса длительностью в миллисекунду и с интервалом 500 миллисекунд.
И при двойном нажатии были бесконечные импульсы 1 миллисекунда с интервалами 500 миллисекунд.

maximooos
Offline
Зарегистрирован: 15.09.2016

На мыло?

vvadim
Offline
Зарегистрирован: 23.05.2012

как вы на курке собираетесь миллисекунды ловить)))))

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:
Курок у меня на втором порту, предохранитель на третьем, соленоид на восьмом, девятый пин -красный светодиод, десятый- зеленый светодиод. Как заставить по нажатию на предохранитель (пин 3) блокировать срабатывание, зажигать красный диод и при повторном нажатии снова разблокировать и зажечь зеленый диод? Я так думаю мой кривой скетч для этого не подходит, да?)

Привет.

Пока работал, набросал.

Проверьте-дайте ответ что и как.

#define button  2    //курок
#define sol   8      //соленоид
#define Led_RED   9      //девятый пин -красный светодиод
#define Led_GREEN   10     //десятый- зеленый светодиод.
#define pred   3//предохранитель (пин 3)

bool Ogonj = 0; //переменная отвечает за предохранитель

void setup() {
  pinMode(sol, OUTPUT);
  pinMode(Led_RED, OUTPUT);
  pinMode(Led_GREEN, OUTPUT);
  pinMode(button, INPUT);
  pinMode(pred, INPUT);
}

void loop() {
  if (digitalRead(pred) == HIGH) {//управляем предохранителем
    Ogonj = !Ogonj;
    delay(100);// защита от дребезга, если на кнопке есть кондер можно убрать
  }
  if (Ogonj == 1) {//разрешает стрелять
    digitalWrite(Led_RED, LOW);
    digitalWrite(Led_GREEN, HIGH);
    if (digitalRead(button) == HIGH) {
      digitalWrite(sol, HIGH);
    }
    else {
      digitalWrite(sol, LOW);
    }
  }
  if (Ogonj == 0) {//запрещает стрелять
    digitalWrite(Led_RED, HIGH);
    digitalWrite(Led_GREEN, LOW);
    digitalWrite(sol, LOW);
  }
}

 

maximooos
Offline
Зарегистрирован: 15.09.2016

А разве ардуина не может отслеживать время удержания кнопки?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:
В иделе хочу, чтоб после загрузки ардуино устройство было заблокировано и загорался красный диод, при нажатии на предохранитель загорался зеленый и устройство разблокировалось. Затем при нажатии на курок на миллисекунду на соленоид подавался сигнал длительностью в одню миллисекунду, а если удерживать курок в течении 500 миллисекунд подавалось еще два импульса длительностью в миллисекунду и с интервалом 500 миллисекунд. И при двойном нажатии были бесконечные импульсы 1 миллисекунда с интервалами 500 миллисекунд.

Когда писал код этого поста еще не было.

maximooos
Offline
Зарегистрирован: 15.09.2016

Спасибо, сейчас закину потестирую. 

Оказываетая все не так сложно как я представлял.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:

Спасибо, сейчас закину потестирую. 

Оказываетая все не так сложно как я представлял.

Да в любом языке программирования не все так сложно!)

Просто не всем без тренировки удается задачу на алгоритмы пошаговые разложить.

maximooos
Offline
Зарегистрирован: 15.09.2016

ваш скетч работает, при нажатии на предохранитель цвет диода менется, но при нажатии на курок снимается с предохранителя, зажигает зеленый диод и дальше стреляет без проблем.

т.е. снимается с предохранителя курком.

поигрался немного с вашим кодом. сделал короткие очереди по три.

#define button  2    //курок

  #define sol   8      //соленоид

  #define Led_RED   9      //девятый пин -красный светодиод

  #define Led_GREEN   10     //десятый- зеленый светодиод.

  #define pred   3//предохранитель (пин 3)

   

  bool Ogonj = 0; //переменная отвечает за предохранитель

   

  void setup() {

    pinMode(sol, OUTPUT);

    pinMode(Led_RED, OUTPUT);

    pinMode(Led_GREEN, OUTPUT);

    pinMode(button, INPUT);

    pinMode(pred, INPUT);

  }

   

  void loop() {

    if (digitalRead(pred) == HIGH) {//управляем предохранителем

      Ogonj = !Ogonj;

    }

    if (Ogonj == 1) {//разрешает стрелять

      digitalWrite(Led_RED, LOW);

      digitalWrite(Led_GREEN, HIGH);

      if (digitalRead(button) == HIGH) {

        digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);
       
       digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);
      }

      else {

        digitalWrite(sol, LOW);

      }

    }

    if (Ogonj == 0) {//запрещает стрелять

      digitalWrite(Led_RED, HIGH);

      digitalWrite(Led_GREEN, LOW);

      digitalWrite(sol, LOW);

    }

  }

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:

ваш скетч работает, при нажатии на предохранитель цвет диода менется, но при нажатии на курок снимается с предохранителя, зажигает зеленый диод и дальше стреляет без проблем.

т.е. снимается с предохранителя курком.

поигрался немного с вашим кодом. сделал короткие очереди по три.

#define button  2    //курок

  #define sol   8      //соленоид

  #define Led_RED   9      //девятый пин -красный светодиод

  #define Led_GREEN   10     //десятый- зеленый светодиод.

  #define pred   3//предохранитель (пин 3)

   

  bool Ogonj = 0; //переменная отвечает за предохранитель

   

  void setup() {

    pinMode(sol, OUTPUT);

    pinMode(Led_RED, OUTPUT);

    pinMode(Led_GREEN, OUTPUT);

    pinMode(button, INPUT);

    pinMode(pred, INPUT);

  }

   

  void loop() {

    if (digitalRead(pred) == HIGH) {//управляем предохранителем

      Ogonj = !Ogonj;

    }

    if (Ogonj == 1) {//разрешает стрелять

      digitalWrite(Led_RED, LOW);

      digitalWrite(Led_GREEN, HIGH);

      if (digitalRead(button) == HIGH) {

        digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);
       
       digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);digitalWrite(sol,HIGH);
      delay(100);

       digitalWrite(sol, LOW);
       delay(500);
      }

      else {

        digitalWrite(sol, LOW);

      }

    }

    if (Ogonj == 0) {//запрещает стрелять

      digitalWrite(Led_RED, HIGH);

      digitalWrite(Led_GREEN, LOW);

      digitalWrite(sol, LOW);

    }

  }

 

Курок не может срабатывать при включенном предохранителе, смотрите железо!

  if (Ogonj == 1) {//разрешает стрелять
    digitalWrite(Led_RED, LOW);
    digitalWrite(Led_GREEN, HIGH);
    if (digitalRead(button) == HIGH) {  //нажатие курка
      digitalWrite(sol, HIGH);
    }
    else {
      digitalWrite(sol, LOW);
    }
  }

 

maximooos
Offline
Зарегистрирован: 15.09.2016

земетил, что при нажатии на предохранитель иногда срабатывает соленоид, и при нажатии на курок меняется статус предохранителя. перенес предохранитель на 7й пин и все стало работать как нужно.

осталось разобраться с режимами стрельбы..

maximooos
Offline
Зарегистрирован: 15.09.2016

посоветуйте статью для примера. где рассматриваются режимы нажатия кнопки.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:

земетил, что при нажатии на предохранитель иногда срабатывает соленоид, и при нажатии на курок меняется статус предохранителя. перенес предохранитель на 7й пин и все стало работать как нужно.

осталось разобраться с режимами стрельбы..

--На счет ложной сработки, кнопки подтянули?конденсаторы на них ставили?

--Режимы реализовать не сложно но нужно их ка-то выбирать. Или кнопку дополнительную ввести(предпочтительно) или через длинное нажатие ограничителя перебирать(так делать не рекомендую) в бою долго будет.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:

посоветуйте статью для примера. где рассматриваются режимы нажатия кнопки.

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...

 

maximooos
Offline
Зарегистрирован: 15.09.2016

Нужно именно комбинацией нажатий курка менять режимы.Нажатие- один выстрел, удержание- короткая очередь, двойное нажатие -очередь. По крайней мере так реализовано на готовых платах.

maximooos
Offline
Зарегистрирован: 15.09.2016

Спасибо.

maximooos
Offline
Зарегистрирован: 15.09.2016

Я так понимаю, мне нужно использовать таймер millis(), верно?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

maximooos пишет:
Я так понимаю, мне нужно использовать таймер millis(), верно?

да.

Дерзайте. Не получится напишите что не смогли- набросаю за лайки.

maximooos
Offline
Зарегистрирован: 15.09.2016

Спасибо. Нужно самому въезжать. Не буду же вечно вас просить)