Проблемы с отправкой сигналов на 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, в котором я хотел использовать для освещения светодиод. В любом случае любая помощь будет очень признательна!
@CyClone, 👍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
- Сборка Arduino uno AVR со светодиодами
- Разбудить компьютер из Uno
- Лента Dotstar сходит с ума при подключении к MIDI-пианино
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- SD-карта не инициализируется
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Остановить мигание светодиодов
о каком светодиоде вы говорите? ... в вашем скетче нет кода управления светодиодом, @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