Управление esp32 с помощью клавиш клавиатуры
Я делаю проект, в котором мне нужно управлять мини-автомобилем и получать информацию от датчиков через Bluetooth. Я хотел бы иметь возможность управлять мини-автомобилем с помощью компьютерной клавиатуры (w,a,s,d), но мне не удалось найти библиотеку, которая могла бы в этом помочь, например «клавиатуру»; библиотека делает это , например, в Python
Пример
import keyboard
# при нажатии w машина едет вперед
If (keyboard.is_pressed("w"):
Forward()
"Клавиатура" библиотека в ардуино, похоже, работает не так. И я не нашел в Интернете ни других библиотек, ни руководств по этому поводу.
Как заставить это работать?
@Matrodsilver, 👍0
1 ответ
На случай, если кто-то попытается сделать то же самое, я придумал, как заставить это работать. В ArduinoIDE после настройки цикл проверяет, доступен ли последовательный порт Bluetooth и получил ли что-нибудь, если он получает нужные переменные для движения, он передает команду двигателям, подключенным к Arduino, через модуль l298n.
Код выглядит следующим образом:
// variáveis para conexão bluetooth // переменные для соединения Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial SerialBT(8, 9);
char valorDoBluetooth;
//переменные для использования двигателей //переменные для использования двигателей
// двигатель 1
const byte in1 = 2;
const byte in2 = 4;
const byte enA = 3;
//двигатель 2
const byte in3 = 5;
const byte in4 = 7;
const byte enB = 6;
int velocidade = 100; // скорость двигателя (до 255)
int componentesOut[6] = { in1, in2, enA, in3, in4, enB }; // список создан для упрощения настройки переменных
void setup() {
SerialBT.begin(9600);
Serial.begin(9600);
// цикл для установки контактов на выход
for (int n = 0; n < 6; n++) {
pinMode(componentesOut[n], OUTPUT);
}
}
void loop() {
// Читаем данные из модуля Bluetooth
if (SerialBT.available()) {
valorDoBluetooth = SerialBT.read(); // значение Bluetooth
if (valorDoBluetooth == 'F' || valorDoBluetooth == 'T' || valorDoBluetooth == 'D' || valorDoBluetooth == 'E' || valorDoBluetooth == 'P') // если SerialBt получил значение движения
{
movimento(); // движение
}
}
}
void movimento() {
if (valorDoBluetooth == 'F') {
Serial.println("Frente"); // Вперед
frente();
} else if (valorDoBluetooth == 'T') {
Serial.println("Trás"); // Назад
tras();
} else if (valorDoBluetooth == 'D') {
Serial.println("Direita"); // Верно
direita();
} else if (valorDoBluetooth == 'E') {
Serial.println("Esquerda"); // Левый
esquerda();
} else if (valorDoBluetooth == 'P') {
Serial.println("Parar"); // Останавливаться
parar();
}
delay(1);
}
void frente() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(enA, velocidade);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
digitalWrite(enB, velocidade);
}
void tras() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(enA, velocidade);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
digitalWrite(enB, velocidade);
}
void direita() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(enA, velocidade);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
digitalWrite(enB, velocidade);
}
void esquerda() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(enA, velocidade);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
digitalWrite(enB, velocidade);
}
void parar() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(enA, velocidade);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
digitalWrite(enB, velocidade);
}
Чтобы иметь возможность управлять им с помощью клавиатуры ПК, я подключил ПК к устройству через Bluetooth, затем посмотрел, к какому COM-порту оно подключено в конфигурациях Bluetooth панели управления, и использовал этот номер COM в коде Python, который возможность связи с устройством.
Код Python выглядит следующим образом:
import serial
import time
import keyboard
# Замените «COMX» фактическим COM-портом, назначенным модулю HC-05 / устройству Esp на вашем ПК. Дополнительную информацию можно найти на https://pyserial.readthedocs.io/en/latest/shortintro.html.
ser = serial.Serial('COM8', 9600, timeout=1)
flagMovido = True # flag that checks if the motors are finished moving before changing directions
def controle(event):
global flagMovido
if event.event_type == keyboard.KEY_DOWN: # if a key is pressed:
if (event.name == "w" or event.name == "a" or event.name == "s" or event.name == "d") and flagMovido: # if movement keys are pressed and motors are finished moving to any other direction:
flagMovido = False # motors started moving
if event.name == "w" and not flagMovido:
ser.write(b'F')
print('frente') # Forward
elif event.name == "a" and not flagMovido:
ser.write(b'E')
print('esquerda') # Left
elif event.name == "s" and not flagMovido:
ser.write(b'T')
print('trás') # Backwards
elif event.name == "d" and not flagMovido:
ser.write(b'D')
print('direita') # Right
elif event.event_type == keyboard.KEY_UP: # if a key is released:
if (event.name == "w" or event.name == "a" or event.name == "s" or event.name == "d") and not flagMovido: # if movement keys are released and motors are moving to some direction
flagMovido = True # motors are finished moving
ser.write(b'P')
print('parado') # Stop
print('START')
def main():
while True:
data = ser.readline().decode().strip()
keyboard.hook(controle)
time.sleep(.001)
if data:
print(f"Recebido: {data}") # prints data if any received. Used to print the sensor values received.
if __name__ == "__main__":
main()
наблюдение:
- Код работает нормально, но может вызвать некоторые проблемы, если вы одновременно нажмете несколько клавиш, поскольку он был создан для одновременной обработки одного направления. Но bools движения помогут в этом и в определенной степени предотвратят это. Хотя в отдельных случаях это следует улучшить.
- В итоге я использовал модуль HC05 с Arduino, но код работает и для Esp. Но при подключении к Esp строку
ser = Serial.Serial('COM8', 9600, timeout=1)
следует изменить на способ подключения к Esp. Дополнительная информация по предоставленной ссылке.
- Мой модуль Bluetooth HC-05 не работает
- Модуль HC-05 не получает команд и не спаривается
- Проблема чтения данных Arduino Bluetooth HC-05
- Arduino с модулем Bluetooth HC-05 | Данные не передаются
- Можете ли вы помочь мне сократить мой код?
- Неудачная загрузка скетч Bluetooth HC-05 - (порт и плата верны)
- модуль Bluetooth HC-05; два последовательных порта, COM4 и COM5
- Могу ли я заставить модуль BT отключиться от модуля BT и подключиться к другому в коде?
приятно видеть, что вы смогли это понять сами... проверка всех значений в
loop()
несколько избыточна, просто вызовитеmovimento()
без оператораif
, @jsotolaСпасибо, и хороший момент. Я сузил код, чтобы объяснить логику, но в проекте я делаю этот оператор «если» действительно необходимым. Тем не менее, это правда, поскольку это просто ненужное утверждение «если»., @Matrodsilver