Обзор online-курса по ардуино/робототехнике от МФТИ (третья неделя)

    Мы продолжаем обзор бесплатного online-курса Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера (предыдущие обзоры: неделя 1, неделя 2)


    Третья неделя


    Всем привет! Задумывались ли вы когда-нибудь, что может быть общего между Валли и шлагбаумом?



    Как минимум, они оба являются роботами.


    До того, как я записался на курс робототехники от МФТИ я представлял себе роботов почти исключительно как


    человекоподобных машин

    Но оказалось, что определение роботов гораздо шире:


    Робот – автоматическое устройство, созданное по принципу живого организма, предназначенное для осуществления производственных и других операций, которое действует по заранее заложенной программе и получает информацию о внешнем мире от датчиков, робот самостоятельно осуществляет производственные и иные операции, обычно выполняемые человеком. При этом робот может как иметь связь с оператором (получать от него команды), так и действовать автономно.

    Как видим, определение гораздо шире, чем мое стереотипное представление о том, что такое робот.


    На третьей неделе мы, помимо некоторых новых возможностей среды программирования, научимся работать с дальномерами, инфракрасным и ультразвуковым, а также взаимодействовать со внешней средой с помощью сервомоторов. Обо всем по порядку.


    Что получилось по результату третьей недели

    Напомню, на второй неделе курса мы рассмотрели подключение простейших датчиков – фоторезистора и терморезистора. Устроены они простейшим способом – при изменении окружающей среды они изменяли свое сопротивление и, как следствие, мы могли измерить падение напряжения на них с помощью Arduino и понять, что внешние условия изменились. Также мы научились выводить информацию с помощью светодиодных индикаторов и пьезодинамика.


    На этой неделе мы изучаем дальномеры — устройство, которое позволяет определить расстояние до какого-либо объекта или препятствия.



    Ультразвуковой дальномер работает по принципу измерения времени между отправкой сигнала (звукового импульса частотой 40 кГц) и получения его отраженной копии.



    У инфракрасного же датчика отраженный сигнал (луч в инфракрасном спектре) через линзу попадает на позиционно-чувствительный фотоэлемент, который меняет свою проводимость в зависимости места приема луча.


    Возможно, читатель поинтересуется, зачем могут понадобиться два датчика, делающих одно и тоже? Все зависит от сферы применения датчика, так инфракрасный датчик плохо подходит для измерения расстояния до светопоглощающих или прозрачных поверхностей, поскольку в его основе лежит свет. С другой стороны, ультразвуковой дальномер плохо подходит для определения расстояния до звукопоглощающих поверхностей, в частности пушистых :) Также, инфракрасные датчики имеют меньший диапазон измеряемых расстояний (например, 4-30, 10-80 или 80-150 см), тогда как даже дешевый дальномер определяет расстояния от 2 до 400 см. В моем наборе оказался только ультразвуковой дальномер, поэтому для экспериментов использовал только его.



    Что же такое сервомотор? Это маленький электрический мотор, который совмещен с потенциометром и управляющей схемой. Подавая ШИМ-сигнал на вход сервомотора мы можем задавать угол, на который он должен повернуться и удерживать это положение. Обычно максимальный угол поворота составляет 180 градусов, но бывают сервомоторы с углами от 120 до 270 градусов.


    Вдоволь наигравшись с сервомотором и ультразвуковым дальномером по отдельности, я стал думать, какое устройство собрать на этой неделе. Решение пришло внезапно, когда я выезжал из подземной парковки торгового центра. На выезде организована пропускная система со шлагбаумом и светофором, которую я и решил смоделировать.


    Для сборки данного устройства я использовал элементы конструктора, сохранившегося со школьных времен.




    Поскольку питания от компьютера было явно недостаточно — плата периодически перезагружалась, поэтому в окончательном варианте для питания использовался powerbank.



    Собственно, как работает наша упрощенная модель пропускной системы:


    1. После включения загорается красный сигнал светофора, шлагбаум устанавливается в закрытое положение. Система ожидает нажатия на кнопку (имитация считывания пропуска).
    2. После нажатия на кнопку загорается зеленый сигнал светофора и открывается шлагбаум. Система ожидает, когда показания дальномера будет ниже определенного значения (проезд автомобиля).
    3. После пересечения автомобилем сигнала дальномера, вновь загорается красный сигнал светофора и шлагбаум закрывается. Система снова переходит в режим ожидания.

    В среде 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-принтера

    Метки:
    MakeItLab 446,83
    Компания
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое