виртуальная клавиатура на usb host shield

kentforth
Offline
Зарегистрирован: 28.12.2015
Всем привет!
 
я только начал изучать ардуино и решил сделать виртуальную клавиатуру для компьютера с подсветкой двух кнопок. Как подклчать кнопки и светодиоды я уже разобрался, а вот с кодом не в ладах.
 
Основа для проекта была взята отсюда:
 
 
что я нажимаю и что должно загореться:
 
-нажимаю первую кнопку (подключена в пин 7)-в блокноте напечатан символ "А"
 
-нажимаю на вторую кнопку (подключена в пин 8)- в блокноте напечатан символ "B"
 
-нажимаю на третью кнопку (подключена в пин 9)- в блокноте напечатан символ "C" и горит светодиод (подключен в пин 10) до тех пор, пока я снова не нажму эту же кнопку
 
-нажимаю на четвёртую кнопку (подключена в пин 11) - в блокноте напечатан символ "D" и горит светодиод (подключен в пин 12) до тех пор, пока я снова не нажму эту же кнопку
 
код был взят отсюда:
 
 
#include "UsbKeyboard.h"

#define PIN_BUTTON 7 // the button is attached to pin 7

int lastState = LOW; // LOW is equivalent to 0

void setup() {
  //  button setup
  pinMode(PIN_BUTTON, INPUT);

  // USB setup -----------------
  // Disable timer0 since it can mess with the USB timing. Note that
  // this means some functions such as delay() will no longer work.
  TIMSK0 &= !(1<TOIE0);
  // Clear interrupts while performing time-critical operations
  cli();

  // Force re-enumeration so the host will detect us
  usbDeviceDisconnect();
  delayMs(250);
  usbDeviceConnect();

  // Set interrupts again
  sei();
}

void loop() {
  // update USB device state
  UsbKeyboard.update();

  // check, if transition to button-pressed has occured
  if( (digitalRead(PIN_BUTTON) == HIGH) && (lastState==LOW) ) {
    UsbKeyboard.sendKeyStroke(KEY_A); // if so, send the letter 'a' via USB keyboard
    lastState = HIGH; // update the state variable
    delay(10); // simple de-bouncing
  // check, if the button was released
  } else if( (digitalRead(PIN_BUTTON) == LOW) && (lastState==HIGH) ) {
    lastState = LOW; // if so, update the state variable
    delay(10); // simple de-bouncing
  }

}

// helper method for V-USB library
void delayMs(unsigned int ms) {
  for( int i=0; i<ms; i++ ) {
    delayMicroseconds(1000);
  }
}

Прошу помощи в написании кода для моего проекта

 

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

kentforth пишет:

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

Не слишком ли круто замахнулись для начинающего? И зачем Host-шилд? По вашим ссылкам всё старое, не факт, что заработает с новыми версиями arduino ide. Лучше бы вам делать это на леонардо / микро / промикро, там всё проще. Если нету, то почитайте мой вчерашний топик, там всё адаптировано к последней версии arduino ide.

kentforth
Offline
Зарегистрирован: 28.12.2015

dimax пишет:

kentforth пишет:

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

Не слишком ли круто замахнулись для начинающего? И зачем Host-шилд? По вашим ссылкам всё старое, не факт, что заработает с новыми версиями arduino ide. Лучше бы вам делать это на леонардо / микро / промикро, там всё проще. Если нету, то почитайте мой вчерашний топик, там всё адаптировано к последней версии arduino ide.

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

Из всех ардуино у меня есть только uno, nano, и pro-mini. Собираюсь вообще на pro mini это всё сделать, чтобы размеры контроллера были меньше. 

А как можно ваш код адаптировать под мои нужды? что нужно дописать так, как я описывал вначлаа тоипка?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Для начала вам нужно инициализировать все пины и включить на них подтяжку на +5в. Пины свтодиодов тоже надо проинициализировать.

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

Для каждой кнопки в цикле нужно сделать условие -  если на пине кнопки лог 0 то послать символ по усб , переключить светодиод(сравнивая значение тригера и изменяя его с записью в пин светодиода)

P.S. Рекомендую Pro Miсro(Atmega32u4) для этой задачи.

kentforth
Offline
Зарегистрирован: 28.12.2015

NeiroN пишет:

Для начала вам нужно инициализировать все пины и включить на них подтяжку на +5в. Пины свтодиодов тоже надо проинициализировать.

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

Для каждой кнопки в цикле нужно сделать условие -  если на пине кнопки лог 0 то послать символ по усб , переключить светодиод(сравнивая значение тригера и изменяя его с записью в пин светодиода)

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

да я слышал,что для моих целей лучше испольлзовать pro micro или леонардо, но есть только uno, pro-mini, nano

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

если входпин(7) == лог0 то {
   усбклаватура.послатькод('A');
   если тригер1 == 0 то {
      тригер1 = 1;
      выходпин(светодиод1, лог1);
   }иначе{
      тригер1 = 0;
      выходпин(светодиод1, лог0);
   }
}

.... Тут то же самое для других кнопок ....

задержка(100мс); // задержка повторного нажатия

kentforth
Offline
Зарегистрирован: 28.12.2015

 а как это всё будет на английском? это вы прописали в void loop? а как правильно инициализировать пины в начале кода для простой кнопки без светодиода, и кнопки со светодиодом?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

kentforth
Offline
Зарегистрирован: 28.12.2015

NeiroN пишет:

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

хорошо, спасибо!

kentforth
Offline
Зарегистрирован: 28.12.2015

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

 #include "UsbKeyboard.h"
 #define PIN_BUTTON1 7
 #define PIN_BUTTON2 9
 int lastState = LOW;

 void setup (){

 pinMode(8,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(7,INPUT);
 pinMode(9,INPUT);

 TIMSK0 &= !(1<TOIE0);

 cli();

 usbDeviceDisconnect();
 delayMs(250);
 usbDeviceConnect();
  
 sei();

 }

 void loop ()
 {
 UsbKeyboard.update();
 
  if( (digitalRead(PIN_BUTTON1) == HIGH) && (lastState==LOW) ) {
   UsbKeyboard.sendKeyStroke(KEY_A);
   lastState = HIGH;
   delay(50);//защита от дребезга
  

digitalWrite(8, !digitalRead(8));
digitalWrite(10, !digitalRead(10));//меняем значение порта на противоположное

}

  if( (digitalRead(PIN_BUTTON1) == LOW && (lastState==HIGH) ) ){ 
   lastState = LOW;
   delay(50);
}

if( (digitalRead(PIN_BUTTON2) == HIGH && (lastState==LOW) )){
  UsbKeyboard.sendKeyStroke(KEY_B);
  lastState = HIGH;
  delay(50);
 
    digitalWrite(10,!digitalRead(10)); 
    digitalWrite(8,!digitalRead(8)); 
}

if( (digitalRead(PIN_BUTTON2) == LOW && lastState==HIGH) ) {
  lastState = LOW;
  delay(50);
 }
}
void delayMs(unsigned int ms) {
  for( int i=0; i<ms; i++ ) {
    delayMicroseconds(1000);
  } 
}