Как пин сделать входом и установить на него низкий уровень
- Войдите на сайт для отправки комментариев
Пт, 11/03/2016 - 23:16
Добрый всем день!
Недавно ко мне в строящийся дом залезли жулики. Озадачился созданием сигнализации с двумя PIR датчиками.
При написании кода в среде Arduino все работает без проблем. Но - потребление в 30 мА слишком много.
int Sirena = 12; // выход на сирену int led = 13; //просто лед int Pir1 = 2; //вход ПИР датчика int Pir2 = 3; //вход ПИР датчика int Kn = 4; //вход ПИР датчика void setup() { pinMode(led, OUTPUT); pinMode(Sirena, OUTPUT); pinMode(Pir1, INPUT); pinMode(Pir2, INPUT); pinMode(Kn, INPUT); } void loop() { if (digitalRead (Pir1) == HIGH || digitalRead (Pir2) == HIGH || digitalRead (Kn) == HIGH) { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(500); } }
Поэтому очень хочется перевести код на Attiny13a
При написании вот такого кода в среде AtmelStudio 6
#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #define LED_BIT1 _BV(PB1) #define LED_BIT2 _BV(PB2) #define LED_BIT3 _BV(PB3) #define LED_BIT4 _BV(PB4) int main() { DDRB |= LED_BIT1; // OUTPUT нога 6 DDRB |= LED_BIT2; // OUTPUT нога 7 // DDRB &= ~ LED_BIT3; // INPUT нога 2 // PORTB &= ~LED_BIT3; // LOW DDRB &= ~(1<<3); // устанавливаем вывод PB3 как вход PORTB &= ~(1<<3); // устанавливаем низкий уровень на выводе PB3 DDRB &= ~(1<<4); // устанавливаем вывод PB4 как вход PORTB &= ~(1<<4); // устанавливаем низкий уровень на выводе PB4 while (1) { if (PINB & (1<<PINB3)||PINB & (1<<PINB4)) //Чтение состояния(лог. 1) на порту ввода вывода: { PORTB |= LED_BIT2; // HIGH _delay_ms(900); PORTB &= ~LED_BIT2; // LOW PORTB |= LED_BIT1; // HIGH _delay_ms(300); PORTB &= ~LED_BIT1; // LOW } } }
На входах PB3 PB4 все время присутствует 1 (меряю вольтметром).
Датчики PIR работают правильно - при сработке выдают 1, через некоторое время ее сбрасывают (в том числе без контроллера)
А на ногах контроллера все равно присутстует 1, независимо от того, подключен датчик или нет.
КТо может сказать - как правильно прописать пины как ВХОДы и установить на них 0 по умолчанию?
Вобще то если пин сконфигурирован как вход, то на него нельзя уже что либо устанавливать, он вход и сигналы принимает а не выдает. Возможно только сделать подтяжку к питанию. Определитесь чего хотите. На вход пины настраиваются после сброса сами.
Gosha Етот ваш код отлично подходит для тини13 и занимает без ужимки всего половину памяти, только ножки выставьте как на тини там их всего 5.
Вобще то если пин сконфигурирован как вход, то на него нельзя уже что либо устанавливать, он вход и сигналы принимает а не выдает. Возможно только сделать подтяжку к питанию. Определитесь чего хотите. На вход пины настраиваются после сброса сами.
Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?
Gosha Етот ваш код отлично подходит для тини13 и занимает без ужимки всего половину памяти, только ножки выставьте как на тини там их всего 5.
А программировать из среды Ардуино?
А программировать из среды Ардуино?
Да в начале темы написанно как, но если вам сложно устанавливать нвпишите мыло скину готовый HEX просто зальете, только измените пины для тини.
Могу скинуть и IDE портабл с установленной тини13.
Вобще то если пин сконфигурирован как вход, то на него нельзя уже что либо устанавливать, он вход и сигналы принимает а не выдает. Возможно только сделать подтяжку к питанию. Определитесь чего хотите. На вход пины настраиваются после сброса сами.
Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?
Нет. Если датчик выдаст 0 - будет ноль, т.к. ток с выхода датчика больше чем с подтяжки. Если датчик выдаст 1 - будет 1. Если ничего не выдаст - отключили, будет один за счет подтяжки
А программировать из среды Ардуино?
Да в начале темы написанно как, но если вам сложно устанавливать нвпишите мыло скину готовый HEX просто зальете, только измените пины для тини.
Могу скинуть и IDE портабл с установленной тини13.
БОльшое спасибо! HEX вполне подойдет
Мыло Swed777@ya.ru
Если можно - пины будут такие:
Ардуино (PIR1=2 PIR2=3) --- это в Attiny13a - порты PB3 PB4 (номер ноги в тиньке 2 и 3 соответственно)
Ардуино (Kn=4) ---- это в Attiny13a - порт PB0 (5 нога тиньки)
Ардуино (Sirena = 12) ---- это в Attiny13a - порт PB2 (5 нога тиньки)
Заранее еще раз спасибо!
Вобще то если пин сконфигурирован как вход, то на него нельзя уже что либо устанавливать, он вход и сигналы принимает а не выдает. Возможно только сделать подтяжку к питанию. Определитесь чего хотите. На вход пины настраиваются после сброса сами.
Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?
Нет. Если датчик выдаст 0 - будет ноль, т.к. ток с выхода датчика больше чем с подтяжки. Если датчик выдаст 1 - будет 1. Если ничего не выдаст - отключили, будет один за счет подтяжки
Спасибо. Но можно еще раз и помедленнее для "одаренных" ))
А почему, если подключить датчик к пину БЕЗ подтяжки к Питанию - то при отсутствии сигнала датчика на ноге висит 1? Она же по-идее должен уходить через контакт датчика на землю и на пине должен быть низкий уровень?
Или я туплю?
БОльшое спасибо! HEX вполне подойдет
Мыло Swed777@ya.ru
Если можно - пины будут такие:
Ардуино (PIR1=2 PIR2=3) --- это в Attiny13a - порты PB3 PB4 (номер ноги в тиньке 2 и 3 соответственно)
Ардуино (Kn=4) ---- это в Attiny13a - порт PB0 (5 нога тиньки)
Ардуино (Sirena = 12) ---- это в Attiny13a - порт PB2 (5 нога тиньки)
Заранее еще раз спасибо!
Вот код скомпилировал сразу для разных частот 9.6 и 1.2МГц
выслал на почту проверяйте.
Кстати у меня выход датчика в самом даьчике подтянут.
Gosha Я код не просмотрел просто скомпилировал, чтож вы включение сирены забыли прописать!?
bodriy2014
Подтянут к питанию или земле?
Каким резистором?
Сейчас только что пробовал 4,7 ком и к питанию, и к земле. Все равно на входе 1. (это я про код для тиньки говорю)
Протормозил - код был отладочный, пытался разобраться со входом.
МОжно сейчас поправлю и на почту вышлю?
А почему, если подключить датчик к пину БЕЗ подтяжки к Питанию - то при отсутствии сигнала датчика на ноге висит 1?
Там может висеть и переключаться 100500 раз в секунду всё что угодно - будут тупо ловиться все помехи.
bodriy2014
Подтянут к питанию или земле?
Каким резистором?
Сейчас только что пробовал 4,7 ком и к питанию, и к земле. Все равно на входе 1. (это я про код для тиньки говорю)
Протормозил - код был отладочный, пытался разобраться со входом.
МОжно сейчас поправлю и на почту вышлю?
Берете резистор на 10КОм и подтягиваете к земле выход датчика пир он же вход на тини13, чтоб когда датчик выдавал LOW пин не ловил наводки и небыло ложных срабатываний.
соберите все на Ардуино и проверьте что работает без ложных срабатываний, потом просто перекомпилируете под тини, у вас команды простые все пойдет.
У меня отладочная плата, так я сразу для тини код пишу.
И не забывайте что все входы контроллера нужно подтягивать иначе это антена которая ловит помехи!(
На Ардуино код работает четко, без ложных срабатываний. Собрал, проверил, 2 часа гонял собранное.
С тинькой - завтра сделаю печатную плату , включая подтягивающие резисторы, тогда проверю.
Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.
В любом случае - всем спасибо. Завтра отпишусь о результатах
На Ардуино код работает четко, без ложных срабатываний. Собрал, проверил, 2 часа гонял собранное.
С тинькой - завтра сделаю печатную плату , включая подтягивающие резисторы, тогда проверю.
Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.
В любом случае - всем спасибо. Завтра отпишусь о результатах
Если вы подтяните выход своего датчика к питанию то он всегда будет выдавать HIGH и сирена всегда будет голосить!)
Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.
Это зависит от того, какой сигнал выдаёт датчик при срабатывании. Если высокий уровень (1), то стягиваем к земле. Если низкий уровень (0), то подтягиваем к питанию. То есть как бы наоборот, по сравнению с сигналом датчика.
Ок, понятно. Датчик движения стандартный, в состоянии покоя - 0, при срабатывании - 1.
Отчитываюсь - сделал печатную плату, входы подтянул к земле резисторами 10К.
Все заработало! Причем на коде С++, что для меня, не программиста, особенно приятно.
Всем, помогающим мне - БОЛЬШОЕ спасибо.
Единственно, что пока напрягает - это потребление тока 3,5 мА. Правда, это вместе с КРЕН5.
Так что сейчас буду заниматься спящим режимом тиньки )
Возможно поискать стабилизаторы с малым током потребления. А также рассмотреть вопрос перехода на питание 3,3 В (т.е. литий ион без стабилизатора). Какая частота у Тини?
.
Возможно поискать стабилизаторы с малым током потребления. А также рассмотреть вопрос перехода на питание 3,3 В (т.е. литий ион без стабилизатора). Какая частота у Тини?
Не подскажите, какие именно? Я только крен-ки знаю ) Частота - 1,2 мгц
Добавил спящий режим, который "PowerDown", с просыпанием каждые 4 секунды. Потребление стало 2,5 мА. Все равно многовато
С такой частотой можно питать напрямую от 3,7В Li-ion аккумуляторов, без понижающего стабилизатора. Только не помню, будут ли PIR-датчики от 3,7В работать.
Не подскажите, какие именно? Я только крен-ки знаю )
Да куча импортных стабилизаторов от разных производителей есть (L7805, LD1085, AMS1117, LD1117, LM1117 и другие), даташиты на них надо смотреть
С такой частотой можно питать напрямую от 3,7В Li-ion аккумуляторов, без понижающего стабилизатора. Только не помню, будут ли PIR-датчики от 3,7В работать.
Нужно на модуль датчика смотреть, там должен быть стаб на 3.3В сразу к нему на выход подпаяться.
Нужно на модуль датчика смотреть, там должен быть стаб на 3.3В сразу к нему на выход подпаяться.
Да, точно, есть там стаб на 3,3. Можно тогда в обход стаба подключить. Микросхема BISS0001 на модуле должна нормально работать в диапазоне 3В - 5В, судя по даташиту.
Gosha , а что за сирена на выходе устройства ?
это про энергосбережение....
малопотребляющееустройство в случае тревоги будет включать реле для подачи питания ( не малого ) на сирену ?
зачем тогда малопотребляющееустройство ?
Gosha , а что за сирена на выходе устройства ?
это про энергосбережение....
Сирена китайская - воет и моргает красными вспышками. В режиме сработки потребляет 300 ма.
НО - надеюсь, ей не придется срабатывать, по-крайней мере, часто.
Поэтому основной потребитель акуммулятора на 7Ач будет как раз таки тинька и два датчика.
PIR датчики стандартные, HC-SR501. На плате нашел стабилизатор на 3,3 вольта ) - так что bodriy2014, Jeka_m Спасибо за идею. Обойдусь вообще без крен-ки )
Сирена китайская - воет и моргает красными вспышками. В режиме сработки потребляет 300 ма.
НО - надеюсь, ей не придется срабатывать, по-крайней мере, часто.
Поэтому основной потребитель акуммулятора на 7Ач будет как раз таки тинька и два датчика.
PIR датчики стандартные, HC-SR501. На плате нашел стабилизатор на 3,3 вольта ) - так что bodriy2014, Jeka_m Спасибо за идею. Обойдусь вообще без крен-ки )
Акум свинец 7Ач как в бесперебойниках?, если да то расслабьтесь и перестаните считать потребеление)))
У него ток саморазряда такой что потребеление даже Atmega328 не сыграет роли на длительном участке времени, не говоря уже о экономной тини13.
Знаю о чем говорю мерил!(
Ага, такой.
Хорошо, буду чаще контролировать напряжение на акуммуляторе.
Спасибо