В этой статье представлена схема простого "робота". Он ездит на свет, а если нет источника света, тогда включается режим "Свободный поиск" т.е. робот будет ездить, а при столкновении отъезжать и разворачиваться.
Сердцем робота является микроконтроллер фирмы ATMEL: AT90S2313, но можно и любой другой этой фирмы, у этого микроконтроллера 2кб памяти для программы, 15 портов ввода/вывода , доступное питание - 4-6В. Двигателями будет управлять "драйвер двигателя" - микросхема L293D (отечественный аналог - КР1128КТ4А). В качестве датчика было решено взять фоторезисторы СФ3-1.
Робот состоит из двух моторов. Вот как они будут работать при определенных действиях:
Ходовой двигатель | Двигатель поворота | |
вперед (F) | вперед | стоп |
вперед-вправо (FR) | вперед | вперед |
вперед-влево (FL) | вперед | назад |
назад (B) | назад | стоп |
назад-вправо (BR) | назад | вперед |
назад-влево (BL) | назад | назад |
назад-влево (BL) | стоп | стоп |
Используемые радиоэлементы в схеме:
Микроконтроллер AT90S2313
Микросхема L293D (отечественный аналог - КР1128КТ4А)
2 фоторезистор СФ3-1
Кварц на 4М Гц
Конденсаторы 22-24 пФ
Стабилизатор 7805 (или КРЕН5А)
Резистор 100 Ом (Опционально)
Два мотора
Питание Vbat - 4 батарейки пальчиковые, или 1 крона (9В)
Питание Vm - 1 крона (9В)
После сборки схемы, необходимо загрузить программу в микроконтроллер и робот готов:
/***************************************************** Chip type : AT90S2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/ #include <90s2313.h> #include #include // назначение определений для удобства работы с периферией #define OUT PORTB #define MOTOR_F 7 #define MOTOR_B 6 #define TURN_R 5 #define TURN_L 4 #define IN PIND #define LIGHT_R 0 #define LIGHT_L 1 #define BUMPER_F 2 #define BUMPER_B 3 // Возможные режимы движения enum {STOP, F, FR, FL, B, BR, BL}; //------------------------------------------------------------------------------ // Задержка t х 10ms //------------------------------------------------------------------------------ void Delay_10ms(unsigned char t) {char i; for(i=0;i pp) break; } this_move = i; // записываем новое полученное направление как текущее return(i); } //------------------------------------------------------------------------------ // Обработка прерывания от переднего бампера (INT0 = PD2) //------------------------------------------------------------------------------ interrupt [EXT_INT0] void ext_int0_isr(void) { if(this_move==FR) go(BL); if(this_move==FL) go(BR); else go(B); Delay_10ms(250); // отъезд в течение 2.5 х 2 сек Delay_10ms(250); this_move=B; } //------------------------------------------------------------------------------ // Обработка прерывания от заднего бампера (INT1 = PD3) //------------------------------------------------------------------------------ interrupt [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) go(FL); if(this_move==BL) go(FR); else go(F); Delay_10ms(250); // отъезд в течение 2.5 х 2 сек Delay_10ms(250); this_move=F; } //------------------------------------------------------------------------------ // "Случайное блуждание" //------------------------------------------------------------------------------ unsigned char walk(void){ // этот цикл организует "свободное блуждание" пока // нет сигнала ни от одного из датчиков освещенности while((IN.LIGHT_R) && (IN.LIGHT_L)){ go(next_move()); // получаем следующее направление движения и Delay_10ms(250); // движемся в этом направлении 2.5 сек } // этот цикл организует движение на свет, пока // есть сигнал хотя бы от одного из датчиков освещенности while((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); else if(IN.LIGHT_R==0) go(FR); else if(IN.LIGHT_L==0) go(FL); } return(0); } //------------------------------------------------------------------------------ // Главная программа //------------------------------------------------------------------------------ void main(void) { DDRB = 0xff; // назначаем все линии порта B на выход PORTB = 0x00; // и устанавливаем на них низкий уровень DDRD = 0x00; // назначаем все линии порта D на вход PORTD = 0xff; // подключаем внутренние нагрузочные резисторы // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // разрешаем прерывания #asm("sei") // запускаем главный цикл while(1) walk(); }
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
DD1 | MK | AT90S2313 | 1 | Поиск в магазине Отрон | ||
DD2 | Драйвер электродвигателей | L293 | 1 | Поиск в магазине Отрон | ||
Линейный регулятор | LM7805 | 1 | Поиск в магазине Отрон | |||
С1, С2 | Конденсатор | 22-24 пФ | 2 | Поиск в магазине Отрон | ||
R1 | Резистор | 100 Ом | 1 | Поиск в магазине Отрон | ||
VD1, VD2 | Фоторезистор | СФ3-1 | 2 | Поиск в магазине Отрон | ||
ZQ1 | Кварц | 4 МГц | 1 | Поиск в магазине Отрон | ||
M1, M2 | Электродвигатель | 2 | Поиск в магазине Отрон | |||
SA1, SA2 | Выключатель | 2 | Поиск в магазине Отрон | |||
Кнопка | 1 | Поиск в магазине Отрон | ||||
Скачать список элементов (PDF)
Прикрепленные файлы:
- robot.rar (6 Кб)
Комментарии (11) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
А как загрузить программу в робота??? вот вот и я тоже хотел этот вопрос задать
Hex файл загружается в МК через специальный программатор(для AVR пойдет программатор Громова) и с помощью проги (я использую UniProf)