В чём может быть дело...

Аня
Offline
Зарегистрирован: 26.10.2012

 Здравсвуйте!

Подскажите пожалуйста. На руках имеется плата Arduino uno. Решается вопрос о подключении купюроприёмника к ардуино с помощью протокола pulse. Для этого в плату залит простейший скетч - помигать светодиодом, если на 7 пине появится сигнал. Соответсвенно подключение выхода купюрника планировалось на этот пин. Но после прошивки и подключения питаения на плату с помощью сетевого адаптера robiton IB12-1000S наблюдаем следующее: пока к пину ничего не подключено-светодиод молчит, но стоит туда подсоединить просто висящий, ни к чему не подключенный провод - светодиод начинает моргать. Соответсвенно при подключении на пин выходного провода купюрника (при том купюрник ещё даже не включен) - светодиод также моргает. 

В чем же проблема?Ошибка в программе или на порту постоянно что то висит? Объясните, пожалуйста :)

Программа:

int pin=7;
unsigned long duration;

void setup()
{
  pinMode(13,OUTPUT);
  pinMode(pin,INPUT);
}

void loop()
{
  duration=pulseIn(pin,HIGH);
  if (duration!=0)
  {
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
  }
  else 
  {
    digitalWrite(13,LOW);
  }
}
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Подключите пин 7 через резистор 10 kOm на минус ( на землю, GND ).

 

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

 На порту постоянно висят помехи-наводки, а просто провод - это антенна....

Резистор уберёт наводки на землю.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

ltkj в том, что у Вас вход "болтается в воздухе", то есть не подтянут ни к одному уровню, ни к земле, ни к питанию. Необходимо знать, какой тип выхода на купюроприемнике - TTL, OK (открытый коллектор), 0-10 VDC, 0-5 мА, 4-20 мА или "сухой контакт" (выход реле); импульс положительный (активная "1") или отрицательный (активный "0"). Это нужно знать с одной стороны, чтобы не спалить  контроллер, с другой стороны, чтобы правильно считать.

Пока поменяйте "pinMode(pin, INPUT)" на "pinMode(pin, INPUT_PULLUP)" - светодиод будет гореть, когда никуда не подключен, это "подтяжка к питанию"

Скорее всего, выход будет OK, тогда нужно будет входной сигнал еще и проинвертировать:

duration=pulseIn(pin,LOW);

 

Аня
Offline
Зарегистрирован: 26.10.2012

 Спасибо, попробую

Аня
Offline
Зарегистрирован: 26.10.2012

 Через резистор пока подключать не пробовали, но с последним вариантом - изменение в скетче "pinMode(pin, INPUT)" на "pinMode(pin, INPUT_PULLUP)" не дало результата - компилятор ругается на эту строчку.

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

замена pinMode(pin,INPUT) на pinMode(pin, INPUT_PULLUP) .....

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

pinMode(pin,INPUT);

digitalWrite(pin, HIGH);

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

Подключить пин через резистор на землю можно только физически, а через резистор на питание - и физически, и программно.

Запись высокого уровня во ВХОДНОЙ пин - это команда подключить внутренний ( встроенный ) резистор между пином и питанием.

Вам важнее сейчас знать 

"...Необходимо знать, какой тип выхода на купюроприемнике - TTL, OK (открытый коллектор), 0-10 VDC, 0-5 мА, 4-20 мА или "сухой контакт" (выход реле); импульс положительный (активная "1") или отрицательный (активный "0"). Это нужно знать с одной стороны, чтобы не спалить контроллер, с другой стороны, чтобы правильно считать. ..."

Аня
Offline
Зарегистрирован: 26.10.2012

 тип выхода на купюроприемнике - TTL, OK (открытый коллектор), импульс положительный (активная "1")

 

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

 По pulseIn(pin,HIGH), если раскрыть умолчание pulseIn(pin,HIGH,1000000), Ардуина только и будет следить за пином 7.

Лучше использовать пин 2, внешнее прерывание INT0.

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

 В таком случае Ваш код изначальный правильный, только добавьте после строки 7 - digitalWrite(pin, HIGH);

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

 ....только странно, что при ОК - положительная логика

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 Советую использовать прерывания для считывания импульсов, так как легко пропустить импульс или один посчитать за два. Например если нужно посчитать 5 грн по 1 имп за 1 грн то между каждым импульсом - интервал, который у разных купюрников отличается (даже у одной модели). Вот пример:

void setup (){ 
attachInterrupt(0, validatorImpulse, RISING); 
} 
void validatorImpulse(){
impulseCounter ++;
}

Вот как я подключал

В даном случае импульс положытельный. Если отрицательный то

По второй схеме я подключал CashCode MVU 10XX. Транзистор BC558

maksim
Offline
Зарегистрирован: 12.02.2012

Аня пишет:

 Здравсвуйте!

Подскажите пожалуйста. На руках имеется плата Arduino uno. Решается вопрос о подключении купюроприёмника к ардуино с помощью протокола pulse. Для этого в плату залит простейший скетч - помигать светодиодом, если на 7 пине появится сигнал. Соответсвенно подключение выхода купюрника планировалось на этот пин. Но после прошивки и подключения питаения на плату с помощью сетевого адаптера robiton IB12-1000S наблюдаем следующее: пока к пину ничего не подключено-светодиод молчит, но стоит туда подсоединить просто висящий, ни к чему не подключенный провод - светодиод начинает моргать. Соответсвенно при подключении на пин выходного провода купюрника (при том купюрник ещё даже не включен) - светодиод также моргает. 

В чем же проблема?Ошибка в программе или на порту постоянно что то висит? Объясните, пожалуйста :)

Программа:

int pin=7;
unsigned long duration;

void setup()
{
  pinMode(13,OUTPUT);
  pinMode(pin,INPUT);
}

void loop()
{
  duration=pulseIn(pin,HIGH);
  if (duration!=0)
  {
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
  }
  else 
  {
    digitalWrite(13,LOW);
  }
}

Толи купюро-приемники разные бывают, толи общаются они совершенно разным способами.
Функция pulseIn не считает количество импульсов, она возвращает длительность импульса в микросекундах, в то время как chervyachok предлагает считать именно количество импульсов.
Вы бы модель своего купюро-приемника озвучили, а лучше ссылочку на документацию или описание дали.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

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

maksim
Offline
Зарегистрирован: 12.02.2012

Если бы это было так и именно для этого и использовалась pulseIn,
то выражение if (duration!=0) выглядело бы так if (duration > 1000),
а в противном случае от pulseIn толку как от digitalRead и  if (duration!=0) можно заменить на if (digitalRead(pin)).

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

 Но ведь digitalRead(pin) - разовое чтение, а pulseIn() - по умолчанию "слушает" пин 1 секунду и возвращает длительность импульса в микросекундах ( если он был ) или 0 ( если его не было в течении секунды ) ?

Как же их можно заменять ?

maksim
Offline
Зарегистрирован: 12.02.2012

Как заменить написано в сообщении #15.

А внутри функция pulseIn вы думаете "слушает" вывод не digitalRead, которая разово читает состояние вывода, а что-то еще???

Единственное отличие будет в том, что с digitalRead светодиод будет загараться по переднему фронту импульса, а в случае с pulseIn по заднему и если длительность импульса не превышает одной секунды.

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

 В pulseIn крутится digitalRead как белка... Спасибо - буду знать :)

Далее непонятно.... Запустили pulseIn - через секунду ( по умолчанию ) она остановится и выдаст 0.

Но если на 900-ой секунде случится импульс длительностью 20 секунд....

Всё же затормозится на 20 секунд ? И только потом pulseIn вернёт значение 20 000 000 ?

При чём здесь "если длительность импульса не превышает одной секунды" ?

Или я не доизучил pulseIn ?

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

 ....на 900-ой МИКРОсекунде....

maksim
Offline
Зарегистрирован: 12.02.2012

Если пришел передний фронт импульса, но не пришел задний в течении одной секунды (или сколько задано секунд), то pulseIn вернет так же 0.

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

 Не буду спорить, буду проверять завтра.... :)

Наверное, я это по другому понимаю - функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW.

maksim
Offline
Зарегистрирован: 12.02.2012

.....который будет остановлен когда на порту вход/выхода будет LOW или пройдет одна секунда (по-умолчанию).

Аня
Offline
Зарегистрирован: 26.10.2012

 И так.. подведём итог :)

данный скетч тестовый это однозначно. тестовый купюроприёмник ICT V7. Вся документация на него - http://www.igrotechnics.ru/billacceptors/bill-acceptors-ict-a6-v6.html.  Думаю я не ошиблась сказав что  там по выходу ТТЛ логика и импульс положительный (логическая1).

И так.. чтобы проверить (просто проверить, а как посчитать импульсы  я разберусь, так как возможно ещё другая модель купброприёмника будет) есть ли что на порту мне нужно подключить выход купюрника на порт через резистор и в скетче исправить if (duration!=0) на if (duration > 1000), если я использую функцию pulseIn? или всё же логичнее заменить  if (duration!=0)  на if (digitalRead(pin))? 

Лично я склоняюсь больше ко второму варианту. И про резистор - номинал 10кОм? 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Судя по описанию, подключение по схеме п.5-1-1? Там не просто OK, там выход "твердотельное реле", рекомендованная подтяжка 4.7 кОм. Со встроенной подтяжкой может не заработать. Резистор, соответственно, с сигнального провода на +5В. Ловить, соответственно, тип импульса LOW, потому что там "активный 0" 

Аня
Offline
Зарегистрирован: 26.10.2012

 Эх, прошу прощения что изначально ввела в заблуждение про тип выхода - другой купюрник смотрели (был в наличии кошак  -Cashcode с ним и тестили по началу). Про  твердотелку согласна, только вот возник вопрос, если не трудно - поясните пожалуйста почему там активный ноль?

Аня
Offline
Зарегистрирован: 26.10.2012

 ОГРОМНЕЙШЕЕ СПАСИБО ВАМ!!!! :)  хотя в режиме теста могла бы и сама догадаться най изменить на лоу.. :)) но вы здорово помогаете :) РЕСПЕКТ

заработало и без резистора, но с изменением в строке

duration=pulseIn(pin,HIGH);

на

duration=pulseIn(pin,LOW);

 

Аня
Offline
Зарегистрирован: 26.10.2012

 Если кому нибудь поможет - заработать без резистора то заработало, но всё равно диод время от времени мигает и ловит какие то помехи. Из за отсутствия резистора в 4.7 кОм, повесила 1кОм резистор и всё нормализовалось. Считать импульсы получается с пмощью отрывка программы от Червячка. Спасибо ему за наводку на мысль :) С использованием в скетче его части программы подключаем выход купюрника на 2 пин ардуино. 

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 Посмотрел что там внутри того pulseIn(). Так с его помощю считать точное количество импульсов никак не получится да и остальной код программы будет исполнятся в перерывах между pulseIn(). Вот что там:

while ((*portInputRegister(port) & bit) == stateMask)
		if (numloops++ == maxloops)
			return 0;
	
	// wait for the pulse to start
	while ((*portInputRegister(port) & bit) != stateMask)
		if (numloops++ == maxloops)
			return 0; 
	
	// wait for the pulse to stop
	while ((*portInputRegister(port) & bit) == stateMask) {
		if (numloops++ == maxloops)
			return 0;
		width++;
	}
	
	return clockCyclesToMicroseconds(width * 21 + 16); 

  Сначала он проверяет нет ли сигнала при запуске функции. Если есть то ждет пока он не исчезнет. Дальше начинает ждать пока он не появится вновь. Когда появляется - начинает считать его длину. И отдает значение длины только в том случае если не превышен таймаут (Во всех других случаях возвращает 0). Дальше дает остальному коду один круг и опять входит в ступор "от 10 микросекунд до 3 минут" ). 
 Мне из 5 импульсов (50мс имп - 300мс пауза ) получалось поймать 1-3 (особо не подбирал значения). Но думаю что можно умудрится вообще не поймать ничего при такой логике. ИМХО бесполезная функция... 


AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Не совсем так. Если импульс уже есть, то да, он его пропускает, потому что не знает, когда он начался. Для функции измерение длины импульса - приоритетно. 0 возвращает только по таймауту. Вот точность в 21 мкс меня чуть-чуть расстроила, micros() дает 4 мкс шаг... 

Toлик
Offline
Зарегистрирован: 28.01.2013

а зачем здесь твердотелка, полевой транзистор разве не подайдет?

 

 

Аня
Offline
Зарегистрирован: 26.10.2012

AlexFisher пишет:

Судя по описанию, подключение по схеме п.5-1-1? Там не просто OK, там выход "твердотельное реле", рекомендованная подтяжка 4.7 кОм. Со встроенной подтяжкой может не заработать. Резистор, соответственно, с сигнального провода на +5В. Ловить, соответственно, тип импульса LOW, потому что там "активный 0" 

Толик, вы об этом? Тут мы говорили про то как внутри купюрника организован выход его

Toлик
Offline
Зарегистрирован: 28.01.2013

все,понял, немного сам стормозил.)буду тестить.

 

Toлик
Offline
Зарегистрирован: 28.01.2013

а транзистор какой лучше ставить я с полевиком пробовал но он не реагирует никак....(

Аня
Offline
Зарегистрирован: 26.10.2012

А с какой целью тебе транзистор понадобился?

Например мы с купюрником работаем так: Сигнальный провод ICT (синий) садим на пин ардуинки, например на 2, от тогоже пина ведём провод через резистор 4.7 кОМ (или 5.1 кОм) на +5В, фиолетовый провод купюрника садим на gnd ардуинки и вуаля, можем видеть и считать импульсы. 

Так зачем транзистор?:)

Toлик
Offline
Зарегистрирован: 28.01.2013

я по схеме chervyachok пробовал подключать )

Аня
Offline
Зарегистрирован: 26.10.2012

А ну ясно:)

НУ купюроприёмник ICT V7 работает вот по моей системе замечательно:)

Toлик
Offline
Зарегистрирован: 28.01.2013

у меня жетоноприемник там три провода +12 земля и сигнал. пульс - там нет) вот и изголяюсь с ним как могу. импульсы видит и моргает ток из 10 импульса 3 пропускает) а считать как? как всемогущий червячок советовал)))

Аня
Offline
Зарегистрирован: 26.10.2012

А модель жетоноприёмника случайно не EU-2? :)

вот скетч как я импульсы на куп. ловила:

const int moneyPin=2;
const int ledPin=13;

int ledState=HIGH;
int moneyState;
int lastMoneyState=LOW;

long lastDebTime=0;
long debDelay=50;

void setup()
{
  pinMode(moneyPin,INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  int reading=digitalRead(moneyPin);
  
  if (reading!=lastMoneyState)
  {
    lastDebTime=millis();
  }
  
  if ((millis()-lastDebTime)>debDelay)
  {
    moneyState=reading;
  }
  
  digitalWrite(ledPin,moneyState);
  lastMoneyState=reading;
  
}

 

в этом скетче куп по моей схеме подключен и светодиод мигает ровно столько, сколько пришло импульсов. Вроде не пропускает ни одного.

А в настройках (наприм дип свичи) жетонника есть длина импульса? может просто подлиннее поставить и тогда лучше ловить будет?

Toлик
Offline
Зарегистрирован: 28.01.2013

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

Toлик
Offline
Зарегистрирован: 28.01.2013

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

Toлик
Offline
Зарегистрирован: 28.01.2013

Здравствуйте ,если вас не затруднит то какой транзистор выв использовали в первой схеме

Kolyanchyk
Offline
Зарегистрирован: 27.02.2013

 Добрый день форумчанам!!! Хочу соединить купюроприёмник ICT A7 с Arduino MEGA. Протокол купюрника Пульс. питание 12 вольт. контакиы в колодке стандартные (9 пинов). Пробовал уже подключать как советовала Аня. но почемуто не захотел. Если у кого есть тестовая программа действующая, помогите, скиньте.

Я так понял что питать недо вот так

В разъем входит 6 проводов:

Красный            ■■■■■■ +12V
Оранжевый       ■■■■■■ GND
Желтый              ■■■■■■ INHIBIT +
Зеленый             ■■■■■■ INHIBIT —
Синий                ■■■■■■ SIGNAL +
Фиолетовый      ■■■■■■ SIGNAL —

Красный и оранжевый это, соответственно, +12 вольт и земля.

«SIGNAL -» и «INHIBIT -» подключаются к общей земле. Если питание купюрника и питание автомата раздельное, то эти провода обязательно подключаются к общей с автоматом земле. Иначе, ничего работать не будет.

«INHIBIT +» — запрещающий сигнал. Позволяет внешнему устройству управлять купюрником.

«SIGNAL + » - это наш контакт что приходит к Ардуинке на любой цифровой вход. Только его ещё надо соединить с +5 в. Правильно????

И когда купюрник принимает купюру(у меня постоянно синий провод под +5 вольт), то ТТЛ коротит его на землю, тоесть на «SIGNAL -». Если я в чёмто ошибаюсь, подскажите.

Аня
Offline
Зарегистрирован: 26.10.2012

красный провод - +12 источника

оранжевый на землю источника

синий на пин и от него через резистор 5 кОм на +5 В ардуины как я и говорила:)

фиолетовый на землю ардуины

и не забудь  - свичи на лицевой стороне купюрника под крышкой - 1,2 - он, 3,4 -офф и у меня сбоку (щас внимание обратила) 8 свич включен. но не знаю, может он роли не играет

Аня
Offline
Зарегистрирован: 26.10.2012

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

 

а насчёт тестовой рограммы - я выше скетч кидала. его в ардуино и вперёд мигать светодиодом

Kolyanchyk
Offline
Зарегистрирован: 27.02.2013

Спасибо! в скетче ты там что то меняла??  я так понял надо строчку заменить 

duration=pulseIn(pin,LOW);

и скетч тогда такой:

int pin=7;
unsigned long duration;

void setup()
{
  pinMode(13,OUTPUT);
  pinMode(pin,INPUT);
}

void loop()
{
  duration=pulseIn(pin,LOW);
  if (duration!=0)
  {
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
  }
  else 
  {
    digitalWrite(13,LOW);
  }
}

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

 

Kolyanchyk
Offline
Зарегистрирован: 27.02.2013

О!!! Спасибо за совет!!!!!! Огромное спасибо!!! Зарегистрировал!!!! Аня Ваша прога работает.

Вот только я понял, что купюрник моргает 1 раз на любой номинал, а если я хочу сделать чтобы он регистрировал 5, 2 и 1 гривну, как задать ему функцию подсчёта сигналов????

Аня
Offline
Зарегистрирован: 26.10.2012
const int moneyPin=2;
const int ledPin=13;

int ledState=HIGH;
int moneyState;
int lastMoneyState=LOW;

long lastDebTime=0;
long debDelay=50;

void setup()
{
  pinMode(moneyPin,INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  int reading=digitalRead(moneyPin);
  
  if (reading!=lastMoneyState)
  {
    lastDebTime=millis();
  }
  
  if ((millis()-lastDebTime)>debDelay)
  {
    moneyState=reading;
  }
  
  digitalWrite(ledPin,moneyState);
  lastMoneyState=reading;
  
}

 

вот этот скетч мигает у нас 1раз-10 руб, 10р-100 р и  т.д.

Kolyanchyk
Offline
Зарегистрирован: 27.02.2013

Спасибо Вам большое! Вы очень помогли, сегодня вечером буду экспериментировать!!! Никто не пробовал сделать маленький автомат по продажам каких либо товаров на основе Ардуинки??? У меня загорелась идея, и я никак не могу выкинуть её из своего восспаленного ума. ))) Если кто имеет опыт, поделитесь плиззз!!! Хоть в Личку или на почту % niksan_85_@_mail_ru_ %? Вводим без пробелов и с точками в доменах.  Заранее Спасибо!

rembo
Offline
Зарегистрирован: 14.11.2012
Аня
Offline
Зарегистрирован: 26.10.2012

мы в http://монетный-аттракцион.рф

сделали автомат по продаже готовых монет на ардуино как первый тестовый образец, потом планируем уйти на просто atmega с обвесами. Короче, опыт есть:)