Працюємо з 09:00 до 20:00 без вихідних.
Самовивіз - Київ біля ТЦ Квадрат бул.Перова

Постановка задачі

Задачею проекту являється виготовлення пристрою озвучення пострілів 6-ти одиниць зброї в електронному тирі. Звук пострілу повинен читатись з mp3-файлу на флешці і подаватися на вхід існуючих активних колонок.

Також необхідно передбачити можливість оперативного вибору з 5-ти записаних файлів на флешці для озвучки за допомогою кнопки вибору.

Особливості живлення і вхідних сигналів.

Вхідні сигнали від спускових крючків зброї складають 10 В в натиснутому стані і нуль у відпущеному.

Живлення пристрою від напруги 9 ... 12 В.

Підбір компонентів

Найголовніше - вибираємо модуль mp3-програвача Catalex з управлінням від контролера, на борту якого гніздо для флешки і вихід прямо під аудіо-штекер 3,4 мм, куди можна зразу підключити більшість активних аудіо-колонок. Цей модуль дозволяє по командам від контролера програвати або один раз визначені файли в папках або циклічно всі файли в папці. Він працює з сигналами 5 В і, коли надходить наступна команда на програвання, перериває програвання попереднього файлу.

Модуль не будемо встановлювати по одному на кожну зброю, а використовуємо один на всі. Просто кожен наступний постріл буде переривати попередній і всім буде здаватись, що новий перекриває по гучності старий. При цьому ми зекономимо на собівартості і необхідності розробляти мікшер, для об"єднання аудіо-сигналів від 6-ти mp3-модулів.

Для чіткого спрацювання кожного пострілу при паралельній стрільбі з декількох рушниць, заведемо кожен вхідний сигнал 10 В на окремий дискретний вхід контролера. Тому контролер потрібно вибрати з кількістю дискретних входів/виходів як мінімум в 9 штук (6 рушниць, 1 кнопка вибору файлу, 2 піна піде на управління модулем mp3 по UART). Вибираємо найзручніший в монтажі і дешевий контролер Arduino Nano.

Для согласования сигналов 10 В от оружия на контроллер Arduino Nano 5 В прийдется поразмыслить. Дело в том, что желательно обезопасить дискретные входы контроллера от различных факторов человеческой глупости и рассеяности. Если бы мы точно могли поручиться, что там не появится что-то сильно отличное от 10 В, то можно было бы ограничиться простыми делителями напряжения на резисторах, но я не могу доверить свою драгоценную плату контроллера незнакомым монтажникам и эксплуататорам. Так же мне дорога репутация по надёжности работы моих проектов. По всем этим причинам буду разрабатывать уникальный модуль гальваноразвязки на оптопарах, для чего разработаю схему и изготовлю печатную плату.

Так же нам понадобится модуль питания понижающий 9 ... 12 В до 5 В. Я выбираю понижающий преобразователь напряжения с 4,5...40В до 5В 2А из-за простоты соединения его с контроллером Arduino Nano при помощи USB-кабеля.

Модуль гальваноразвязки

Схема модуля гальваноразвязки на основе оптопар. Резисторы на входе подбираются под конкретное напряжение сигнала. У меня под 10 В получилось сопротивление порядка 300 Ом. Нормальное рабочее падение напряжения на светодиоде выбранной оптопары 1,2 В при токе 20 мА.

SW1 это мини кнопка SMD 6х6 мм выбора файла mp3.


При приходе сигнала 10 В на отдельный канал модуля, на выход пойдёт +5В через открытый фототранзистор. При отсутствии сигнала, транзистор будет закрыт и выходной канал модуля будет подтянут только на общий провод через резистор 10 кОм.

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

После изготовления модуль выглядит следующим образом


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

Питание 5В заводим прямо с верхней гребёнки контроллера Arduino Nano. А сигналы с выходов модуля подключаем на выводы D3 ... D8. Сигнал с кнопки выбора файла озвучки заводим на вход D2 контроллера Nano.

Подключение модуля MP3 проигрывателя к контроллеру Arduino Nano

Тут всё просто: плюс 5В контроллера на плюс модуля, минус контроллера на минус модуля. Вывод RX контроллера на TX модуля MP3 и так же наоборот вывод TX контроллера подаем на вывод RX модуля проигрывателя. Так же не забываем вставить флешку с MP3 файлами.


Загрузка программы в контроллер

Подключаем комп к контроллеру и загружаем следующую программу:

static int8_t Send_buf[8] = {0} ;
const int songs = 2;     // вывод контроллера для кнопки
const int alarm1 = 3;     // вывод контроллера для выстрела
const int alarm2 = 4;     // вывод контроллера для выстрела
const int alarm3 = 5;     // вывод контроллера для выстрела
const int alarm4 = 6;     // вывод контроллера для выстрела
const int alarm5 = 7;     // вывод контроллера для выстрела
const int alarm6 = 8;     // вывод контроллера для выстрела
const int ledPin =  13;
int songs_old = 1;     // предидущее значение входа для кнопки
int song = 1; //номер выбранного звука выстрела
int alarm1_old = 1;
int alarm2_old = 1;
int alarm3_old = 1;
int alarm4_old = 1;
int alarm5_old = 1;
int alarm6_old = 1;
#define CMD_PLAY_W_INDEX 0X03
#define CMD_SET_VOLUME 0X06
#define CMD_SEL_DEV 0X09
#define DEV_TF 0X02
#define CMD_PLAY 0X0D
#define CMD_PAUSE 0X0E
#define CMD_SINGLE_CYCLE 0X19
#define SINGLE_CYCLE_ON 0X00
#define SINGLE_CYCLE_OFF 0X01
#define CMD_PLAY_W_VOL 0X22
void setup() 
{
  pinMode(songs, INPUT_PULLUP); //вывод для кнопки с подтяжкой к плюсу
  
  pinMode(alarm1, INPUT);
  pinMode(alarm2, INPUT);
  pinMode(alarm3, INPUT);
  pinMode(alarm4, INPUT);
  pinMode(alarm5, INPUT);
  pinMode(alarm6, INPUT);
  
  pinMode(ledPin, OUTPUT); //существующий светодиод на плате контроллера. //будет загораться при нажатии на кнопку выбора файла
  Serial.begin(9600);
  delay(500);
  sendCommand(CMD_SEL_DEV, DEV_TF); //выбор TF карточки  
  delay(200);
  
  sendCommand(CMD_SET_VOLUME, 0X1E);//установить громкость в 30 (100%)
}
void loop() 
{
  digitalWrite(ledPin, not digitalRead(songs));
if (((digitalRead(alarm1)==HIGH)&&(alarm1_old==0)) || ((digitalRead(alarm2)==HIGH)&&(alarm2_old==0)) || ((digitalRead(alarm3)==HIGH)&&(alarm3_old==0)) || ((digitalRead(alarm4)==HIGH)&&(alarm4_old==0)) || ((digitalRead(alarm5)==HIGH)&&(alarm5_old==0)) || ((digitalRead(alarm6)==HIGH)&&(alarm6_old==0)))
  { 
    switch (song) {
    case 1:
      sendCommand(0X0F, 0X0101);
      break;
    case 2:
      sendCommand(0X0F, 0X0102);
      break;
    case 3:
      sendCommand(0X0F, 0X0103);
      break;
    case 4:
      sendCommand(0X0F, 0X0104);
      break;
    case 5:
      sendCommand(0X0F, 0X0105);
      break; 
    default: 
      sendCommand(0X0F, 0X0101);
    break;
    } 
  }

if ((digitalRead(songs)==1)&&(songs_old==0))
  { 
   song = song + 1;
   if (song > 5) song = 1;
  }
alarm1_old = digitalRead(alarm1);
alarm2_old = digitalRead(alarm2);
alarm3_old = digitalRead(alarm3);
alarm4_old = digitalRead(alarm4);
alarm5_old = digitalRead(alarm5);
alarm6_old = digitalRead(alarm6);
 
songs_old = digitalRead(songs); 

delay(100);
}
void sendCommand(int8_t command, int16_t dat)
{
  delay(20);
  Send_buf[0] = 0x7e; //начальный байт
  Send_buf[1] = 0xff;
  Send_buf[2] = 0x06; //число байтов команд без начального и конечного байта
  Send_buf[3] = command;
  Send_buf[4] = 0x00;//0x00 = no feedback, 0x01 = feedback
  Send_buf[5] = (int8_t)(dat >> 8);//данные
  Send_buf[6] = (int8_t)(dat); //datal
  Send_buf[7] = 0xef; //завершающий байт
  for(uint8_t i=0; i<8; i++)//
  {
    Serial.write(Send_buf[i]) ;
  }
}

При включении питания и приходе сигнала с оружия модуль проиграет первый файл. При частых выстрелах, каждый следующий выстрел будет прерывать предыдущий. Программа реагирует на каждый перепад с нуля до единицы на каждом из 6-ти входных каналов. А, при долгом удержании спускового крючка оружия, очереди выстрелов не последует - выстрел будет единичным только в момент нажатия.
Если поклацать на кнопку выбора файла, то выстрелы будут менять своё звучание.

Питание устройства

Питаем контроллер при помощи выбранного понижающего преобразователя напряжения. Плюс и минус 12 В подаем на клеммник преобразователя, а выход соединяем с контроллером при помощи короткого USB-кабелечка.


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

Выводы

Устройство в собранном виде выглядит следующим образом


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

На видео работа устройства выглядит так:


Каждый канал уверенно стреляет. Работает все в широком диапазоне питающих напряжений. Проверялась работа при питании 6 ... 12 В. Сигналы выстрелов брались с того же источника питания. Срабатывает всё достаточно быстро и реалистично. В который раз меня уже радует модуль mp3 с управлением UART. Всем советую!

Кому нужна озвучка событий с mp3-файлов - обращайтесь по телефонам на сайте.

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Електро замок торцевий 12В

Електро замок торцевий 12В

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

327.03грн.

Датчик дотику ємнісний

Датчик дотику ємнісний

Датчик видає дискретний сигнал на виході, коли до нього доторкаються пальцем.Його можна використовув..

22.30грн.

Набір латунних стійок М2 270шт.

Набір латунних стійок М2 270шт.

Латунні стійки зіркоподібного перетину з різьбою кріплення М2Застосовуються для з'єднання частин кор..

217.53грн.

Драйвер крокового двигуна 800мА L9110S

Драйвер крокового двигуна 800мА L9110S

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

36.27грн.

Силовий MOSFET транзистор IRF520

Силовий MOSFET транзистор IRF520

MOSFET транзистор 3-го поколінняВикористовується для швидкісної комутації потужних виконавчих механі..

12.01грн.