Управление esp32 с помощью клавиш клавиатуры

Я делаю проект, в котором мне нужно управлять мини-автомобилем и получать информацию от датчиков через Bluetooth. Я хотел бы иметь возможность управлять мини-автомобилем с помощью компьютерной клавиатуры (w,a,s,d), но мне не удалось найти библиотеку, которая могла бы в этом помочь, например «клавиатуру»; библиотека делает это , например, в Python

Пример

import keyboard

# при нажатии w машина едет вперед

If (keyboard.is_pressed("w"):

    Forward()

"Клавиатура" библиотека в ардуино, похоже, работает не так. И я не нашел в Интернете ни других библиотек, ни руководств по этому поводу.

Как заставить это работать?

, 👍0


1 ответ


2

На случай, если кто-то попытается сделать то же самое, я придумал, как заставить это работать. В 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. Дополнительная информация по предоставленной ссылке.
,

приятно видеть, что вы смогли это понять сами... проверка всех значений в loop() несколько избыточна, просто вызовите movimento() без оператора if, @jsotola

Спасибо, и хороший момент. Я сузил код, чтобы объяснить логику, но в проекте я делаю этот оператор «если» действительно необходимым. Тем не менее, это правда, поскольку это просто ненужное утверждение «если»., @Matrodsilver