Мы продолжаем обзор бесплатного online-курса Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера (предыдущие обзоры: неделя 1, неделя 2)
Третья неделя
Всем привет! Задумывались ли вы когда-нибудь, что может быть общего между Валли и шлагбаумом?
Как минимум, они оба являются роботами.
До того, как я записался на курс робототехники от МФТИ я представлял себе роботов почти исключительно как

Но оказалось, что определение роботов гораздо шире:
Робот – автоматическое устройство, созданное по принципу живого организма, предназначенное для осуществления производственных и других операций, которое действует по заранее заложенной программе и получает информацию о внешнем мире от датчиков, робот самостоятельно осуществляет производственные и иные операции, обычно выполняемые человеком. При этом робот может как иметь связь с оператором (получать от него команды), так и действовать автономно.
Как видим, определение гораздо шире, чем мое стереотипное представление о том, что такое робот.
На третьей неделе мы, помимо некоторых новых возможностей среды программирования, научимся работать с дальномерами, инфракрасным и ультразвуковым, а также взаимодействовать со внешней средой с помощью сервомоторов. Обо всем по порядку.
Напомню, на второй неделе курса мы рассмотрели подключение простейших датчиков – фоторезистора и терморезистора. Устроены они простейшим способом – при изменении окружающей среды они изменяли свое сопротивление и, как следствие, мы могли измерить падение напряжения на них с помощью Arduino и понять, что внешние условия изменились. Также мы научились выводить информацию с помощью светодиодных индикаторов и пьезодинамика.
Как следует из названия, дальномер — устройство, которое позволяет определить расстояние до какого-либо объекта или препятствия.
Ультразвуковой дальномер работает по принципу измерения времени между отправкой сигнала (звукового импульса частотой 40 кГц) и получения его отраженной копии.
У инфракрасного же датчика отраженный сигнал (луч в инфракрасном спектре) через линзу попадает на позиционно-чувствительный фотоэлемент, который меняет свою проводимость в зависимости места приема луча.
Возможно, читатель поинтересуется, зачем могут понадобиться два датчика, делающих одно и тоже? Все зависит от сферы применения датчика, так инфракрасный датчик плохо подходит для измерения расстояния до светопоглощающих или прозрачных поверхностей, поскольку в его основе лежит свет. С другой стороны, ультразвуковой дальномер плохо подходит для определения расстояния до звукопоглощающих поверхностей, в частности пушистых 🙂 Также, инфракрасные датчики имеют меньший диапазон измеряемых расстояний (например, 4-30, 10-80 или 80-150 см), тогда как даже дешевый дальномер определяет расстояния от 2 до 400 см. В моем наборе оказался только ультразвуковой дальномер, поэтому для экспериментов использовал только его.
Что же такое сервомотор? Это маленький электрический мотор, который совмещен с потенциометром и управляющей схемой. Подавая ШИМ-сигнал на вход сервомотора мы можем задавать угол, на который он должен повернуться и удерживать это положение. Обычно максимальный угол поворота составляет 180 градусов, но бывают сервомоторы с углами от 120 до 270 градусов.
Вдоволь наигравшись с сервомотором и ультразвуковым дальномером по отдельности, я стал думать, какое устройство собрать на этой неделе. Решение пришло внезапно, когда я выезжал из подземной парковки торгового центра. На выезде организована пропускная система со шлагбаумом и светофором, которую я и решил смоделировать.
Для сборки данного устройства я использовал элементы конструктора, сохранившегося со школьных времен.

Поскольку питания от компьютера было явно недостаточно — плата периодически перезагружалась, поэтому в окончательном варианте для питания использовался powerbank.
Собственно, как работает наша упрощенная модель пропускной системы:
- После включения загорается красный сигнал светофора, шлагбаум устанавливается в закрытое положение. Система ожидает нажатия на кнопку (имитация считывания пропуска).
- После нажатия на кнопку загорается зеленый сигнал светофора и открывается шлагбаум. Система ожидает, когда показания дальномера будет ниже определенного значения (проезд автомобиля).
- После пересечения автомобилем сигнала дальномера, вновь загорается красный сигнал светофора и шлагбаум закрывается. Система снова переходит в режим ожидания.
В среде Fritzing схема выглядит следующим образом:
#include <Servo.h> // Определяем пины для устройств #define GATE_PIN 3 #define RED_PIN 4 #define GREEN_PIN 5 #define BUTTON_PIN 6 #define SENSOR_TRIG 11 #define SENSOR_ECHO 12 // Цвета и состояния устройства #define GREEN 1 #define RED 0 #define CLOSE 1 #define OPEN 0 // Углы поворота сервомотора, соответствующие открытому и закрытому состоянию #define GATE_OPEN 180 #define GATE_CLOSE 90 // Расстояние, которое соответсвует проезжающему автомобилю #define SENSOR_THR 15 Servo gate; void setup() { Serial.begin(9600); // Подключаем сервомотор и закрываем шлагбаум Serial.println("Initialize gate"); gate.attach(GATE_PIN); gate.write(CLOSE); // Подключаем дальномер и светодиоды Serial.println("Setup pins"); pinMode(GREEN_PIN, OUTPUT); pinMode(RED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(SENSOR_TRIG, OUTPUT); pinMode(SENSOR_ECHO, INPUT); Serial.println("Light red"); light(RED); } // Функция для открытия-закрытия шлагбаума void gateSet(int state) { if (state == CLOSE) { for (int i = GATE_OPEN; i >= GATE_CLOSE; i--) { gate.write(i); delay(15); } } else { for (int i = GATE_CLOSE; i <= GATE_OPEN; i++) { gate.write(i); delay(15); } } } // Пепеключение светофора void light(int col) { if (col == RED) { digitalWrite(GREEN_PIN, LOW); digitalWrite(RED_PIN, HIGH); } else { digitalWrite(GREEN_PIN, HIGH); digitalWrite(RED_PIN, LOW); } } // Получение текущего расстояния до препятствия/автомобиля int getDistance() { digitalWrite(SENSOR_TRIG, HIGH); digitalWrite(SENSOR_TRIG, LOW); int distance = pulseIn(SENSOR_ECHO, HIGH) / 54; Serial.println("Distance is :" + String(distance)); return distance; } // Ожидание, когда машина проедет bool waitCar() { while (getDistance() > SENSOR_THR) { delay(10); } while (getDistance() <= SENSOR_THR) { delay(10); } } void loop() { Serial.println("Wait button"); while (digitalRead(BUTTON_PIN)) { delay(10); } Serial.println("Light green"); light(GREEN); Serial.println("Open gate"); gateSet(OPEN); Serial.println("Wait for car"); waitCar(); Serial.println("Light red"); light(RED); Serial.println("Close gate"); gateSet(CLOSE); Serial.println("End loop"); }
Демонстрация работы собранного устройства
Подведем итоги. На данной неделе мы научились работать с дальномерами, а также управлять сервоприводом. Данные элементы являются основой для множества колесных или шагающих роботов, а также различных манипуляторов, поэтому предоставляют большое пространство для творчества.
Предыдущие обзоры:
И ссылка на курс: Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера
ссылка на оригинал статьи https://geektimes.ru/post/289067/
Добавить комментарий