Простий робот
У цій статті представлена схема простого "робота". Він їздить на світло, а якщо немає джерела світла, тоді вмикається режим "Вільний пошук", тобто робот буде їздити, а при зіткненні від'їжджати і розвертатися.

Серцем робота є мікроконтролер фірми ATMEL: AT90S2313, але можна й будь-який інший цієї фірми, у цього мікроконтролера 2кб пам'яті для програми, 15 портів вводу/виводу, доступне живлення - 4-6В. Двигунами буде управляти "драйвер двигуна" - мікросхема L293D (вітчизняний аналог - КР1128КТ4А). В якості датчика було вирішено взяти фоторезистори СФ3-1.
Робот складається з двох моторів. Ось як вони будуть працювати при певних діях:
Ходовой двигатель | Двигатель поворота | |
вперед (F) | вперед | стоп |
вперед-вправо (FR) | вперед | вперед |
вперед-вліво (FL) | вперед | назад |
назад (B) | назад | стоп |
назад-вправо (BR) | назад | вперед |
назад-вліво (BL) | назад | назад |
стоп (S) | стоп | стоп |
Використовувані радіоелементи в схемі:
Мікроконтролер 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 < t; i++) { // Затримка for(volatile int j=0;j < 100;j++); } } //------------------------------------------------------------------------------ // Обробка переривання від переднього бампера (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; // підключаємо внутрішні навантажувальні резистори // Ініціалізація зовнішніх переривань // INT0: Увімкнено // INT0 Режим: Негативний фронт // INT1: Увімкнено // INT1 Режим: Негативний фронт GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // дозволяємо переривання #asm("sei") // запускаємо головний цикл while(1) walk(); }
Список радіоелементів
Обозначение | Тип | Номінал | Кількість | Примітка | ||
---|---|---|---|---|---|---|
DD1 | МК | 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 | |||||
Прикреплені файли:
- robot.rar (6 Кб)