Реклама ⓘ
Главная » Радиоуправление
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

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

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

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

Сердцем робота является микроконтроллер фирмы 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 MKAT90S23131 Поиск в магазине ОтронВ блокнот
DD2 Драйвер электродвигателей
L293
1 Поиск в магазине ОтронВ блокнот
Линейный регулятор
LM7805
1 Поиск в магазине ОтронВ блокнот
С1, С2 Конденсатор22-24 пФ2 Поиск в магазине ОтронВ блокнот
R1 Резистор
100 Ом
1 Поиск в магазине ОтронВ блокнот
VD1, VD2 ФоторезисторСФ3-12 Поиск в магазине ОтронВ блокнот
ZQ1 Кварц4 МГц1 Поиск в магазине ОтронВ блокнот
M1, M2 Электродвигатель2 Поиск в магазине ОтронВ блокнот
SA1, SA2 Выключатель2 Поиск в магазине ОтронВ блокнот
Кнопка1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

none Опубликована: 2006 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (11) | Я собрал (0) | Подписаться

0
VLad #
А как загрузить программу в робота???
Ответить
0
Simplyman #
Большое спасибо автору за простую конструкцию и выложенный исходник!
Ответить
0
кардан #
А как загрузить программу в робота???
Вот и я тоже хотел этот вопрос задать
Ответить
0
Reizor #
Сообщение от кардан
А как загрузить программу в робота??? вот вот и я тоже хотел этот вопрос задать

Hex файл загружается в МК через специальный программатор(для AVR пойдет программатор Громова) и с помощью проги (я использую UniProf)
Ответить
0
илья #
А какие фьюзы выставлять? И что нужно поменять в прошивке для замены микроконтроллера на attiny2313?
Ответить
0
Артур #
Мы с друго всё сделали как надо даже проверяли у мастера ! мы сделали не робота а тачку с полным приводом ! но радио управление не идут всё зделал включаю тачку он сам чот стоит ! когда отходиш начинает газовать поворачивать и тд!
Ответить
0
Влад #
Не понятно зачем нужны переключатели sa1 и sa2? А также в исходнике не прописана программа для столкновения и объезда препятствия :ups:
Ответить
0
booger #
скажите, пожалуйста, каким компилятором Вы пользовались?
Ответить
0
Артём #
Где можно взять микросхему L293D?
Ответить
0
Le_Fleurs #
Какие фьюзы ставить и можно ли использовать Attiny2313?
Ответить
0
Сержан #
Кто нибудь собирал эту схему? Работает? И зачем там два переключателя?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Квадрокоптер Syma X11
Квадрокоптер Syma X11
Конструктор - темброблок на LM1036 Солнечная панель 10Вт 12В поликристаллическая
вверх