ардуино, активная мишень.

Автор Deny, 17:19:39

« предыдущая - следующая »

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

Deny

Основной проблемой  инфракрасных боев  в регионах остается  не согласованность инфракрасных систем танков различных фирм. Перечислю основные: Тамия, тайген, хенд-лонг, васан, деа... В бесседах с коллегами звучали идеи о создании универсальной системы боя, которая способна воевать со всеми танками. Озадачившись и покопавшись в микроконтроллере ардино, пришел к выводу,  что такая система имеет право на существование.
   Первой основной и нелегкой задачей было  снять Ик коды с основных производителей танков.
   Второе - это заставить ардуину выдавать верную последовательность, чтобы танки могли верно считывать,    каждый свой сигнал.
В адрдуино есть несколько библиотек, которые работают с Ик кодами, перечислю:
1. IRremote
2. IRLib
3. IRLib2
4. iarduino_IR
Может существует и еще, но я сталкивался только с этими. В каждой библиотеке есть свои недостатки и достоинства, останавливаться не буду, не про то нынче речь.
Я использую библиотеку IRLib2.
С первым кодом, которым я намучился, был код производителей Тамия. Танка с платами тамия у меня не было, но был танк с платой эльмод, который, как заявлено производителем совместим с Тамией.  Я не знаю чем и как они там руководствовались, но их сигнал имеет офигительную последовательность и хреновую тучу в периодичности повтора сигнала, чтобы в контрольной сумме придти к {3000, 3000, 6000} (это, кстати оригинальный код тамия). НО! Расшифровать код, это пол дела, надо было еще выстроить точное количество повторов и определить длительность посылки пакета данных.  С помощью метода ТЫКа и какой-то материи эта периодичность была вычислена.  
 Она составляет 4 посылки, сумма длительности не превышает 50 мсек всех посылок. Наконец-то Танк стал понимать, то что передает ардуино. А далее дело техники, по аналогии были сняты сигналы со всех основных производителей. Продолжение следует....
​Не говорите, если это не изменит тишину к лучшему.

Deny

Итак, все коды были сняты и протестированы. На основе полученных данных  была собрана система, способная принимать и  выдавать коды основных производителей танков.
Мной была собрана, из журнала собери танк Т-34, пушка ЗИС -3, как выставочный экземпляр она хороша, но для нас это не интересно, совместив систему боя и пушку, получил действующую активную мишень, способную поражать все танки, а так же она может быть уничтожена.

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


#define G_LedPin 7
#define IRpin 9
#define Ssig 10
#include <avr/pgmspace.h>
#include <IRLibDecodeBase.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h>
#include <IRLib_P02_Sony.h>
#include <IRLib_HashRaw.h>
#include <IRLibCombo.h>
#include <IRLibRecv.h>

IRsendRaw mySender;        //объявляем переменную mySender типа IRsendRaw
IRdecode myDecoder;
IRrecv myReceiver(5);    //create a receiver on pin number 11

// Иницилизация Ик боя

const long Kod1[] = { 0x50C5D1D, 0x49B0F624};
const char * Message1[] = { "Tamiya", "Heng-Long"};
const char * Name1 = "Boy";
const int khz = 38; // 38kHz carrier frequency for the  protocol

// сохраняем несколько беззнаковых целых чисел

unsigned int irSignal[] = {3000, 3000, 6000}; //AnalysIR Tamiya - RAW
unsigned int rawData[] = {19000, 4700, 9500, 4700, 4700, 9500, 4700}; //Hend-Long - RAW

unsigned long currentTime;
unsigned long loopTime;
unsigned long loopTime1;
unsigned int displayInt;
int flag = 0;                  // флаг состояния
int regim = 0;                 // Переключалка
const int ButPin = 10;
const int BonOff = 2;
int k;    // переменная-счечтик

void setup() {

  currentTime = millis();      // считываем время, прошедшее с момента запуска программы
  loopTime = currentTime;
  pinMode (IRpin, OUTPUT);
  pinMode (G_LedPin, OUTPUT);
  pinMode (4, OUTPUT);
  pinMode (6, OUTPUT);
  pinMode (8, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);
  pinMode (12, OUTPUT);  digitalWrite (8, LOW);
  digitalWrite (4, LOW);
  digitalWrite (11, HIGH);
  digitalWrite (12, LOW);
  digitalWrite (BonOff, LOW);
  Serial.begin(115200);
  delay(2000); while (!Serial); //delay for Leonardo
  myReceiver.enableIRIn(); // Start the receiver
  Serial.println(F("Ready to receive IR signals"));
  digitalWrite (7, HIGH);
  delay (5000);
  digitalWrite (7, LOW);

}

void loop() {

  HITS_CT();
  FIRE ();

          }

void FIRE ()
{
  //if (Serial.read() != -1) {
  // myReceiver.disableIRIn(); // Start the receiver
  currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if (currentTime >= (loopTime + 5000)) {            // сравниваем текущий таймер с переменной loopTime + 1 секунда
    digitalWrite(IRpin, HIGH);     // включаем/выключаем LED
    //servo.write(90); //ставим вал под 90
    delay (500);
    // servo.write(0); //ставим вал под 0
    loopTime = currentTime;
    mySender.send(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), 38); delay (30);//Note the approach used to automatically calculate the size of the array.
    mySender.send(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), 38); delay (7); //Note the approach used to automatically calculate the size of the array.
    mySender.send(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), 38); delay (7); //Note the approach used to automatically calculate the size of the array.
    mySender.send(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), 38); delay (5); //Note the approach used to automatically calculate the size of the array.
    mySender.send(rawData, sizeof(rawData) / sizeof(rawData[0]), 38); delay (10);
    Serial.println(F("Sent signal."));
  }
  myReceiver.enableIRIn();
}


void HIT ()
{
  digitalWrite(G_LedPin, HIGH);
  delay (100);
  digitalWrite(G_LedPin, LOW);
  delay (200);
  digitalWrite(G_LedPin, HIGH);
  delay (100);
  digitalWrite(G_LedPin, LOW);
  delay (200);
  digitalWrite(G_LedPin, HIGH);
  delay (100);
  digitalWrite(G_LedPin, LOW);
}



void HITS_CT()
{


  if (myReceiver.getResults()) {
    if (myDecoder.decode()) {
      long x = (myDecoder.value);


      Serial.print( x, HEX ); // печатаем данные
      Serial.print ("   ");
      int Err = 1;
      //-----------------------------
      int len = sizeof(Kod1) / sizeof(Kod1[0]);//определяем размер массива
      for (int i = 0; i <= len; i++) {
        if (x == Kod1[i] && flag == 0)
        {
          //if(digitalRead(ButPin) == HIGH && flag == 0)
          {
            regim ++;
            flag = 1;
                    if (regim > 4)                    // Если номер режима превышает требуемого
            { // то отсчет начинается с нуля
              digitalWrite(G_LedPin, HIGH);
              delay (20000);
              regim = 0;
            }
          }


          if (digitalRead(ButPin) == LOW && flag == 1)
          {
            flag = 0;
          }


          // ======= Вполняем задачу при выборе режима =======
          // РЕЖИМ 0: OFF
          if (regim == 0)
          {
            ZAPUSK ();
            delay (1000);
            digitalWrite(G_LedPin, LOW);


          }


          // РЕЖИМ 1: R
          if (regim == 1)
          {
            HIT ();
       
          }


          // РЕЖИМ 2: G
          if (regim == 2)
          {


            HIT ();
         


          }


          // РЕЖИМ 3: B
          if (regim == 3)
          {
            HIT();


          }


          // РЕЖИМ 4: RG
          if (regim == 4)
          {
            HIT ();
     
          }


         


          Serial.print( Name1 );
          Serial.print ("   ");
          Serial.println(  Message1[i] );
          Err = 0;
        }
      }
      //-----------------------------
      if (Err == 1)  {
        Serial.println( "...not found..." );
      }
      //-----------------------------
      Err = 1;
      myReceiver.enableIRIn();// принимаем следующую команду
    }
  }
}



void ZAPUSK ()
{
  digitalWrite(G_LedPin, HIGH);
  delay (150);
  digitalWrite(G_LedPin, LOW);
  delay (100);
  digitalWrite(G_LedPin, HIGH);
  delay (150);
  digitalWrite(G_LedPin, LOW);
  delay (100);
  digitalWrite(G_LedPin, HIGH);
}



Друзья, так как много было проделано работы, считаю возможным некоторую часть кодов утаить))))) В данной программе, одновременно работают коды Тамии и  Хенд-лонга.
​Не говорите, если это не изменит тишину к лучшему.

Hal

Почему пушка победила?

Как направлялись танки, что был за опыт?
...I.M.

Deny

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

У Деа скорость перезаряда 6 сек. У пушки 5 секунд. У штуга от тайген, но с мако перезаряд 5 сек., но приходилось выцеливать, так как окно попаданее не большое. Пушка работает автоматом, каждые 5 сек выстрел.
Ественно надо учитывать разброс луча и что пушка одним выстрелом иногда паражала три танка одновременно, которые находились близко друг к другу. Ик диод утоплен в стволе.
​Не говорите, если это не изменит тишину к лучшему.

Deny

Библиотека для скетча
Качаем тут:  https://github.com/cyborg5/IRLib2
​Не говорите, если это не изменит тишину к лучшему.