Загрузил dpyr-95

Laboratornaya rabota 2 Sborka i nastroyka shestinogogo robota 1

реклама
Лабораторная работа № 2
Сборка и настройка шестиногого робота
Цель работы: Изучить контроллер Arduino Uno, принципов соединения
электрических компонентов шестиного робота на основе данного контроллера
и приемов работы с контроллером.
Теоретическая часть
Управление изучаемого шестиного робота осуществляется устройством
Arduino Uno. Оно представляет из себя простую, бюджетную и распространенная плату, в основе которой лежит чип ATmega328 с тактовой частотой в 16
МГц, 32 Кб флеш-памяти, 2 Кб ОЗУ и 1 Кб EEPROM. В Uno 14 цифровых
входов/выходов, которые могут использоваться для управления сенсорами и
сервоприводами и другими устройствами.
Аналоговый
In/Out
Цифровой
IO/PWM
EEPROM
[KB]
SRAM, [KB]
Flash, [KB]
USB
UART
14/6
1
2
32
Regular
1
84 Mhz 12/2
54/12
–
96
512 2 Micro
4
Tmega32u4
5V/7-12V 16 Mhz 12/0
20/7
1
2.5
32
Micro
1
Mega 2560 Tmega2560
5V/7-12V 16 Mhz 16/0
54/15
4
8
256 Regular
4
Micro
Tmega32u4
5V/7-12V 16 Mhz 12/0
20/7
1
2.5
32
Micro
1
Mini
Tmega328
5V/7-9V 16 Mhz
8/0
14/6
1
2
32
–
–
Nano
Tmega168
Tmega328
5V/7-9V 16 Mhz
8/0
14/6
0.512
1
1
2
16
32
Mini-B
1
Ethernet
Tmega328
5V/7-12V 16 Mhz
6/0
14/4
1
2
32
Regular
–
Esplora
Tmega32u4
5V/7-12V 16 Mhz
5V/
16 Mhz
2.5-12V
–
–
1
2.5
32
Micro
–
6/0
14/6
1
2
32
–
1
8/0
14/6
1
2
32
Mini
1
Uno
Tmega328
Due
T91SAM3X8
E
Leonardo
ArduinoBT Tmega328
Fio
Tmega328P
Напряжение
рабочее/
входное
6/0
Процессор
5V/7-12V 16 Mhz
Название
Тактовая частота процессора
Таблица 1 – Характеристики плат семейства Arduino
3.3V/
7-12V
3.3V/
3.7-7V
8 Mhz
1
Pro Mini
Tmega168
3.3V/
8 Mhz
3.35-12V
16Mhz
5V/5-12V
6/0
14/6
0.512
1
16
–
1
LilyPad
Tmega168V
Tmega328V
2.7-5.5V/
2.7-5.5V
8 Mhz
6/0
14/6
0.512
1
16
–
–
Gemma
ATtiny85
3.3V/
4-16V
8 Mhz
1/0
3/2
0.5
0.5
8
Micro
0
Yùn
ATmega32U4
AR9331 Linux
5V
16 Mhz,
12/0
400 Mhz
20/7
1
2.5
32
Micro
16MB 64MB
1
Zero
ATSAMD21G
18
3.3V/
7-12V
48 Mhz
14/10
–
6/1
32
256 2 Micro
2
Рабочее напряжение – это напряжение, на котором работает большинство элементов контроллера, это уровень логической единицы входов и выходов устройства. Входное напряжение – это напряжение, которое нужно подать
на вход контроллера для его нормальной работы. Если входное напряжение не
соответствует номиналу, то контроллер выйдет из строя.
Исторически сложилось, что тактовая частота процессора представляет
собой главный показатель быстродействия устройства. Сегодня разработчики
стараются уйти в сторону создания более совершенной архитектуры, увеличения количества кэш-памяти и количества процессорных ядер, но тактовая частота все равно является важной характеристикой. В общем смысле, это то количество элементарных операций (тактов), которое процессор может произвести за секунду времени. Поэтому чем выше тактовая частота процессора, тем
больше элементарных операций способен выполнить компьютер, и, следовательно, тем быстрее он работает.
Современные микроконтроллеры обычно имеют линии ввода-вывода
общего назначения, которые становятся либо дискретными входами или выходами, либо аналоговыми, в зависимости от программной конфигурации
устройства. Дискретный – это прерывистый сигнал (рис. 1). То есть сигнал,
который имеет какое-то фиксированное число значений. Аналоговый же сигнал – это непрерывный сигнал. То есть сигнал, значение которого изменяется
плавно.
2
Рисунок 1 – Аналоговый и дискретный сигналы
Если провести аналогию с лампочкой, то можно сказать так: при подаче
дискретного двоичного сигнала на вход лампочка либо гаснет, либо зажигается, а при подаче и изменении аналогового сигнала на вход лампочка плавно
меняет свою яркость свечения.
Микроконтроллер может работать только с электрическими сигналами в
двоичной форме. Поэтому, чтобы измерить с помощью микроконтроллера,
например, температуру, сначала требуется преобразовать её в электрический
сигнал. Например, в напряжение. А потом ещё значение этого напряжения
надо как-то преобразовать в двоичное число. Для этого предназначены АЦП –
аналого-цифровые преобразователи. Аналоговый вход микроконтроллера –
это вход, на который можно подавать аналоговый сигнал. То есть определённый вывод на корпусе микроконтроллера, к которому можно подключить датчик, на выходе которого имеется аналоговый сигнал. Любой контроллер характеризуется количеством аналоговых и цифровых сигналов, которые он может получить извне (обозначается «In») и сформировать на выходе («Out»).
Канал, обозначенный «IO» (сокращение от Input/Output) может использоваться и как вход и как выход.
Некоторые цифровые выходы могут работать в режиме PWM (PulseWidth Modulation) – Широтно-Импульсной Модуляции. ШИМ – это операция
получения изменяющегося аналогового значения посредством цифровых
3
устройств. Устройства используются для получения прямоугольных импульсов - сигнала, который постоянно переключается между максимальным и минимальным значениями. Данный сигнал моделирует напряжение между максимальным значением (5 В) и минимальным (0 В), изменяя при этом длительность времени включения 5 В относительно времени выключения 0 В.
Чтобы понять, как это работает, давайте представим, что у вас есть лампочка накаливания на 5В и кнопка с батарейкой на 5В, все это подключено и
нажимая на кнопку вы включаете лампочку. Нажав на кнопку, вы подали на
лампочку 5В, и лампочка ярко загорелась, затем отпустили и она погасла.
Представьте, что вы нажали на кнопку очень быстро и отпустили её, пока лампочка еще не успела полностью разгореться. Потом снова нажали на кнопку
пока лампочка еще не до конца потухла. И так далее. Таким образом ШИМ
всегда подает максимальное напряжение, но благодаря тому как долго ШИМ
держит «нажатой» кнопку, «отпускает», ждет и потом снова «нажимает»
кнопку, рождается сигнал, называемый PWM.
Рисунок 2 – Широтно-импульсная модуляция ШИМ (PWM)
4
Длительность включения максимального значения называется шириной
импульса. Для получения различных аналоговых величин изменяется ширина
импульса. На рисунке 2 зеленые линии отмечают постоянные временные периоды. Длительность периода обратно пропорциональна частоте ШИМ. Т.е.
если частота ШИМ составляет 500 Гц, то зеленые линии будут отмечать интервалы длительностью в 2 миллисекунды каждый. Если процент заполнения
рабочего цикла (ширина импульса) равен 25%, то среднее напряжение на выходе будет 1,25 В, если 50% – то 2,5 В и так далее.
Важной характеристикой любого микроконтроллера является память.
Можно выделить три основных вида памяти:
– память программ, которая представляет собой постоянную память, предназначенную для хранения программного кода и констант. Эта память не изменяет своего содержимого в процессе выполнения программы;
– память данных, предназначенная для хранения переменных (результатов) в
ходе выполнения программы;
– регистровая память, состоящая из внутренних регистров микроконтроллера.
Рассмотрим особенности каждого из перечисленных видов памяти.
Память программ. Необходимость такой памяти вызвана тем, что микроконт-роллер не содержит таких устройств памяти, как винчестер в компьютере, с которого загружается исполняемая программа. Поэтому код программы
должен постоянно храниться в микроконтроллере. Все типы памяти программ
относятся к энергонезависимой памяти, или постоянной памяти (ПЗУ), содержимое которой сохраняется после выключения питания микроконтроллера. В
процессе выполнения программа считывается из этой памяти, а блок управления (дешифратор команд) обеспечивает ее декодирование и выполнение необходимых операций. Содержимое памяти программ не может меняться (перепрограммироваться) во время выполнения программы. Поэтому функциональное назначение микроконтроллера не может измениться, пока содержимое его
5
памяти программ не будет стерто (если это возможно) и перепрограммировано
(заполнено новыми командами).
Существует несколько видов постоянной памяти, но в контроллерах
обычно используется 2 вида: EEPROM и Flash.
EEPROM (Electrically Erasable Programmable Read-Only Memory) – перепрограммируемая память с электрическим стиранием. Память такого типа может стираться и заполняться данными до миллиона раз. Предназначена она для
тех случаев, когда необходимо сохранить данные так, чтобы они восстановились после перезагрузки контроллера. Физически и логически эта память находится в отдельном адресном пространстве, а чтение из EEPROM и запись туда
осуществляется через специальные порты.
Память типа Flash – электрически программируемая и электрически стираемая память (FLASH ROM) может быть многократно стерта и перезаписана.
Отличается от EEPROM по структуре и способу работы с ней. Во Flash памяти
хранится программа, которую выполняет микроконтроллер.
Любой контроллер во время своей работы сохраняет некоторые данные
(переменные – любые, в основном, числовые значения, например, прочитанные со входа данные) во внутренней памяти. Внутренняя память является временным рабочим пространством, содержимое которого не сохраняется при
выключении питания. Существует несколько видов такой памяти, но в контроллерах обычно используется память SRAM (Static RAM, статическая память). После записи данных в ячейки статической памяти они могут сохранять
свое значение сколько угодно (в отличие от динамической памяти DRAM, используемой в компьютерах). SRAM имеет более высокое быстродействие, чем
динамическая оперативная память, и может работать на той же частоте, что и
современные процессоры. Время доступа SRAM не более 2 нс, это означает,
что такая память может работать синхронно с процессорами.
Обычно подключение плат Arduino к компьютеру производится по интерфейсу USB с различным видом разъёма (коннектора). Самое существенное
отличие разъемов – по размеру и форме.
6
Платы также отличаются наличием/отсутствием интерфейса UART –
универсального последовательного интерфейса. По структуре это обычный
асинхронный последовательный протокол, то есть передающая сторона по
очереди выдает в линию 0 и 1, а принимающая отслеживает их и запоминает.
Синхронизация идет по времени – приемник и передатчик заранее договариваются о том на какой частоте будет идти обмен. Если скорость передатчика и
приемника не будут совпадать, то передачи может не быть вообще, либо будут
считаны не те данные.
Практическая часть
Для передачи команд управления на робота используется инфракрасный
(ИК) передатчик, в качестве которого подойдет пульт от телевизора или сотовый телефон с ИК портом. Подавляющее большинство ИК-пультов работают
на несущих частотах 36 кГц, 38 кГц или 40 кГц (Panasonic, Sony). Исключение
составляют пульты Sharp (56 кГц), Bang & Olufsen (455 кГц) и, может, какието еще. Поэтому для приема сигналов на роботе используется ИК приемник на
38 кГц. Частота может точно не совпадать с несущей частотой сигнала. В таком случае чувствительность приемника может снижаться.
Программирование платы Arduino UNO производится в среде Arduino
IDE (arduino.cc) – это кросс-платформенная бесплатная среда разработки. Программу для Arduino принято называть скетчем.
Сначала необходимо научиться взаимодействовать с пультом дистанционного управления и узнать коды нажатий на некоторые его кнопки. Эти коды
потом пригодятся для скетча управления роботом.
Подключите ИК датчик к плате Arduino Uno как показано на рисунке 3
и зарисуйте схему подключения датчика в протокол выполнения лабораторной работы.
7
Рисунок 3 – Подключение ИК датчика к плате Arduino Uno
Подключите плату Arduino Uno кабелем USB к компьютеру с тыльной
стороны. Следом запустите на компьютере среду программирования Arduino
IDE (рис. 4). В ней в меню «Инструменты», подменю «Порт» выберите порт,
к которому подключился контроллер.
Для того, чтобы контроллер принимал сигналы и отображал их, в него
необходимо загрузить специальную программу. В ней используется
специальная
библиотека
IRremote.h, декодирующая сигналы самых разных ИК-пультов.
Эта библиотека – открытый проект, доступный в интернете. Она
подключается к скетчу с помощью
команды
"IRremote.h".
#include
Рисунок 4 – Среда программирования
Arduino IDE
8
Контроллер может отправлять данные на компьютер через уже подключенный USB кабель с помощью функции println объекта Serial. Для просмотра
результата этого вывода на компьютере в Arduino IDE нужно выбрать пункт
меню «Инструменты» → «Монитор порта» (Ctrl + Shift + M). Проверьте, чтобы
в открывшемся окне была установлена скорость передачи 9600 бод.
Рисунок 5 – Окно монитора порта
Теперь скопируйте в окно среды программирования Arduino IDE следующий код:
#include "IRremote.h"
const int IR_PIN = A0;
IRrecv irrecv(IR_PIN);
void setup() {
Serial.begin(9600);
Serial.println("ready");
irrecv.enableIRIn();
}
void loop() {
decode_results results;
if (irrecv.decode(&results)) {
Serial.println(results.value);
irrecv.resume();
}
}
Сохраните проект в папку «C:\Projects\Arduino».
9
Итак, питание контроллер получает по USB-кабелю, данные передает по
нему же. Загрузите скетч кнопкой «Загрузка», активируйте «Монитор порта»
и нажимайте кнопки пульта ДУ. В окне «Монитор порта» должны появляться
коды. Протоколы пультов отличаются, иногда это может быть один код, иногда несколько. В любом случае всегда можно выделить коды, уникальные для
каждой кнопки пульта.
Нам потребуется 13 кнопок пульта для следующих действий: 1 – плавный поворот налево; 2 – движение вперед; 3 – плавный поворот направо; 4 –
поворот налево на месте; 5 – стоп; 6 – поворот направо на месте; 7 – движение
назад с поворотом направо; 8 – движение назад; 9 – движение назад с поворотом налево; синяя кнопка – очень медленно; желтая – медленно; зеленая –
быстро; красная – очень быстро.
Вернитесь к среде программирования Arduino IDE, нажмите на стрелочку в правой верхней части окна и в выпавшем меню выберите «Новая
вкладка» (рис. 6). В появившейся строке для ввода имени файла напишите
«ir_command_codes.h».
Рисунок 6 – Создание новой вкладки
В появившуюся новую вкладку скопируйте следующий программный
код:
10
const long IR_COMMAND_FORWARD_CODES[] = { 123456, 2050, 2 };
const long IR_COMMAND_BACKWARD_CODES[] = { 123456, 2056, 8 };
const long IR_COMMAND_TURN_LEFT_CODES[] = { 123456, 2052, 4 };
const long IR_COMMAND_TURN_RIGHT_CODES[] = { 123456, 2054, 6 };
const long IR_COMMAND_FORWARD_LEFT_CODES[] = { 123456, 2049, 1
};
const long IR_COMMAND_FORWARD_RIGHT_CODES[] = { 123456, 2051, 3
};
const long IR_COMMAND_BACKWARD_LEFT_CODES[] = { 123456, 2057, 9
};
const long IR_COMMAND_BACKWARD_RIGHT_CODES[] = { 123456, 2055, 7
};
const long IR_COMMAND_STOP_CODES[] = { 123456, 2053, 5 };
const long IR_COMMAND_VERY_SLOW_CODES[] = { 123456, 2088, 40 };
const long IR_COMMAND_SLOW_CODES[] = { 123456, 2091, 43 };
const long IR_COMMAND_FAST_CODES[] = { 123456, 2074, 26 };
const long IR_COMMAND_VERY_FAST_CODES[] = { 123456, 2075, 27 };
В данном программном коде вместо числа «123456» вставьте коды соответствующих кнопок пульта управления, полученных с помощью монитора
порта и занесите эти данные в таблицу в протоколе выполнения лабораторной
работы (таблица 2).
Таблица 2 – Коды управления роботом
Команда
движение вперед
движение назад
поворот налево на месте
поворот направо на месте
плавный поворот налево
плавный поворот направо
движение назад с поворотом
налево
движение назад с поворотом
направо
стоп
очень медленно
медленно
быстро
очень быстро
Наименование константы
IR_COMMAND_FORWARD_CODES[]
IR_COMMAND_BACKWARD_CODES[]
IR_COMMAND_TURN_LEFT_CODES[]
IR_COMMAND_TURN_RIGHT_CODES[]
IR_COMMAND_FORWARD_LEFT_CODES[]
IR_COMMAND_FORWARD_RIGHT_CODES[]
IR_COMMAND_BACKWARD_LEFT_CODES[]
IR_COMMAND_BACKWARD_RIGHT_CODES[]
IR_COMMAND_STOP_CODES[]
IR_COMMAND_VERY_SLOW_CODES[]
IR_COMMAND_SLOW_CODES[]
IR_COMMAND_FAST_CODES[]
IR_COMMAND_VERY_FAST_CODES[]
Код кнопки
В среде программирования Arduino IDE вернитесь к первой вкладке и
замените программный код в ней на следующий:
11
#include "IRremote.h"
#include "ir_command_codes.h"
#include <Servo.h>
const int IR_PIN = A0;
const int LEFT_SERVO_PIN = 2;
const int CENTRAL_SERVO_PIN = 4;
const int RIGHT_SERVO_PIN = 7;
const long LEFT_SERVO_ZERO_VALUE = 90;
const long RIGHT_SERVO_ZERO_VALUE = 90;
const long CENTRAL_SERVO_ZERO_VALUE = 90;
const long SIDE_SERVOS_FULL_AMPLITUDE = 30;
const long SIDE_SERVOS_HALF_AMPLITUDE = 15;
const long CENTRAL_SERVO_AMPLITUDE = 20;
const long STEP_PERIOD_VERY_SLOW = 2000;
const long STEP_PERIOD_SLOW = 1500;
const long STEP_PERIOD_FAST = 1000;
const long STEP_PERIOD_VERY_FAST = 500;
long lastMillis;
long globalPhase;
float angleShiftLeftServo;
float angleShiftRightServo;
float angleShiftCentralServo;
long stepPeriod;
long amplitudeLeftServo;
long amplitudeRightServo;
boolean isAttached;
boolean isStopped;
IRrecv irrecv(IR_PIN);
Servo LeftServo;
Servo RightServo;
Servo CentralServo;
void attachServos() {
if (!isAttached) {
LeftServo.attach(LEFT_SERVO_PIN);
RightServo.attach(RIGHT_SERVO_PIN);
CentralServo.attach(CENTRAL_SERVO_PIN);
isAttached = true;
}
}
void detachServos() {
if (isAttached) {
LeftServo.detach();
RightServo.detach();
CentralServo.detach();
isAttached = false;
}
}
void setup() {
irrecv.enableIRIn();
attachServos();
12
isStopped = true;
lastMillis = millis();
angleShiftLeftServo = 0;
angleShiftRightServo = 0;
angleShiftCentralServo = 0;
stepPeriod = STEP_PERIOD_FAST;
}
int getAngle(long amplitude, long phaseMillis, float shiftAngle)
{
float alpha = 2 * PI * phaseMillis / stepPeriod + shiftAngle;
float angle = amplitude * sin(alpha);
return (int)angle;
}
template<typename T,size_t N>
boolean hasCode(T (&commandCodes)[N], long code) {
for (int i = 0; i < N; i++) {
if (commandCodes[i] == code) {
return true;
}
}
return false;
}
void loop() {
long millisNow = millis();
long millisPassed = millisNow - lastMillis;
if (isStopped) {
if (millisPassed >= 500) {
lastMillis = 0;
detachServos();
}
globalPhase = 0;
} else {
lastMillis = millisNow;
globalPhase += millisPassed;
globalPhase = globalPhase % stepPeriod;
}
decode_results results;
if (irrecv.decode(&results)) {
if (hasCode(IR_COMMAND_FORWARD_CODES, results.value) ||
hasCode(IR_COMMAND_FORWARD_LEFT_CODES, results.value) ||
hasCode(IR_COMMAND_FORWARD_RIGHT_CODES, results.value))
{
attachServos();
isStopped = false;
angleShiftLeftServo = 0;
angleShiftRightServo = 0;
angleShiftCentralServo = PI/2;
amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
13
if (hasCode(IR_COMMAND_FORWARD_LEFT_CODES, results.value))
{
amplitudeLeftServo = SIDE_SERVOS_HALF_AMPLITUDE;
} else if (hasCode(IR_COMMAND_FORWARD_RIGHT_CODES, results.value)) {
amplitudeRightServo = SIDE_SERVOS_HALF_AMPLITUDE;
}
} else if(hasCode(IR_COMMAND_BACKWARD_CODES, results.value)
||
hasCode(IR_COMMAND_BACKWARD_LEFT_CODES, results.value) ||
hasCode(IR_COMMAND_BACKWARD_RIGHT_CODES, results.value)) {
attachServos();
isStopped = false;
angleShiftLeftServo = 0;
angleShiftRightServo = 0;
angleShiftCentralServo = -PI/2;
amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
if (hasCode(IR_COMMAND_BACKWARD_LEFT_CODES, results.value)) {
amplitudeRightServo = SIDE_SERVOS_HALF_AMPLITUDE;
} else if (hasCode(IR_COMMAND_BACKWARD_RIGHT_CODES, results.value)) {
amplitudeLeftServo = SIDE_SERVOS_HALF_AMPLITUDE;
}
} else if (hasCode(IR_COMMAND_TURN_LEFT_CODES, results.value)) {
attachServos();
isStopped = false;
angleShiftLeftServo = 0;
angleShiftRightServo = PI;
angleShiftCentralServo = -PI/2;
amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
} else if (hasCode(IR_COMMAND_TURN_RIGHT_CODES, results.value)) {
attachServos();
isStopped = false;
angleShiftLeftServo = 0;
angleShiftRightServo = PI;
angleShiftCentralServo = PI/2;
amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
} else if (hasCode(IR_COMMAND_STOP_CODES, results.value)) {
attachServos();
isStopped = true;
angleShiftLeftServo = 0;
angleShiftRightServo = 0;
angleShiftCentralServo = 0;
14
amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
} else if (hasCode(IR_COMMAND_VERY_SLOW_CODES, results.value)) {
globalPhase = globalPhase * STEP_PERIOD_VERY_SLOW / stepPeriod;
stepPeriod = STEP_PERIOD_VERY_SLOW;
} else if (hasCode(IR_COMMAND_SLOW_CODES, results.value)) {
globalPhase = globalPhase * STEP_PERIOD_SLOW / stepPeriod;
stepPeriod = STEP_PERIOD_SLOW;
} else if (hasCode(IR_COMMAND_FAST_CODES, results.value)) {
globalPhase = globalPhase * STEP_PERIOD_FAST / stepPeriod;
stepPeriod = STEP_PERIOD_FAST;
} else if (hasCode(IR_COMMAND_VERY_FAST_CODES, results.value)) {
globalPhase = globalPhase * STEP_PERIOD_VERY_FAST / stepPeriod;
stepPeriod = STEP_PERIOD_VERY_FAST;
}
irrecv.resume();
}
if (isAttached) {
LeftServo.write(LEFT_SERVO_ZERO_VALUE + getAngle(amplitudeLeftServo, globalPhase, angleShiftLeftServo));
RightServo.write(RIGHT_SERVO_ZERO_VALUE + getAngle(amplitudeRightServo, globalPhase, angleShiftRightServo));
CentralServo.write(CENTRAL_SERVO_ZERO_VALUE + getAngle(CENTRAL_SERVO_AMPLITUDE, globalPhase, angleShiftCentralServo));
}
}
Загрузите скетч в контроллер.
Подключите сервоприводы, батарейку и USB разъем питания к контроллеру, как показано на рисунке 7. ИК датчик должен остаться подключенным к
контроллеру, как и ранее (на рисунке 7 не показан). На рисунке черным показана «Земля» или «ноль», красным – питание (+5В или +9В), оранжевым – сигнальные кабели.
15
Правый
Центральный
Левый
Рисунок 7 – Схема подключения оборудования к контроллеру
Проверьте правильность подключения всех контактов. Подключите USB
разъем к компьютеру и включите кнопку питания. Нажимая кнопки на пульте,
проверьте, чтобы робот правильно реагировал на них. Если все работает корректно, зарисуйте схему подключения в протокол лабораторной работы и разберите робота.
16
Скачать