неділю, 15 січня 2017 р.

как подключить USB клавиатуру к Arduino nano (uno и другие)


Задача стояла следующая: телевизор на котором отображается примитивная консоль для ввода логина и пароля. Логин и пароль, состоящий из букв и/или цифр, вводится с клавиатуры. Действия производимые при помощи клавиатуры должны быть озвучены. При правильном вводе пароля необходимо произвести некую коммутацию сигналов (проще говоря включить реле). Решена с помощью USB Host shield и библиотеки для Arduino TV-Out.

Задачу я разбил на 2 подзадачи
  1. Вывод изображения на экран
  2. Ввод данных с клавиатуры.

Вывод изображения на экран

Первую задачу я знал как решить, так как уже доводилось сталкиваться с библиотекой вывода ЧБ изображения на экран при помощи Arduino. Так же библиотека позволяет вывести звук определенной частоты и, при необходимости, длительности. 

Библиотеку использовал отсюда , файл TVout_w_audio.zip

Схема подключения
Замечу что в данной библиотеке использован вывод D8 для вывода изображения, вместо D7 как на сайте Arduino.

Интерфейс получился примерно такой:


Так же во время написания программы столкнулся с тем что при выводе текста в одну строку но по частям, или с использованием команды вывода текста на экран - получал ошибку компиляции. Например слово "LOGIN:" я вывожу одним оператором, а буквы введенные с клавиатуры этим же оператором только в следующей строке. Библиотека с сайта Arduino имеет функционал шире, но при этом так и не понял как избавиться от ошибки компиляции. В приведенной выше библиотеке с выводом изображения все ок. А вот при попытке проиграть простейшую мелодию из тонов разной частоты получал ошибку, пришлось оставить простое пикание например при вводе символов. 

Программу приводить не буду. Все операторы взял из примера который приложен к библиотеке. Символы поступают через последовательный порт из другой Arduino-ки. Разнес вывод изображения и ввод с клавиатуры на два контроллера, так как библиотеки конфликтуют между собой. Не имел желания и необходимости разбираться.

Ввод данных с клавиатуры

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

Самый простой способ подключить клавиатуру к ардуино это использовать интерфейс PS/2 и соответствующую библиотеку которая с легкостью гуглиться. Но клавиатур PS/2 значительно меньше (2017год на дворе как ни как :)  ), а клавиатура будет использоваться в жестких условиях. решил остановиться на USB клавиатуре. 

Поиски по гуглу дали ответ о том что можно клавиатуру подключить на прямую к ардуино, и есть библиотека которая позволяет софтварно добывать информацию с клавиатуры через USB интерфейс. Но мне показалось весьма сложной процедура копания в библиотеке, так как организована она на мой взгляд не очень явно. 

И тут я вспомнил что недавно заказал у китайцев USB HOST shield на микросхеме MAX3421E. Когда я покупал эту штуку я даже не представлял на сколько велик ее потенциал :) 


Шилд подключается необычным для меня образом через разъем ICSP. Причем Если reset дублируется и на основных выводах платы ардуино, то на шилд заходит только через панельку ICSP. Как я понимаю это связано с тем что плату можно переключать на 3,3В и на 5В логику. И трансляция в моем случае 5В логики ардуино на 3,3В для контроллера УСБ шилда производится как раз через ICSP. По этому привожу схему по которой я подключил шилд к своему контроллеру.


Библиотека и информация по работе с шилдом есть на сайте ардуино
Библиотеку можно скачать здесь.
С библиотекой идет куча величайшая примеров. Я взял этот пример:


Убрал из него обработку ненужных мне клавиш. Оставил лишь буквы, цифры, и стрелки курсора.
Пример написан очень аккуратно и понятно что за что отвечает. 
Коды полученые с клавиатуры транслируются через последовательный порт на контроллер который выводит видео. 

Код программы которая опрашивает клавиатуру через шилд 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <hidboot.h>
#include <usbhub.h>
 
// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif
 
class KbdRptParser : public KeyboardReportParser
{
  protected:
    void OnKeyDown  (uint8_t mod, uint8_t key);
 
};
 
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
 
  Serial.write(key);
 
}
 
 
 
 
USB     Usb;
//USBHub     Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);
 
uint32_t next_time;
 
KbdRptParser Prs;
 
void setup()
{
  Serial.begin( 115200 );
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
 
 
  if (Usb.Init() == -1)
  {
      while(1)
          {
              Serial.write(200); //Выводим в порт код 200, если не удалось инициализировать шилд
              delay(500);
          }
  }
  delay( 200 );
 
  next_time = millis() + 5000;
 
  HidKeyboard.SetReportParser(0, &Prs);
}
 
void loop()
{
  Usb.Task();
}

И так все удалось, клавиши с любой УСБ клавиатуры распознаются и передаются в контроллер видео для последующего вывода на экран.

Немає коментарів:

Дописати коментар