Как пин сделать входом и установить на него низкий уровень
- Войдите на сайт для отправки комментариев
Пт, 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.
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); } }Вобще то если пин сконфигурирован как вход, то на него нельзя уже что либо устанавливать, он вход и сигналы принимает а не выдает. Возможно только сделать подтяжку к питанию. Определитесь чего хотите. На вход пины настраиваются после сброса сами.
Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?
Gosha Етот ваш код отлично подходит для тини13 и занимает без ужимки всего половину памяти, только ножки выставьте как на тини там их всего 5.
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); } }А программировать из среды Ардуино?
А программировать из среды Ардуино?
Да в начале темы написанно как, но если вам сложно устанавливать нвпишите мыло скину готовый 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МГц
выслал на почту проверяйте.
int Sirena = PB2; // выход на сирену int led = PB1; //просто лед int Pir1 = PB3; //вход ПИР датчика int Pir2 = PB4; //вход ПИР датчика int Kn = PB0; //вход ПИР датчика 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); } }Кстати у меня выход датчика в самом даьчике подтянут.
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.
Знаю о чем говорю мерил!(
Ага, такой.
Хорошо, буду чаще контролировать напряжение на акуммуляторе.
Спасибо