виртуальная клавиатура на usb host shield
- Войдите на сайт для отправки комментариев
Вс, 03/01/2016 - 08:43
Всем привет!
я только начал изучать ардуино и решил сделать виртуальную клавиатуру для компьютера с подсветкой двух кнопок. Как подклчать кнопки и светодиоды я уже разобрался, а вот с кодом не в ладах.
Основа для проекта была взята отсюда:
что я нажимаю и что должно загореться:
-нажимаю первую кнопку (подключена в пин 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);
}
}Прошу помощи в написании кода для моего проекта
я только начал изучать ардуино и решил сделать виртуальную клавиатуру для компьютера с подсветкой двух кнопок. Как подклчать кнопки и светодиоды я уже разобрался, а вот с кодом не в ладах.
Не слишком ли круто замахнулись для начинающего? И зачем Host-шилд? По вашим ссылкам всё старое, не факт, что заработает с новыми версиями arduino ide. Лучше бы вам делать это на леонардо / микро / промикро, там всё проще. Если нету, то почитайте мой вчерашний топик, там всё адаптировано к последней версии arduino ide.
я только начал изучать ардуино и решил сделать виртуальную клавиатуру для компьютера с подсветкой двух кнопок. Как подклчать кнопки и светодиоды я уже разобрался, а вот с кодом не в ладах.
Не слишком ли круто замахнулись для начинающего? И зачем Host-шилд? По вашим ссылкам всё старое, не факт, что заработает с новыми версиями arduino ide. Лучше бы вам делать это на леонардо / микро / промикро, там всё проще. Если нету, то почитайте мой вчерашний топик, там всё адаптировано к последней версии arduino ide.
Замахнулся круто, не спорю) но очень надо сделать сейчас контроллер для плеера Aimp. Хост шилд с юсби портом - это чтобы ардуина воспринималась не как ардуино а как обычная ПК клавиатура. С новыми версиями Arduino IDE не работает этот скетч, да, но он прекрасно работает с старой версией 1.0.5 (скетч с одной кнопкой проверял и загружал)
Из всех ардуино у меня есть только uno, nano, и pro-mini. Собираюсь вообще на pro mini это всё сделать, чтобы размеры контроллера были меньше.
А как можно ваш код адаптировать под мои нужды? что нужно дописать так, как я описывал вначлаа тоипка?
Для начала вам нужно инициализировать все пины и включить на них подтяжку на +5в. Пины свтодиодов тоже надо проинициализировать.
Для каждого светодиода завести переменную тригер - которая бы отображала состояние светодиода.
Для каждой кнопки в цикле нужно сделать условие - если на пине кнопки лог 0 то послать символ по усб , переключить светодиод(сравнивая значение тригера и изменяя его с записью в пин светодиода)
P.S. Рекомендую Pro Miсro(Atmega32u4) для этой задачи.
Для начала вам нужно инициализировать все пины и включить на них подтяжку на +5в. Пины свтодиодов тоже надо проинициализировать.
Для каждого светодиода завести переменную тригер - которая бы отображала состояние светодиода.
Для каждой кнопки в цикле нужно сделать условие - если на пине кнопки лог 0 то послать символ по усб , переключить светодиод(сравнивая значение тригера и изменяя его с записью в пин светодиода)
а сможете мне сделать строку кода хотя бы для одной кнопки со светодиодом, чтобы я дальше понял как остальные задействовать?
да я слышал,что для моих целей лучше испольлзовать pro micro или леонардо, но есть только uno, pro-mini, nano
если входпин(7) == лог0 то {
усбклаватура.послатькод('A');
если тригер1 == 0 то {
тригер1 = 1;
выходпин(светодиод1, лог1);
}иначе{
тригер1 = 0;
выходпин(светодиод1, лог0);
}
}
.... Тут то же самое для других кнопок ....
задержка(100мс); // задержка повторного нажатия
а как это всё будет на английском? это вы прописали в void loop? а как правильно инициализировать пины в начале кода для простой кнопки без светодиода, и кнопки со светодиодом?
Не понимая значения каждой команды вы никогда не напишите код. Вам нужно псидеть и почитать, возможно подучить английский. Чтобы видя программу вы понимали выполняемые действия. Написал так специально чтобы вы учились думать логически, а не "копировать-вставить".
Не понимая значения каждой команды вы никогда не напишите код. Вам нужно псидеть и почитать, возможно подучить английский. Чтобы видя программу вы понимали выполняемые действия. Написал так специально чтобы вы учились думать логически, а не "копировать-вставить".
хорошо, спасибо!
Я сделал этот проект, но присутствует то,что мне не нравится. Когда я нажимаю на кнопку и удерживаю, то символ печатается в редакторе постоянно, когда отпускаю кнопку, он не печатается.Мне надо сделать так,чтобы даже если я удерживаю нажатую кнопку, символ не печатался, чтобы символ печатался только один раз. Помогите с кодом пожалуйста
#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); } }