- •Курс «Основы робототехники на Arduino». Занятие 5 Опрос входов Arduino
- •5.1. Цифровой ввод
- •Применение цифрового ввода:
- •Практическое занятие 1. Опрос кнопки
- •Практическое занятие 2. Управление светофором кнопкой
- •Дополнительные практические занятия:
- •5.2. Аналоговый ввод
- •Применение аналогового ввода:
- •Практическое занятие 3. Опрос переменного резистора
- •Практическое занятие 4. Управление яркостью светодиода, чтение в Монитор порта
- •П рактическое занятие 5. Опрос аналогового датчика освещенности
- •Практическое занятие 6. Опрос аналогового датчика температуры
- •Практическое занятие 7. Опрос кнопок шилда с жк индикатором
- •Практическое занятие 8. Робот-светофил или следующий по линии, на фоторезисторах
- •Домашнее задание
Подключите контроллер к компьютеру, загрузите данную программу и попробуйте работу: при нажатии/отпускании кнопки светодиод L на плате Arduino должен загораться или потухать
Практическое занятие 2. Управление светофором кнопкой
добавьте к уже собранной схеме кнопки схему светофора, использованную в занятии 2 – три светодиода (красный, желтый, зеленый) с подпаянными к ним токоограничивающими резисторами:
модифицируйте программу Button, чтобы реализовать алгоритм работы для светофора, переключающегося кнопкой:
Если кнопка нажата, выполнить:
помигать красным светодиодом
включить желтый светодиод на 3 секунды
включить зеленый светодиод на 3 секунды
помигать зеленым светодиодом
включить желтый светодиод на 3 секунды
включить красный светодиод
Иначе
включить красный светодиод
Дополнительные практические занятия:
Переключение цвета светодиода по нажатию на кнопку
Изменение яркости светодиода (светодиодов) при нажатии на кнопку
Подключение второй кнопки и управление перечисленными выше процессами двумя кнопками
5.2. Аналоговый ввод
Arduino Uno может определять определенный уровень напряжения от 0 до +5 В (например, 1 В, 3 В и т.д.), только на пинах A0…A5
Опрос аналогового входа проводится командой analogRead:
analogRead(аналоговый пин);
В качестве аналогового пина в Arduino Uno можно указать А0…А5
Команда выдает значения от 0 до 1023, соответствующие значениям от 0 до 5 В на входе (0 = 0 В, 1023 = 5 В, 512 = 2,5 В и т.д.)
Применение аналогового ввода:
управление уровнем с помощью переменного резистора, например, громкостью звука, яркостью света и т.д.
чтение информации с аналоговых датчиков (например, температуры, освещенности, громкости звука, уровня примесей в воздухе, магнитного поля), которые выдают уровень напряжения, соответствующий уровню измеряемого параметра
измерение уровня напряжения на батареях и аккумуляторах (при этом уровень напряжения выше +5 В переводится в диапазон 0…+5 В, используя делитель напряжения на двух резисторах)
измерение тока (например, определения, какой ток генерирует солнечная батарея, ветрогенератор), измеряя напряжение на резистивном шунте (резисторе очень малого сопротивления – порядка 1 Ом)
опрос нескольких кнопок, подключенных к одному аналоговому входу
Практическое занятие 3. Опрос переменного резистора
Нужные компоненты:
переменный резистор
т
ри
провода со штырьками на обоих концах:
красный (+5 В), синий или черный (Gnd),
один произвольного цвета (но не красного,
синего или черного)
Переменный резистор можно представить как два последовательно соединенных резистора, где средний вывод – точка соединения. Данная схема является делителем напряжения – на резисторе, обладающем бОльшим сопротивлением, падает бОльшее напряжение. Поворачивая ручку переменного резистора, мы меняем соотношение сопротивлений и таким образом меняем напряжение на средней ножке.
подключите переменный резистор по схеме
запустите среду разработки Arduino IDE и загрузите в контроллер программу Файл / Примеры / Analog / AnalogInput
попробуйте поворачивать ручку резистора. Светодиод L на плате должен мигать с периодом, зависящим от угла поворота резистора (который меняет напряжение на средней ножке)
Практическое занятие 4. Управление яркостью светодиода, чтение в Монитор порта
добавьте к предыдущей схеме светодиод с токоограничивающим резистором (на контакт D9), который будет изменять яркость в зависимости от уровня напряжения на A0:
загрузите в контроллер программу Файл / Примеры / Analog / AnalogInOutSerial
В данной программе для пересчета из диапазона входных значений 0…1023 (считанный analogRead) в диапазон выходных значений 0…255 (записываемый analogWrite) используется команда map:
map(пересчитываемое число, минимум входного, максимум входного, минимум выходного, максимум выходного)
map(100, 0, 1023, 0, 5) = 0,488; // пересчет в 5 В (100 на входе = 0,488 Вольт)
map(5, 0, 10, 0, 1000) = 500; // середина диапазона
map(0, 1023, 0, 0, 255) = 255; // может быть и диапазон от максимума к минимуму
убедитесь, что при вращении резистора меняется яркость светодиода
для передачи данных в компьютер используется набор команд Serial:
Serial.begin(9600); // установить связь с компьютером со скоростью 9600
Serial.print("sensor = "); // вывести символы в кавычках ""
Serial.print(sensorValue); // вывести значение, хранящееся в sensorValue
Serial.print("\t"); // табуляция (аналогично нажатию кнопки Tab в Word’е
Serial.println(outputValue); // вывести значение, хранящееся в outputValue и перейти на следующую строку
откройте Монитор порта – кнопка с иконкой лупы справа сверху в среде разработки и убедитесь, что в Мониторе порта показываются числа, меняющиеся в зависимости от угла поворота резистора
П рактическое занятие 5. Опрос аналогового датчика освещенности
Нужные компоненты:
фоторезистор
постоянный резистор на 10 кОм
светодиод с токоограничивающим резистором
провода со штырьками на обоих концах: красный (+5 В), синий или черный (Gnd), два произвольного цвета (но не красного, синего или черного)
научимся получать информацию с аналогового датчика, сопротивление которого меняется в зависимости от измеряемой величины (фоторезистор, терморезистор, магниторезистор). Для получения зависимости напряжения от сопротивления датчика нужно соберем делитель напряжения, состоящий из постоянного резистора и фоторезистора:
для измерения напряжения на аналоговом входе (зависящем от уровня освещения фоторезистора) используйте программу Файл / Примеры / Analog / AnalogInOutSerial, выдающую данные в Монитор порта и зависимостью яркости светодиода
сделаем модель регулятора уровня освещения в комнате в зависимости от внешнего освещения: измените в программе на map(0, 1023, 0, 0, 255) и загрузите в контроллер. После этого светодиод должен гореть тем ярче, чем ниже освещение фоторезистора
Практическое занятие 6. Опрос аналогового датчика температуры
вместо фоторезистора подключите терморезистор
откройте Монитор порта и убедитесь, что контроллер отслеживает изменение температуры при нагреве терморезистора пальцем
запишите выдаваемые контроллером значения при комнатной температуре (без нагрева, 20С) и при температуре тела (36С, нагревать терморезистор пальцем и подождать, пока значение установится)
используя функцию map, напишите программу пересчета значений с аналогового датчика в градусы Цельсия и вывод в Монитор порта:
temperature = map(sensorValue, значение при 20С, значение при 36С, 20, 36);
Serial.print("temperature = " );
Serial.println(temperature);
загрузите программу в контроллер и убедитесь, что при изменении температуры терморезистора меняется значение, выдаваемое в Монитор порта
Практическое занятие 7. Опрос кнопок шилда с жк индикатором
В плате, устанавливаемой поверх Arduino Uno, содержащей ЖК индикатор и кнопки (LCD Shield) для опроса кнопок используется схема справа. В зависимости от нажатой кнопки меняется сопротивление нижнего резистора, соответственно, меняется напряжение на входе A0. Каждой нажатой кнопке соответствует определенное напряжение.
Эта схема позволяет подключить большое количество кнопок на один вход Arduino.
установите шилд с ЖК индикатором над Arduino Uno
загрузите программу Файл / Примеры / Analog / AnalogInOutSerial в контроллер
н
ажмите
на все кнопки по очереди (кроме Reset)
и запишите значения уровней, выдаваемые
Монитором портаподключите к плате пять светодиодов разных цветов с токоограничивающими резисторами
напишите программу, которая включает определенный светодиод при нажатии на определенную кнопку. Для облегчения программирования условий запишите значения, полученные для каждой кнопки, в переменные right, up и т.д. Приведен фрагмент кода программы:
int right = 0; // значение, выдаваемое при нажатии кнопки Right
int up = 100; // значение, выдаваемое при нажатии кнопки Up
int down = 200; // значение, выдаваемое при нажатии кнопки Down
int left = 300; // значение, выдаваемое при нажатии кнопки Left
int select = 400; // значение, выдаваемое при нажатии кнопки Select
…
if (sensorValue == right) { // если снятое с аналогового входа значение равно значению, определенному для нажатия кнопки Right
digitalWrite(led_right, HIGH); // зажжем светодиод индикации Вправо
}
else { // иначе
digitalWrite(led_right, LOW); // погасим светодиод индикации Вправо
}
…
загрузите написанную программу в контроллер и убедитесь, что при нажатии на ЖК шилде на кнопку загорается соответствующий светодиод
Практическое занятие 8. Робот-светофил или следующий по линии, на фоторезисторах
Реализация простейшего зрения, позволяющего определить направление на источник света или двигаться по линии на полу
Н
ужные
компоненты:
два фоторезистора
два постоянных резистора на 10 кОм
провода со штырьками на обоих концах: два красных (+5 В), четыре произвольного цвета (но не красного, синего или черного)
Соберите схему опроса двух фоторезисторов:
загрузите в контроллер следующую программу:
int photoPin1 = A0; // первый фоторезистор подключен к аналоговому входу A0
int photoPin2 = A1; // второй фоторезистор подключен к аналоговому входу A1
int ledPin1 = 3; // первый светодиод подключается к digital pin 3
int ledPin2 = 2; // первый светодиод подключается к digital pin 2
int val1 = 0; // значение с фоторезистора 1
int val2 = 0; // значение с фоторезистора 2
void setup()
{
Serial.begin(9600);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
val1 = analogRead(photoPin1); // считываем значение с фоторезистора 1
val2 = analogRead(photoPin2); // считываем значение с фоторезистора 2
Serial.print("values: "); // выводим значения в COM-порт
Serial.print(val1);
Serial.print(" : ");
Serial.println(val2);
if(val1==val2) // если значения равны - зажигаем оба светодиода
{
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
Serial.println("forward"); // едем вперед
}
else
{
if(val1>val2) // если освещённость первого больше – зажигаем
{ // первый светодиод, а второй гасим
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
Serial.println("left"); // едем влево
}
else // если освещённость второго больше – зажигаем
{ // второй светодиод, а первый гасим
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin1, LOW);
Serial.println("right"); // едем вправо
}
}
delay(200);
}
убедитесь, что поведение светодиодов и выдаваемые в Монитор порта команды соответствуют нужным – при подключении моторов вместо светодиодов (через драйвер двигателя) робот ехал бы на свет
Дополнительное практическое занятие 1: линейка светодиодов, количество горящих светодиодов зависит от уровня напряжения на датчике
Дополнительное практическое занятие 2: подключение Sound Sensor и его опрос программой AnalogInOutSerial
Домашнее задание
Принесите на следующее занятие по программированию (занятие 6) программы (на флешке или скиньте через Интернет), выполняющие приведенные ниже задачи.
Примечание: если Вы уже имеете собственный контроллер, но еще не имеете дополнительных компонентов к нему, для возможности опробовать написанную программу дома, обратитесь к преподавателю для получения компонентов для выполнения, которые нужно вернуть на следующем занятии. Также можно после занятия под руководством преподавателя спаять необходимые компоненты, которые можно будет забрать насовсем.
Задача 1. Две кнопки (1 и 2) + три светодиода – красный (К), желтый (Ж) и зеленый (З)
Если не указано другое, при отсутствии нажатия кнопок все светодиоды потушены
№ |
Задание |
№ |
Задание |
1 |
1 нажата – горит К 2 нажата – горит З |
7 |
Не нажаты обе кнопки – горит З, нажата одна из кнопок (любая) – горит Ж, нажаты обе кнопки – горит К |
2 |
1 нажата – горят К и Ж 2 нажата – горит З |
8 |
Нажата 1 – включается один случайный светодиод, нажата 2 – включается два случайных светодиода |
3 |
1 нажата – горит Ж 2 нажата –горят З и К |
9 |
Не нажаты обе кнопки – горит З, нажата 1 - горит Ж, нажата 2 – горит К |
4 |
1 нажата – помигать К 10 раз 2 нажата – помигать З 5 раз |
10 |
В исходный момент горит К Нажата 1 – светодиод переключается К->Ж->З (на З останавливается), нажата 2 – З->Ж->К (на К останавливается) |
5 |
1 нажата – помигать К 10 раз 2 нажата – помигать З 5 раз |
11 |
Три раза подряд нажата 1 – загорается зеленый на 1 секунду, 3 раза подряд 2 – загорается К на 1 секунду |
6 |
1 нажата – помигать З и Ж 7раз 2 нажата – помигать К 4 раза |
12 |
1 нажата и отпущена – загорается К, остальные тухнут, 2 нажата и отпущена – загорается З, остальные тухнут |
Задача 2. Аналоговый датчик + светодиоды (? и + кнопки для Елены, Александры и Мешкова)
№ |
Задание |
№ |
Задание |
1 |
Переменный резистор и 2 светодиода, мигающие по очереди с частотой, зависящей от угла поворота резистора |
7 |
Фоторезистор, два светодиода. Фоторезистор имитирует компас: крайние положения – 0 и 360 – юг, среднее положение 180 – север. Вывести в Монитор порта пересчитанный угол поворота резистора и команды: если <175 – команда «Left», горит зеленый светодиод, > 185– команда «Right», горит зеленый светодиод, от 175 до 180 – команда «Forward», горят оба светодиода |
2 |
Переменный резистор, выдающий в монитор порта угол поворота: 0, если резистор в 0 положении, 180, если повернут на 180 и т.д. |
8 |
В монитор порта вывести угол поворота (см. задание слева), два светодиода: один горит, когда угол меньше 90, другой – когда больше |
3 |
Фоторезистор, один светодиод. Светодиод загорается, когда яркость на фоторезисторе ниже определенного уровня (прикрыт рукой) |
9 |
Три фоторезистора. Темно на среднем и светло на крайних – в монитор порта команда «Forward». Темно на левом – команда «Right». . Темно на правом – команда «Left» |
4 |
Терморезистор, один светодиод. Светодиод загорается, когда температура на терморезисторе ниже определенного уровня |
10 |
Светодиод, фоторезистор. Вывести полученные с фоторезистора значения в Монитор порта. При освещенности ниже определенного уровня (фоторезистор закрыт рукой) светодиод горит, а при большей освещенности (фоторезистор открыт) светодиод не горит |
5 |
Переменный резистор и 5 светодиодов. Количество горящих светодиодов зависит от угла поворота резистора |
11 |
Два терморезистора. Контроллер показывает температуру обоих и разницу между показаниями в градусах Цельсия |
6 |
В зависимости от уровня освещенности фоторезистора контроллер выводит в Монитор порта сообщение «Temno» «Sredne» или «Svetlo» |
12 |
Терморезистор, два светодиода. Вывод температуры в Монитор порта, три уровня температуры: холодно – горят оба светодиода, средне – один, тепло – ни одного |
