Новости:

ОЧЕРЕДНАЯ ВСТРЕЧА КЛУБА  08.12.2019 в  11:00
ЖДЕМ ВСЕМ

https://tankspb.com/index.php?topic=1130.0

Автор Тема: ИК_МИШЕНЬ (для домиков и мишени)  (Прочитано 207 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Deny

  • Администратор
  • Маршал
  • *****
  • Сообщений: 2146
  • РЕПУТАЦИЯ: +10559/-0
    • Питерский танковод
    • Награды
Доброго дня, дорогие танкисты!
 На базе  программы переходника для тайген, сделана  упрощенная плата со звуком для  пушек, для мишени, домиков.

 
  - ИК_МИШЕНЬ

В программе irbattle2 надо в скетче  добавить:

#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
#include "irbattle2.h"

SoftwareSerial mySerial(A7, 12); // RX, TX
далее в функцию void setup()

void setup(){
//  pinMode(pin_onoff,INPUT);              // Input for IR on/off button -  эти строки должны быть обязательно за комментированы
//  digitalWrite(pin_onoff, HIGH);         // Enable pull-in resistor

  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  mp3_set_volume (29);       //Громкость работы звукового модуля от 0 до 30

Далее в функции void loop ()

// Shoot
    if (signal_Shoot && readyToShoot)                                    // Check shoot
    {
        digitalWrite(pin_sendShootSig,HIGH);                             // Send shoot signal to TCB
        mp3_play (20);
        lastShootTime = millis();                                        // Save time of shooting
 
  // Recoil servo
    servoBarrelTrigger = servoRecoil.allowMoving();
    if (servoRecoil.allowMoving()) {
      servoRecoil.Move();
    }

Вкладку HIT  копируем отсюда

void HITS_TT()
{
  if (myReceiver.getResults() || irrec_debug) {
    if (myDecoder.decode() || irrec_debug) {
      digitalWrite(pin_Status, LOW);
      long x = (myDecoder.value);
      bool code_NotFound = true;                    // Flag that IR code is absent (true by default)
      bool code_Noise = false;                      // Flag that IR code is parasit (noise); false by default
      byte i = 0;

      // Debug block
      if (irrec_debug) x = 0xA90;                   // Debug info
      printIRData();                              // Print Debug IR dump

      // Check that duplicate illegal IR signal is received
      //      if ((x == lastIRCode) && ! readyToHit) {
      if ( x == lastIRCode ) {
        myReceiver.disableIRIn();
        code_Noise = true;
        lastIRCode = 0;
        Serial.println( String(String(x, HEX) + "   duplicate detected. ") );
      } else {
        lastIRCode = x;
      }

      // Detect noise signal (list of noise signals will be moved to separate structure)
      if (x == 0x811C9DC5) code_Noise = true;
      //0x5CCDEDFE

      // Process all codes from array ir_BattleCodes (if signal isn't noise)
      if (! code_Noise) {
        for (i = 0; i < num_BattleSystems; i++) {
          if (x == ir_BattleSystems[i].codeHash)        // If code found - perform hit actions.
          {
            Serial.print( String(String(x, HEX) + "   Battle system: " + String(ir_BattleSystems[i].Name)) );
            code_NotFound = false;                      // Code is found; set flag 'not_found' to false

            // Confirm received IR code depend from parameter 'codeConfirmation' in BattleSystems structure
            if ( (ir_BattleSystems[i].codeConfirmation) && ( !match_irCode(ir_BattleSystems[i].codeFull, ir_BattleSystems[i].codeLength) ) ) break;   // Signal confirmation
            Serial.println(F(";"));

            hitsTaken ++;           // Increase HIT counter
            hitAction();            // Perform hit actions

            myReceiver.disableIRIn();
            lastIRCode = 0;         // Reset last IR code for prevent false skip of legal code
            break;                  // Code is found; don't need to process next codes
          }
        }
      }

      // Print not detectected code
      if (code_NotFound && (!code_Noise || print_Noise))  Serial.print( String(String(x, HEX) + "   Not found. ") );

      // Supress print output if noise
      if (!(code_Noise && !print_Noise)) {
        Serial.print(F("Reinitialize IRIn; Cycle position: "));
        Serial.println(i);
      }

      // Reset IRIn for receiving next code
      myReceiver.enableIRIn();
      digitalWrite(pin_Status, HIGH);
    }
  }
}

// Hit function
void hitAction ()
{
  // Print debug info
  Serial.print("  Hits taken (hitsTaken):   ");
  Serial.println(hitsTaken);
  Serial.print("  Lives left (tankHealth):  ");
  Serial.println(tankHealth - hitsTaken);

  // Calculate condition for enable taigen recoil depend from tank class and current hit
  // Logic of recoil sending depends from maxHits from structure Battlesystems. (Taigen, Heng-long, DeA)
  if (ir_BattleSystems[pcb_recoilSignal].maxHits > 0 ) {
    digitalWrite(pin_Status, HIGH);
    hit_prvScope = hit_curScope;                                                  // Save previous hit
    //hit_curScope = (byte)hitsTaken / ((float)tankHealth / (tankHealth - 4));    // 4 = Taigen hits-1;
    hit_curScope = (byte)hitsTaken / ((float)tankHealth / (tankHealth - ir_BattleSystems[pcb_recoilSignal].maxHits + 1));    // 4 = Taigen hits-1;
    if (hit_curScope < 0) hit_curScope = 0;
    Serial.print("  Hit scope: (prev) ");
    Serial.println(hit_prvScope);
    Serial.print("  Hit scope: (cur)  ");
    Serial.println(hit_curScope);

    if (hit_prvScope == hit_curScope) {                // if scope not changed - send hit signal to TCB
      sendHitToTCB_general();
    }
  } else {
    // Send hit signal to TCB on each hit
    Serial.print("  Method of hit signal: ");
    (pcb_sendhittotcb) ? Serial.println(F("IR")) : Serial.println(F("Pin"));
    sendHitToTCB_general();
  }

  // Calculate bright of Led strip status color
  strip_Status = ledStrip.Color(0, ((tankHealth - hitsTaken) * ((100 / tankHealth) * 32 / 100)), 0);
  setStripColor(strip_Status, 1);
  mp3_play (50);
  delay(100);
  // Blink 3 times
  blinkGeneral(5, 40, strip_Hit, 2, pin_Hit);

  // If hitsTaken is max - tank destroyed; reboot arduino module
  if (tankHealth - hitsTaken == 0) {

    // Send repeatly hit signal to TCB until TCB destroy (number of TCB lives)
    for (int i = 0; i < ir_BattleSystems[pcb_recoilSignal].maxHits; i++) {
      sendHitToTCB_general();
      blinkGeneral(5, 40, strip_Hit, 2, pin_Hit);

      // Set delay between repeats depend from TCB invulnerability
      delay(ir_BattleSystems[pcb_recoilSignal].invulnerability * 1000);
    }
    digitalWrite(pin_Hit, HIGH);
    mp3_play (60);
    Serial.println(F("  Tank destroyed;"));
    Serial.println(F("Reboot initiated."));
    delay(2000);
    resetFunc();
  }

 
- ИК_ПУШКА
Белый светодиод на схеме - это ИК ДИОД
Красный - сигнализация попадания


 
- Полная схема


Но если не хотите заморачиваться, то плату могу прошить я!!!

ОПИСАНИЕ ПРОЕКТА irbattle2 МОЖНО НАЙТИ ТУТ Для просмотр ссылок требуется регистрация.



Оффлайн Сергей Смирнов

  • Клуб
  • Лейтенант
  • *
  • Сообщений: 125
  • РЕПУТАЦИЯ: +64/-0
    • Награды
Re: ИК_МИШЕНЬ (для домиков и мишени)
« Ответ #1 : 05 Июль 2019, 17:21:51 »
Премного благодарен!!!!!!
А провод питания где??
Молодец.

Оффлайн Сергей Смирнов

  • Клуб
  • Лейтенант
  • *
  • Сообщений: 125
  • РЕПУТАЦИЯ: +64/-0
    • Награды
Re: ИК_МИШЕНЬ (для домиков и мишени)
« Ответ #2 : 05 Июль 2019, 19:54:45 »
Динамик на сколько Ом?

Оффлайн Deny

  • Администратор
  • Маршал
  • *****
  • Сообщений: 2146
  • РЕПУТАЦИЯ: +10559/-0
    • Питерский танковод
    • Награды
Re: ИК_МИШЕНЬ (для домиков и мишени)
« Ответ #3 : 05 Июль 2019, 20:03:13 »
Любой вешай, а так надо смотреть дашит мп3 плеера))) 

Оффлайн Сергей Смирнов

  • Клуб
  • Лейтенант
  • *
  • Сообщений: 125
  • РЕПУТАЦИЯ: +64/-0
    • Награды
Re: ИК_МИШЕНЬ (для домиков и мишени)
« Ответ #4 : 06 Июль 2019, 20:28:47 »
Все получилось. Теперь нужна пощь в установке проги и прошивке ардуино
 

Оффлайн Deny

  • Администратор
  • Маршал
  • *****
  • Сообщений: 2146
  • РЕПУТАЦИЯ: +10559/-0
    • Питерский танковод
    • Награды
Re: ИК_МИШЕНЬ (для домиков и мишени)
« Ответ #5 : 06 Июль 2019, 21:09:43 »
Чудно))) будет Вам прошивка)))