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

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

Принципова схема робота

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

Прикреплені файли:

Top