У наступних експериментах ці датчики використовуються для руху робота по заданій лінії Але спочатку слід провести оцінку роботи датчиків Ось програма, яка пропонується до проведення цього експерименту:

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

/ ************ Читання датчика відстеження ліній ************** /

/ ************************************************* ******* / int Sensor0, Sensor1 / / Зберігає Аналогове значення

char Txt [6] / / Зберігає результат перетворення в Рядок

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

void Read_Adc()

{

ADCON0 = 0b11000001 / / Вибір Analog0 RC_Mode і ADON ADCON0GO = 1 / / Запуск перетворення

while (ADCON0GO) / / Чекаємо, доки перетворення завершиться Sensor0 = (ADRESH * 4) + (ADRESL/64) / / 10 біт Даних ==> sensor0 ADCON0 = 0b11000101 / / Вибір Analog1 RC_Mode і ADON ADCON0GO = 1 / / Запуск перетворення

while (ADCON0GO) / / Чекаємо, доки перетворення завершиться Sensor1 = (ADRESH * 4) + (ADRESL/64) / / 10 біт Даних ==> sensor1

}

void main()

{

Delay_ms (1000) / / Початкове очікування Lcd_Init () / / Ініціалізація РКІ

ANSEL = 0xFF // PORTA ==> Analog

TRISA = 0xFF / / PORTA ==> input Lcd_Cmd (_LCD_CURSOR_OFF) / / Курсор РКІ вимкнений while (1)

{

Read_Adc()

WordToStr (Sensor0, Txt) / / Перетворення значення Sensor0 в рядок Lcd_Out (1,1, Txt) / / І відображення її на екрані РКІ WordToStr (Sensor1, Txt) / / Перетворення значення Sensor1 в рядок Lcd_Out (2,1, Txt) / / І відображення її на екрані РКІ

}

}

Як і описано в керівництві, після завантаження програми робота слід встановити на чорну лінію доданого до конструктора паперового роботодрома, прочитати показання РКІ, потім перемістити його на білу поверхню, щоб ще раз рахувати показання індикатора

Тут слід зазначити, що в тому випадку, коли при монтажі датчиків вони опиняються на різній відстані від поверхні, різниця в показаннях, чорного і білого, лівого і правого датчиків буде дуже істотна Використовуючи шайби, слід підігнати відстань від підлоги до датчика, за показаннями РКІ Крім того, при русі робота його ніс часом задирається, трохи переважує задня частина через двигуни, тому краще утяжелить носову частину робота І ще, роботодром на папері після того, як його склали при укладанні конструктора, сильно замято Складки теж заважають роботі робота: при оцінці значення світлого і чорного ділянки свідчення можуть мінятися на ділянці складки від значення 900 до 400 Папір слід розгладити до початку дослідів, але в цьому я не порадник – як погладити сорочку або штани, знаю, а як розгладжувати папір, на жаль

Отримані за допомогою першої програми значення: на чорному 270 і на білому 970, – як і описано в керівництві, можна усереднити, визначивши порогове значення У моєму випадку це 620 Саме це значення буде використовуватися в програмі наступного експерименту

Перед завантаженням цієї програми робот краще встановити на підставку, оскільки відразу після завантаження він починає рухатися А можна використовувати, як це робилося раніше, кнопку для включення моторів

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

/ ***** Рух вперед уздовж чорної лінії при виявленні заходу

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

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

#include “motorh”

int Sensor0, Sensor1 / / Зберігаються Аналогові значення

char Txt [6] / / Зберігаються значення, перетворені в рядки

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

void Read_Adc()

{

ADCON0 = 0b11000001 / / Вибрати Analog0 RC_Mode і ADON ADCON0GO = 1 / / Запустити перетворення

while (ADCON0GO) / / Чекаємо, доки перетворення закінчиться Sensor0 = (ADRESH * 4) + (ADRESL/64) / / 10 біт Даних ==> sensor0 ADCON0 = 0b11000101 / / Вибрати Analog1 RC_Mode і ADON ADCON0GO = 1 / / Запустити перетворення

while (ADCON0GO) / / Чекаємо, доки перетворення закінчиться Sensor1 = (ADRESH * 4) + (ADRESL/64) / / 10 біт Даних ==> sensor1

}

void main()

{

Delay_ms (1000) / / Початкове очікування Lcd_Init () / / Ініціалізувати РКІ ANSEL = 0xFF / / PORTA ==> Аналоговий TRISA = 0xFF / / PORTA ==> вхід

Lcd_Cmd (_LCD_CURSOR_OFF) / / Погасити курсор РКІ while (1)

{

Read_Adc()

WordToStr (Sensor0, Txt) / / Перетворити Sensor0 в рядок Lcd_Out (1,1, Txt) / / І відобразити на РКІ WordToStr (Sensor1, Txt) / / Перетворити Sensor1 в рядок Lcd_Out (2,1, Txt) / / І відобразити на РКІ

if ((Sensor0> 620) & (Sensor1> 620)) / / Якщо обидва датчика над білим Forward (255) / / Рухатися ВПЕРЕД

if ((Sensor0 <620) & (Sensor1 <620)) / / Якщо обидва датчика над чорним

{

Forward (255) / / Вперед 03 секунди Delay_ms (300)

}

if (Sensor0 <620) / / Тільки Sensor0 виявив лінію

{

S_Left (255) / / Поворот Наліво

}

if (Sensor1 <620) / / Тільки Sensor1 виявив лінію

{

S_Right (255) / / Поворот Направо

}

}

}

Датчики можуть виявитися включені навпаки, і робот буде повертати не в належну сторону Можна або виправити підключення, помінявши місцями розєми, або внести зміни в програму

Випробувати рух по заданій лінії можна на прямої лінії, проведеної вздовж роботодрома

Перевіривши правильність включення датчиків, можна спробувати починати рух робота ні з установки на лінію прямо і правильно, а під деяким кутом до прямої лінії У чому сенс цих експериментів

Ось як у керівництві до конструктора описана робота датчиків:

Рис 424 На першому малюнку обидва датчика над білою поверхнею, на другому над чорною Для прямолінійного руху роботові не потрібно робити поворотів

Рис 425 Лівий датчик над чорною поверхнею на першому малюнку, на другому навпаки

У першому випадку робот повинен повернути ліворуч, у другому повернути праворуч Запускаючи робота під різними кутами, можна поекспериментувати з рядками:

S_Left (255) / / Поворот Наліво S_Right (255) / / Поворот Направо

Міняючи параметр 255, можна перевірити кут повороту Зміни можуть залежати від різних причин, зокрема від заходів розряду акумуляторів (або батарейок) Зробити поворот різкіше, більш крутим, можна, додавши паузи після команд повороту

S_Left (255) / / Поворот Наліво Delay_ms (300)

Після експериментів на прямій, мені захотілося «проїхати» по «змійці» роботодрома Міняючи програму, скажімо, так:

if (Sensor1 <400) / / Тільки Sensor1 виявив лінію

{

Motor_Stop()

S_Right (255) / / Поворот Направо Delay_ms (100)

Backward(250) Delay_ms(100)

}

Міняючи швидкість і часи, я домігся тільки того, що батарейки розрядилися, а робот так в поворот, може бути, занадто крутий, і не вписався

Рис 426 Робот на роботодроме

У мене терпіння не вистачило, але, сподіваюся, у вас вистачить У будь-якому випадку ви отримаєте багато задоволення, експериментуючи з цією «змійкою»

Одна з можливих причин невдачі, я цього не виключаю, занадто примітивна система датчиків Ось, як описується в керівництві до конструктора, система датчиків, що дозволяє реалізувати складніші рухи робота

Рис 427 Більш складна система датчиків для робота

Невдача з дослідами руху по «змійці» змусила мене подумати, а не знайти чи підходящу чорну стрічку, яку можна розкласти по кімнаті, і зробити майданчики для зупинки в кінці шляху Можна «поправити» програму так, щоб робот, доїхавши до майданчика, кілька секунд

«Подумав», а потім робив би повний розворот і їхав у зворотному напрямку Потрібно спробувати Але потім

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012