Безкоштовна технічна бібліотека ЕНЦИКЛОПЕДІЯ РАДІОЕЛЕКТРОНІКИ ТА ЕЛЕКТРОТЕХНІКИ Простий робот. Енциклопедія радіоелектроніки та електротехніки Енциклопедія радіоелектроніки та електротехніки / Апаратура радіокерування У цій статті представлено схему простого "робота". Він їздить світ, і якщо немає джерела світла, тоді включається режим " Вільний пошук " тобто. робот їздитиме, а при зіткненні від'їжджатиме і розвертатиметься. Серцем робота є мікроконтролер фірми ATMEL: AT90S2313, але можна і будь-якої іншої цієї фірми, цей мікроконтролер має 2кб пам'яті для програми, 15 портів вводу/виводу, доступне живлення - 4-6В. Двигунами керуватиме "драйвер двигуна" - мікросхема L293D (вітчизняний аналог - КР1128КТ4А). Як датчик було вирішено взяти фоторезистори СФ3-1. Робот складається із двох моторів. Ось як вони працюватимуть за певних дій:
Використовувані радіоелементи у схемі: Мікроконтролер 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 // Призначення визначень для зручності роботи з периферією #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 x 10ms //------------------------------------------------ ------------------------------ void Delay_10ms(unsigned char t) {char i; for(i=0;i //Таблиця ймовірностей для вибору напрямку руху // Виходячи з поточного напрямку руху unsigned char p[7][7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100}; // поточний напрямок руху unsigned char this_move; //------------------------------------------------ ------------------------------ // Включення комбінації двигунів для руху в заданому напрямку //------------------------------------------------ ------------------------------ void go (unsigned char direction) { switch (direction) { case STOP: OUT.MOTOR_F=0; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; case F: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break; case FR: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=1; OUT.TURN_L=0; break; case FL: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=1; break; випадок B: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=0; break; case BR: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=1; OUT.TURN_L=0; break; case BL: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=1; break; } } //------------------------------------------------ ------------------------------ // Вибір напрямку руху на наступному кроці за таблицею ймовірностей //------------------------------------------------ ------------------------------ unsigned char next_move(void){ unsigned char pp, i; pp = rand()/327; // Отримуємо випадкове число 0..99 for (i=0;i<7;i++){ // шукаємо відповідність у таблиці ймовірностей if (p [this_move] [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); } повернення (0); } //------------------------------------------------ ------------------------------ // Головна програма //------------------------------------------------ ------------------------------ сили основних (недійсними) { 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(); } Завантажити програму, файл прошивки та схему робота у форматі sPlan Публікація: cxem.net Дивіться інші статті розділу Апаратура радіокерування. Читайте та пишіть корисні коментарі до цієї статті. Останні новини науки та техніки, новинки електроніки: Шум транспорту затримує зростання пташенят
06.05.2024 Бездротова колонка Samsung Music Frame HW-LS60D
06.05.2024 Новий спосіб управління та маніпулювання оптичними сигналами
05.05.2024
Інші цікаві новини: ▪ Повідомлення про наближення машини швидкої допомоги ▪ Орбітальне кільце навколо Землі Стрічка новин науки та техніки, новинок електроніки
Цікаві матеріали Безкоштовної технічної бібліотеки: ▪ Розділ сайту Зарядні пристрої, акумулятори, батарейки. Добірка статей ▪ стаття Щит на брамі Цареграда. Крилатий вислів ▪ стаття Що таке камедь? Детальна відповідь ▪ стаття Лікар-статистик. Посадова інструкція ▪ стаття Втік світлодіодний вогонь (варіант 3). Енциклопедія радіоелектроніки та електротехніки ▪ стаття Простий SSB-мінітрансівер на 160 метрів. Енциклопедія радіоелектроніки та електротехніки
Залишіть свій коментар до цієї статті: All languages of this page Головна сторінка | Бібліотека | Статті | Карта сайту | Відгуки про сайт www.diagram.com.ua |