www.diagram.com.ua
www.diagram.com.ua
Русский: Русская версия English: English version
Translate it!
Поиск по сайту

+ Поиск по журналам
+ Поиск по статьям сайта
+ Поиск по схемам СССР
+ Поиск по Библиотеке

Бесплатная техническая библиотека:
Все статьи А-Я
Энциклопедия радиоэлектроники и электротехники
Новости науки и техники
Журналы, книги, сборники
Архив статей и поиск
Схемы, сервис-мануалы
Электронные справочники
Инструкции по эксплуатации
Голосования
Ваши истории из жизни
На досуге
Случайные статьи
Отзывы о сайте

Справочник:
Большая энциклопедия для детей и взрослых
Биографии великих ученых
Важнейшие научные открытия
Детская научная лаборатория
Должностные инструкции
Домашняя мастерская
Жизнь замечательных физиков
Заводские технологии на дому
Загадки, ребусы, вопросы с подвохом
Инструменты и механизмы для сельского хозяйства
Искусство аудио
Искусство видео
История техники, технологии, предметов вокруг нас
И тут появился изобретатель (ТРИЗ)
Конспекты лекций, шпаргалки
Крылатые слова, фразеологизмы
Личный транспорт: наземный, водный, воздушный
Любителям путешествовать - советы туристу
Моделирование
Нормативная документация по охране труда
Опыты по физике
Опыты по химии
Основы безопасной жизнедеятельности (ОБЖД)
Основы первой медицинской помощи (ОПМП)
Охрана труда
Радиоэлектроника и электротехника
Строителю, домашнему мастеру
Типовые инструкции по охране труда (ТОИ)
Чудеса природы
Шпионские штучки
Электрик в доме
Эффектные фокусы и их разгадки

Техническая документация:
Схемы и сервис-мануалы
Книги, журналы, сборники
Справочники
Параметры радиодеталей
Прошивки
Инструкции по эксплуатации
Энциклопедия радиоэлектроники и электротехники

Бесплатный архив статей
(200000 статей в Архиве)

Алфавитный указатель статей в книгах и журналах

Бонусы:
Ваши истории
Загадки для взрослых и детей
Знаете ли Вы, что...
Зрительные иллюзии
Веселые задачки
Каталог Вивасан
Палиндромы
Сборка кубика Рубика
Форумы
Карта сайта

ДИАГРАММА
© 2000-2020

Дизайн и поддержка:
Александр Кузнецов

Техническое обеспечение:
Михаил Булах

Программирование:
Данил Мончукин

Маркетинг:
Татьяна Анастасьева

Перевод:
Наталья Кузнецова

Контакты

При использовании материалов сайта обязательна ссылка на https://www.diagram.com.ua

сделано в Украине
сделано в Украине

Диаграмма. Бесплатная техническая библиотека

Бесплатная техническая библиотека Бесплатная техническая библиотека, Энциклопедия радиоэлектроники и электротехники

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

Бесплатная техническая библиотека

Энциклопедия радиоэлектроники и электротехники / Аппаратура радиоуправления

Комментарии к статье Комментарии к статье

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

Простой робот. Принципиальная схема робота
(нажмите для увеличения)

Сердцем робота является микроконтроллер фирмы 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 <stdlib.h>

#include <delay.h>

// назначение определений для удобства работы с периферией

#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++) delay_ms(10);}

// таблица вероятностей для выбора направления движения

// исходя из текущего направления движения

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;

case 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);

}

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();

}

Публикация: cxem.net

Смотрите другие статьи раздела Аппаратура радиоуправления.

Читайте и пишите полезные комментарии к этой статье.

<< Назад

Рекомендуем скачать в нашей Бесплатной технической библиотеке:

раздел сайта Жизнь замечательных физиков

журналы Силовые машины (годовые архивы)

книга Цифровые регистраторы аварийных событий энергосистем. Пуляев В.И., Усачев Ю.В., 1999

книга Устранение неисправностей в телевизоре. Ельяшкевич С.А., 1957

статья Как возникли тюрьмы?

статья Тиристорные переключатели серий КР1125КП2 и КР1125КПЗ

справочник Сервисные меню зарубежных телевизоров. Книга №19

Оставьте свой комментарий к этой статье:

Имя:


E-mail (не обязательно):


Комментарий:

[lol][cry][!][?]




Бесплатная техническая библиотека Бесплатная техническая документация для любителей и профессионалов