Проблемы с отправкой сигналов на Arduino-Uno через клавиатуру

У меня есть Arduino Uno и экран usb 2.0, к которому я подключил клавиатуру. У меня установлены все необходимые библиотеки, но я пытаюсь понять, как зажечь светодиод при нажатии определенной клавиши.

Я новичок в кодировании плат Arduino, и я много читал, но я не могу понять свою проблему, я чувствую, что если я это выясню, мне будет намного лучше в моих будущих проектах.

#include <hidboot.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

int SKEY = 8;

class KbdRptParser : public KeyboardReportParser
{
    void PrintKey(uint8_t mod, uint8_t key);

  protected:

    void OnKeyDown  (uint8_t mod, uint8_t key);
    void OnKeyUp    (uint8_t mod, uint8_t key);
    void OnKeyPressed            (uint8_t key);
};

void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
  MODIFIERKEYS mod;
  *((uint8_t*)&mod) = m;
  Serial.print((mod.bmLeftCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmLeftShift  == 1) ? "S" : " ");
  Serial.print((mod.bmLeftAlt    == 1) ? "A" : " ");
  Serial.print((mod.bmLeftGUI    == 1) ? "G" : " ");

  Serial.print(" >");
  PrintHex<uint8_t>(key, 0x80);
  Serial.print("< ");

  Serial.print((mod.bmRightCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmRightShift  == 1) ? "S" : " ");
  Serial.print((mod.bmRightAlt    == 1) ? "A" : " ");
  Serial.println((mod.bmRightGUI  == 1) ? "G" : " ");
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
  Serial.print("DN ");
  PrintKey(mod, key);
  uint8_t c = OemToAscii(mod, key);

}

void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
  Serial.print("UP ");
  PrintKey(mod, key);
}

void KbdRptParser::OnKeyPressed(uint8_t key)
{
  Serial.print("ASCII: ");
  Serial.println((char)key);
};

USB Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);

KbdRptParser Prs;

void setup() { 
 
 Serial.begin(9600);
#if !defined(__MIPSEL__)
  while (!Serial); 
  Serial.println("Start");

  if (Usb.Init() == -1)
    Serial.println("OSC did not start.");

  delay( 1 );

  HidKeyboard.SetReportParser(0, &Prs);

}

void loop() {
 Usb.Task();
}

В любом случае, я знаю, как делать операторы if и как активировать контакты на Arduino, но я не могу понять это в этой библиотеке клавиатуры. На данный момент я просто заставил его напечатать "TRUE", так как нет необходимости усложняться, если я не могу заставить первый шаг работать. До того, как я сделал это утверждение if, последовательный монитор показывал значение, присвоенное ключу, и помечал его DN #, а когда я отпускал ключ, он говорил UP #, но как я могу перевести это на отправку импульса на любой вывод, когда я нажимаю клавишу, и прекратить отправку импульса, когда я нажимаю клавишу? отпустить ключ?

Кроме того, в моем заявлении if, которое я сделал, я знаю, что мне нужно что-то до == sign, но я попробовал несколько вещей, и они не сработали, поэтому я просто оставил его пустым, и причина, по которой я использовал число 16, заключалась в том, что это было значение, присвоенное ключу S, в котором я хотел использовать для освещения светодиод. В любом случае любая помощь будет очень признательна!

, 👍1

Обсуждение

о каком светодиоде вы говорите? ... в вашем скетче нет кода управления светодиодом, @jsotola

вы можете напечатать DN при нажатии клавиши... почему вы не можете включить светодиод при нажатии клавиши?, @jsotola

посылаю импульс на любой штифт, когда нажимаю клавишу и перестаю посылать импульс... это относится только к мигающему светодиоду ... если вы включаете светодиод и оставляете его включенным, то это не импульс, @jsotola

Я не хочу оставлять светодиод включенным... Я хочу иметь возможность нажать клавишу, чтобы включить светодиод, и когда я отпущу эту клавишу, светодиод должен погаснуть. Кроме того, я дал понять, что еще не сделал светодиодный код, потому что если я не могу понять, как сделать правильный if-оператор, то ничего из этого не сработает. Каждый раз, когда я пытаюсь, я получаю ошибку, которая была единственной причиной, по которой я задал этот вопрос, я знаю код, чтобы загореться светодиодом, но я не знаю, как это сделать, используя библиотеку клавиатуры..., @CyClone

в вашем посте ничего не говорится об ошибке ... почему бы вам не включить светодиод сразу после печати "DN"? ... выключите светодиод сразу после печати "ВВЕРХ"., @jsotola

Если бы я мог, я бы так и сделал... иначе зачем бы я задавал этот вопрос, если бы знал, как это сделать..., @CyClone

я ничего не понимаю ... найдите строку, которая печатает DN ... вставьте линию, которая включает светодиод сразу после него, @jsotola

Единственное утверждение "if", которое я вижу, - это "if (Usb.Init() == -1)", но это не похоже на то, с чем у вас возникли проблемы. Какое полное точное сообщение об ошибке вы получаете от Arduino IDE при компиляции кода?, @RedGrittyBrick

Вы отправили неправильный код? Где это утверждение "если", о котором вы говорите?, @Delta_G

В подпрограмме oneKeyDown вы получаете параметр key, который содержит нажатую клавишу. Сохраните его в переменной, и вы можете поместить эту переменную в оператор if, чтобы делать все, что хотите, если она равна некоторому значению. Или просто зажгите светодиод, когда кнопка нажата прямо там, в этой рутине., @Delta_G


1 ответ


1

Клавиатуры нельзя использовать совсем так, как вы хотите - клавиатура будет посылать код клавиши (сканирования) при нажатии клавиши, а затем повторять этот код, если кнопка продолжает нажиматься. При отпускании одного и того же ключа отправляется другой код.

Scancode для освобождения ключа получается из него путем установки бита старшего порядка (добавление 0x80 = 128). Таким образом, Esc press выдает scancode 01, Esc release scancode 81 (hex). Для последовательностей все обстоит примерно так же: Клавиатура-/ дает e0 35 при нажатии, e0 b5 при отпускании. Большинство клавиатур повторяют код make (key down code), когда клавиша повторяется.

От: https://www.win.tue.nl /~aeb/linux/kbd/scancodes-1.html

,

Очень странно, потому что, когда я нажимаю клавишу, к ней прикрепляется определенное число или комбинация букв. Например, когда я смотрю на последовательный монитор, он знает, какую клавишу я нажимаю и как долго. Я не понимаю, как Arduino знает через последовательный монитор, какая клавиша нажата, и может распечатать ее, но не может отправить импульс на определенный вывод в зависимости от продолжительности удержания клавиши. Если Arduino знает о нажатой конкретной клавише и ее продолжительности, нет никаких причин, по которым он не может зажечь светодиод., @CyClone

@CyClone Ну, этот вопрос и его ответ были оставлены в покое, потому что вы не отредактировали свой вопрос, ответив на 1) как вы пытались управлять светодиодом и 2) какую ошибку вы получили, пытаясь., @the busybee