Занятие 1#
Если вам не досталось ардуино сейчас, то для работы с эмулятором можете воспользоваться следующим сайтом
Инструкция по работе с макетной платой#
Макетная плата — удобный инструмент для сборки схем. Но сначала нужно немного времени, чтобы разобраться, как она устроена, и “набить руку”.
На плате видно много ячеек — в них мы будем вставлять провода. Чтобы понять принцип работы, разберём одну плату (бюджет статьи вырос на 200 руб.):

Мы разобрали макетную плату и видим, что внутри лежат провода. Причем они уложены в определенном порядке. Провода посередине лежат вертикально, а провода по краям – горизонтально.
Также можете увидеть, как происходит соединение ячеек:
- по центру соединены вертикальными рядами,
- по краям (обозначены + и –) — горизонтальными строками.
⚠️ Если два вывода вставлены в один ряд по центру — они соединены.
Аналогично: если вставить в одну строку на краю — они тоже соединены.
В этом – вся суть макетной платы. вставляя элементы в те или иные ячейки, мы будем соединять их между собой с помощью проводов, которые лежат под ними.

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

Создадим простую схему для демонстрации работы с цифровыми выходами Arduino UNO путём управления миганием светодиода.
Вам понадобятся следующие компоненты:
- Arduino UNO
 - Светодиод
 - Резистор на 220 Ом
 - Провода для соединения компонентов
 

- Вставьте резистор на 220 Ом в макетную плату.
 - Подключите анод (длинная ножка) светодиода к свободному концу резистора.
 - Подключите катод (короткая ножка) светодиода к одному из заземляющих (GND) выводов на Arduino UNO.
 - Подключите другой конец резистора к цифровому выводу 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. Управление осуществляется программно — путём чередования высокого и низкого напряжения на этом выводе.
- Инициализация
 - При запуске выполняется 
setup(). - 
Командой
pinMode(led, OUTPUT);вывод D12 настраивается как выходной. - 
Включение светодиода
 - В 
loop()подаётся сигнал:digitalWrite(led, HIGH); - Через светодиод идёт ток: анод → резистор → D12, катод → GND → земля.
 - 
Светодиод загорается.
 - 
Задержка
 - 
Команда
delay(1000);— пауза 1 секунда, светодиод остаётся включённым. - 
Выключение
 - Командой 
digitalWrite(led, LOW);подаётся низкий уровень. - 
Ток не идёт, светодиод гаснет.
 - 
Пауза и повтор
 - Ещё одна задержка: 
delay(1000); - Цикл 
loop()повторяется — создаётся мигание. 
Роль резистора
- Резистор (220 Ом) ограничивает ток через светодиод.
- Без него светодиод может сгореть от слишком большого тока.
Программа "Управление светом"#
Чтобы управлять светодиодом на Arduino с помощью Python, нужно:
- Модифицировать Arduino-код так, чтобы он принимал команды через Serial (USB).
 - Написать 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.