Я купил NONAME китайские сервоприводы с ebay. Нужно научиться с ними работать, решил сделать лазерную игрушку для кота, как увидел в статье на хабре. Также хотел добавить ручное управление.
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> //TCCR0 #define CS0 0 #define CS1 1 #define CS2 2 #define TOIE0 0 // Частота МК 4 МГЦ int clock = 0; int move_x = 20; int move_y = 20; int clock2 = 0; int manual = -1; int pressed = -1; int x_increase = 0, y_increase = 0; ISR(TIMER0_OVF_vect) // Прерывание по переполнению таймера TNC0 { clock++; // Переменная для подсчёта частоты if (clock == move_y) // Каждые 1 - 2 мс обнуляем ножку { PORTC = PORTC ^ 0b00010000; // PD4 } if (clock == move_x) // Подбиралось эксперементально min 14 max 32 { PORTC = PORTC ^ 0b00100000; // PD5 } if(clock >= 251) // Каждые 20 мс посылаем импульс { PORTC = 0b00110000; clock = 0; clock2++; } if( manual == -1 && clock == 0 ) // Если НЕ ручное управление { if(clock2 == 100) // Примерно каждые 2 секунды { move_x = 26; move_y = 17; } else if(clock2 == 200) // двигаем сервоприводами { move_x = 30; move_y = 20; } else if(clock2 == 300) { move_x = 20; move_y = 22; } else if(clock2 == 400) { move_x = 25; move_y = 21; } else if(clock2 >= 500) { move_x = 32; move_y = 19; clock2 = 0; } } if( manual == 1 && clock == 0 ) // Если ручное управление { if(clock2 >= 7) // Каждые 1/4 секунды крутим серву если нажата кнопка { if(x_increase == 1) move_x++; if(x_increase == -1) move_x--; if(y_increase == 1) move_y++; if(y_increase == -1) move_y--; x_increase = 0; y_increase = 0; clock2 = 0; } } if ((PIND & (1 << 0)) == 0 && pressed == -1) // Если 1 вывод заземлили PIND == 0, нажали кнопку { _delay_ms(50); // Убираем дребезг контактов if ((PIND & (1 << 0)) == 0 && pressed == -1) { manual = -manual; // Меняем тип управления pressed = 1; // переменная для проверки нажатия } } if ((PIND & (1 << 0)) == 1 && pressed == 1) // Чтобы тип управления не менялся 100 раз { _delay_ms(50); if ((PIND & (1 << 0)) == 1 && pressed == 1) // Движение сервами { pressed = -1; // за 1 нажатие } } if ((PIND & (1 << 1)) == 0 && move_x < 32 ) // Остальные проверки кнопок { x_increase = 1; } if ((PIND & (1 << 2)) == 0 && move_x > 16) // Для движения сервами { x_increase = -1; } if ((PIND & (1 << 3)) == 0 && move_y < 32) { y_increase = 1; } if ((PIND & (1 << 4)) == 0 && move_y > 16) { y_increase = -1; } } int main() { DDRC=0xFF; //выход DDRD=0x00; // вход PORTD=0b00011111; // ЛОГ 1 на выводы для кнопок // Настройка TIMER0 TCCR0|=(0<<CS2)|(0<<CS1)|(1<<CS0); // без предделителя TIMSK|=(1<<TOIE0); // прерывание при переполнении таймера TNC0 sei(); // Разрешаем прерывания while(1); }
Комментариев нет :
Отправить комментарий