Занятие №1. Цифровые сигналы. Резистор. Светодиод. Тактовая кнопка.

По окончании занятия учащиеся смогут…

Запуск программы на Arduino

С помощью Arduino IDE

  1. После того как схема проекта собрана на макетной плате, запустите среду разработки Arduino IDE image-20210131150419118.
  2. Подключите плату Arduino к компьютеру с помощью USB-кабеля.
  3. Зайдите в пункт меню Инструменты - Порт и убедитесь что напротив COM-порта с именем платы стоит галочка. Этот порт будет использоваться для передачи скомпилированной программы на микроконтроллер платы Arduino.
  4. Нажмите кнопку Загрузка image-20210131150843196. Через некоторое время программа скомпилируется и загрузится в микроконтроллер. Программа начнёт выполняться сразу же после загрузки.

С помощью RobboScratch

  1. Подключите плату Arduino к компьютеру и запустите среду разработки RobboScratch.
  2. Замкните контакт 5V и 7 пин.
  3. Нажмите кнопку Поиск устройств. После успешного подключения зелёным загорится буква А.
  4. Если плата не распозналась, RobboScratch предложить загрузить нужную прошивку. Нажмите OK и дождитесь окончания процесса.

Задание № 1. Маячок

Соберите схему со светодиодом. Напишите программу с помощью которой светодиод будет мигать раз в 1 секунду.

Симуляция проекта в Tinkercad

Работу над этим и последующими проектами будем начинать с моделирования схемы в сервисе Tinkercad.

На странице своего профиля в Tinkercad перейдите в закладку Проекты, нажмите кнопку Создать и создайте новый проект из раздела Цепи:

Соберите схему проекта. Вы можете ориентироваться на изображение с прототипом или принципиальную схему. Между этими вариантами можно переключаться в любой момент.

Схема для сборки

Увеличение изображений

Вы можете щёлкнуть по изображению, чтобы увеличить его.

После сборки схемы нужно написать программу для микроконтроллера. Для этого в Tinkercad нажмите кнопку Код и в выпадающем списке выберите вариант Текст:

Программа

// Мигание светодиодом

// функция выполняется один раз
void setup()
{
    // пин светодиода 9 настраиваем
    // на выход - OUTPUT
    pinMode(9, OUTPUT);
}

// функция выполняется бесконечно
void loop()
{
    digitalWrite(9, HIGH); // устанавливаем на 9 пине логическую 1 - 5 В
    delay(1000); // ждём 1000 миллисекунд
    digitalWrite(9, LOW); // устанавливаем на 9 пине логический 0 - 0 В
    delay(1000); // ждём 1000 миллисекунд
}

Код внутри Функции setup() предназначен для настройки пинов и начальных настроек компонентов цепи: некоторых датчиков, сервомоторов, LCD-дисплеев. Функция loop() выполняется, пока на плату подаётся питание.

С помощью функции pinMode(пин, режим) настраивается режим работы указанного пина - INPUT (на вход) или OUTPUT (на выход). Функция digitalWrite(пин, значение) устанавливает на выбранном пине либо высокий уровень напряжения - HIGH, либо низкий - LOW.

С помощью функции delay(миллисекунд) можно сделать паузу на выбранное количество миллисекунд.

В бесконечном цикле с паузой в 1 секунду подаём сначала высокий а затем низкий уровень напряжения на пин 9.

Запустите симуляцию схемы, нажав на кнопку Начать моделирование. Светодиод должен мигать.

Сборка и программирование реального прототипа

Теперь соберите схему на реальной макетной плате и подключите Arduino к компьютеру. Запустите программу RobboScratch и подключитесь к Arduino с помощью инструкции в этом разделе.

Составьте программу в RobboScratch. Саму программу вы можете найти в разделе Программа, переключившись к вкладке RobboScratch. Проверьте работу программы на реальной схеме.

Дополнительное задание

Добавьте к схеме ещё один светодиод. Измените программу так, чтобы светодиоды включались по-переменно: пока включен один, второй выключен.

Задание № 2. Тактовая кнопка

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

Схема для сборки

Резистор на 10 кОм в схеме называется стягивающим. Он тянет значение на 8 пине к земле, пока кнопка не нажата.

Подтягивающий резистор

Если нужно, чтобы в не нажатом состоянии на пине с кнопкой была логическая единица (5 В), то кнопку подключают к питанию через подтягивающий резистор, который подтягивает значение на пине к напряжению 5 В.

Программа

// Тактовая кнопка

// описываем логическую переменную state
// будем хранить состояние кнопки - HIGH или LOW
bool state;

void setup()
{
    // пин кнопки настраиваем на вход - INPUT
    pinMode(8, INPUT);
    // пин светодиода настраиваем на выход - OUTPUT
    pinMode(9, OUTPUT);
}

void loop()
{
    // считываем логическое значение с пина 8
    // сохраняем значение в переменной state
    state = digitalRead(8);

    // значение переменной state (состояние кнопки)
    // определит состояние светодиода (вкл/выкл)
    digitalWrite(9, state);
}

Логическая переменная state может хранить два значения - true (1) или false (0). Константы HIGH и LOW также соответствуют этим числовым значениям.

Функция digitalRead(пин) возвращает значение HIGH если на пине уровень напряжения больше 3 В. Иначе функция вернёт значение LOW.

Создайте переменную state для хранения состояния кнопки. Это же состояние используется для управления светодиодом.

Задание № 3. Выключатель

Составьте программу с помощью которой нажатие одной кнопки будет последовательно включать и выключать светодиод.

Схема для сборки

Для решения задачи используйте схему из задания № 2.

Дублирование проекта в Tinkercad

В некоторых случаях может понадобится создать в Tinkercad новый проект, который основывается на уже существующем. Для этого удобно создать копию проекта. Нажмите на шестерёнку в верхнем правом углу карточки проекта и выберите вариант Дублировать:

Теперь можно модифицировать копию проекта.

Программа

// Включение и выключение на одну кнопку

// все три переменные инициализируем значением LOW
bool cur = LOW; // текущее состояние кнопки
bool prev = LOW; // предыдущее состояние кнопки
bool state = LOW; // состояние светодиода

void setup()
{
    pinMode(9, OUTPUT);
}

void loop()
{
    // сохраняем текущее состояние кнопки
    cur = digitalRead(8);

    // если состояние кнопки изменилось
    // с LOW на HIGH, значит кнопка нажата.
    // истинность двух условий проверяем с
    // помощью логического И - &&
    if (cur == HIGH && prev == LOW) {

        // меняем значение переменной state
        // на противоположное с помощью
        // логического НЕ - !
        state = !state;
    }

    // текущее состояние кнопки сохраняем
    // в качестве предыдущего
    prev = cur;

    // устанавливаем состояние светодиода
    digitalWrite(9, state);
}

Задание № 4. Бегущий огонёк

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

Схема для сборки

Программа

// Бегущие огни

#define FIRST_LED_PIN 2 // первый пин ряда светодиодов
#define LAST_LED_PIN  5 // последний пин ряда

void setup()
{
    /*
    Настраиваем пины со светодиодами на вывод (OUTPUT).
    Для этого перебираем номера пинов в цикле for.
    */
    for(int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)
    {
        pinMode(pin, OUTPUT);
    }
}

void loop()
{
    /*
    Перебираем пины светодиодов
    */
    for(int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)
    {
        // "включаем" очередной светодиод с пином pin
        digitalWrite(pin, HIGH);
        delay(500);
        digitalWrite(pin, LOW);
    }
}

С помощью директивы #define описываем константы с номерами первого и последнего светодиодов. Описав константы в начале программы, мы может легко исправить их значение при необходимости.

С помощью цикла for внутри функции loop() перебираем номера пинов и включаем светодиоды на этих пинах на пол секунды.

Количество повторений цикла вычислим по формуле: \[ loop = last - first + 1 \] где first - номер первого пина, last - номер последнего пина.

Дополнительное задание

Добавьте пятый светодиод и после этого исправьте программу.