В чём может быть дело...
- Войдите на сайт для отправки комментариев
Здравсвуйте!
Подскажите пожалуйста. На руках имеется плата 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);
}
}
Подключите пин 7 через резистор 10 kOm на минус ( на землю, GND ).
На порту постоянно висят помехи-наводки, а просто провод - это антенна....
Резистор уберёт наводки на землю.
ltkj в том, что у Вас вход "болтается в воздухе", то есть не подтянут ни к одному уровню, ни к земле, ни к питанию. Необходимо знать, какой тип выхода на купюроприемнике - TTL, OK (открытый коллектор), 0-10 VDC, 0-5 мА, 4-20 мА или "сухой контакт" (выход реле); импульс положительный (активная "1") или отрицательный (активный "0"). Это нужно знать с одной стороны, чтобы не спалить контроллер, с другой стороны, чтобы правильно считать.
Пока поменяйте "pinMode(pin, INPUT)" на "pinMode(pin, INPUT_PULLUP)" - светодиод будет гореть, когда никуда не подключен, это "подтяжка к питанию"
Скорее всего, выход будет OK, тогда нужно будет входной сигнал еще и проинвертировать:
Спасибо, попробую
Через резистор пока подключать не пробовали, но с последним вариантом - изменение в скетче "pinMode(pin, INPUT)" на "pinMode(pin, INPUT_PULLUP)" не дало результата - компилятор ругается на эту строчку.
замена pinMode(pin,INPUT) на pinMode(pin, INPUT_PULLUP) .....
тогда пробуйте в две строки, это одно и тоже, только диалекты разные
pinMode(pin,INPUT);
digitalWrite(pin, HIGH);
Подключить пин через резистор на землю можно только физически, а через резистор на питание - и физически, и программно.
Запись высокого уровня во ВХОДНОЙ пин - это команда подключить внутренний ( встроенный ) резистор между пином и питанием.
Вам важнее сейчас знать
"...Необходимо знать, какой тип выхода на купюроприемнике - TTL, OK (открытый коллектор), 0-10 VDC, 0-5 мА, 4-20 мА или "сухой контакт" (выход реле); импульс положительный (активная "1") или отрицательный (активный "0"). Это нужно знать с одной стороны, чтобы не спалить контроллер, с другой стороны, чтобы правильно считать. ..."
тип выхода на купюроприемнике - TTL, OK (открытый коллектор), импульс положительный (активная "1")
По pulseIn(pin,HIGH), если раскрыть умолчание pulseIn(pin,HIGH,1000000), Ардуина только и будет следить за пином 7.
Лучше использовать пин 2, внешнее прерывание INT0.
В таком случае Ваш код изначальный правильный, только добавьте после строки 7 - digitalWrite(pin, HIGH);
....только странно, что при ОК - положительная логика
Советую использовать прерывания для считывания импульсов, так как легко пропустить импульс или один посчитать за два. Например если нужно посчитать 5 грн по 1 имп за 1 грн то между каждым импульсом - интервал, который у разных купюрников отличается (даже у одной модели). Вот пример:
void setup (){ attachInterrupt(0, validatorImpulse, RISING); } void validatorImpulse(){ impulseCounter ++; }Вот как я подключал
В даном случае импульс положытельный. Если отрицательный то
По второй схеме я подключал CashCode MVU 10XX. Транзистор BC558
Здравсвуйте!
Подскажите пожалуйста. На руках имеется плата 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 предлагает считать именно количество импульсов.
Вы бы модель своего купюро-приемника озвучили, а лучше ссылочку на документацию или описание дали.
Я так понял, что приведенный скетч - тестовый, чтобы понять, ловится ли импульс. Если скетчу ничего делать не надо, кроме как считать, то контроль длины импульса позволит избавиться от помех и ложных срабатываний, что в данном случае важно.
Если бы это было так и именно для этого и использовалась pulseIn,
то выражение if (duration!=0) выглядело бы так if (duration > 1000),
а в противном случае от pulseIn толку как от digitalRead и if (duration!=0) можно заменить на if (digitalRead(pin)).
Но ведь digitalRead(pin) - разовое чтение, а pulseIn() - по умолчанию "слушает" пин 1 секунду и возвращает длительность импульса в микросекундах ( если он был ) или 0 ( если его не было в течении секунды ) ?
Как же их можно заменять ?
Как заменить написано в сообщении #15.
А внутри функция pulseIn вы думаете "слушает" вывод не digitalRead, которая разово читает состояние вывода, а что-то еще???
Единственное отличие будет в том, что с digitalRead светодиод будет загараться по переднему фронту импульса, а в случае с pulseIn по заднему и если длительность импульса не превышает одной секунды.
В pulseIn крутится digitalRead как белка... Спасибо - буду знать :)
Далее непонятно.... Запустили pulseIn - через секунду ( по умолчанию ) она остановится и выдаст 0.
Но если на 900-ой секунде случится импульс длительностью 20 секунд....
Всё же затормозится на 20 секунд ? И только потом pulseIn вернёт значение 20 000 000 ?
При чём здесь "если длительность импульса не превышает одной секунды" ?
Или я не доизучил pulseIn ?
....на 900-ой МИКРОсекунде....
Если пришел передний фронт импульса, но не пришел задний в течении одной секунды (или сколько задано секунд), то pulseIn вернет так же 0.
Не буду спорить, буду проверять завтра.... :)
Наверное, я это по другому понимаю - функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW.
.....который будет остановлен когда на порту вход/выхода будет LOW или пройдет одна секунда (по-умолчанию).
И так.. подведём итог :)
данный скетч тестовый это однозначно. тестовый купюроприёмник 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кОм?
Судя по описанию, подключение по схеме п.5-1-1? Там не просто OK, там выход "твердотельное реле", рекомендованная подтяжка 4.7 кОм. Со встроенной подтяжкой может не заработать. Резистор, соответственно, с сигнального провода на +5В. Ловить, соответственно, тип импульса LOW, потому что там "активный 0"
Эх, прошу прощения что изначально ввела в заблуждение про тип выхода - другой купюрник смотрели (был в наличии кошак -Cashcode с ним и тестили по началу). Про твердотелку согласна, только вот возник вопрос, если не трудно - поясните пожалуйста почему там активный ноль?
ОГРОМНЕЙШЕЕ СПАСИБО ВАМ!!!! :) хотя в режиме теста могла бы и сама догадаться най изменить на лоу.. :)) но вы здорово помогаете :) РЕСПЕКТ
заработало и без резистора, но с изменением в строке
на
Если кому нибудь поможет - заработать без резистора то заработало, но всё равно диод время от времени мигает и ловит какие то помехи. Из за отсутствия резистора в 4.7 кОм, повесила 1кОм резистор и всё нормализовалось. Считать импульсы получается с пмощью отрывка программы от Червячка. Спасибо ему за наводку на мысль :) С использованием в скетче его части программы подключаем выход купюрника на 2 пин ардуино.
Посмотрел что там внутри того 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 (особо не подбирал значения). Но думаю что можно умудрится вообще не поймать ничего при такой логике. ИМХО бесполезная функция...
Не совсем так. Если импульс уже есть, то да, он его пропускает, потому что не знает, когда он начался. Для функции измерение длины импульса - приоритетно. 0 возвращает только по таймауту. Вот точность в 21 мкс меня чуть-чуть расстроила, micros() дает 4 мкс шаг...
а зачем здесь твердотелка, полевой транзистор разве не подайдет?
Судя по описанию, подключение по схеме п.5-1-1? Там не просто OK, там выход "твердотельное реле", рекомендованная подтяжка 4.7 кОм. Со встроенной подтяжкой может не заработать. Резистор, соответственно, с сигнального провода на +5В. Ловить, соответственно, тип импульса LOW, потому что там "активный 0"
Толик, вы об этом? Тут мы говорили про то как внутри купюрника организован выход его
все,понял, немного сам стормозил.)буду тестить.
а транзистор какой лучше ставить я с полевиком пробовал но он не реагирует никак....(
А с какой целью тебе транзистор понадобился?
Например мы с купюрником работаем так: Сигнальный провод ICT (синий) садим на пин ардуинки, например на 2, от тогоже пина ведём провод через резистор 4.7 кОМ (или 5.1 кОм) на +5В, фиолетовый провод купюрника садим на gnd ардуинки и вуаля, можем видеть и считать импульсы.
Так зачем транзистор?:)
я по схеме chervyachok пробовал подключать )
А ну ясно:)
НУ купюроприёмник ICT V7 работает вот по моей системе замечательно:)
у меня жетоноприемник там три провода +12 земля и сигнал. пульс - там нет) вот и изголяюсь с ним как могу. импульсы видит и моргает ток из 10 импульса 3 пропускает) а считать как? как всемогущий червячок советовал)))
А модель жетоноприёмника случайно не 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; }в этом скетче куп по моей схеме подключен и светодиод мигает ровно столько, сколько пришло импульсов. Вроде не пропускает ни одного.
А в настройках (наприм дип свичи) жетонника есть длина импульса? может просто подлиннее поставить и тогда лучше ловить будет?
ну да он самый. бесполезная штука конечно,ну все равно))) я когда на мойке заправлял кофейник рядом помойка была там три игровых автомата стояло, ну это ж как такое добро и выкидывать... открутил и взял себе.)))теперь провожу экперименты))) спасибо тебе добрая женщина за подсказки,сам бы не додумался.буду пробовать.)интересно все же.
у меня этот код в стандартных настройках проги есть . только он как раз для кнопки и на прерывания должен срабатывать.
Здравствуйте ,если вас не затруднит то какой транзистор выв использовали в первой схеме
Добрый день форумчанам!!! Хочу соединить купюроприёмник ICT A7 с Arduino MEGA. Протокол купюрника Пульс. питание 12 вольт. контакиы в колодке стандартные (9 пинов). Пробовал уже подключать как советовала Аня. но почемуто не захотел. Если у кого есть тестовая программа действующая, помогите, скиньте.
Я так понял что питать недо вот так
В разъем входит 6 проводов:
Красный ■■■■■■ +12V
Оранжевый ■■■■■■ GND
Желтый ■■■■■■ INHIBIT +
Зеленый ■■■■■■ INHIBIT —
Синий ■■■■■■ SIGNAL +
Фиолетовый ■■■■■■ SIGNAL —
Красный и оранжевый это, соответственно, +12 вольт и земля.
«SIGNAL -» и «INHIBIT -» подключаются к общей земле. Если питание купюрника и питание автомата раздельное, то эти провода обязательно подключаются к общей с автоматом земле. Иначе, ничего работать не будет.
«INHIBIT +» — запрещающий сигнал. Позволяет внешнему устройству управлять купюрником.
«SIGNAL + » - это наш контакт что приходит к Ардуинке на любой цифровой вход. Только его ещё надо соединить с +5 в. Правильно????
И когда купюрник принимает купюру(у меня постоянно синий провод под +5 вольт), то ТТЛ коротит его на землю, тоесть на «SIGNAL -». Если я в чёмто ошибаюсь, подскажите.
красный провод - +12 источника
оранжевый на землю источника
синий на пин и от него через резистор 5 кОм на +5 В ардуины как я и говорила:)
фиолетовый на землю ардуины
и не забудь - свичи на лицевой стороне купюрника под крышкой - 1,2 - он, 3,4 -офф и у меня сбоку (щас внимание обратила) 8 свич включен. но не знаю, может он роли не играет
в такой системе подключения у тебя на пине купюрника в ждущем режиме висит HIGH, когда он шлёт импульсы, то просаживает пин до 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); } }Я конечно прошу прощения, но иногда мой мозг зависает и сложно что то понять......
О!!! Спасибо за совет!!!!!! Огромное спасибо!!! Зарегистрировал!!!! Аня Ваша прога работает.
Вот только я понял, что купюрник моргает 1 раз на любой номинал, а если я хочу сделать чтобы он регистрировал 5, 2 и 1 гривну, как задать ему функцию подсчёта сигналов????
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 р и т.д.
Спасибо Вам большое! Вы очень помогли, сегодня вечером буду экспериментировать!!! Никто не пробовал сделать маленький автомат по продажам каких либо товаров на основе Ардуинки??? У меня загорелась идея, и я никак не могу выкинуть её из своего восспаленного ума. ))) Если кто имеет опыт, поделитесь плиззз!!! Хоть в Личку или на почту % niksan_85_@_mail_ru_ %? Вводим без пробелов и с точками в доменах. Заранее Спасибо!
http://habrahabr.ru/post/143756/
?
мы в http://монетный-аттракцион.рф
сделали автомат по продаже готовых монет на ардуино как первый тестовый образец, потом планируем уйти на просто atmega с обвесами. Короче, опыт есть:)