Лазертаг с использованием " Ардуино"

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

HOCKU
HOCKU аватар
Offline
Зарегистрирован: 25.04.2011

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

dronsoft
Offline
Зарегистрирован: 02.06.2011

А на 328 нано сколько таких ID можно сделать?

 

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

С учетом что сигнал должен длиться примерно 16мс 

leshak
Offline
Зарегистрирован: 29.09.2011

 А при чем тут 328 нано? Вы бы еще спросили "сколько таких ID может обслужить трех-вольтовая батарейка".

Это зависит от того какой протокол-кодировку передачи ID вы придумаете и реализуете. Сделаете одно-битый - будет вам два передатчика. Сделаете 8-ми битный - 256.  

Погуглите-посмотрите как пульты инфакрасные работают. Как они шлют код нажатой клавиши. Кодировка NEC,RC5,SONY и т.п. Ну и возьмите либо готовый (тогда, кстати тестить приемник сможете обычной ДУ-шкой), либо "подпилите его под себя". 

dronsoft
Offline
Зарегистрирован: 02.06.2011

leshak пишет:

 "А при чем тут 328 нано?"

 

Вы бы еще спросили "сколько таких ID может обслужить трех-вольтовая батарейка".

Это зависит от того какой протокол-кодировку передачи ID вы придумаете и реализуете. Сделаете одно-битый - будет вам два передатчика. Сделаете 8-ми битный - 256.  

Погуглите-посмотрите как пульты инфакрасные работают. Как они шлют код нажатой клавиши. Кодировка NEC,RC5,SONY и т.п. Ну и возьмите либо готовый (тогда, кстати тестить приемник сможете обычной ДУ-шкой), либо "подпилите его под себя". 

 "А при чем тут 328 нано?"- на базе этого хочу сделать.

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

leshak
Offline
Зарегистрирован: 29.09.2011

 >"А при чем тут 328 нано?"- на базе этого хочу сделать.

Да я понял. Просто я имел ввиду что это не имеет отношения к заданному вопросу (сколько ID может быть). Любой камень успеет обработать такие вещи. Хоть тинька. Это как спрашивать можно ли по этому телефону говорить, кроме русского, еще и по немецкий и английски. Тут зависит не от телефона,а от вашего знания этих языков.

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

Дык а в чем сложность. Как сами с собой "договоритесь" так и будет. Вот пример протокола, для 16-ти возможных ID-шек (все цифры взяты от балды, просто мне так захотелось). :

  1.  Стартовый импульс - 2000 микросекунд. Означает "щас начнем код  передавать".
  2. Дальше идут 4-ре импульса (бита) кода передатчика. Импульс длинной 1200 микросекунд означает "0", 400 микросекунд - "1". Пауза между импульсами 200 микросекунд.
  3. В конце идет один бит четности.

Ну значит приемник этого протокола будет:

  1. Ждать на TSOP (приемник) импульса длинной 2 милисекунды. Все остальное "игнорить" (это помехи)
  2. Принимаем следующие пять импульсов - это данные. Длину импульсов переводим в "0" и "1". При этом учитываем что ждать "точно" 1200 и 400 не стоит. Идеальных резонаторов не бывает, поэтому в реальности длина импульсов будет "плавать", может до 20%. Подбирается "опытным путем" допустимую погрешность. То есть когда вы послаете импульс длинной 1200, на приемник он может прийти длиной и 1350, и 980.
  3. Смотрим сколько у нас получилось единичек. Если нечетное число, то игнорируем (значит код принялся с ошибкой) и ждем пока передатчик "повторит" все с начала.
  4. Если "четное", то первые четыре бита считаем "кодом передатчика".

Вот такой протокол. Позволит обрабатывать 16-ть ID-шек. Причем сможет распознать, если один бит будет принять "неправильно". Практически каждый параметр протокола можно менять, подбирать приемлемые значения опытным путем. Можно добавить "бит повтора", что бы различать "нажали курок и держим" и "очень быстро нажимаем курок" и т.д. и т.п. все что потребуется.

Вплоть до "каким боеприпасом в нас выстрелили". Кстати, в коммерческих лазертагах я такой "фишки",  не видел. Можно сделать "виды патронов". И засчитывать за них разный "урон", разный звук попадания и т.п.. Тогда можно смело говорить что "делал сам не от нищебродства, а от того что мое лучше" ;)

 

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Частично понял кроме написания кода а точнне как начать примерно а что то теряюсь я. особенно в том как сделать чтобы он (мк) работал и на прием и отдачу сигнала одновременно

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

еще вопрос по поводу хранения и воспроизведения звуковых файлов. 

whoim
Offline
Зарегистрирован: 03.11.2011

dronsoft пишет:

Частично понял кроме написания кода а точнне как начать примерно а что то теряюсь я. особенно в том как сделать чтобы он (мк) работал и на прием и отдачу сигнала одновременно

 

Повесить приемник и передатчик на разные ноги МК. Приемник также заводить на прерывание и обрабатывать его.

whoim
Offline
Зарегистрирован: 03.11.2011

dronsoft пишет:

еще вопрос по поводу хранения и воспроизведения звуковых файлов. 

Хранить удобно на жестком диске, воспросводить, например, умеет WinAmp

dronsoft
Offline
Зарегистрирован: 02.06.2011

Я имею в виду звуковые файлы на мк или епроме хранить или mikroSD хранить и при выстреле и попадании проигрывался определенный звук

 

HOCKU
HOCKU аватар
Offline
Зарегистрирован: 25.04.2011

Как вариант, можно воспользоваться чем-то вроде этого:

www.sparkfun.com/products/9736

dronsoft
Offline
Зарегистрирован: 02.06.2011

omnicorpdetroit.com/blog/wp-content/uploads/2011/05/Lasertag-Source-Code.pdf

Вот нашел вариант будем пробовать.

//Define all constants
#define TRIGGER_PIN 3
#define SPEAKER_PIN 4
#define MOTOR_PIN1  6
#define MOTOR_PIN2  7
#define YELLOW_PIN  11
#define RED_PIN     12
#define TEAM_SWITCH_TIMEOUT 3000
enum
{
  RED = RED_PIN,
  YELLOW = YELLOW_PIN
};
//The default team
int mTeam = RED;
void setup()
{
  //Setup pins
pinMode(SPEAKER_PIN, OUTPUT);
  pinMode(YELLOW_PIN,  OUTPUT);
  pinMode(RED_PIN,     OUTPUT);
  pinMode(MOTOR_PIN1,  OUTPUT);
  pinMode(MOTOR_PIN2,  OUTPUT);
pinMode(TRIGGER_PIN, INPUT);
//Turn on LED's for the defulat team
digitalWrite(mTeam, HIGH);
}
void loop()
{
  //First see if the board has been shot
//Read ITR will return the team that te board was shot by
int shotBy = readIR();
//If the board was shot by the opposite team,
//Then "shutdown"
if(mTeam == YELLOW && shotBy == RED)
  {
    deactivate();
  }
  else if(mTeam == RED && shotBy == YELLOW)
  {
    deactivate();
  }
  

 

valkhal
Offline
Зарегистрирован: 10.03.2012

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

kindats
Offline
Зарегистрирован: 15.03.2012

 Если интересует сборка лазертага - советую использовать стандратный открытый протокол. Майлс. Скажу сразу - игра начинает быть интересной с количества играющих от 10 человек, а собирать 10 таггеров - удовольствие долгое. Рано или поздно все равно придется закупать либо компоненты, либо макеты для интеграции, хотя большинство плюет уже после 2-го таггера и покупает готовый. Вот тогда то совместимость пригодится. Вот сайт, посвященный самостоятельной сборке лазертага. Если сочтете спамом - такова жизнь. Спамить не хотел.

valkhal
Offline
Зарегистрирован: 10.03.2012

мне интересен таггер именно с мк из ардуино, реально ли, пробовал ли кто-либо, а этот сайт я уже перечитал=) 

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

stels
Offline
Зарегистрирован: 03.01.2014

http://www.instructables.com/id/Duino-Tagger/?ALLSTEPS

пробовал этот скетч на уно и нано, выдает ошибки, пенял порты, пробовал примеры из комментов, нормально ничего не работает( 

saftik
Offline
Зарегистрирован: 08.04.2015

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

  1.  Стартовый импульс - 2000 микросекунд. Означает "щас начнем код  передавать".
  2. Дальше идут 4-ре импульса (бита) кода передатчика. Импульс длинной 1200 микросекунд означает "0", 400 микросекунд - "1". Пауза между импульсами 200 микросекунд.
  3. В конце идет один бит четности.
Saper
Offline
Зарегистрирован: 27.09.2015

Почему обязательно привязывать ID  в сигнале. Ведь не важно кто в кого попал. Например длительность выстрела выбрать 5000 мксек. Таким образом подсчитать длительность непрерывного сигнала (с учетом погрешности конечно  4950-5050 мксек). Думаю так будет проще. Звуки зашить в массиве 8 бит 8000 Hz.          25 Кб (примерно 3 сек). Звук выводить через ШИМ. (Звук: выстрела, перезаряд, попадание, конец игры,      воскрешение).

 

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Saper пишет:

Звук выводить через ШИМ. (Звук: выстрела, перезаряд, попадание, конец игры,      воскрешение).

Можете подробней описать идею вывода звука через ШИМ?

dronsoft
Offline
Зарегистрирован: 02.06.2011

ID  нужо для определения свой чужой, 

dronsoft
Offline
Зарегистрирован: 02.06.2011

хотя я сам хард кор предпочитаю

 

stels
Offline
Зарегистрирован: 03.01.2014

Saper пишет:

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

ну как-же

сценарии разные бывают,

в каких-то есть дружественный огонь, в каких-то нет, в каких-то один тип оружия, в каких-то несколько разных с разным поражающим эффектом, есть специальные "гранаты", аптечки и прочее и прочее...

Saper
Offline
Зарегистрирован: 27.09.2015

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

Лазертаг больше интересен для детей.

Saper
Offline
Зарегистрирован: 27.09.2015

dronsoft пишет:

хотя я сам хард кор предпочитаю

 

 

 

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

Лазертаг больше интересен для детей.

Saper
Offline
Зарегистрирован: 27.09.2015

dronsoft пишет:

ID  нужо для определения свой чужой, 

Несколько раз играл со своими детьми на оборудовании Полигон 64(3 жизни, 3х30 патроны, может ранить свой и чужой) захват флага, оборона-нападение, колесо. Мне показалось что не повлияло на ход игры, даже прикольней. 

Saper
Offline
Зарегистрирован: 27.09.2015

Gippopotam пишет:

Saper пишет:

Звук выводить через ШИМ. (Звук: выстрела, перезаряд, попадание, конец игры,      воскрешение).

Можете подробней описать идею вывода звука через ШИМ?

Настраиваем ШИМ (например пин 11)   на частоту кварца(выше качество звука). Свободный таймер настраиваем на частоту  8 кГц с прерыванием. В прерывании с частотой 8 кГц в регистр  OCR2A помещаем значение из массива. В массиве значения из WAV файла.

 

Saper
Offline
Зарегистрирован: 27.09.2015

А кто-нибудь практически собирал самодельный лазертаг. Или все в теории?

dronsoft
Offline
Зарегистрирован: 02.06.2011

Saper пишет:

dronsoft пишет:

ID  нужо для определения свой чужой, 

Несколько раз играл со своими детьми на оборудовании Полигон 64(3 жизни, 3х30 патроны, может ранить свой и чужой) захват флага, оборона-нападение, колесо. Мне показалось что не повлияло на ход игры, даже прикольней. 

Согласен так более реалистичнее, на данный момент все стоит пока другим проектом заморочился дособирываю 3д принтер на моторах от принтеров, остается сделать подачу прутка в печатающую головку, без этого пробовал настраивал вроде все норм работает

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

 

Saper
Offline
Зарегистрирован: 27.09.2015

 

Я так понял что ветка загнулась. Никто этим не занимается!!!!!

bod.petr
Offline
Зарегистрирован: 12.01.2017

Народ. Привет, никто так ничего дельного то не сделал?

Saper
Offline
Зарегистрирован: 27.09.2015

Привет. Прогу написал. Без определения ID. Попадание если ИК сигнал 5000 мкс. Звуки зашиты в ардуину. Звук выстрела, ранения, рекошет, перезарядка, Game Over. На макетке вроде все работает. Стрелял сам в себя(режим самоубийство, можно откл.). Сигнал принимает и выстрел посылает. Звук воспроизводит. Времени нет собрать в ствол и  проверить на улице (на практике).

bod.petr
Offline
Зарегистрирован: 12.01.2017

Я все это сделал тоже, ток звук через плеер вывел. Все гуд, но вот проблема, на солнце не работает( ловит помехи)

Saper
Offline
Зарегистрирован: 27.09.2015

У меня была проблема с tsop. Привезли мне наши местные торгаши. Я их с дуру 10 шт. купил. Тоже собрал 2 тагера в помещении все норм. А на солнце болты. Эти тсопы при попадании на них солнца запирались и на вых 2.5 вольта. Думал ну может один, а они все такие.

bod.petr
Offline
Зарегистрирован: 12.01.2017

У меня по другому, все нормально, но при выстреле у меня код, к примеру, 1234, а солнце добавляет своё ИК излучение и получается примерно 857733097 как то так

Saper
Offline
Зарегистрирован: 27.09.2015

Код майлес?

bod.petr
Offline
Зарегистрирован: 12.01.2017

Неа, сам нарисовал. Вечером скетч кину

Saper
Offline
Зарегистрирован: 27.09.2015

Неужели единомышленника нашёл! А в помещении все норм.

bod.petr
Offline
Зарегистрирован: 12.01.2017

В любых условиях работает, кроме открытого солнца

bod.petr
Offline
Зарегистрирован: 12.01.2017

ну, в общем, как обещал. мои скетчи. кто что скажет, поправит?

передатчик

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <IRremote.h>
#include <DFPlayer_Mini_Mp3.h>

IRsend irsend;

const int b1  = 4;  //fire
const int b2  = 5;  //reset

int pat = 0;
int ob = 5;
RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб

void setup() {
    Serial.begin(9600); //открываем порт для связи с ПК
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  
  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(b1, INPUT);
  pinMode(b2, INPUT);
  Serial.begin(9600);
  mp3_set_serial (Serial);  //set Serial for DFPlayer-mini mp3 module 
  mp3_set_volume (30);
}

void loop() { byte pipeNo, gotByte;                          
    while( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &gotByte, sizeof(gotByte) );         // чиатем входящий сигнал

      Serial.print("Recieved: "); Serial.println(gotByte);
 
        
      }

    if (digitalRead(b1) == HIGH&pat<10&gotByte==1) {
      delay(50);
        mp3_play (4);
        irsend.sendNEC(0x1234, 32);
      pat=pat+1;
    }
      Serial.print(pat);
      delay (50); 
 if (digitalRead(b1) == HIGH&pat>=10){
    mp3_play (3);
 }
       Serial.print("patronov NET");
      if (digitalRead(b2) == HIGH&ob>0&gotByte==1) {
     mp3_play (5);
     delay(2000);
      ob=ob-1;
      pat=0;
       
       Serial.print(ob);}
     
       
}

 

 

приемник

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

#include <SPI.h>          // библиотека для работы с шиной SPI
#include "nRF24L01.h"     // библиотека радиомодуля
#include "RF24.h"         // ещё библиотека радиомодуля

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
int RECV_PIN = 2;
int led=6; // переменная переключения режима, при нажатии кнопки она принимает значение +1

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

byte counter;
int qwe;
int qwe2;
int qwe3;
int button = 3;
int button2 = 4;
int key;
int key2;
int kill=7; //
IRrecv irrecv(RECV_PIN);

decode_results results;
int life = 3;
int dead = 0;
void setup()
{pinMode(6, OUTPUT);

pinMode(7, OUTPUT);

  Serial.begin(9600); //открываем порт для связи с ПК
 pinMode(button, INPUT); 
 pinMode(button2, INPUT);
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {qwe=5;
qwe3=6;
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    if (results.value == 4660&&life>0) {digitalWrite(6, HIGH);
  qwe2=3;
  Serial.print("Sent: "); Serial.println(qwe2);
  radio.write(&qwe2, sizeof(qwe2));
  delay(500);
  qwe2=4;
  Serial.print("Sent: "); Serial.println(qwe2);
  radio.write(&qwe2, sizeof(qwe2));

delay (1500);
digitalWrite(6, LOW);
life=life-1;
  Serial.println(life);} 
      if (results.value == 4660&&life==dead) {digitalWrite(6, HIGH);

  Serial.print("Sent: "); Serial.println(qwe);
  radio.write(&qwe, sizeof(qwe));
  delay(500);
  qwe=4;
  Serial.print("Sent: "); Serial.println(qwe);
  radio.write(&qwe, sizeof(qwe));

delay (1500);
digitalWrite(6, LOW);
life=life-1;
  Serial.println("DEAD");} 
  if (results.value == 74565) { Serial.print("Sent: "); Serial.println(qwe3);
  radio.write(&qwe3, sizeof(qwe3));
 delay(500);
  qwe3=4;
  Serial.print("Sent: "); Serial.println(qwe3);
  radio.write(&qwe3, sizeof(qwe3));
  life = 3;
} 

    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

 

Saper
Offline
Зарегистрирован: 27.09.2015

А для чего радио передатчик.? Повязка на радио?

bod.petr
Offline
Зарегистрирован: 12.01.2017

да

bod.petr
Offline
Зарегистрирован: 12.01.2017

есть какие мысли? я с посылкой не очень разобрался, идет 1234, 32. вот эти 32, я так понял биты передаваемые, зачем они?

Saper
Offline
Зарегистрирован: 27.09.2015

Т.е. посылка отправляется библиотекой IRremote? 

bod.petr
Offline
Зарегистрирован: 12.01.2017

ну да

 

 

 

Saper
Offline
Зарегистрирован: 27.09.2015

На какой частоте в библиотеке модулируется ИК сигнал?

bod.petr
Offline
Зарегистрирован: 12.01.2017

irsend.enableIROut(36); строчку надо добавить

Saper
Offline
Зарегистрирован: 27.09.2015

Строка означает 36 kHz?