Сигналы управления роботом – для новичков в радиоделе

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

Для управления роботом можно использовать радиосигналы, применив, скажем, результаты опытов, проводимых ранее Можно использовать приёмник и передатчик от радиоуправляемой модели Но, если вы в экспериментах используете конструктор IE-ROBOPICA, то без сомнений следует воспользоваться его пультом управления

На шасси робота установлен модуль приёма ИК-команд

Рис 431 Модуль приёма команд

Сам приёмник не просто фотодиод или фототранзистор – это микросхема, обрабатывающая сигнал с частотой 38 кГц, и воспроизводящая команды (сигналы), модулированные этой частотой Ранее я использовал аналогичную микросхему TSOP1736 Очень удобно

Эти микросхемы выпускаются для работы с разными частотами несущей Не то, что микросхема TSOP1736 при частоте излучающего светодиода 38 кГц не будет работать, но максимальная чувствительность на этой частоте будет у TSOP1738

Рис 432 Микросхема TSOP

В набор ROBOPICA входит и пульт управления

Рис 433 Пульт управления конструктора IE-ROBOPICA

Существуют разные стандарты ИК-команд Если вы хотите использовать программу Flowcode, то можете использовать стандарт RC5

Рис 434 Использование ИК-команд в среде Flowcode

Макрос   компонента   имеет   достаточное   количество   команд,   чтобы   ускорить   разработку собственного пульта управления или собственного приёмника

Рис 435 Макрос компонента RC5

Пульт управления ROBOPICA использует для генерации управляющих команд протокол RS232 Вот, что написано в руководстве:

(Пульт)Передает последовательность данных, используя стандарт RS-232 при скорости передачи 1200 бод и формате данных 8N1 (8 бит данных, без четности, 1 стоповый бит)

Перед тем, как приступить к экспериментам по ручному управлению роботом, посмотрим, как выглядят управляющие сигналы на выходе приёмника ZX-IRM Я использую для этого программу передачи микроконтроллером символа «А» (латинского) через модуль USART Программу я соберу в Flowcode, а сигнал просмотрю в программе ISIS (Proteus) Как и на выходе модуля ZX-IRM в отсутствии несущей частоты, на выходе модуля USART без сигнала должна быть единица

Рис 436 Вид инвертированного сигнала USART при передаче символа «А»

Чтобы скорость передачи была 1200, при создании программы в Flowcode следует использовать расширенные свойства программного модуля RS232, именно там задаётся скорость передачи

Вернёмся к руководству ROBOPICA Пульт дистанционного управления – это законченная конструкция Символы, отправляемые с пульта, это большие и маленькие буквы от A до D Маленькие символы (a-d) позволяют различить однократное, повторное и непрерывное нажатие на кнопки пульта управления

Если команды управления заложены в готовую конструкцию, то приём команд осуществляется программно Чтобы робот «увидел» и «понял» команды, его следует запрограммировать Однако до того как робот будет выполнять команды, следует проверить, правильно ли он их «понимает»

Вот программа приёма и отображения команд:

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 —————–// 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     // Save Remote Key Press ANSELHF4=0           // RB0 ==> Digital IO

OPTION_REGINTEDG = 0 // INT falling edge INTCONINTE =1        // Enable INT/PB0

INTCONGIE =1         // Enable Global interrupt

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

Lcd_Out(1, 1, text)   // Вывести текст на ЖКИ,2-я строка,1-1 столбец Sound_Init(&ampPORTC,0)

while(1)               // Infinite loop

{

key = get_remote()    // Принять символ от ПДУ if(key==’a’ || key==’A’) // Нажата кнопка A

{

Lcd_Out(2, 1, “Button A Press “) // Вывести сообщение Sound_Play(100,500)

}

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

{

Lcd_Out(2, 1, “Button B Press “) // Вывести сообщение Sound_Play(110,500)

}

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

{

Lcd_Out(2, 1, “Button C Press “) // Вывести сообщение Sound_Play(120,500)

}

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

{

Lcd_Out(2, 1, “Button D Press “) // Вывести сообщение Sound_Play(130,500)

}

}

}

Потребовалась небольшая правка текста, скопированного из руководства, для работы с программой MicroC PRO: настройка порта D для работы с ЖКИ, небольшая правка команд ЖКИ и разделение определения переменной _key и присваивание ей прочитанной команды Если вы не следили за вносимыми ранее изменениями, будет полезно сейчас сравнить тексты программ Это даст вам некоторое представление о том, как сделать правки готового текста программы, если вы используете другой компилятор языка Си или другую среду разработки

Работу программы можно наблюдать на ЖКИ:

Рис 437 Проверка работы пульта управления

Для  приёма  команд  в  программе  используется  прерывание  В  данном  случае  оно  наиболее подходящий вариант дешифровки команд, но к причинам этого мы вернёмся чуть позже, а сейчас

посмотрим, как выглядят команды на выходе ИК-приёмника «в живом виде», то есть, на экране осциллографа

Рис 438 Вид принимаемых сигналов на экране осциллографа

Первое, что  я отмечаю, это  разный вид сигнала, полученный в программе ISIS и с помощью осциллографа Какой сигнал правильный

Давайте, разбираться Символ «А» (латинский) имеет шестнадцатеричный код 0x41 Двоичное представление кода: 1000001 Длительность импульсов при скорости передачи 1200 несколько меньше 1 миллисекунды Если пульт дистанционного управления передаёт логическую единицу отсутствием несущей частоты, а логический ноль формированием несущей частоты, то, с учётом служебных символов, я готов согласиться, что пульт транслирует символ «А» А что транслирует Proteus

Да, то же самое Непрерывная передача символов, использованная мною в первом эксперименте с ISIS, может запутать вас При непрерывной передаче символа служебные импульсы перепутываются с информационными импульсами

Добавим в программу паузу между отправкой символов и получим новый вид одиночного сигнала, предающего символ «А»:

Рис 439 Ещё одни вид сигнала в программе ISIS

Чем примечателен этот опыт Во-первых, тем, что можно доверять программам симуляции, если не делать ошибок Во-вторых, чтобы этих ошибок не делать, следует проверять работу схемы на макетной плате – чем больше опыт таких проверок, тем легче понять, где могут появиться ошибки

И, наконец, при трансляции кода вы можете выбрать, как передавать логические уровни единицы и нуля, передавать ли единицу с помощью несущей частоты или передавать так ноль

И вновь вернёмся к руководству, которое предлагает полную программу управления роботом с помощью пульта дистанционного управления:

#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 —————–

//

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 ==> Цифровой Ввод/Вывод 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-й столбец Sound_Init(&ampPORTC,0)

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 Forward(255)Delay_ms(50)

}

}

}

}

Создав новый проект в программе MicroC PRO, добавив файл motorh в папку, где находится проект, вносим корректирующие изменения в программу, скопированную из руководства

Обратите внимание на запись #include “motorh” В руководстве это выглядит несколько иначе: #include <motorh>. Обе записи верны, но первая означает, что файл motorh следует искать в папке проекта

Изменение я вношу в строку:

unsigned char _key=ir_cmd // Записать символ в буфер

Разбив её на две строки:

unsigned char _key

_key=ir_cmd // Записать символ в буфер

В противном случае компилятор сообщает об ошибке Ещё в три строки текста следует внести изменения:

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

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

В приведённом выше тексте они выглядят так:

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

Это  небольшие  изменения,  связанные  со  сменой  библиотеки  в  версиях  MicroC  Из-за  этих изменений я добавил и такой фрагмент:

// 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

Я надеюсь, вы уже отметили эти изменения И ещё один пример того, что нужно быть внимательным при копировании готового текста программы:

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

Казалось бы, в чём проблема Эту строку я скопировал из руководства, как она была в тексте программы Но вот, что мне на это сказал компилятор Си при попытке транслировать файл в hex формат

Рис 4310 Сообщение об ошибке в программе MicroC PRO

Что же не понравилось компилятору Я не заметил бы этого сам, мог бы долго ломать голову над ошибками, которых появилось много, если бы не посмотрел внимательно на текст в руководстве Вот снимок экрана, где ошибка видна очень хорошо:

Рис 4311 Фрагмент текста в руководстве к ROBOPICA

При переносе текста после прямого копирования в редактор MicroC PRO эта деталь выглядит менее очевидной Но достаточно одного пробела между косыми обратными чёрточками, чтобы поставить в тупик компилятор К чему я это

Многие радиолюбители предпочитают пользоваться готовыми схемами, готовыми программами Следует в этих случаях быть очень внимательными, и обязательно нужно хорошо разбираться в том, что делает схема или о чём говорит текст кода Достаточно лишнего пробела в тексте программы, достаточно пропустить точку с запятой или вместо неё поставить двоеточие, что в спешке сделать легко, чтобы появился длинный шлейф ошибок при трансляции текста Если такое случается, то нужно тщательно проверить весь текста программы, начиная с того места, где появилась первая ошибка Очень часто её исправление устраняет все прочие сообщения об ошибках Самый неприятный случай, когда ошибка в конце текста и относится ко всей программе Её обнаружить бывает труднее всего Будьте бдительны

Возвращаясь к роботу, остаётся загрузить оттранслированную программу и проверить, как робот подчиняется командам

Рис 4312 Управляемый с пульта робот на «роботодроме»

Признаться, я собирался «погонять» робота по «роботодрому», чтобы попытаться ещё раз собрать сведения о необходимых движениях робота в попытке научить его самостоятельно проходить

«змейку» Но, не последовав совету руководства, где советуют использовать аккумуляторы, я зарядил батарейки, которые к настоящему времени почти разрядились Придётся дальнейшие эксперименты отложить до следующих глав книги Однако добавлю ещё одно замечание – хотя моторы работают хуже, чем в самом начале, вся электроника робота работает исправно Причина этого в том, что электроника питается через преобразователь, превращающий напряжение от 15 В до 6 В в напряжение 5 В Как говорится, пустячок, а приятно

В этой главе мы познакомились с ещё одним применением пары фотоприёмник и светодиод Теперь для передачи данных на расстояние в несколько метров Конечно, знакомство было довольно поверхностным, но некоторое представление о процессе общения робота с пультом дистанционного управления вы, надеюсь, получили

В этой главе мы увидели, как выглядят сигналы на выводе трансляции символов модуля USART, который часто входит в состав микроконтроллеров

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

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

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

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