Проблемы и наводки на ардуино с монетоприемником

Depesh
Offline
Зарегистрирован: 26.12.2015

Добрый день, не нашел похожую тему, решил написать сюда. С ардуиной работаю пару месяцев, до этого вообще ни чего подобного не делал. В общем по работе (рабтаю в квесте) стояло задание, подключить монетоприемник, в моё случае еу9 к ардуино, так что бы при пробросе 7 жетонов, открывалась выходная дерь и люди могли выйти из квеста, я подключил всё так же как указано выше только без дисплея, вместо дисплея у меня стоит сервопривод, который в свое время поворачивается на определенное количество градусов, при пробросе одного жетона. И подключено реле, которое открывает дверь после проброса 7 жетона. Ниже скетч и схема 

#include <Servo.h>
 
// монетоприемник EU-9
const int moneyPin2=3;
 
Servo myservo; 
#define rele2 7
#define ON 0
#define OFF 1
 
 
int regim=0;
int pulse2=0;
unsigned long timeAllPulse2=500; // макс. время приема монеты
unsigned long timeCount2=0;
 
void setup()
{
  Serial.begin(9600);
  pinMode(rele2, OUTPUT);
  pinMode(moneyPin2,INPUT);
  pinMode(moneyPin2, ON);
  digitalWrite(rele2, OFF);
  attachInterrupt(1,count_pulse2,FALLING);
  Serial.println("coin ready");
  myservo.attach(12);  
}
 
void loop()
{
delay(1000);
  // прошло максимальное время приема монеты?
  if(pulse2>1 && (millis()-timeCount2)>timeAllPulse2) 
    {
    regim++;   
    Serial.print("pulse2=");  
    Serial.println(pulse2);
    Serial.print("regim=");  
    Serial.println(regim);
    pulse2=0;
     }
         if(regim==0)
   { 
    myservo.write(180);
    delay(100);  
    }
         if(regim==1)
   { 
    myservo.write(157);
    delay(100);
   }
         if(regim==2)
   { 
    myservo.write(134);
    delay(100);
   }
         if(regim==3)
   { 
    myservo.write(111);
    delay(100);
   }
             if(regim==4)
   { 
    myservo.write(88);
    delay(100);
   }
         if(regim==5)
   { 
    myservo.write(65);
    delay(100);
   }
         if(regim==6)
   { 
    myservo.write(42);
    delay(100);
   }
   
        if(regim==7)
   { 
    myservo.write(10);
    delay(15000);
    digitalWrite(rele2, ON);
    delay (4000);
    digitalWrite(rele2, OFF);
    myservo.write(180);
    regim=0;
   } 
   }
// обработка прерывания монетоприемника - получить кол-во импульсов
//  
void count_pulse2()
  {
  detachInterrupt(1);
  pulse2++;
  if(pulse2==1)
    timeCount2=millis();
  attachInterrupt(1,count_pulse2,FALLING);
  }
 
 
 
Теперь собственно сама проблема: реле как правило открывает дверь, когда монетоприемник получил только 5-6 жетонов, то есть накручивает лишние, монетоприемник пробовал менять эффект тот же, ардуино получает холостые сигналы с монетоприемника, бывает даже после того как просто монетой дотронешься до лицевой панели, возможно из за статики, бьюсь с ним месяц. Может кто подскажет как с ним бороться. P.S. монетоприемник обучен (прописан, пробросан раз 20 что бы принимать один жетон за 1 рубль т.е. за один импульс)

 

Depesh
Offline
Зарегистрирован: 26.12.2015

Ардуино питается от БП 12в 3А, от этого же БП питается замок на двери, а рэле перерывает питание на замок

temenator
Offline
Зарегистрирован: 26.12.2015

Я думаю вызов прерывания по релюшке идея неудачная.

Странно, чт оно еще более менее работает :)

Убери ты это прерывание и сделай фильтр от дребезга.

Или RC цепочку на вход от реле.

Я думаю когда стучиш монетой дребезжит реле в монетоприемнике и вопрос зачем от реле 3 контакта ?

Depesh
Offline
Зарегистрирован: 26.12.2015

Спасибо огромное, за то что откликнулись. Но будет великодушная просьба, так как я не глубоко знаком пока что еще, но я стараюсь)), не могли бы вы наглядно написать прям на моем коде что исправить, или на схеме что куда припаять). Релюшка у меня вот такая. GND на массу на ардуино, IN1 уходит на 7 pin, ну и

соответственно VCC на +5в. поэтому 3 контакта от реле.

saptam
Offline
Зарегистрирован: 01.07.2016

Доброго времени суток! Только начинаю похожий проект, получилось решить вопрос с имульсами? Личка 369911(a)mail.ru

ВН
Offline
Зарегистрирован: 25.02.2016

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

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

allspam
Offline
Зарегистрирован: 29.09.2016

1. оставь в обработчике прерываний только сброс обработчика и изменение флага.

const byte CoinChangerPin=2;
#define IntNo 0 // interrupt number

byte ICount=0; //счетчик для импульсов
volatile bool IbCount=false; //признак импульса с монетника

void count_pulse()
{
detachInterrupt(IntNo);
IbCount=true;
}

2. в основном цикле дополнительно проверяй состояние входа

делай временную отсечку по каждому импульсу, таймаут 250 мс







#define COINWAITTIME 250 //wait from last impulse
void loop()
{
  while (1) //обязательно для ускорения кода
  {
    if (IbCount) //прибыл импульс по прерыванию
    {
      IbCount=false;
      if (digitalRead(CoinChangerPin) == LOW /* for falling */) // подсчет только «правильных» прерываний
     {
        ICount++;
        timestamp=millis();
     }
     attachInterrupt ...
  }
  else
  if(ICount > 1 and (millis() - timestamp) > COINWAITTIME) //timeout

3. добавь импульсов на жетон, как минимум 2 импульса (четные числа).

4. eu2 вроде бы с пластиковой лицевой частью, сделай металлическую накладку с прорезью под жетон, к ней (у ch-926 под болт лицевой металлической части)  прикрути провод соединенный с землей.

5. добавь пару диодов, сопротивление и конденсатор

6. если есть ферритовое кольцо намотай на него несколько витков кабеля монетоприемника