Простой робот

В этой статье представлена схема простого «робота». Он ездит на свет, а если нет источника света, тогда включается режим «Свободный поиск» т.е. робот будет ездить, а при столкновении отъезжать и разворачиваться.

Принципиальная схема робота

Сердцем робота является микроконтроллер фирмы 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