Игровой аркадный автомат на платформе Ардуино (вопросы)

krosslove
Offline
Зарегистрирован: 12.06.2015

Сгорел у нас на работе вот такой автомат - http://yugis.su/automat/27-dragon-punch/. Игровой автомат - силомер. Логика довольно простая - при закидывании монеты в монетоприемник срабатывает концевик, программа опускает грушу с помощью электромагнита для удара. После удара по груше, она ударяется о платформу на которой закреплен фотодатчик (платой управления регистрируется время затемнения датчика и этим вычисляется сила удара). После срабатывания датчика: если сила удара была меньше последнего рекорда - игра кончается, если же больше, то дается призовая игра. После окончания работы второй тяговый электромагнит подтягивает грушу в гнездо, пряса от удара. На большом дисплее показывается количество очков. Так же после ударов и во время простоя звучит музыка.

Плату отремонтировать нереально, там неизвестный тип ППЗУ с неизвестной программой, фирма изготовитель ремонтом не занимается, предлагая купить новый автомат (400.000 рублей!!!), поэтому, полистав интернет, остановились на платформе Ардуино, как на наиболее вероятной для замены всей логики-электроники.

И возникли следующие вопросы:

1 - можно ли подключить фотодатчик на Ардуино, чтобы потом его запрограммировать на подсчет времени затемнения и, исходя из этого, дальнейший выбор нужной инструкции?

2- можно ли управлять с помощью Ардуино большим 7 сегментным светодиодным дисплеем?

3 - как реализовать управление электромагнитами?

4 - какую плату Ардуино выбрать для этих задач ?

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

Подскажите, пожалуйста, нужное направление. Что нужно купить, чтобы начать изучение.

 

 

 

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

krosslove пишет:

...

И возникли следующие вопросы:

1 - можно ли подключить фотодатчик на Ардуино, чтобы потом его запрограммировать на подсчет времени затемнения и, исходя из этого, дальнейший выбор нужной инструкции?

2- можно ли управлять с помощью Ардуино большим 7 сегментным светодиодным дисплеем?

3 - как реализовать управление электромагнитами?

4 - какую плату Ардуино выбрать для этих задач ?

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

Подскажите, пожалуйста, нужное направление. Что нужно купить, чтобы начать изучение.

1. - Можно. Нужно больше информации для конкретики.

2. - Да, можно. Проще всего на Дарлингтонах, если диоды не сверхмощные.

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

4. Nano. Задача простая - ресурсов хватит, а возможность прямой пайки к плате увеличит надежность. Наличие ЮСБ упростит прошивку.

5. Да, можно.

 

P.S. Вы уверены, что датчик реагирует на время затемнения? Если честно - слабо представляю себе логику работы. Хотя, если там очень чувствительная система...

krosslove
Offline
Зарегистрирован: 12.06.2015

Gippopotam пишет:

1. - Можно. Нужно больше информации для конкретики.

 

 

 

 

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

- фиксация времени начала прохождения пластины 

- фиксация времени окончания пластины

- подсчет времени прохождения пластины ( то есть общее время затемнения датчика )

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

Gippopotam пишет:

2. - Да, можно. Проще всего на Дарлингтонах, если диоды не сверхмощные.

Там три четырехсегментных индикатора, оказывается. Со своими контроллерами на плате. Но физически можно контроллеры отключить и подсоединить напрямую к led - индикаторам. Диоды яркие, питание на них - 24 вольта.

Gippopotam пишет:

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

Вообще, эта часть да, работает. Но не проблема собрать ключи управления либо на транзисторах, либо на микросхеме.

Gippopotam пишет:

4. Nano. Задача простая - ресурсов хватит, а возможность прямой пайки к плате увеличит надежность. Наличие ЮСБ упростит прошивку.

Да, планируется именно пайка. Автомат стоит на открытом воздухе.

Gippopotam пишет:

5. Да, можно.

А как? Я видел где то модули плееров мп3 с флеш картой в которых есть, допустим, 5 цифровых входов и один аудиовыход. При подаче логического 1 на один из входов плеера проигрывается соответствующая номеру контакта мелодия, которая на флешке. Вот только не помню, где их видел, вроде на алиеэкспресс.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

krosslove пишет:

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

- фиксация времени начала прохождения пластины 

- фиксация времени окончания пластины

- подсчет времени прохождения пластины ( то есть общее время затемнения датчика )

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

Ну если так - то все просто. Главное оставить возможность подстройки.

Цитата:

Там три четырехсегментных индикатора, оказывается. Со своими контроллерами на плате. Но физически можно контроллеры отключить и подсоединить напрямую к led - индикаторам. Диоды яркие, питание на них - 24 вольта.

на контроллерах есть опознавательные знаки?

Цитата:

А как? Я видел где то модули плееров мп3 с флеш картой в которых есть, допустим, 5 цифровых входов и один аудиовыход. При подаче логического 1 на один из входов плеера проигрывается соответствующая номеру контакта мелодия, которая на флешке. Вот только не помню, где их видел, вроде на алиеэкспресс.

Модуль, предложенный вам выше. У него есть режим эмуляции мп3-плеера (кнопки Play, Stop, Pouse и т.д.), но интересней использовать его возможности прямого проигрывания файлов. Только нужно учитывать, что он не все карточки понимает - не больше 2 Гб., а их сейчас не просто найти. Ножет последние реализации и не имеют этого ограничения.

krosslove
Offline
Зарегистрирован: 12.06.2015

Gippopotam пишет:

krosslove пишет:

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

- фиксация времени начала прохождения пластины 

- фиксация времени окончания пластины

- подсчет времени прохождения пластины ( то есть общее время затемнения датчика )

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

Ну если так - то все просто. Главное оставить возможность подстройки.

Цитата:

Там три четырехсегментных индикатора, оказывается. Со своими контроллерами на плате. Но физически можно контроллеры отключить и подсоединить напрямую к led - индикаторам. Диоды яркие, питание на них - 24 вольта.

на контроллерах есть опознавательные знаки?

Цитата:

А как? Я видел где то модули плееров мп3 с флеш картой в которых есть, допустим, 5 цифровых входов и один аудиовыход. При подаче логического 1 на один из входов плеера проигрывается соответствующая номеру контакта мелодия, которая на флешке. Вот только не помню, где их видел, вроде на алиеэкспресс.

Модуль, предложенный вам выше. У него есть режим эмуляции мп3-плеера (кнопки Play, Stop, Pouse и т.д.), но интересней использовать его возможности прямого проигрывания файлов. Только нужно учитывать, что он не все карточки понимает - не больше 2 Гб., а их сейчас не просто найти. Ножет последние реализации и не имеют этого ограничения.

Заказал модули Мп 3 и плату Уно плюс датчики. Остается вопрос по индикаторам. Вон наша плата - можно ли её как то приспособить под управление системой Ардуино?

4533618d968582624d0e54cc179e3dae.png

 

Номера микросхем:

- TD 62783 APG - драйвер вакуумных индикаторов

- MC 14094 BCP - регистры сдвига счетчика 8-bit, 3-18 V

- CD 4050 - шесть преобразователей уровня МОП-ТТЛ 

Блок питания для всего этого есть, есть ли возможность подключения напрямую в плату Уно?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

TD 62783 APG - драйвер вакуумных индикаторов
на УНО можно , если точно есть такие индикаторы , указанные выше

krosslove
Offline
Зарегистрирован: 12.06.2015

SU-27-16 пишет:

TD 62783 APG - драйвер вакуумных индикаторов
на УНО можно , если точно есть такие индикаторы , указанные выше


Там уже стоят и индикаторы и микросхемы - скорее всего там схема с динамической индикацией, ибо катоды всех индикаторов выведены в отдельную группу и уходят с платы индикации на микросхему ПЗУ.
Разьемы - CN1 - это катоды индикаторов.
CN2 - входы сегментов. Точнее разьем идет на CD 4050, там преобразуется в более мощный сингал и поступает на MC 14094 BCP а после на драйверы.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если все есть то все просто, как минимум индикация

krosslove
Offline
Зарегистрирован: 12.06.2015

jeka_tm пишет:

если все есть то все просто, как минимум индикация

Не пойму что делать с катодами. Как реализовать подключение к ардуино .

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а в чем проблема? высокое напряжение или ток?

krosslove
Offline
Зарегистрирован: 12.06.2015

jeka_tm пишет:

а в чем проблема? высокое напряжение или ток?

схема подключения - не разобрался.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я не угадаю. нужна схема фото

krosslove
Offline
Зарегистрирован: 12.06.2015

jeka_tm пишет:

я не угадаю. нужна схема фото

 

Спасибо за отклик, с индикаторами разобрались - там была применена схема динамической индикации.

Сейчас работаем с помощью библиотеки Ледконтрол. 

возникли вопросы по ней, не подскажете русский мануал по этой библиотеке?

Теперь проблема в следующем:

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

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

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при поступлении с датчика освещённости HIGH запоминаем текущее абсолютное время в системе контроллера в переменную
unsigned long timeON = millis();
boolean temno = 1;
или
boolean svetlo = 1; ( смотря что вам нужно )

в любое время после этого получаем время относительно выставления датчиком HIGH
if ( temno )
{

unsigned long timeONdelta = millis() - timeON; // timeONdelta - миллисекунды
}
далее - "
в зависимости от этого timeONdelta выводить по формуле цифры на табло"

при поступлении с датчика освещённости LOW

boolean temno = 0;

...кататак :)

krosslove
Offline
Зарегистрирован: 12.06.2015

int switchPin = 5;  
unsigned long timeON = millis();

 
void setup()
{
 
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);     
  Serial.begin(9600);
 
}
 
void loop()
{
  if (digitalRead(switchPin) == LOW)
  {  
      unsigned long timeONdelta = millis() - timeON;
      Serial.print("Time: ");
      Serial.println(timeONdelta);
      
  }

   if (digitalRead(switchPin) == HIGH)
  {  
      unsigned long timeONdelta = millis() - timeON;
      Serial.print("Time 2: ");
      Serial.println(timeONdelta);
      
  }
}

Собрал вот такой код - меняет значения как бешеный, при нажатии кнопки то же самое, только с "Time 2". Как можно сделать так, чтобы код второго условия включался только после того, как выполнится первое?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

в первом условии поднять флаг , второе условие обрабатывать по этому флагу ( и опустить его после обработки условия )
смотри #14.....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
krosslove
Offline
Зарегистрирован: 12.06.2015

Спасибо большое.

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

 

volatile int length = 0;
volatile int start_time = 0;

void setup() {
Serial.begin(115200);
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
}


void loop() { }


//Обработчик прерывания на возрастание сигнала
void rising() {
// Привязываем к Pin2 прерывание по срезу сигнала
attachInterrupt(0, falling, FALLING);
//сохраняем значение времени начала импульса
start_time = micros();
}


//Обработчик прерывания по срезу сигнала
void falling() {
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
//сохраняем значение длительности импульса
length = micros() - start_time;
Serial.println(length);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

29 строка в прерывании лишняя

krosslove
Offline
Зарегистрирован: 12.06.2015

Но тогда нужно альтернативу в виде светодиодных индикаторов, иначе как мы узнаем значения времени?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в лупе отправляй

а погуглить?

https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-...

 

krosslove
Offline
Зарегистрирован: 12.06.2015

jeka_tm пишет:

в лупе отправляй

А это как?

 

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

#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);

int unsigned long  length =0;


void setup()
{
lc.shutdown(0,false);
lc.clearDisplay(0);
lc.setScanLimit (0,8);

}
void loop()

{
 length = millis();
 
 if (length <=9000)
 
 {lc.setDigit(0,0,length/1000,true);}
 
 else {lc.setDigit(0,0,0,true);}
  }

почему не работает else?

 

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

это XP у тебя стоит? - почему не 95-я, как у всех продвинутых ползателей?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Пффффф....реальные труЪные кодеры пишут в 3.11, под ДОСом или запускают на АВРке линух и пишут там! но только в редакторе nano)

Компилят асм вручную и знают таблицы машинных слов всех АВРок.

Заливают прошивку кнопками.

Питают от батареи из кокоса или силой пальца.

Но к теме это не относится)

krosslove
Offline
Зарегистрирован: 12.06.2015

Клапауций 998 пишет:

это XP у тебя стоит? - почему не 95-я, как у всех продвинутых ползателей?

 

Инсталлятор не могу найти...

Можете по теме что нибудь посоветовать?

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

krosslove пишет:

Клапауций 998 пишет:

это XP у тебя стоит? - почему не 95-я, как у всех продвинутых ползателей?

 

Инсталлятор не могу найти...

Можете по теме что нибудь посоветовать?

скачай 

http://arduino.cc/download.php?f=/arduino-1.0.6-windows.zip

или

http://arduino.googlecode.com/files/arduino-1.0.5-r2-windows.zip

и забудь о новых версиях софта

krosslove
Offline
Зарегистрирован: 12.06.2015

---Спасибо за ссылку - всё работает, до кучи установил вин 7 на всякий случай)

 
Как можно запомнить переменную length и постоянно сравнивать ее с самым последним очередным результатом? Чтобы если удар был сильнее, то результат перемещался на вторые 4 разряда, а если слабее, то исчезал.  Тут еще проблема - как можно инвертировать данные миллис? То есть сейчас чем короче удар, тем короче цифра, а надо наоборот...может формула какая?
 
Присвоил в пятой строчке снизу новой переменной length2 значение length, почему то остальные 4 разряда не реагируют... Хотя по коду дожны...
 
 
#include "LedControl.h"
LedControl lc=LedControl(12,11,10);
volatile int length2 = 0;   
volatile int length = 0;
volatile int start_time = 0;
 
void setup() {
lc.shutdown(0,false);
lc.clearDisplay(0);
lc.setScanLimit (8,8);
lc.setIntensity(0,11);
 
  lc.setDigit(0,0,0,true);
  lc.setDigit(0,1,0,true);
  lc.setDigit(0,2,0,true);
  lc.setDigit(0,3,0,true);
  lc.setDigit(0,4,0,true);
  lc.setDigit(0,5,0,true);
  lc.setDigit(0,6,0,true);
  lc.setDigit(0,7,0,true);
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
}
 
 
void loop() { }
 
 
//Обработчик прерывания на возрастание сигнала
void rising() {
// Привязываем к Pin2 прерывание по срезу сигнала
attachInterrupt(0, falling, FALLING);
//сохраняем значение времени начала импульса
start_time = millis();
}
 
 
//Обработчик прерывания по срезу сигнала
void falling() {
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
//сохраняем значение длительности импульса
  
  length = millis() - start_time;
 
  
  lc.setDigit(0,0,(length)%10,true);
  lc.setDigit(0,1,(length/10)%10,true);
  lc.setDigit(0,2,(length/100)%10,true);
  lc.setDigit(0,3,(length/1000)%10,true);
  
  length = length2 ;
 
  lc.setDigit(0,4,(length2)%10,true);
  lc.setDigit(0,5,(length2/10)%10,true);
  lc.setDigit(0,6,(length2/100)%10,true);
  lc.setDigit(0,7,(length2/1000)%10,true);
 
 } 

 

 

Melis
Offline
Зарегистрирован: 15.08.2022

Здравствуйте .нужна помощь у меня в аппарате всегда одно и тоже очков покзивает 1230 как бы не быть