Модифікація ручного управління роботом
Ви памятаєте, що один з перших дослідів з роботом – це використання датчика відстані для управління рухом робота Чому б не спробувати поєднати програму ручного управління і програму руху з подолання перешкод Єдине, що може перешкодити – обмеження на використання памяті в середовищі 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 = 0 i <8; i + +) / / Цикл на 8 кроків для збереження даних від ПДУ ER-4
{
Delay_us (833) / / Затримка на час 1 біта (швидкість 1200 бод) ir_cmd = ir_cmd >> 1 / / Зрушення на 1 біт вправо
if ((PORTB & 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
Сподобалася стаття? Натисни "+1"! :
Ще статті:
- Автоматичний зарядний пристрій для Ni-Cd-акумуляторів (0)
- Оформимо! JBL Speakershop (0)
- Універсальний велосипедний шляховий прилад на PIC контролері (0)
- Як зробити простий програматор для PIC-ів і AVR-ів (0)
- Читання інформації з LPT порту (0)
- Модернізація материнської плати (додавання коефіцієнтів множення) (0)
- Мікропроцесорний блок управління пральною машиною (0)
Ваш відгук