Для управління роботом можна використовувати радіосигнали, застосувавши, скажімо, результати дослідів, проведених раніше Можна використовувати приймач і передавач від радіокерованої моделі Але, якщо ви в експериментах використовуєте конструктор 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 Маленькі символи (ad) дозволяють розрізнити одноразове, повторне та безперервне натиснення на кнопки пульта управління

Якщо команди управління закладені в готову конструкцію, то прийом команд здійснюється програмно Щоб робот «побачив» і «зрозумів» команди, його слід запрограмувати Проте до того як робот буде виконувати команди, слід перевірити, чи правильно він їх «розуміє»

Ось програма прийому і відображення команд:

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 = 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     // 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 (& PORTC, 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 = 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 ==> Цифровий Введення / Висновок 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 (& PORTC, 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 слід шукати в папці проекту

Зміна я вношу в рядок:

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

Розбивши її на два рядки:

unsigned char _key

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

В іншому випадку компілятор повідомляє про помилку Ще у три рядки тексту слід внести зміни:

Lcd_Init (& PORTD) / / Ініціалізувати РКІ, приєднаний до порту 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