Перейти к содержанию

Занятие 1#

Если вам не досталось ардуино сейчас, то для работы с эмулятором можете воспользоваться следующим сайтом

Инструкция по работе с макетной платой#

Макетная плата — удобный инструмент для сборки схем. Но сначала нужно немного времени, чтобы разобраться, как она устроена, и “набить руку”.

На плате видно много ячеек — в них мы будем вставлять провода. Чтобы понять принцип работы, разберём одну плату (бюджет статьи вырос на 200 руб.):

Внутренности макетной платы

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

Также можете увидеть, как происходит соединение ячеек:
- по центру соединены вертикальными рядами,
- по краям (обозначены + и ) — горизонтальными строками.

⚠️ Если два вывода вставлены в один ряд по центру — они соединены.
Аналогично: если вставить в одну строку на краю — они тоже соединены.

В этом – вся суть макетной платы. вставляя элементы в те или иные ячейки, мы будем соединять их между собой с помощью проводов, которые лежат под ними.

Внутренности макетной платы

Мигающий светодиод#

Давайте попробуем соединить несколько элементов и убедимся, что все работает.

Виды плат

Создадим простую схему для демонстрации работы с цифровыми выходами Arduino UNO путём управления миганием светодиода.

Вам понадобятся следующие компоненты:

  1. Arduino UNO
  2. Светодиод
  3. Резистор на 220 Ом
  4. Провода для соединения компонентов

Схема

  1. Вставьте резистор на 220 Ом в макетную плату.
  2. Подключите анод (длинная ножка) светодиода к свободному концу резистора.
  3. Подключите катод (короткая ножка) светодиода к одному из заземляющих (GND) выводов на Arduino UNO.
  4. Подключите другой конец резистора к цифровому выводу D12 на Arduino UNO.

Warning

Смысл схемы такой: электрический ток проходит через светодиод и он горит, резистор при этом ограничивает ток, чтобы светодиод не сгорел.

Код программы:

int led = 12; // Контакт 12 подключен к светодиоду через резистор

void setup() {
    pinMode(led, OUTPUT); // Инициализация цифрового вывода как выход
}
void loop() {
    digitalWrite(led, HIGH); // Включить светодиод
    delay(1000); // Подождать секунду
    digitalWrite(led, LOW); // Выключить светодиод
    delay(1000); // Подождать секунду
}

Принцип работы схемы

Светодиод подключён к цифровому выводу D12 микроконтроллера Arduino UNO. Управление осуществляется программно — путём чередования высокого и низкого напряжения на этом выводе.

  1. Инициализация
  2. При запуске выполняется setup().
  3. Командой pinMode(led, OUTPUT); вывод D12 настраивается как выходной.

  4. Включение светодиода

  5. В loop() подаётся сигнал: digitalWrite(led, HIGH);
  6. Через светодиод идёт ток: анод → резистор → D12, катод → GND → земля.
  7. Светодиод загорается.

  8. Задержка

  9. Команда delay(1000); — пауза 1 секунда, светодиод остаётся включённым.

  10. Выключение

  11. Командой digitalWrite(led, LOW); подаётся низкий уровень.
  12. Ток не идёт, светодиод гаснет.

  13. Пауза и повтор

  14. Ещё одна задержка: delay(1000);
  15. Цикл loop() повторяется — создаётся мигание.

Роль резистора
- Резистор (220 Ом) ограничивает ток через светодиод.
- Без него светодиод может сгореть от слишком большого тока.

Программа "Управление светом"#

Чтобы управлять светодиодом на Arduino с помощью Python, нужно:

  1. Модифицировать Arduino-код так, чтобы он принимал команды через Serial (USB).
  2. Написать Python-программу с использованием Flet, которая отправляет команды Arduino по Serial-порту.

Что такое serial?#

Serial — это способ передачи данных по одному биту за раз, последовательно.
В контексте Arduino и ПК — это связь через USB-порт, которая позволяет обмениваться данными между компьютером и микроконтроллером.

Как работает Serial?#

  • Arduino подключается к компьютеру через USB.
  • Операционная система создаёт виртуальный последовательный порт (например, COM5 в Windows).
  • По этому порту можно отправлять и принимать данные — команды, текст, числа.

Serial в Arduino#

  • Serial.begin(9600); — инициализация последовательного порта на скорости 9600 бод (бит в секунду).
  • Serial.available() — проверяет, есть ли входящие данные для чтения.
  • Serial.read() — читает один байт (один символ) из входящего буфера.
  • Serial.write() и Serial.print() — отправляют данные из Arduino на компьютер.

Ниже пример использования:

int led = 12;

void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(9600); // Инициализация Serial-соединения
}

void loop() {
  if (Serial.available() > 0) {
    char command = Serial.read(); // Чтение команды
    if (command == '1') {
      digitalWrite(led, HIGH); // Включить свет
    } else if (command == '0') {
      digitalWrite(led, LOW); // Выключить свет
    }
  }
}

Для взаимодействия с Arduino через Serial в Python используется библиотека pyserial.

    import flet as ft
    import serial

    # Настройка порта — укажи свой порт!
    arduino = serial.Serial('COM5', 9600)  # для Windows, например COM5
    # arduino = serial.Serial('/dev/ttyUSB0', 9600)  # для Linux/Mac

    def main(page: ft.Page):
        page.title = "Управление светодиодом"
        page.vertical_alignment = ft.MainAxisAlignment.CENTER

        def toggle_light(e):
            if toggle.value:
                arduino.write(b'1')  # Включить свет
            else:
                arduino.write(b'0')  # Выключить свет

        toggle = ft.Switch(label="Светодиод", on_change=toggle_light)
        page.add(toggle)

    ft.app(target=main)

Ниже представлен интерфейс нашей программы

Интерфейс программв

Пример "Двухосевой джойстик"#

Создадим схему для чтения положения двухосевого джойстика и состояния его кнопки с помощью микроконтроллера Arduino UNO.

Необходимые компоненты:
- Arduino UNO
- Двухосевой джойстик KY-023
- Провода для соединения компонентов

Инструкция по сборке схемы:
1. Подключите GND джойстика KY-023 к GND на Arduino UNO.
2. Подключите +5V джойстика KY-023 к 5V на Arduino UNO.
3. Подключите вывод VRx джойстика к аналоговому входу A1 на Arduino UNO.
4. Подключите вывод VRy джойстика к аналоговому входу A0 на Arduino UNO.
5. Подключите вывод SW джойстика к цифровому входу D7 на Arduino UNO.

Интерфейс программв

const int axisX = A0; // ось X подключена к A0
const int axisY = A1; // ось Y подключена к A1
const int buttonPin = 7; // кнопка джойстика подключена к D7
int valX, valY, valButton = 0; // переменные для хранения значений осей и кнопки

void setup() {
    pinMode(buttonPin, INPUT_PULLUP); // конфигурируем D7 как INPUT с включением подтягивающего резистора
    Serial.begin(9600);
}
void loop() {
    valX = analogRead(axisX); // значение оси X
    valY = analogRead(axisY); // значение оси Y
    valButton = 1 - digitalRead(buttonPin); // значение кнопки (инвертированное)
    // выводим значения в монитор порта
    Serial.print("X:"); Serial.print(valX, DEC);
    Serial.print(" | Y:"); Serial.print(valY, DEC);
    Serial.print(" | Button: "); Serial.println(valButton, DEC);
    delay(500); // пауза перед следующим считыванием данных
}

Схема считывает аналоговые значения положения джойстика по осям X и Y, а также состояние кнопки.

Как это работает:
- В setup() настраивается цифровой вход с подтягивающим резистором для кнопки и запускается последовательное соединение.
- В loop() считываются аналоговые значения осей через analogRead(axisX) и analogRead(axisY).
- Состояние кнопки считывается через digitalRead(buttonPin) и инвертируется (кнопка замыкает на землю при нажатии).
- Все значения выводятся в монитор порта для наблюдения.
- Между циклами стоит задержка 500 мс для удобства чтения.

Схема демонстрирует работу с аналоговыми и цифровыми входами Arduino, а также основы обработки сигналов с джойстика и кнопки.

Question
Теперь посмотрите при попомщи вкладки "Мониторинг порта" (Инструменты -> Мониторинг порта) на значения, которые передаются

Мониторинг порта

Прграмма "Управление фигурой"#

Пример кода на Python с использованием Flet, который позволяет управлять положением фигуры на экране с помощью данных, получаемых от джойстика Arduino через последовательный порт.

В программе организовано чтение данных в отдельном потоке, чтобы не блокировать интерфейс, и обновление позиции квадрата в окне приложения.

import flet as ft
import serial
import threading
import time

# Настройка порта (укажите свой порт, например 'COM5' для Windows или '/dev/ttyUSB0' для Linux)
ser = serial.Serial('COM5', 9600)

# Начальные координаты квадрата
pos_x = 100
pos_y = 100

# Функция для считывания данных с Arduino в отдельном потоке
def read_joystick(update_position_callback):
    global pos_x, pos_y
    while True:
        try:
            line = ser.readline().decode('utf-8').strip()
            if line:
                # Пример строки: X:512 | Y:504 | Button: 0
                parts = line.split('|')
                x_val = int(parts[0].split(':')[1])
                y_val = int(parts[1].split(':')[1])
                button = int(parts[2].split(':')[1])

                # Преобразуем значения в смещение (например, чувствительность ±20)
                threshold = 100
                step = 5

                if x_val < 512 - threshold:
                    pos_x -= step
                elif x_val > 512 + threshold:
                    pos_x += step

                if y_val < 512 - threshold:
                    pos_y -= step
                elif y_val > 512 + threshold:
                    pos_y += step

                # Ограничения на выход за экран
                pos_x = max(0, min(400, pos_x))
                pos_y = max(0, min(400, pos_y))

                update_position_callback(pos_x, pos_y)
        except Exception as e:
            print("Ошибка при чтении:", e)

        time.sleep(0.05)

# Основной интерфейс Flet
def main(page: ft.Page):
    page.title = "Управление квадратом через джойстик"
    page.vertical_alignment = ft.MainAxisAlignment.START
    page.window_width = 500
    page.window_height = 500

    square = ft.Container(
        width=50,
        height=50,
        bgcolor="blue",
        left=pos_x,
        top=pos_y
    )

    canvas = ft.Stack([square], width=500, height=500)
    page.add(canvas)

    def update_position(x, y):
        square.left = x
        square.top = y
        page.update()

    # Запускаем чтение джойстика в отдельном потоке
    thread = threading.Thread(target=read_joystick, args=(update_position,), daemon=True)
    thread.start()

ft.app(target=main)

В результате вы получите приложение с квадратом, который будет перемещаться по экрану в зависимости от положения джойстика Arduino.