PDA

Просмотр полной версии : Encoder + Arduino + Резистивные кнопки


TransF
15.06.2015, 18:15
В принципе в машине минимальный набор кнопок для любого кар-писишника это: Vol+, Vol-, AltTab, Previous и Rewind.Что на форуме уже реализовано в сообщении уважаемого lti1 (http://pccar.ru/showthread.php?p=319975#post319975)

есть ещё куча примеров и уроков как здесь на форуме так и на просторах инета о том как прикрутить энкодер (https://duino.ru/encoder.html)к ардуине (https://duino.ru/arduino.html)
например вот http://www.pccar.ru/showthread.php?t=20222

Теперь для меня встал вопрос как это объединить в один скетч и что бы это всё работало как клавиатура при подключении к любому PC в том числе и планшету. Прошу помощи знающих и ведающих програмированием :blush:

s.m.
16.06.2015, 02:08
теория
http://arduino.ru/forum/programmirovanie/usb-hid-multimedia-klaviatura-pod-android

коды клавиш

https://code.google.com/p/androhid/wiki/Keycodes

ардуина (https://duino.ru/arduino.html) годится любая, которая подключается напрямую к USB, без всяких USB-Serial мостов (FT232, CH340 etc.)

Читаем ссылки до полного просветления. Задаем вопросы, хотя там и так все понятно: прикидываемся USB-клавой, скетчем обрабатываем кнопки и энкодер (https://duino.ru/encoder.html), посылаем нужные сканкоды клавиатуры. Будет работать в любом аппарате на Андроид с поддержкой OTG.

TransF
16.06.2015, 15:17
Спасибо за ликбез, но это я всё читал и ничего непонятно. Мои знания в програмировании заканчиваются на школьном уровне, это как построить космический корабль кандидату юридических наук.

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


//Скетч регулятора громкости на энкодере для Arduino MICRO
// энкодер на 10 и 11 пинах выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT7)|(1<<PCINT6);
pinMode (7,INPUT_PULLUP);
pinMode (10,INPUT);
pinMode (11,INPUT);
attachInterrupt(4, key_mute, FALLING);
Remote.begin();
}
void loop() { }

ISR (PCINT0_vect){
static byte old_n=PINB&B11000000;
byte new_n=PINB&B11000000;
if (old_n==128&&new_n==192||old_n==64&&new_n==0) {Remote.increase();}
if (old_n==64&&new_n==192||old_n==128&&new_n==0) {Remote.decrease();}
old_n= new_n;
}

void key_mute() {Remote.mute();}


Вот так скетч для кнопок

//****************** Здесь необходимо указать свои значения ***************

int analogPin=0; // пин для подключения кнопок, по умолчанию A0

int release_button = 1023; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 10; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах
int vol_up = 111; // значение кнопки увеличить громкость
int vol_down = 222; // значение кнопки уменьшить громкость
int alt_tab = 333; // значение кнопки которая будет работать как Alt + Tab
int next = 444; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании
int previous = 555; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании
int play_pause = 777; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании

//************************************************** ************************

int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;

void setup()
{
Keyboard.begin();
}

void loop()
{
data=analogRead(analogPin);
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0)
{
eventTime=millis();
}

//********************** Громкость ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0)
{
Remote.increase();
flag = 5;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3)
{
Remote.increase();
flag = 3;
Remote.clear();
delay(100);
}

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_down - button_range && data <= vol_down + button_range && flag == 0)
{
Remote.decrease();
flag = 6;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3)
{
Remote.decrease();
flag = 3;
Remote.clear();
delay(100);
}

//********************** AltTab + Ещё что то ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - button_range && data <= alt_tab + button_range)
{
flag = 1;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis == 0)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis != 0)
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - button_release_range && data<=release_button + button_release_range)
{
flag = 0;
pauseMillis = 0;
Keyboard.releaseAll();
}

if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1)
{
flag = 0;
}
//********************** Next и Fast Forward ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next - button_range && data <= next + button_range)
{
flag = 2;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)
{
Remote.next();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + button_range && flag == 2 || data >= next - button_range && data <= next + button_range && flag == 3)
{
Remote.forward();
flag = 3;
Remote.clear();
delay(100);
}
//********************** Previous и Rewind ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous - button_range && data <= previous + button_range)
{
flag = 4;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)
{
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= previous - button_range && data <= previous + button_range && flag == 4 || data >= previous - button_range && data <= previous + button_range && flag == 3)
{
Remote.rewind();
flag = 3;
Remote.clear();
delay(100);
}

//********************** Play/pause + Mute ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range)
{
flag = 7;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 7)
{
Remote.play_pause();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 7)
{
Remote.mute();
flag = 0;
delay(10);
Remote.clear();
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6)
{
flag = 0;
}
}
Это то что я проверил на Ардуино Микро (Леонардо) (https://duino.ru/arduino-micro-arduino-leonardo.html)
подскажите как их объединить?

TransF
18.06.2015, 19:28
Нашел ещё одну тему
http://www.pccar.ru/showthread.php?t=20222
может всё таки кто нибудь подключится? или все грамотные а делиться грамотой стыдно?

Едиственное там все регулировки делаются фубаром, а хотелось бы на прямую в ОС регулировать громкость

s.m.
19.06.2015, 00:15
Собрал два вместе
Откуда эти либы Keyboard и Remote - лучше спросить в тех ветках, откуда взяты эти куски кода.


//****************** Здесь необходимо указать свои значения ***************

int analogPin=0; // пин для подключения кнопок, по умолчанию A0

int release_button = 1023; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 10; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах
int vol_up = 111; // значение кнопки увеличить громкость
int vol_down = 222; // значение кнопки уменьшить громкость
int alt_tab = 333; // значение кнопки которая будет работать как Alt + Tab
int next = 444; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании
int previous = 555; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании
int play_pause = 777; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании

//************************************************** ************************
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;


void setup() {
PCICR = 1<<PCIE0;
PCMSK0 = (1<<PCINT7)|(1<<PCINT6);
pinMode (7,INPUT_PULLUP);
pinMode (10,INPUT);
pinMode (11,INPUT);
attachInterrupt(4, keyMute, FALLING);

Remote.begin();
Keyboard.begin();
}

ISR (PCINT0_vect) {
static byte old_n = PINB&B11000000;
byte new_n = PINB&B11000000;
if (old_n == 128 && new_n == 192 || old_n == 64 && new_n == 0) {
Remote.increase();
}
if (old_n == 64 && new_n == 192 || old_n == 128 && new_n == 0) {
Remote.decrease();
}
old_n = new_n;
}

void keyMute() {
Remote.mute();
}

void loop() {
data = analogRead(analogPin);
if (data >= release_button - button_release_range && data <= release_button + button_release_range && flag == 0) {
eventTime = millis();
}

//********************** Громкость ************************************
if (millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0) {
Remote.increase();
flag = 5;
delay(10);
Remote.clear();
}

if (millis() - eventTime > time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3) {
Remote.increase();
flag = 3;
Remote.clear();
delay(100);
}

if(millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >= vol_down - button_range && data <= vol_down + button_range && flag == 0) {
Remote.decrease();
flag = 6;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3)
{
Remote.decrease();
flag = 3;
Remote.clear();
delay(100);
}

//********************** AltTab + Ещё что то ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - button_range && data <= alt_tab + button_range)
{
flag = 1;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis == 0)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis != 0)
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - button_release_range && data<=release_button + button_release_range)
{
flag = 0;
pauseMillis = 0;
Keyboard.releaseAll();
}

if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1)
{
flag = 0;
}
//********************** Next и Fast Forward ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next - button_range && data <= next + button_range)
{
flag = 2;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)
{
Remote.next();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + button_range && flag == 2 || data >= next - button_range && data <= next + button_range && flag == 3)
{
Remote.forward();
flag = 3;
Remote.clear();
delay(100);
}
//********************** Previous и Rewind ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous - button_range && data <= previous + button_range)
{
flag = 4;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)
{
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= previous - button_range && data <= previous + button_range && flag == 4 || data >= previous - button_range && data <= previous + button_range && flag == 3)
{
Remote.rewind();
flag = 3;
Remote.clear();
delay(100);
}

//********************** Play/pause + Mute ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range)
{
flag = 7;
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 7)
{
Remote.play_pause();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 7)
{
Remote.mute();
flag = 0;
delay(10);
Remote.clear();
}

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6)
{
flag = 0;
}
}


Пробуйте

TransF
23.06.2015, 14:42
Спасибо за сборку данного скетча, и с библиотеками всё норм, ни каких ошибок нет.
Но вот почему-то часть отвечающая за энкодер не работает при чем не могу понять почему(((

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

может сделать всю сборку попроще типа вот такой?
pinMode (10,INPUT);
pinMode (11,INPUT);

void setup()
{
Keyboard.begin();
}
void loop()
{ data=pinRead(PinMode 10);
Keyboard.press(VOL_UP);
}
{data=pinRead(PinMode 11);
Keyboard.press(VOL_DOWN);
}

demonnwx
03.07.2015, 20:39
Решил сделать Encoder (https://duino.ru/modul-encoder.html) + Arduino (https://duino.ru/arduino.html) + Резистивные кнопки.

Только у меня другой подход.

Я хочу сделать плату на Atmega8. Размеры платы не более 5х5 см. В плату будут подключаться резистивные кнопки и энкодер.

Мультимедиа клавишы
3 цифровых входа Энкодер VOL+ //// VOL- //// MUTE //// UNMUTE

5 ¬ходов кнопки матрица 5х4

1 Play/Pause 2 Stop 3 Next 4 Previous 5 Brightness+
6 Brightness- 7 Power 8 Reset 9 Forward 10 Back
11 Refresh 12 Full Screen 13 Sleep 14 Tab 15 Enter
16 Space 17 Lock 18 Reserve 19 Reserve 20 Reserve

Схема соединений уже нарисована, плата разведена. Осталось сделать печатные платы и прошить.

Нужны соискатели готовые приобрести плату (без компонентов).

10 плат обойдется в 20$, 2$ за штуку при условии 10 человек.

Жду вопросов и предложений.

TransF
07.07.2015, 10:39
Решил сделать Encoder (https://duino.ru/modul-encoder.html) + Arduino (https://duino.ru/arduino.html) + Резистивные кнопки.

Только у меня другой подход.

Я хочу сделать плату на Atmega8. Размеры платы не более 5х5 см. В плату будут подключаться резистивные кнопки и энкодер.

Мультимедиа клавишы
3 цифровых входа Энкодер VOL+ //// VOL- //// MUTE //// UNMUTE

5 ¬ходов кнопки матрица 5х4

1 Play/Pause 2 Stop 3 Next 4 Previous 5 Brightness+
6 Brightness- 7 Power 8 Reset 9 Forward 10 Back
11 Refresh 12 Full Screen 13 Sleep 14 Tab 15 Enter
16 Space 17 Lock 18 Reserve 19 Reserve 20 Reserve

Схема соединений уже нарисована, плата разведена. Осталось сделать печатные платы и прошить.

Нужны соискатели готовые приобрести плату (без компонентов).

10 плат обойдется в 20$, 2$ за штуку при условии 10 человек.

Жду вопросов и предложений.



Вопрос не в цене, а в реализации и рациональности данного проекта.
Ардуино всё таки универсальная штуковина и каждый может настроить ее как ему удобно, а в Вашем сообщении только слова.
Есть хотя бы макетка или пример который реально существует и работает?

Посидев на разных форумах и почитав сообщения умных (не то что я) людей практически собрал полноценный пульт на ардуине. )))

Чуть позже выложу схему и скетч)))

TransF
09.07.2015, 18:55
И так:
поиски по инету и общение с грамотными людьми дало свои результаты

1.100% работающий код для энкодера
//Скетч регулятора громкости на энкодере для Arduino PRO MICRO
// энкодер на 8 и 9 пинах выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Remote.begin();
}
void loop() { }

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {Remote.increase();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {Remote.decrease();}
old_n= new_n;
}

void key_mute() {Remote.mute();}

взято у этого доброго человека
http://arduino.ru/forum/programmirovanie/usb-hid-multimedia-klaviatura-pod-android#comment-111864

2. так же как и у всех тут на форуме работающий скетч от lti1 (http://pccar.ru/showthread.php?p=319975#post319975)

Сочленение этих двух скетчей ни выдает ни каких ошибок, проходит компиляцию, но работают только кнопки :unsure2: не могу понять в чем проблема. может у кого есть идеи где ошибка в скетче обьедененном?

//****************** Здесь необходимо указать свои значения ***************

int analogPin=0; // пин для подключения кнопок, по умолчанию A0

int release_button = 1023; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 20; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах
int vol_up = 130; // значение кнопки увеличить громкость
int vol_down = 340; // значение кнопки уменьшить громкость
int alt_tab = 380; // значение кнопки которая будет работать как Alt + Tab
int next = 470; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании
int previous = 600; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании
int play_pause = 700; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании

//************************************************** ************************
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;


void setup() {
PCICR = 1<<PCIE0;
PCMSK0 = (1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, keyMute, FALLING);

Remote.begin();
Keyboard.begin();
}

ISR (PCINT0_vect) {
static byte old_n = PINB&B11000000;
byte new_n = PINB&B11000000;
if (old_n == 32&&new_n==48 || old_n == 16&&new_n == 0) {Remote.increase();}
if (old_n == 16&&new_n==48 || old_n == 32&&new_n == 0) {Remote.decrease();}
old_n = new_n;
}

void keyMute() {
Remote.mute();
}

void loop() {
data = analogRead(analogPin);
if (data >= release_button - button_release_range && data <= release_button +

button_release_range && flag == 0) {
eventTime = millis();
}

//********************** Громкость ************************************
if (millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >=

vol_up - button_range && data <= vol_up + button_range && flag == 0) {
Remote.increase();
flag = 5;
delay(10);
Remote.clear();
}

if (millis() - eventTime > time_holding && data >= vol_up - button_range && data <=

vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up +

button_range && flag && flag == 3) {
Remote.increase();
flag = 3;
Remote.clear();
delay(100);
}

if(millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >=

vol_down - button_range && data <= vol_down + button_range && flag == 0) {
Remote.decrease();
flag = 6;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <=

vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <=

vol_down + button_range && flag == 3)
{
Remote.decrease();
flag = 3;
Remote.clear();
delay(100);
}

//********************** AltTab + Ещё что то ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab -

button_range && data <= alt_tab + button_range)
{
flag = 1;
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 1 && pauseMillis == 0)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 1 && pauseMillis != 0)
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}

if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button -

button_release_range && data<=release_button + button_release_range)
{
flag = 0;
pauseMillis = 0;
Keyboard.releaseAll();
}

if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <=

alt_tab + button_range && flag == 1)
{
flag = 0;
}
//********************** Next и Fast Forward ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next -

button_range && data <= next + button_range)
{
flag = 2;
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 2)
{
Remote.next();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= next - button_range && data <= next +

button_range && flag == 2 || data >= next - button_range && data <= next + button_range

&& flag == 3)
{
Remote.forward();
flag = 3;
Remote.clear();
delay(100);
}
//********************** Previous и Rewind ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous -

button_range && data <= previous + button_range)
{
flag = 4;
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 4)
{
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= previous - button_range && data <=

previous + button_range && flag == 4 || data >= previous - button_range && data <=

previous + button_range && flag == 3)
{
Remote.rewind();
flag = 3;
Remote.clear();
delay(100);
}

//********************** Play/pause + Mute ************************************

if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause

- button_range && data <= play_pause + button_range)
{
flag = 7;
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 7)
{
Remote.play_pause();
flag = 0;
delay(10);
Remote.clear();
}

if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <=

play_pause + button_range && flag == 7)
{
Remote.mute();
flag = 0;
delay(10);
Remote.clear();
}

if(data>=release_button - button_release_range && data<=release_button +

button_release_range && flag == 3 || data>=release_button - button_release_range &&

data<=release_button + button_release_range && flag == 5 || data>=release_button -

button_release_range && data<=release_button + button_release_range && flag == 6)
{
flag = 0;
}
}

TransF
23.07.2015, 14:59
Уважаемый lti1 прислал мне свой скетч для энекодера

//Скетч регулятора громкости на энкодере для Arduino PRO MICRO
// энкодер на 8 и 9 пинах выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Keyboard.begin();
}
void loop() { }

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(10);
Remote.clear();}
old_n= new_n;
}

void key_mute() {
Remote.mute();
delay(10);
Remote.clear();}

И он на самом деле шикарный нет ни дребезга ни проскакиваний всё чётко.
Но видимо у меня кривые руки не могу обьеденить скетч для кнопок и энкодера.
Хочу переделать теперь кнопки потому как щелчки не красивые и именно они дают дребезг при нажатии на кнопки хотя новые:sad2:

<<МиТяЙ>>
24.09.2015, 23:20
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0PinC = 5;
int encoder0PinD = 6;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int encoder0PinCLast = LOW;
int n = LOW;
int d = LOW;

void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
pinMode (encoder0PinC,INPUT);
pinMode (encoder0PinD,INPUT);
pinMode (8,INPUT_PULLUP);
attachInterrupt(4, key_mute, FALLING);
Serial.begin (9600);
}

// энкодер.1 - обработка звука
void loop() {
n = digitalRead(encoder0PinA);
d = digitalRead(encoder0PinC);

if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
Remote.increase();
delay(50);
Remote.clear();
} else {
Remote.decrease();
delay(50);
Remote.clear();
}
}
encoder0PinALast = n;

// энкодер.2 - обработка треков

if ((encoder0PinCLast == LOW) && (d == HIGH)) {
if (digitalRead(encoder0PinD) == LOW) {
Remote.next();
delay(50);
Remote.clear();
} else {
Remote.previous();
delay(50);
Remote.clear();
}
}
encoder0PinCLast = d;
}

// энкодер.2 - обработка нажатия

void key_mute() {
Remote.mute();
delay(100);
Remote.clear();}

Подскажите вот такой код для обработки 2 энкодеров можно использовать.

nikopol70
11.10.2015, 11:32
Уважаемый lti1 прислал мне свой скетч для энекодера

//Скетч регулятора громкости на энкодере для Arduino PRO MICRO
// энкодер на 8 и 9 пинах выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Keyboard.begin();
}
void loop() { }

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(10);
Remote.clear();}
old_n= new_n;
}

void key_mute() {
Remote.mute();
delay(10);
Remote.clear();}

И он на самом деле шикарный нет ни дребезга ни проскакиваний всё чётко.
Но видимо у меня кривые руки не могу обьеденить скетч для кнопок и энкодера.
Хочу переделать теперь кнопки потому как щелчки не красивые и именно они дают дребезг при нажатии на кнопки хотя новые:sad2:

шаг регулировки 4, а как сделать шаг 1?

lti1
11.10.2015, 14:42
шаг регулировки 4, а как сделать шаг 1?Похоже на дребезг контактов, конденсаторы в схеме присутствуют? Если нет попробуйте поставить 100 nF.

nikopol70
11.10.2015, 15:07
Похоже на дребезг контактов, конденсаторы в схеме присутствуют? Если нет попробуйте поставить 100 nF.

Нет, не верно поняли, кондеры стоят и регулировка происходит четко. Дребезга нет взагали.
В винде шаг регурировки 4 единицы, т.е. 0-4-8-12... и т.д.

В андроиде тоже все четко, но от мин до макс ползунок проходит за 4-5 щелчков энкодера.

Rage2
11.10.2015, 15:15
В андроиде тоже все четко, но от мин до макс ползунок проходит за 4-5 щелчков энкодера.

Так значит нужно увеличить количество пунктов уровня громкости в андройд до нужного значения. Xposed в помошь
как пример http://ru.wikihow.com/увеличить-шаги-максимального-звука-вашего-устройства-Андроид

TransF
19.10.2015, 00:24
В связи с покупкой нового руля, и ковырянием в куче всякой информации выяснилось что подключить новый руль в машине с его заводским устройством не представится возможным. (единственное поможет замена почти всей проводки в авто)
Родилась идея воткнуть всё рулевое (4 кнопки и 2 энкодера) в ещё одну ардуину.
Вот тут (http://www.pccar.ru/showthread.php?t=16718) нашёл пример включения 2 энкодеров.
Убрал всё что не относится к рулевому

Может кто посоветует что со скетчем?

ali_vlad
19.10.2015, 09:25
Тут уже кучу скетчей выложили, выбирай любой. Но я бы посоветовал использовать не аппаратное прерывание, а библиотеки. Bounce.h для ликвидации дребезга и encoder.h. Описания и примеры в интернете навалом.
Вечером добирусь до компа - выложу пример.

TransF
19.10.2015, 09:29
Все скетчи тут выложенные предусматривают подключение 3 пинов к ардуине, а в последнем варианте, всего 2.
В этом и вся сложность(((
Может я конечно совсем чайник, но мы тут и находимся все, чтобы делится опытом...

ali_vlad
19.10.2015, 11:15
Ну хоть чуть теорию почитай. Есть аналоговые входы. На них резистивные кнопки вешаются. Есть цифровые входы. Без матчасти тяжело будет.

TransF
19.10.2015, 11:44
Ну как всегда ((( повторюсь тем что было написано выше, мы тут для обсуждения того как и что тут реализовывает а не для ликвидации безграмотности.

Прошу прощения за грубость и с учетом Ваших заслуг и умений ali_vlad - Ваша позиция мне сейчас напоминает человека у которого всё есть и ему не хватает только кисточки для "чистки пупка". Можно же ткнуть туда, где есть реальные примеры которые можно переработать под мою идею, а "не возить меня по полу и указывать на мою безграмотность"

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

Правый энкодер - горомкость + -
TEL - play+stop
кнопка на правом энкодере - mute

Левый энкодер - треки >> и <<
MODE - Alt+tab
кнопка на левом энкодере - хотелось бы реализовать как яркость экрана в связке с левым энкодером, нажал и покрутил

ali_vlad
19.10.2015, 12:33
Ну как всегда ((( повторюсь тем что было написано выше, мы тут для обсуждения того как и что тут реализовывает а не для ликвидации безграмотности.

Прошу прощения за грубость и с учетом Ваших заслуг и умений ali_vlad - Ваша позиция мне сейчас напоминает человека у которого всё есть и ему не хватает только кисточки для "чистки пупка". Можно же ткнуть туда, где есть реальные примеры которые можно переработать под мою идею, а "не возить меня по полу и указывать на мою безграмотность"

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

Правый энкодер - горомкость + -
TEL - play+stop
кнопка на правом энкодере - mute

Левый энкодер - треки >> и <<
MODE - Alt+tab
кнопка на левом энкодере - хотелось бы реализовать как яркость экрана в связке с левым энкодером, нажал и покрутил

Если Вы такой нервный - персенчику попейте, а кисточку себе оставьте.
Вы сами не представляете, чего просите. Левый, правый, яркость...
А если левый и средний тогда что, конец света, земля остановилась? Повторяю еще раз без элементарных знаний Ваша идея так и останется идеей. Вы даже не можете 2 скетча сложить, а уже начали советы давать. Не всё так просто в ардуине. Вот (http://arduino.ru/forum/programmirovanie/usb-hid-multimedia-klaviatura-pod-android?page=1), почитайте. И это (http://arduino.ru/forum/apparatnye-voprosy/arduino-usb-hid) почитайте, про энкодер (http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder) почитайте. Про управление яркостью - здесь (http://openrtd2662.ru) ищите. А если у Вас есть время писать гневные коменты на дельные советы - значит Вы его бесполезно тратите. Потратьте его ан изучение матчасти.

ali_vlad
19.10.2015, 12:37
А если Вам лень учить - здесь (http://pccar.ru/showthread.php?t=20460) то, что Вы хотите, и знаний нужно 0,00000000000000000000000000000000.

TransF
19.10.2015, 13:02
Ну вот и померились как говориться.....

А за ссылки большое спасибО!
Пошёл учить мат.часть)

ali_vlad
19.10.2015, 13:12
И еще один совет: хотите безотказной работы - обратите особое внимание на последнюю ссылку. Ардуина - так, поиграться. Без серьезных знаний толку будет мало. Я тоже начинал с тех же граблей. Итог: ардуина так и осталась на макетке. Детей развлекать.
Дальше Вам понадобится умный блок питания. Тоже будете искать скетчи, складывать их. Ошибки неизбежны. А это тормоза, глюки, нервы. Потом посчитайте, сколько Вы туда вложили, сколько контроллеров спалили. Добавьте потраченное впустую время и у Вас выйдет...
Если Вы хотите нормальную вещь - берите то, что посоветовал. Можете мне сейчас не верить, но пойдет время и Вы поймете, что я был прав на 200%

ali_vlad
19.10.2015, 13:17
померились
помЕрились или помИрились:big:
Если что, то у меня 25см

TransF
20.10.2015, 11:40
Я лично и не сСорился чтобы мИриться.....
А размер не имеет значения, если не уметь пользоваться этим размером :big:

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

пока не ясен вопрос только с переключением треков с помощью энкодера :be:

ali_vlad
20.10.2015, 11:48
Одна голова хорошо, а две, три - уже бардак. :) Кидай наработки, вечером поковыряю. Переключение треков реализовать не сложно. Мой пример с громкостью и mute изучи. Там следует только заменить вызываемую из библиотеки remote финкцию.

TransF
21.10.2015, 00:01
Да наработок то как я понимаю и не нужно, lti1 уже всё наработал и оно работает (https://www.dropbox.com/s/rqsbb4xn1l6fbz3/%D0%AD%D0%BD%D0%BA%D0%BE%D0%B4%D0%B5%D1%80%20%D0%B 8%20%D1%80%D0%B5%D0%B7%D0%B8%D1%81%D1%82%D0%B8%D0% B2%D0%BD%D1%8B%D0%B5%20%D0%BA%D0%BD%D0%BE%D0%BF%D0 %BA%D0%B8.txt?dl=0), осталось только разобраться как раз со вторым энкодером для переключения треков, чем я в принципе и занимался непонимая что и как:dntknw:
ДЛя себя решил что просто не буду подключать ненужные мне кнопки и всё.

Кстати благодаря ковыряниям в инфе по энкодерам решил прозвонить все свои энкодеры и выяснилось что мой основной который уже работает на громкости он постоянно разомкнут (т.е. сигнал проходит только в момент поворота), а те что стоят в руле (завод ауди, сделал постоянно замкнутыми и в момент поворота происходит разрыв)
Не повлияет ли это как-то на скетч?

ali_vlad
21.10.2015, 08:14
Озадачил. Надо искать инфу по библиотеке bounce, так как она занимается обработкой энкодеров.

TransF
21.10.2015, 09:27
Да, как выяснилось по bounce (спасибо за направление) библиотеке пофик что обрабатывать замыкание или разрыв,
http://greenoakst.blogspot.ru/2012/06/arduino-bounce.html?m=1
Вот пример это демонстрирующий, главное указать ей начальные и конечные значения.
Блин на вид всё так просто, а когда начинаешь копать скетч, голова кругом.
И ещё нюанс, теперь даже проверить не могу эти энкодеры со скетчем, планшет готовлю в машину, а ардуину вытаскивать уже не вариант(((
Жду другую из поднебесной....

ali_vlad
21.10.2015, 10:39
Я ошибся. Библиотека encoder называется.

TransF
23.10.2015, 17:26
Я ошибся. Библиотека encoder называется.

Что-то я такой не нахожу ни где :dntknw:



НАШЕЛ)))
теперь бы как нибудь её изучить, сама библиотека есть теперь, а вот информации по ней, кто-то маловато будет (((

ali_vlad
23.10.2015, 18:59
Посмотри ссылки, которые я осталял. Там готовый пример с регулятором громкости и библиотекой энкодер и с пояснениями. С ней вообще всё просто: 3 режима. С аппаратным прерыванием, без прерываний и еще какой-то. На мой взгляд, лучше без прерываний.

ali_vlad
23.10.2015, 20:33
Забыл самое главное. Библиотека remote. Она всем рулит. А bounce, encoder это для избавления дребезга контактов.

defed
24.10.2015, 17:55
Привет.Подскажите, может знает кто нибудь. Залил скетч на ардуино pro micro управление звуком энкодером,все отлично работает. Но если запуск pipo x8 идет с данным регулятором то при включении он не работает пока не отключишь и подключишь его обратно. Может есть способ программно побороть это без задержки включения 5 вольт на usb?

ali_vlad
24.10.2015, 20:14
defed, мне кажется тебе с этой проблемой обратиться на ардуиновский форум. Там программистов больше чем здесь, а значит и вероятность получить решение проблемы больше.

TransF
22.11.2015, 18:34
Эпопея продолжается...
теперь есть всё необходимое для рулевого управления,
пишу скетч для правой (пока) чести управления

по отдельности 2 счетча работают
1 для кнопок int analogPin=0;
int data;

void setup()
{
Keyboard.begin();
Serial.begin(9600);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/

if (data>=28 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
delay(100);
}
2-й для энекодера громкости от lti1

а вот вместе они дружить не хотят ((((
что я могу не так соединять?
//Скетч регулятора громкости на энкодере для Arduino PRO MICRO
// энкодер на 8 и 9 пинах выводы подтянуты к питанию,
// конденсаторы на землю желательно.
//кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно.
int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Keyboard.begin();
Serial.begin(9600);
}
void loop() { }

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(10);
Remote.clear();}
old_n= new_n;
}

void key_mute() {
Remote.mute();
delay(10);
Remote.clear();}
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/
if (data==614) Keyboard.write(176); //ENTER
if (data==122) Keyboard.write(216); //стрелка влево
if (data==165) Keyboard.write(215); //стрелка вправо
if (data==216) Keyboard.write(218); //стрелка вверх
if (data==276) Keyboard.write(217); //стрелка вниз
if (data>=38 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
delay(100);
}

выдает вот такую ошибку
sketch_encoder:37: error: expected unqualified-id before '{' token

lti1
22.11.2015, 19:39
TransF, ну наверное потому, что в loop добавлять нужно, чтиво (http://developer.alexanderklimov.ru/arduino/arduino-minimum.php).
int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (7,INPUT_PULLUP);
pinMode (8,INPUT);
pinMode (9,INPUT);
attachInterrupt(4, key_mute, FALLING);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/
if (data==614) Keyboard.write(176); //ENTER
if (data==122) Keyboard.write(216); //стрелка влево
if (data==165) Keyboard.write(215); //стрелка вправо
if (data==216) Keyboard.write(218); //стрелка вверх
if (data==276) Keyboard.write(217); //стрелка вниз
if (data>=38 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(10);
Remote.clear();}
old_n= new_n;
}

void key_mute() {
Remote.mute();
delay(10);
Remote.clear();}
И зачем delay(100); в конце цикла?
P.S.
Это не мой скетч, я его только подправил.

TransF
22.11.2015, 23:59
P.S.
Это не мой скетч, я его только подправил.
Прошу прощения исправлюсь :blush:

И еще спасибо за чтиво, пока только читаю кучу теории и не совсем понимаю для чего какая команда,скорее даже пытаюсь повторить что делают другие :be:

Опытным путем выяснено что дэлэй для энкодера в показателе 100 исключает дребезг контактов (вместо 10 в оригинальном скетче)
Верхний дэлэй пришлось вернуть, так как только с его помощью исключил дребезг в кнопках мьют и плэй/пауза

на данном этапе скетч выглядит вот так
int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/
if (data>=28 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
delay(180);
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(100);
Remote.clear();}
old_n= new_n;
}



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

начал работу над левый частью, по особо не получается, мучаюсь с альт+табом

TransF
25.11.2015, 02:02
Помогите пожалуйста люди добрые, где-то скосячил не пойму где

int analogPin=0;
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта



if (data>=28 && data<=35) // альт+таб
{
flag = 1;
}
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
// что-то
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
delay(180);}

ISR (PCINT0_vect)
{
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.next();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.previous();
delay(100);
Remote.clear();}
old_n= new_n;
}

выходят ошибки
sketch_nov24a.ino: In function 'void loop()':
sketch_nov24a:40: error: expected unqualified-id before string constant
sketch_nov24a:41: error: a function-definition is not allowed here before '{' token
sketch_nov24a:53: error: expected `}' at end of input
я так понял первая потянула за собой остальной клубок

Lexx09
25.11.2015, 10:35
Разберись со скобками в блоке кода с 20-й по 32-ю строку. В строке 24 у тебя открывается скобка просто так, это неправильно. Вероятно, лишние скобки в строках 23 и 24, но тогда непонятки с переменной flag.

ali_vlad
25.11.2015, 11:41
Не хватает одной закрывающейся скобки в конце. Кстати про скобки: если курсор поместить на любую скобку то ответеая подсвеч вается. Самый простой способ проверки открытых и закрытых скобок.

TransF
25.11.2015, 19:50
Всё проверяю, всё сходится, поубирал лишние коменты что бы самому понимать что пытаюсь написать
всё тоже самое, в програматоре опять ошибка

sketch_nov25a.ino: In function 'void loop()':
при этом выделяется строка ISR (PCINT0_vect)

как я понял нет действия в loop
но ведь оно есть в setup как и в правом регуляторе громкости :be::be::be: и там всё работает

TransF
26.11.2015, 01:06
Почти вторая часть моего руля
int analogPin=0;
int data;
unsigned long flag = 0;
unsigned long pauseMillis = 0;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
if (data>=28 && data<=35) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if (data>=28 && data<=35) // ALT+TAB
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
delay(1800);
Keyboard.releaseAll();
}
if (data>=58 && data<=65) // домой
{
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
delay(180);
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.next();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.forward();
delay(100);
Remote.clear();}
old_n= new_n;
}
Альт+таб к сожалению пока не стабилен но уже работает :big:
почему-то приложения не все подряд перелистывает а ровно через одно.
После еще придется объединить скетчи, это я думаю осилю)

Lexx09
26.11.2015, 11:33
Вот этот кусок кода странный. Зачем два раза проверять одно и то же условие? Объедини.
if (data>=28 && data<=35) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if (data>=28 && data<=35) // ALT+TAB
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
delay(1800);
Keyboard.releaseAll();
}

Да, и сделай нормальные отступы...

TransF
26.11.2015, 15:03
Если я обьеденяю их, то происходит:
1) нажание АЛЬТ,
2) нажатие ТАБ
3) отпуск ТАБ
4) нажатие ТАБ
5)отпуск ТАБ
6) ожидание 3 секунды
7) отпуск всего
В связи с этим: 1 - происходит перескакивание таба на 2 приложения и 2 - пока не пройдёт 3 секунды на кнопку не реагирует.


Да, и сделай нормальные отступы...
Что значит нормальные отступы? (прошу прощения за тупость я гуманитарий и для меня нормальный отступ 1,25 в начале абзаца)
тут делал так просто для того чтобы себе понятнее было

TransF
29.11.2015, 01:13
Закончил с пайкой, и теперь у меня 2 половинки управления моим мультирулём.

скомпоновал скетч, всё кроме второго энкодера для переключения треков
ни как не получается ничего(((

подскажите что как дописать вот в этот рабочий скетч для второго энкодера?

int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/
if (data>=28 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
if (data>=140 && data<=150) // домой
{
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
if (data>=88 && data<=95) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.releaseAll();
}
delay(180);
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(100);
Remote.clear();}
old_n= new_n;
}
второй энкодер использую на 6 и 7 ногах ардуины

ali_vlad
29.11.2015, 12:28
Дребезг контактов надо подавлять. Или аппаратно или программно. На мой взгляд самый простой способ - использование библиотеки bounce. А иначе глюки будут всегда.
Так же не забыаайте про "подтяжку" кнопок по питанию. Или к плюсу или к земле. На столе может работать идеально, а в машине может глючить.

TransF
29.11.2015, 12:31
Дребезг контактов надо подавлять. Или аппаратно или программно. На мой взгляд самый простой способ - использование библиотеки bounce. А иначе глюки будут всегда.
Так же не забыаайте про "подтяжку" кнопок по питанию. Или к плюсу или к земле. На столе может работать идеально, а в машине может глючить.
(С дребезгом всё норм, по крайней мере на столе. аппаратно он заглушен 104 конденсаторам. Глюков НЕТ.) всё изменилось((

не смог реализовать переключения треков, нашел скетч, вот отсюда https://www.drive2.ru/c/2347322/
он к сожалению далек от идеала, и появился бешенный зребезг

поскажите пожалуйста как в этом скетче реализовать подавление дребезга библиотекой bounce

int analogPin=0;
int data;
unsigned long currentTime;
unsigned long loopTime;
const int pin_enc_A = 8; /// звук
const int pin_enc_B = 9; /// звук
const int pin_enc_C = 5; /// переключение
const int pin_enc_D = 4; /// переключение

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev=0;
void setup() {

Keyboard.begin();
Serial.begin(9600);
pinMode(pin_enc_A, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_B, INPUT_PULLUP); // encoder 2
pinMode(pin_enc_C, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_D, INPUT_PULLUP); // encoder 2
currentTime = millis();
loopTime = currentTime;
///attachInterrupt(4, key_mute, FALLING);

}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_C = digitalRead(pin_enc_C); // считываем состояние выхода А энкодера
encoder_D = digitalRead(pin_enc_D); // считываем состояние выхода А энкодера
if((!encoder_C) && (encoder_C_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_D)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.next();
delay(10);
Remote.clear();
}
else {
Remote.previous();
delay(10);
Remote.clear();
}
} encoder_C_prev = encoder_C;

}

////энкодер 2

currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_enc_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_enc_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.increase();
delay(5);
Remote.clear();
}
else {
Remote.decrease();
delay(5);
Remote.clear();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

loopTime = currentTime;
}

data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
/*поддерживаемые коды управляющих клавиш
http://arduino.cc/en/Reference/KeyboardModifiers*/
if (data>=28 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
if (data>=140 && data<=150) // домой
{
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
if (data>=88 && data<=95) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.releaseAll();
}
delay(180);
}

TransF
02.12.2015, 23:08
Посидел покрутил в руках то что нашёл для энкодеров в инете, и пришел к выводу что скетча лучше чем от lti1 просто не найти, дополнил его кнопками.

int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (9,INPUT);
pinMode (8,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
if (data>=28 && data<=35) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
delay(180);
if (data>=88 && data<=95) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.releaseAll();
}
delay(180);
if (data>=140 && data<=150) // домой
{
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
Remote.increase();
delay(10);
Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
Remote.decrease();
delay(100);
Remote.clear();}
old_n= new_n;
}

Помогите пожалуйста, дописать кусок скетча для переключения треков.

lti1
03.12.2015, 01:26
Помогите пожалуйста, дописать кусок скетча для переключения треков.Второй энкодер (https://duino.ru/encoder.html) подключается к D10 и D16, так же с резисторами и конденсаторами:
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4)|(1<<PCINT2)|(1<<PCINT6);
pinMode (9,INPUT);
pinMode (8,INPUT);
pinMode (16,INPUT);
pinMode (10,INPUT);
Keyboard.begin();
}
void loop() {
}

ISR (PCINT0_vect){
static byte old_n=PINB&B01110100;
byte new_n=PINB&B01110100;

if ((old_n & B00110000) == 32 && (new_n & B00110000) == 48 || (old_n & B00110000) == 16 && (new_n & B00110000) == 0) {
Remote.increase();
Remote.clear();
}
if ((old_n & B00110000) == 16 && (new_n & B00110000) == 48 || (old_n & B00110000) == 32 && (new_n & B00110000) == 0) {
Remote.decrease();
Remote.clear();
}

if ((old_n & B01000100) == 64 && (new_n & B01000100) == 68 || (old_n & B01000100) == 4 && (new_n & B01000100) == 0) {
Remote.next();
Remote.clear();
}
if ((old_n & B01000100) == 4 && (new_n & B01000100) == 68 || (old_n & B01000100) == 64 && (new_n & B01000100) == 0) {
Remote.previous();
Remote.clear();
}

old_n= new_n;
}

TransF
05.12.2015, 15:45
Второй энкодер (https://duino.ru/encoder.html) подключается к D10 и D16, так же с резисторами и конденсаторами:
int analogPin=0;
int data;

void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4)|(1<<PCINT2)|(1<<PCINT6);
pinMode (9,INPUT);
pinMode (8,INPUT);
pinMode (16,INPUT);
pinMode (10,INPUT);
Keyboard.begin();
}
void loop() {
}

ISR (PCINT0_vect){
static byte old_n=PINB&B01110100;
byte new_n=PINB&B01110100;

if ((old_n & B00110000) == 32 && (new_n & B00110000) == 48 || (old_n & B00110000) == 16 && (new_n & B00110000) == 0) {
Remote.increase();
Remote.clear();
}
if ((old_n & B00110000) == 16 && (new_n & B00110000) == 48 || (old_n & B00110000) == 32 && (new_n & B00110000) == 0) {
Remote.decrease();
Remote.clear();
}

if ((old_n & B01000100) == 64 && (new_n & B01000100) == 68 || (old_n & B01000100) == 4 && (new_n & B01000100) == 0) {
Remote.next();
Remote.clear();
}
if ((old_n & B01000100) == 4 && (new_n & B01000100) == 68 || (old_n & B01000100) == 64 && (new_n & B01000100) == 0) {
Remote.previous();
Remote.clear();
}

old_n= new_n;
}
Спасибо огромнейшее, теперь всё ровно и четко.

А не подскажете принцип вот этой строчки
if ((old_n & B01000100) == 4 && (new_n & B01000100) == 68 || (old_n & B01000100) == 64 && (new_n & B01000100) == 0) {
для собственного понимания?

TransF
05.12.2015, 16:03
Закончил, на компе всё работает, на телефоне тоже.
иду проверять на планшете в машине)
Последняя версия скетча:blush:

int analogPin=0;
int data;
void setup() {
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4)|(1<<PCINT2)|(1<<PCINT6);
pinMode (9,INPUT);
pinMode (8,INPUT);
pinMode (16,INPUT);
pinMode (10,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
if (data>=28 && data<=35) // приглушение звука
{
Remote.play_pause();
Remote.clear();
}
if (data>=58 && data<=65) // воспроизведение / пауза
{
Remote.mute();
Remote.clear();
}
delay(100);
if (data>=88 && data<=95) // ALT+TAB
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.releaseAll();
}
delay(180);
if (data>=140 && data<=150) // спать
{
Remote.power();
Remote.clear();
}
}
ISR (PCINT0_vect){
static byte old_n=PINB&B01110100;
byte new_n=PINB&B01110100;

if ((old_n & B00110000) == 32 && (new_n & B00110000) == 48 || (old_n & B00110000) == 16 && (new_n & B00110000) == 0) {
Remote.increase();
Remote.clear();
}
if ((old_n & B00110000) == 16 && (new_n & B00110000) == 48 || (old_n & B00110000) == 32 && (new_n & B00110000) == 0) {
Remote.decrease();
Remote.clear();
}

if ((old_n & B01000100) == 64 && (new_n & B01000100) == 68 || (old_n & B01000100) == 4 && (new_n & B01000100) == 0) {
Remote.previous();
Remote.clear();
}
if ((old_n & B01000100) == 4 && (new_n & B01000100) == 68 || (old_n & B01000100) == 64 && (new_n & B01000100) == 0) {
Remote.next();
Remote.clear();
}

old_n= new_n;
}
ОГРОМНОЕ спасибо всем кто помог мне в этой совсем не простой (для меня) задаче)

lti1
05.12.2015, 16:15
Спасибо огромнейшее, теперь всё ровно и четко.

А не подскажете принцип вот этой строчки
if ((old_n & B01000100) == 4 && (new_n & B01000100) == 68 || (old_n & B01000100) == 64 && (new_n & B01000100) == 0) {
для собственного понимания?Так как оба энкодера пишутся в одну переменную, сравнение производится с применением битовой маски (https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC% D0%B0%D1%81%D0%BA%D0%B0). Нагляднее будет так:
if ((old_n & B01000100) == B00000100 && (new_n & B01000100) == B01000100 ||
(old_n & B01000100) == B01000000 && (new_n & B01000100) == B00000000)

TransF
05.12.2015, 16:22
Проверяю на nexus-e,
Альт\таб - переключает между собой только последние 2 приложения
Мьют - вообще не работает( планшет думает что мьют включают на входящие звонки, во время воспроизведения звук не глушит как на компьютере (((
Рано радоваться(((
Так как оба энкодера пишутся в одну переменную, сравнение производится с применением битовой маски (https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC% D0%B0%D1%81%D0%BA%D0%B0). Нагляднее будет так:
if ((old_n & B01000100) == B00000100 && (new_n & B01000100) == B01000100 ||
(old_n & B01000100) == B01000000 && (new_n & B01000100) == B00000000)
Спасибо за информацию. Чесно говоря ничего не понял.

lti1
05.12.2015, 16:39
Проверяю на nexus-e,
Альт\таб - переключает между собой только последние 2 приложения
Мьют - вообще не работает( планшет думает что мьют включают на входящие звонки, во время воспроизведения звук не глушит как на компьютере (((
Рано радоваться(((

Спасибо за информацию. Чесно говоря ничего не понял.
Про Alt+Tab я же вам в личку писал, то что Вы сделали нормально работать не будет.

~aviator~
26.02.2016, 16:27
темка еще жива?
на панели компа есть энкодер с кнопкой и еще 2 кнопки
поможет ли мне этот скетч и схема в реализации задачи по регулирвки громкости например+ выкл/вкл звука и еще 2 кнопки например по переходу трека вперед/назад

TransF
27.02.2016, 10:05
темка еще жива?
на панели компа есть энкодер с кнопкой и еще 2 кнопки
поможет ли мне этот скетч и схема в реализации задачи по регулирвки громкости например+ выкл/вкл звука и еще 2 кнопки например по переходу трека вперед/назад
Да поможет, но может там уже какое то устройство есть, чтобы не изобретать велосипед?

~aviator~
28.02.2016, 00:25
есть но дорого для меня пока

TransF
28.02.2016, 00:27
есть но дорого для меня пока

Если устройство уже есть, ведь энкодер есть, значит просто нужно заставить работать.

defed
28.02.2016, 12:25
Всем привет! А кто нибудь пытался на pro micro (https://duino.ru/arduino-pro-micro.html) сделать Энкодер (https://duino.ru/modul-encoder.html) + матричная клавиатура 4*4 (https://duino.ru/Klaviatura-membrannaya-4-H-4.html), 3*4 ? Сделал Энкодер + резистивные кнопки, но не очень нравится их работа. Есть ошибки при срабатывании... хотя висят и резисторы и конденсаторы, подальше разнёс значения кнопок и питание дополнительно стабилизировано.. Нашел пример кода для матричной клавиатуры 3*4 но пока не могу добиться срабатывания всех кнопок. Может есть у кого опыт?

lti1
28.02.2016, 14:23
Всем привет! А кто нибудь пытался на pro micro (https://duino.ru/arduino-pro-micro.html) сделать Энкодер (https://duino.ru/modul-encoder.html) + матричная клавиатура 4*4 (https://duino.ru/Klaviatura-membrannaya-4-H-4.html), 3*4 ? Сделал Энкодер + резистивные кнопки, но не очень нравится их работа. Есть ошибки при срабатывании... хотя висят и резисторы и конденсаторы, подальше разнёс значения кнопок и питание дополнительно стабилизировано.. Нашел пример кода для матричной клавиатуры 3*4 но пока не могу добиться срабатывания всех кнопок. Может есть у кого опыт?http://arduino.ru/forum/programmirovanie/podklyuchenie-matrichnoi-klaviatury-4kh4-i-ispolzovanie-biblioteki-keypad

defed
28.02.2016, 19:13
http://arduino.ru/forum/programmirovanie/podklyuchenie-matrichnoi-klaviatury-4kh4-i-ispolzovanie-biblioteki-keypad

Спасибо за направление. Подскажите а как прикрепить сюда нажатие на F1 ? в порт посылает четко .Можно пример если не трудно. Спасибо огромное заранее!

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact <a href="mailto:alexanderbrevig@gmail.com">alexanderbrevig@gmail.com</a>
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
Serial.begin(9600);
}

void loop(){
char customKey = customKeypad.getKey();

if (customKey){
Serial.println(customKey);
}
}

lti1
28.02.2016, 20:41
Спасибо за направление. Подскажите а как прикрепить сюда нажатие на F1 ? в порт посылает четко .Можно пример если не трудно. Спасибо огромное заранее!

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact <a href="mailto:alexanderbrevig@gmail.com">alexanderbrevig@gmail.com</a>
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
Serial.begin(9600);
}

void loop(){
char customKey = customKeypad.getKey();

if (customKey){
Serial.println(customKey);
}
}
Keyboard.press(KEY_F1);
https://www.arduino.cc/en/Reference/KeyboardModifiers
https://www.arduino.cc/en/Reference/KeyboardBegin

~aviator~
29.02.2016, 11:11
подскажите скачал IDE 1.0.5v2
заменил файлы как сказано, а он не хочет компилиться, говорит, только с леонардо будет работать

TransF
29.02.2016, 14:00
подскажите скачал IDE 1.0.5v2
заменил файлы как сказано, а он не хочет компилиться, говорит, только с леонардо будет работать

Так и есть ПРО МИКРО это и есть ЛЕОНАРДО

~aviator~
29.02.2016, 14:17
Так и есть ПРО МИКРО это и есть ЛЕОНАРДО

я уже понял, буду заказывать

~aviator~
02.03.2016, 16:57
Еще такой вопрос, а как происходит назначение клавиш?
как на них повесить, то что необходимо

kazanova
09.03.2016, 14:04
Всем привет!

А ни у кого не было проблем с засыпанием леонардо? У меня планшет при подключенной ардуино про микро (леонардо) некорректно уходит в гибернацию (не восстанавливается и сообщает о произошедшей ошибке). При этом на домашнем ноуте все нормально. Куда копать - ума не приложу?

TransF
01.06.2016, 17:12
Доброго времени суток одноклубням!
Подскажите как прикрутить к уже рабочей схеме АРДУИНО-МУЛЬТИМЕДИА-КЛАВИАТУРЕ блютуз передатчик?

avaRi
31.10.2016, 20:48
Всем привет! Подскажите нормальный скейч для Двух энкодеров с кнопками
https://www.youtube.com/watch?v=Mo5p6z5B27k вот здесь все работает но не могу найти исходники! Может у кого сохранилось?

TransF
31.10.2016, 21:21
http://www.pccar.ru/showthread.php?t=23202&page=6
Самое верхнее сообщение.

Там же мой скетч с добавленными кнопками.

https://youtu.be/J7EMfMGWc9Y
Работает вот так.

avaRi
31.10.2016, 23:06
http://www.pccar.ru/showthread.php?t=23202&page=6
Самое верхнее сообщение.

Там же мой скетч с добавленными кнопками.

https://youtu.be/J7EMfMGWc9Y
Работает вот так.

Там в ВИдео управление именно кнопками на энкодере они простые не резестивные. Энкодер именно ардуиновский. МУте получается а вот альт таб не хочет

TransF
31.10.2016, 23:17
Там в ВИдео управление именно кнопками на энкодере они простые не резестивные. Энкодер именно ардуиновский. МУте получается а вот альт таб не хочет

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

Альт таб реализован и работает что четко видно из моего видео. Скетч там же ниже написан, оъединение нескольких скетчей.

avaRi
31.10.2016, 23:44
Спасибо да реально затупил, у нас уже утро. Подскажите какое сопротивление ставили на кнопки? Вернее схему!

TransF
31.10.2016, 23:52
Спасибо да реально затупил, у нас уже утро. Подскажите какое сопротивление ставили на кнопки?

Уже давно не помню своих значений.
Хотя они вам не помогут. Ваше железо даст свои показатели. Считывание их и потом вводите в конечный скетч.

avaRi
01.11.2016, 00:09
У меня показывает нули с 10 кОм может нужно меньше.
http://www.pccar.ru/attachment.php?attachmentid=41326&d=1445200047
ПО этой схеме подключали?

TransF
01.11.2016, 00:18
У меня показывает нули с 10 кОм может нужно меньше.
http://www.pccar.ru/attachment.php?attachmentid=41326&d=1445200047
ПО этой схеме подключали?
Нет. Сейчас с телефона не смогу найти тему. Тут на форуме есть общая тема по рулевым резистивный кнопкам. Там есть всё. Только там 50 страниц, было последний раз. Где то на первом десятке есть все ответы. Всё остальное в большей мере флуд.
Изучить эту тему как минимум все равно придется.

uncann
09.01.2017, 23:59
Скетч поставил - все работает, вот только кроме одной кнопки "Power", пока без нее :)
В чем проблема? библиотеку какую то походу надо?

sketch_jan10a:38: error: 'class Remote_' has no member named 'power'
'class Remote_' has no member named 'power'

TransF
10.01.2017, 00:45
Скетч поставил - все работает, вот только кроме одной кнопки "Power", пока без нее :)
В чем проблема? библиотеку какую то походу надо?

sketch_jan10a:38: error: 'class Remote_' has no member named 'power'
'class Remote_' has no member named 'power'

А кнопки повер в скетче и не было.
Я пользую 2 провода на кнопку основного энкодера.

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

uncann
10.01.2017, 08:10
Ну и имеется в виду спать, просто это же кнопка "power" :)
Вот как в скрипте на 6-ой странице, строка которая не проходит компиляцию:

if (data>=140 && data<=150) // спать
{
Remote.power();
Remote.clear();
}

lti1
10.01.2017, 09:03
Ну и имеется в виду спать, просто это же кнопка "power" :)
Вот как в скрипте на 6-ой странице, строка которая не проходит компиляцию:

if (data>=140 && data<=150) // спать
{
Remote.power();
Remote.clear();
}
http://pccar.ru/showthread.php?p=277286#post277286

uncann
11.01.2017, 19:01
Не, файлики то поменяны, но заменил попробовать из тех что по ссылке - все равно так же 'class Remote_' has no member named 'power' :(

uncann
12.01.2017, 19:03
О! Победил :)
Оказывается надо так:
Remote.power();
Remote.clear();
То есть "Power" надо с маленькой буквы! С чего бы ради - непонятно, но так скомпилировалось.

T0xa
01.03.2017, 11:13
Всем привет! Стоит задача рулить цифровым потенциометром используя энкодер. Написал скетч - залил в Arduino Uno, (https://duino.ru/arduino-uno-ch340g.html) подтянул пины по питанию через встроенные резисторы. Все работает и регулируется. НО после того как перенес этот скетч на Pro Mini 3.3V 8Mhz (https://duino.ru/arduino-pro-mini.html), то появился глюк - вращаешь энкодер в любую сторону а он циклично меняет значение сначала до минимума а потом до максимума (либо наоборот, смотря в какую сторону крутить). Попробовал переписать скетч под библиотеку Encoder.h, но в результате все повторяется. На Uno работает как должно, а на Pro Mini циклично меняет значение, как будто энкодер попеременно вращаешь в разные стороны. Возможно где-то по схемотехнике чего-то надо добавить? В общем, прошу помощи.

skanch
01.03.2017, 16:23
Я нисколько не программист, но пользуюсь таким (http://www.pccar.ru/showpost.php?p=357302&postcount=31) скетчем в своих поделках. Связка: энкодер+ProMini 5V 16Mhz (https://duino.ru/arduino-pro-mini.html) работает нормально.

T0xa
01.03.2017, 19:14
Я нисколько не программист, но пользуюсь таким (http://www.pccar.ru/showpost.php?p=357302&postcount=31) скетчем в своих поделках. Связка: энкодер+ProMini 5V 16Mhz (https://duino.ru/arduino-pro-mini.html) работает нормально.
Благодарю, но на мой взгляд слишком громоздко. Нашел решение своей проблемы - подтянул пины по питанию через внешние резисторы 10 кОм и для надежности добавил конденсаторы 0.1 мкф. Все пришло в норму :smile2:

skanch
01.03.2017, 19:22
... Нашел решение своей проблемы - подтянул пины по питанию через внешние резисторы 10 кОм и для надежности добавил конденсаторы 0.1 мкф. Все пришло в норму :smile2:
Все оказалось куда проще, чем я мог предположить... Удачи в проекте!

Las42kuz
10.08.2017, 20:50
Здравствуйте делаю планшет в машину! Остановился на подключении кнопок на руле точнее я подключил ардуйно про микро и кнопки но сейчас решил добавить энкодер (https://duino.ru/modul-encoder.html) и теперь не знаю как объединить два сетча помогите пожалуйста , сам не осилю! По отдельности все работает! Заранее спасибо

это для энкодера
[PHP]#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная
uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель

void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
Keyboard.begin(); //подключим как клава
}
void loop()
{

{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_LEFT_ALT); //нажмем кнопку ALT
Keyboard.press(KEY_TAB); //нажмем кнопку TAB
Keyboard.release(KEY_TAB); //отпустим кнопку TAB
delay(150); //ждем 150мс чтоб не скакало по окошкам
vibor = millis(); //запускаем отсчет времени
perek=1; //переменной переключателя присваиваем 1
}
if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
{
Keyboard.releaseAll(); //отпускаем все кнопки
perek = 0; //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
}
}
/PHP]
для кнопок на руль

[PHP]int rknop; // это переменная которая хранит значения наших кнопок.
void setup()
{
Serial.begin(9600); //это скорость соединения с компьютером (для сериал монитора в нашем случае)

pinMode(rknop,INPUT);
}

void loop()
{
rknop=analogRead(A0); //Считываем значения на порту A0 и записываем значения в переменную rknop
Serial.println(rknop); //Отправляем данные переменной rknop на компьютер
delay(200); //небольшая задержка в пол секунды, её можно удалить но значения в сериал мониторе будет меняться очень быстро

///////////////////////////////////////////
if(rknop < 969 && rknop > 966) //здесь мы делаем условие. Т.е если у наз значение переменной rknop больше 900 и меньше 960 то делаем какоето действие которая ниже. На сколько мы помним при нажатии кнопки S1 у нас значения были ~930 так вот мы могли написать просто if(rknop == 930) что означает если rknop равно 930 то делем дейсвие которое ниже, но наши значения немного игрют поэтому мы задаем никий промежуток от 900 до 960
{
Remote.next(); //отправляем команду следующая песня
delay(200); //делаем небольшую задержу чтоб устройство успело отправить необходимые команды на планшет или компьютер и не засыпать его командами
Remote.clear();//очищаем команду
}

////////////////////////////////////////////
if(rknop < 994 && rknop > 992)
{
Remote.previous(); //предыдущая песня
delay(200);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 927 && rknop > 925)
{
Remote.play_pause(); //плей и паузу
delay(200);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1009 && rknop > 1007)
{
Remote.increase(); //громкость прибавить
delay(000);
Remote.clear();
}

////////////////////////////////////////////
if(rknop < 1019 && rknop > 1015)
{
Remote.decrease(); //громкость убавить
delay(000);
Remote.clear();
}/PHP]

jonikus81
11.08.2017, 07:16
Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.

Las42kuz
11.08.2017, 08:43
Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.

Я в этом не силен делал все по урокам на youtube по отдельности и энкодер и кнопки на руле работают :
https://yadi.sk/d/YrXiZwyB3Ltp8P
https://yadi.sk/d/1N16cgDh3Ltp7Y

Las42kuz
11.08.2017, 09:13
Las42kuz, как оно могло у Вас работать, если не хватает библиотек в обоих скетчах и желательно ссылку на них ибо стандартные не работают.
https://yadi.sk/d/hGU3nP4w3LtqKZ

jonikus81
11.08.2017, 12:23
https://yadi.sk/d/gjjMKyYZ3Lu7iB
пробуйте, так как все железки дома, протестировать не могу

Las42kuz
11.08.2017, 12:46
https://yadi.sk/d/gjjMKyYZ3Lu7iB
пробуйте, так как все железки дома, протестировать не могу

попробовал работает но жутко тормозит само нажатие кнопок и энкодера

lti1
12.08.2017, 01:17
Las42kuz, пробуйте. Схема подключения резистивных кнопок здесь (http://pccar.ru/showthread.php?p=319975#post319975)./*
вывод 1 энкодера к выводу 3 ардуино
вывод 2 энкодера к выводу 4 ардуино
общий вывод энкодера к выводу GND ардуино
резестивные кнопки к выводу A0 ардуино
*/
//****************** Здесь необходимо указать свои значения ***************

#define analogPin 0 // пин для подключения кнопок, по умолчанию A0

/* возможные действия
vol_up_action() Увеличить громкость
vol_down_action() Уменьшить громкость
next_action() Следующий трек
forward_action() Предыдущий трек
previous_action() Перемотка вперед
rewind_action() Перемотка назад
play_pause_action() Play/Pause
mute_action() Приглушение звука
alt_tab_action() Alt + Tab
home_action() Переход на домашний экран
play_action() Play
pause_action() Pause
stop_action() Stop
power_action() Питание (Включить или выключить экран)
mouse_wheel_up() Вращение колеса мыши от себя
mouse_wheel_down() Вращение колеса мыши на себя
*/
// только на кнопках 1-4 при удержании действие повторяется 10 раз в секунду

#define encoder_up vol_up_action() // действие на энкодер
#define encoder_down vol_down_action() // действие на энкодер
#define key_1_press vol_up_action() // действие на короткое нажатие кнопки 1
#define key_1_holding vol_up_action() // действие на удержание кнопки 1
#define key_2_press vol_down_action() // действие на короткое нажатие кнопки 2
#define key_2_holding vol_down_action() // действие на удержание кнопки 2
#define key_3_press next_action() // действие на короткое нажатие кнопки 3
#define key_3_holding forward_action() // действие на удержание кнопки 3
#define key_4_press previous_action() // действие на короткое нажатие кнопки 4
#define key_4_holding rewind_action() // действие на удержание кнопки 4
#define key_5_press play_pause_action() // действие на короткое нажатие кнопки 5
#define key_5_holding mute_action() // действие на удержание кнопки 5
#define key_6_press alt_tab_action() // действие на короткое нажатие кнопки 6
#define key_6_holding home_action() // действие на удержание кнопки 6
#define key_7_press mouse_wheel_up() // действие на короткое нажатие кнопки 7
#define key_7_holding // действие на удержание кнопки 7
#define key_8_press mouse_wheel_down() // действие на короткое нажатие кнопки 8
#define key_8_holding // действие на удержание кнопки 8
#define key_9_press // действие на короткое нажатие кнопки 9
#define key_9_holding // действие на удержание кнопки 9

#define release_button 1023 // значение при отпущенных кнопках
#define button_release_range 50 // диапазон значения + - при отпущенных кнопках
#define button_range 10 // диапазон значения нажатых кнопок + -
#define time_holding 500 // время для удержания кнопок в миллисекундах
#define time_tinkling 30 // время исключающее дребезг контактов в миллисекундах
#define key_1 1500 // значение кнопки 1
#define key_2 1500 // значение кнопки 2
#define key_3 1500 // значение кнопки 3
#define key_4 1500 // значение кнопки 4
#define key_5 1500 // значение кнопки 5
#define key_6 1500 // значение кнопки 6
#define key_7 1500 // значение кнопки 7
#define key_8 1500 // значение кнопки 8
#define key_9 1500 // значение кнопки 9
//************************************************** ************************

uint32_t timer, data_save, data_key, timer_alt_tab;
uint16_t data, counter;
uint8_t pinb_state, pinb_state_save, pind_state;

void setup() {
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Keyboard.begin();
Mouse.begin();
DDRD &= ~(1<<0);
PORTD |= (1<<0);
DDRD &= ~(1<<4);
PORTD |= (1<<4);
}

void loop() {
data = analogRead(analogPin);
if((millis() - timer) > 5) {
timer = millis();
encoder();
key();
}
if((millis() - timer_alt_tab) == 1000) {
Keyboard.release(KEY_LEFT_ALT);
}
}

void encoder() {
if ((PIND & B00010001) != B00010001 && (PIND & B00010001)!= B00000000) {
if ((PIND & B00010001) == B00010000 && pind_state == B00000001) {
encoder_up;
}
else if ((PIND & B00010001) == B00000001 && pind_state == B00010000) {
encoder_down;
}
pind_state = (PIND & B00010001);
}
else if ((PIND & B00010001) == B00010001) {
pind_state = B00000000;
}
}

void key() {
if(data >= release_button - button_release_range && data <= release_button + button_release_range) { // кнопки отпущены
if(counter > (time_tinkling / 5) && counter < (time_holding / 5)) { // короткое нажатие какой-либо кнопки и больше времени исключающее дребезг
data_key = data_save / counter;
if(data_key >= (key_1 - button_range) && data_key <= (key_1 + button_range)) {
key_1_press;
}
if(data_key >= (key_2 - button_range) && data_key <= (key_2 + button_range)) {
key_2_press;
}
if(data_key >= (key_3 - button_range) && data_key <= (key_3 + button_range)) {
key_3_press;
}
if(data_key >= (key_4 - button_range) && data_key <= (key_4 + button_range)) {
key_4_press;
}
if(data_key >= (key_5 - button_range) && data_key <= (key_5 + button_range)) {
key_5_press;
}
if(data_key >= (key_6 - button_range) && data_key <= (key_6 + button_range)) {
key_6_press;
}
if(data_key >= (key_7 - button_range) && data_key <= (key_7 + button_range)) {
key_7_press;
}
if(data_key >= (key_8 - button_range) && data_key <= (key_8 + button_range)) {
key_8_press;
}
if(data_key >= (key_9 - button_range) && data_key <= (key_9 + button_range)) {
key_9_press;
}
}
data_save = 0;
counter = 0;
}
else { // нажата какая-то кнопка
counter++;
data_save = data_save + data;
if(counter >= (time_holding / 5)) { // удержание какой-либо кнопки
data_key = data_save / counter;
if((counter % 20) == 0) { // действие повторяется 10 раз в секунду, пока кнопка нажата
if(data_key >= (key_1 - button_range) && data_key <= (key_1 + button_range)) {
key_1_holding;
}
if(data_key >= (key_2 - button_range) && data_key <= (key_2 + button_range)) {
key_2_holding;
}
if(data_key >= (key_3 - button_range) && data_key <= (key_3 + button_range)) {
key_3_holding;
}
if(data_key >= (key_4 - button_range) && data_key <= (key_4 + button_range)) {
key_4_holding;
}
}
if(counter == (time_holding / 5)) { // действие выполняется 1 раз при удержании
if(data_key >= (key_5 - button_range) && data_key <= (key_5 + button_range)) {
key_5_holding;
}
if(data_key >= (key_6 - button_range) && data_key <= (key_6 + button_range)) {
key_6_holding;
}
if(data_key >= (key_7 - button_range) && data_key <= (key_7 + button_range)) {
key_7_holding;
}
if(data_key >= (key_8 - button_range) && data_key <= (key_8 + button_range)) {
key_8_holding;
}
if(data_key >= (key_9 - button_range) && data_key <= (key_9 + button_range)) {
key_9_holding;
}
}
}
}
}

void vol_up_action() {
Remote.increase();
Remote.clear();
}
void vol_down_action() {
Remote.decrease();
Remote.clear();
}
void next_action() {
Remote.next();
Remote.clear();
}
void forward_action() {
Remote.forward();
Remote.clear();
}
void previous_action() {
Remote.previous();
Remote.clear();
}
void rewind_action() {
Remote.rewind();
Remote.clear();
}
void play_pause_action() {
Remote.play_pause();
Remote.clear();
}
void mute_action() {
Remote.mute();
Remote.clear();
}
void alt_tab_action() {
if((millis() - timer_alt_tab) > 1000) {
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
timer_alt_tab = millis();
}
else {
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
timer_alt_tab = millis();
}
}
void home_action() {
Remote.home();
Remote.clear();
}
void play_action() {
Remote.play();
Remote.clear();
}
void pause_action() {
Remote.pause();
Remote.clear();
}
void stop_action() {
Remote.stop();
Remote.clear();
}
void power_action() {
Remote.power();
Remote.clear();
}

void mouse_wheel_up() {
Mouse.move(0, 0, 1);
}

void mouse_wheel_down() {
Mouse.move(0, 0, -1);
}

jonikus81
14.08.2017, 07:24
мой косяк, в привате отдал рабочий скетч, а сюда не выложил :blush:

palexsa
27.10.2020, 01:23
Скетч приведенный уважаемым lti1 работает только если резистивные кнопки притянуты к плюсу. У меня была схема с подтяжкой к земле. #define release_button приравнивал к нулю - энкодер работает, а кнопки нет. Скетч в посте #307 работает с обоими вариантами схемы.