Занятие 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.