Attiny13 и серво. Помогите найти ошибку в коде.
- Войдите на сайт для отправки комментариев
Всем добрый день! Пытаюсь тодключить к Attiny13 и сервопривод, но что-то какие-то глюки... Суть работы проста: Установить серву в 90, ести на 4 пине гогическая "1" то учтановить серву в 60, если на 3 пине "1" то установить серву в 120. Если на пинах 3 и 4 "0", то установить серву в начальное положение - 90. К пинам 3 и 4 подпаяны резисторы по 20кОм к земле что бы избежать ложных срабатываний. Питается все это от аккумулятора 18650. Заранее оговорюсь: серва нормально работает от 3.3 вольта, проверял на Ардуино ДУЕ! Почему-то серва не хочет нормально позиционироваться. Поварачивается не туда, или вообще не поварачивается... или ровно в 90 не хочет становиться, а стает +- 5-10...
вот код:
#include <avr/io.h> #include <util/delay.h> byte s=0; byte pos=90; boolean lastPos = false; void setup() { //pinMode(s, OUTPUT); DDRB |= (1<<0); DDRB &= ~(1<<3); DDRB &= ~(1<<4); pulseOut(s,pos); } void loop() { if (lastPos == false) { if (PINB & (1<<PINB3)){ _delay_ms(5); if (PINB & (1<<PINB3)) { pulseOut(s, pos - 30); lastPos = true; _delay_ms(200); } } if (PINB & (1<<PINB4)){ _delay_ms(5); if (PINB & (1<<PINB4)) { pulseOut(s,pos + 30); lastPos = true; _delay_ms(200); } } } if (lastPos == true) { if (!(PINB & (1<<PINB4)) && !(PINB & (1<<PINB4))){ for (byte i=0;i<10;i++){ pulseOut(s,pos); _delay_ms(2); } lastPos = false; _delay_ms(200); } } _delay_ms(20); } void pulseOut( byte pin, byte p){ PORTB |= (1<<0); delayMicroseconds(300+p*(2500/180)); PORTB &= ~(1<<0); }
Заготовку кода брал здесь: https://arduinodiy.wordpress.com/2015/05/20/servo-on-attiny13/
В первой ветке при lastPos==false Вы изменяете lastpos=true послк чего у Вас выполняется и вторая ветка с lastPos==true;
Вряд ли Вы хотели такого результата?
В общем именно этого я и хотел. В первой ветке идет поворот вправо-влево, а во второй восстановление в 90. Условие lastPos я использовал для того что бы "не мучить серву": появился сигнал - повернуть серву - перейти к другой ветке и ждать пока сигнал не пропадет. Сигнал пропал - поставить серву в 90 - Перейти к 1-й ветке и ожидать сигнала на поворот.
Я только учусь программированию. Если есть более оптимальный вариант, то я буду рад если мне покажут как правильно.
Вот рабочий код:
Для тех кому сложно, вот код по-проще:
Похоже, у Вас ощибка в строке 37, Вы дважды смотрите состояние пина 4, а должны смотреть пин 4 и пин3
Да, там ошибка, вы правы.
Последние два кода рабочие, можно их использовать