Модификация ручного управления роботом

July 6, 2014 by admin Комментировать »

Вы помните, что один из первых опытов с роботом – это использование датчика расстояния для управления движением робота Отчего бы не попробовать соединить программу  ручного управления и программу движения по преодолению препятствий Единственное, что может помешать – ограничение на использование памяти в среде MicroC Но без проверки этого мы не определим, возникает ли это ограничение или нет Возьмём программу из предыдущей главы, соединив движение вперёд с программой преодоления препятствий

#include “motorh”

char *text = “ER-4 Remote” // Определить сообщение

unsigned char ir_cmd=0 // Получит значение нажатой кнопки для ПДУ ER-4

// Lcd задание выводов sbit LCD_RS at RD2_bit sbit LCD_EN at RD3_bit sbit LCD_D7 at RD7_bit sbit LCD_D6 at RD6_bit sbit LCD_D5 at RD5_bit sbit LCD_D4 at RD4_bit

// Направление выводов

sbit LCD_RS_Direction at TRISD2_bit sbit LCD_EN_Direction at TRISD3_bit sbit LCD_D7_Direction at TRISD7_bit sbit LCD_D6_Direction at TRISD6_bit sbit LCD_D5_Direction at TRISD5_bit sbit LCD_D4_Direction at TRISD4_bit

int Adc // Хранит Аналоговые Данные char Txt[6] // Хранит Строку

void Read_Adc()

{

ADCON0=0b11001001 // Выбор Analog2 RC_Mode и ADON ADCON0GO=1 // Запуск преобразования

while(ADCON0GO) // Ожидаем, пока преобразование завершится Adc=(ADRESH*4)+(ADRESL/64) // 10 бит Данных ==> Adc

}

//—————— Сервисная подпрограмма прерывания INT —————–

//

void interrupt()

{

unsigned char i // Хранит значение счетчика

if(INTCONINTF) // Проверяет значение флага прерывания RB0 (спад импульса)

{

Delay_us(416) // Задержка на время 1/2 или 1 бита(скорость 1200 бод) for(i=0i<8i++) // Цикл на 8 шагов для сохранения данных от ПДУ ER-4

{

Delay_us(833) // Задержка на время 1 бита(скорость 1200 бод) ir_cmd = ir_cmd>>1 // Сдвиг на 1 бит вправо

if((PORTB &amp 0x01)==1) // Выполнить логическое И RB0 = ‘1’ ir_cmd = ir_cmd | 0x80 // Вставить бит, если ‘1’

}

Delay_us(833) // Задержка на время 1 бита(скорость 1200 бод) INTCONINTF =0 // Очистка флага прерывания

}

}

//—————— Функция получения символа от ПДУ ——————// unsigned char get_remote()

{

unsigned char _key

_key=ir_cmd // Записать символ в буфер ir_cmd=0 // Стереть старые данные return(_key) // Вернуть символ от ПДУ

}

//—————— Основная Программа ———————————-//

void main()

{

unsigned char key // Хранит значение нажатой кнопки ПДУ ANSELHF4=0 // RB0 ==> Цифровой Ввод/Вывод

ANSEL=0xFF TRISA=0xFF

OPTION_REGINTEDG = 0 // Полярность сигнала прерывания INTCONINTE =1 // Разрешить INT/PB0

INTCONGIE =1 // Разрешить глобальные прерывания

Lcd_Init() // Инициализировать ЖКИ, присоединенный к порту PORTD Lcd_Cmd(_Lcd_CLEAR) // Очистить дисплей

Lcd_Cmd(_Lcd_CURSOR_OFF) // Запретить курсор ЖКИ

Lcd_Out(1, 1, text) // Вывести текст на ЖКИ, 2-я строка, 1-й столбец while(1) // Бесконечный цикл

{

if (ir_cmd==0)

{

Motor_Stop()

}

else

{

key = get_remote() // Прочитать данные с датчика ДУ if(key==’a’ || key==’A’) // Нажата кнопка A

{

Lcd_Out(2, 1, “Button A Press “) // Показать сообщение

// Нажата кнопка A Backward(255)Delay_ms(50)

}

else if(key==’b’ || key==’B’) // Нажата кнопка B

{

Lcd_Out(2, 1, “Button B Press “) // Показать сообщение

// Нажата кнопка B

S_Right(255)Delay_ms(50)

}

else if(key==’c’ || key==’C’) // Нажата кнопка C

{

Lcd_Out(2, 1, “Button C Press “) // Показать сообщение

// Нажата кнопка C S_Left(255)Delay_ms(50)

}

else if(key==’d’ || key==’D’) // Нажата кнопка D

{

Lcd_Out(2, 1, “Button D Press “) // Показать сообщение

// Нажата кнопка D

/**********************************************************/

/***** Робот с Обнаружителем Объектов ***************************/

/**********************************************************/ while(key==’d’ || key==’D’)

{

key = get_remote() // Прочитать данные с датчика ДУ Read_Adc() // Чтение сигнала с Analog2 WordToStr(Adc,Txt) // Преобразование Данных в Строку Lcd_Out(1,1,Txt) // Отображение на ЖКИ

if (Adc>200) // Если обнаружен объект в допустимом диапазоне расстояний

{

Backward(255)Delay_ms(500) // Движение Назад и поворот Влево S_left(255)Delay_ms(400)

}

else

{

Forward(255) Delay_ms(50) // Объект вне диапазона ВПЕРЕД

}

}

}

}

}

}

Теперь  по  команде  «Вперёд»  с  пульта  управления  робот  едет  вперёд  (батарейки  я  так  и  не поменял), а встречая препятствие, старается его объехать

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

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

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты