Пульт управления ESP-NOW
ESP32 > Джойстик
GND > GND
3V3 > VCC
D33 > VRX
D32 > VRY
D13 > SW
ESP32 > MX1508
D14 > INT1
D27 > INT2
D13 > INT3
D12 > INT4
Передатчик.
Связь между модулями по ESP-NOW .
В передатчике надо поменять
RECEIVER_MAC_ADDRESSКод ниже main.py
import network
import espnow
from machine import Pin, ADC
import time
# --- Конфигурация ---
# MAC-адрес ESP32-приемника (должен быть в формате байтов)
# Замените на реальный MAC-адрес вашего приемника
# Пример: b'\x30\xAE\xA4\xF6\x7D\x4C'
RECEIVER_MAC_ADDRESS = b'\\\x01;f\xff\xf0'
# Пины для джойстика (VRx и VRy)
# Используйте пины, поддерживающие ADC (например, 32-39)
PIN_VRX = 33
PIN_VRY = 32
PIN_BTN = 13 # ← ДОБАВЛЕНА КНОПКА
# Создаем объекты ADC
adc_x = ADC(Pin(PIN_VRX))
adc_y = ADC(Pin(PIN_VRY))
# Настраиваем диапазон ADC (например, 0-1023 для 10-бит)
adc_x.width(ADC.WIDTH_10BIT)
adc_y.width(ADC.WIDTH_10BIT)
# Настраиваем аттенюацию (для полного диапазона 0-3.3V используйте ADC.ATTN_11DB)
adc_x.atten(ADC.ATTN_11DB)
adc_y.atten(ADC.ATTN_11DB)
# Инициализация Wi-Fi в режиме Station для работы ESP-NOW
w0 = network.WLAN(network.STA_IF)
w0.active(True)
# Инициализация ESP-NOW
e = espnow.ESPNow()
e.active(True)
# Кнопка
btn = Pin(13, Pin.IN, Pin.PULL_UP) # Кнопка → GND
# Регистрируем получателя (Peer)
try:
e.add_peer(RECEIVER_MAC_ADDRESS)
print("Peer added:", RECEIVER_MAC_ADDRESS)
except OSError as err:
print("Failed to add peer:", err)
# Функция для считывания и преобразования значения
def map_value(value, in_min, in_max, out_min, out_max):
"""Маппирование значения из одного диапазона в другой."""
return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
print("Sender running...")
while True:
# 1. Считываем значения с джойстика (обычно 0-1023)
val_x = adc_x.read()
val_y = adc_y.read()
# 2. Маппируем значения в диапазон, например, -100 до 100
# X (горизонтальное) для поворота: -100 (влево) до 100 (вправо)
mapped_x = map_value(val_x, 0, 1023, -100, 100)
# Y (вертикальное) для движения: -100 (назад) до 100 (вперед)
mapped_y = map_value(val_y, 0, 1023, -100, 100)
# 3. Определяем "мертвую зону" (dead zone)
# Если значение близко к центру (0), устанавливаем 0
DEAD_ZONE = 20
if abs(mapped_x) < DEAD_ZONE:
mapped_x = 0
if abs(mapped_y) < DEAD_ZONE:
mapped_y = 0
# ===== Кнопка =====
btn_state = 0 if btn.value() == 0 else 1
# 0 = нажата, 1 = отпущена
# ===== Формируем пакет =====
message = f"{mapped_x},{mapped_y},{btn_state}"
# 5. Отправляем сообщение
try:
e.send(RECEIVER_MAC_ADDRESS, message.encode('utf8'))
# print(f"Sent: X={mapped_x}, Y={mapped_y}")
except Exception as error:
print("Send error:", error)
time.sleep(0.05) # Задержка для стабильной работы
Простой пример приемника.
main.py
import network
import espnow
import ubinascii
from machine import Pin, PWM
import time
# ===== LED =====
led = Pin(2, Pin.OUT)
# ===== PWM =====
FREQ = 1000
MAX_DUTY = 1023
# Мотор A — движение вперёд/назад (IN1/IN2)
PIN_MOTOR_A_IN1 = 12
PIN_MOTOR_A_IN2 = 13
# Мотор B — поворот (IN3/IN4)
PIN_MOTOR_B_IN3 = 14
PIN_MOTOR_B_IN4 = 27
pwm_a_in1 = PWM(Pin(PIN_MOTOR_A_IN1), freq=FREQ)
pwm_a_in2 = PWM(Pin(PIN_MOTOR_A_IN2), freq=FREQ)
pwm_b_in3 = PWM(Pin(PIN_MOTOR_B_IN3), freq=FREQ)
pwm_b_in4 = PWM(Pin(PIN_MOTOR_B_IN4), freq=FREQ)
# ===== ФУНКЦИЯ УПРАВЛЕНИЯ МОТОРОМ =====
def set_motor_speed(pwm_fwd, pwm_bwd, speed):
duty = int((abs(speed) / 100) * MAX_DUTY)
if speed > 0:
pwm_fwd.duty(duty)
pwm_bwd.duty(0)
elif speed < 0:
pwm_fwd.duty(0)
pwm_bwd.duty(duty)
else:
pwm_fwd.duty(0)
pwm_bwd.duty(0)
# ===== ESP-NOW =====
w = network.WLAN(network.STA_IF)
w.active(True)
print("Receiver MAC:", ubinascii.hexlify(w.config("mac")).decode())
e = espnow.ESPNow()
e.active(True)
print("Receiver started...")
# ===== ОСНОВНОЙ ЦИКЛ =====
while True:
host, msg = e.recv()
if msg:
try:
# ожидаем "X,Y,BTN"
parts = msg.decode().split(",")
if len(parts) != 3:
print("Bad packet:", msg)
continue
x = int(parts[0])
y = int(parts[1])
btn = int(parts[2])
# ===== LED кнопки =====
if btn == 1:
led.value(0)
else:
led.value(1)
#led.value(1 if btn == 1 else 0)
# ===== МОТОР A — движение =====
drive_speed = y # вперёд/назад
# ===== МОТОР B — поворот =====
turn_speed = -x # влево/вправо
# ограничение диапазона
drive_speed = max(-100, min(100, drive_speed))
turn_speed = max(-100, min(100, turn_speed))
# ===== ПРИМЕНЕНИЕ =====
set_motor_speed(pwm_a_in1, pwm_a_in2, drive_speed)
set_motor_speed(pwm_b_in3, pwm_b_in4, turn_speed)
print(f"RX: x={x}, y={y}, btn={btn} | drive={drive_speed}, turn={turn_speed}")
except Exception as ex:
print("Error:", ex)
time.sleep_ms(2)
Код что бы узнать мак адрес.
main.py
import network, ubinascii
w = network.WLAN(network.STA_IF)
w.active(True)
print(ubinascii.hexlify(w.config('mac')))


Комментарии
Отправить комментарий