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

Скачать список элементов (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
FM-модуль RDA5807M Осциллограф DSO138
вверх