Вход

Просмотр полной версии : Резистивные кнопки под андроид


Страницы : 1 2 3 [4]

mihrun79
31.03.2017, 13:57
Два источника лучше ставить на 2 разных канала А0 и А1 и немного править в скетче. Сам сажал 2 источника на А0 и в итоге такая каша.

Второй канал: 5в брать оттуда же,и подтяжку на А1 добавлять?

mihrun79
31.03.2017, 14:01
Начало здесь (http://pccar.ru/showthread.php?p=277235#post277235).
Nett, в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении соответственно. И добавляете в код из поста murano (http://pccar.ru/showpost.php?p=248366&postcount=72) нужные действия, не нужные удаляете
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==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>=315 && data<=345) // приглушение звука
{
Remote.mute();
Remote.clear();
}
if (data>=420 && data<=460) // воспроизведение / пауза
{
Remote.play_pause();
Remote.clear();
}
delay(100);
}
И как писал murano, добавить диапазон значения +- 5%, напимер если значение клавиши 330 вместо data==330 использовать data>=315 && data<=345 и т.д.
Возможные варианты мультимедиа клавиш
// Volume
Remote.increase(); Volume Up
Remote.decrease(); Volume Down
Remote.mute(); Mute

// Playback
Remote.play(); Play
Remote.pause(); Pause
Remote.play_pause(); Play/Pause
Remote.stop(); Stop

// Track Controls
Remote.next(); Next
Remote.previous(); Previous
Remote.forward(); Fast Forward
Remote.rewind(); Rewind

Remote.power(); Power
Remote.home(); WWW Home
Remote.search(); WWW Search
Кстати, какая у Вас плата? Должна быть Arduino Leonardo или Arduino Pro Micro.
Исходник здесь (http://stefanjones.ca/blog/arduino-leonardo-remote-multimedia-keys/), Stop заменен на Play/Pause

Alt/tab и кнопки планшета не могу реализовать ?Есть решения к этому скетчу?

blogsylar
18.04.2017, 12:18
Всем привет! Суть такова. Ардуино (https://duino.ru/arduino.html) подключено к кнопкам, но не резистивно, по двум проводам, а с каждой кнопки идет по два провода и подключается каждая к своему порту. В файлике vendor.kl прописаны все действия, типа home, back, next, volume_up, и тд., эти команды отрабатывает на ура. Так же прописаны горячие клавиши, типа ctrl+1. ctrl+2... итд. Вопрос вот в чем. В 4-м андройде была панель быстрых клавиш, или типа того, quick launch, что ли, и в ней можно было назначать целые приложения на комбинации кнопок. В 6-м андройде это вырезали. Есть ли способ интерпретировать это сочетание в запуск приложения? Может через таскер? Андройд само нажатие видит, но не знаю как назначить на него запуск приложения

maxymike
20.04.2017, 17:19
Не могу подружить про микро (https://duino.ru/arduino-pro-micro.html) и bluetooth hc 05,hc 06 (https://duino.ru/product_info.php/info/p2309_Bluetooth-modul-HC-06.html). Питание давал и 3,3 и 5 вольт. RX и TX местами менял-бесполезно. Блютус виден,подключается,но данные не сыпет. По usb все хорошо. HC 05-06 работают с UNO (https://duino.ru/arduino-uno-r3.html) отлично. В чем может быть собака?

ВладимирC
20.04.2017, 17:29
Не могу подружить про микро (https://duino.ru/arduino-pro-micro.html) и bluetooth hc 05,hc 06 (https://duino.ru/product_info.php/info/p2309_Bluetooth-modul-HC-06.html). Питание давал и 3,3 и 5 вольт. RX и TX местами менял-бесполезно. Блютус виден,подключается,но данные не сыпет. По usb все хорошо. HC 05-06 работают с UNO (https://duino.ru/arduino-uno-r3.html) отлично. В чем может быть собака?
3.3В не питание нужно, а логические уровни, делители попробуйте поставить на TX RX.

Alladim
30.04.2017, 01:49
Всех приветствую! Нужна Ваша помощь!
Недавно раздобыл себе вот такую панель управления от финика.
https://mail.google.com/mail/u/0/?ui=2&ik=6ff0f50710&view=fimg&th=15bbba8043a21f3d&attid=0.1&disp=inline&realattid=1566050337158070272-local0&safe=1&attbid=ANGjdJ8oj0_ZSKNjrkr-E8iAVrTRbpeYMTjhWnPAOMDBFiadZFAIFBYpDHkq7aQ5W7aHoK zZnqNmLjSnri87bjJr6mFnYAMWPvsRjXelQQ3Vwp74NHj-OxHlmk0BfPk&ats=1493502152161&rm=15bbba8043a21f3d&zw&sz=w1280-h845

Давняя мечта что то подобное заточить под управление планшетом.
С кнопками разобрался, там матрица 5*5=25 кнопок (26-я аварийка выведена отдельно)
Использую Arduino pro micro. Подключил, залил для теста простенький скетч- на мониторе отзываются все кнопки без проблем. Вот скетч:

#include <Keypad.h> // подключаем нашу библиотеку
const byte ROWS = 5; //число строк у нашей клавиатуры
const byte COLS = 5; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {
{'1','2','3','4','5'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'6','7','8','9','0'},
{'A','B','C','D','E'},
{'F','G','H','I','J'},
{'K','L','M','N','O'}
};
byte rowPins[ROWS] = {2, 3, 4, 5, 6}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {7, 8, 9, 10, 16}; //к каким выводам подключаем управление столбцами
//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
http://pccar.ru/showpost.php?p=319975&postcount=307
С учетом того что клавиатура не резистивная? В програмировании мягко говоря не очень. Поэтому не могу пока понять как считать нажатие моей клавиатуры и присвоить ей действие, которое будет отправлено в планшет.

Еще как вариант, будут ли работать приложения такие как "Remote steering wheel control" или "SerialManager" с матричной клавиатурой?

Помогите пожалуйста реализовать мечту идиота)
Буду очень благодарен за помощь!

wanix
04.05.2017, 09:51
Народ, направьте в правильное русло. Есть кнопки на руле резистивные, есть sony MEX-DV1600U у него есть вход для пульта судя по всему такого : https://www.drive2.ru/l/288230376152759568/ так вот у меня возникло желание впендюрить ему родные кнопки руля чтобы он их кушал.
Я это понимаю как: берем ардуину по выше указанным методам читаем кнопки, понимаем кто есть кто, а потом как это скормить соньке ?

blogsylar
04.05.2017, 11:23
Народ, направьте в правильное русло. Есть кнопки на руле резистивные, есть sony MEX-DV1600U у него есть вход для пульта судя по всему такого : https://www.drive2.ru/l/288230376152759568/ так вот у меня возникло желание впендюрить ему родные кнопки руля чтобы он их кушал.
Я это понимаю как: берем ардуину по выше указанным методам читаем кнопки, понимаем кто есть кто, а потом как это скормить соньке ?

Нужен цифровой потенциометр. А в общем - так (https://mysku.ru/blog/ebay/35610.html)

wanix
04.05.2017, 13:26
Нужен цифровой потенциометр. А в общем - так (https://mysku.ru/blog/ebay/35610.html)

спасибо

Alladim
06.05.2017, 02:02
В общих чертах накидал с горем пополам вот такой скетч
#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 5; //число строк у нашей клавиатуры

const byte COLS = 5; //число столбцов у нашей клавиатуры

char hexaKeys[ROWS][COLS] = {

{'1','2','3','4','5'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования

{'6','7','8','9','0'},

{'A','B','C','D','E'},

{'F','G','H','I','J'},

{'K','L','M','N','O'}



};

byte rowPins[ROWS] = {2, 3, 4, 5, 6}; //к каким выводам подключаем управление строками

byte colPins[COLS] = {7, 10, 16, 14, 15}; //к каким выводам подключаем управление столбцами

//initialize an instance of class NewKeypad

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup()
{
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT_PULLUP);
pinMode (9,INPUT_PULLUP);

Keyboard.begin();
Serial.begin(9600);
}
// настройка функциональных клавиш
void loop(){
char customKey = customKeypad.getKey();



// назначение действий на кнопки


if (customKey == 'B') {

Keyboard.press(KEY_UP_ARROW);
delay (100);
Keyboard.releaseAll();
}
if (customKey == '2') {

Keyboard.press(KEY_DOWN_ARROW);
delay (100);
Keyboard.releaseAll();


}
if (customKey == 'O') {

Remote.previous();
delay (100);
Remote.clear();


}if (customKey == '7') {

Remote.next();
delay (100);
Remote.clear();

}if (customKey == '4') {

Remote.play_pause();
delay (100);
Remote.clear();

}if (customKey == '5') {

Remote.mute();
delay (100);
Remote.clear();

}if (customKey == '9') {

Keyboard.press(KEY_RETURN);
delay (100);
Keyboard.releaseAll();


Serial.println(customKey);
}

}


// часть кода для регулировки громкости энкодером

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;
}






Все кнопки работают, энкодер работает, нажатия на кнопки назначать получается. Но ! очень хочется реализовать управление с коротким/ длинным нажатием как в скетче Ув. lti1
http://pccar.ru/showpost.php?p=319975&postcount=307.
Ну ни как я не могу въехать, как переделать строки

if(millis()-eventTime>10 && millis()-eventTime<499 && data>=165 && data<=185) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
{
flag = 7;
}
под матричную клавиатуру, в которой нету дребезга, не надо ничего сравнивать.
Очень прошу, на примере одной команды перемотки вперед, подскажите что нужно добавить в мой скетч, в том числе над циклом loop.

kostyamat
06.05.2017, 05:44
Нужен цифровой потенциометр. А в общем - так (https://mysku.ru/blog/ebay/35610.html)
спасибо

Там же, в комментариях, были поданы две не плохие идеи.
1) цифровыми выводами ардуино подтягивать нужные резисторы к массе. Если кнопок не много, а ардуино хотя бы Нано (https://duino.ru/arduino-nano-v30-ch340-usb.html), то вполне решаемо.
2) Сделать RC цепочку по аналоговому выходу и формировать нужный ток (а кнопка с резистором именно ток и формирует) с помощью ШИМ модуляции, меняя скважность импульсов. Такое даже на Attiny85 сделать можно, ее хватит. Если использовать выводы Arduino Due (https://duino.ru/arduino-due.html) DAC0-DAC1, то даже RC цепочка не нужна.
Нужно только высчитать внутреннее сопротивление инфо.линии управления в магнитоле. Для этого нужно включить на этот вход любой известный заранее резистор, на 1кОм например, замерить напряжение на линии, а дальше закон Ома в помощь. Высчитать внутреннее сопротивление, можно сделать макетку и проиграться со скважностью ШИМ, для каждого из номиналов (напряжение для них на шине тоже можно посчитать по Ому).
Пс. RC цепочка это - резистор номиналом чуть меньше минимального, понятного вашей магнитоле, последовательно выходу ардуино + конденсатор 100нФ, за резистором на землю. И почитайте, что найдете про функцию analogWrite(), можно начать читать тут http://arduino.ru/Tutorial/PWM

sandr2010
06.05.2017, 09:32
Народ, направьте в правильное русло. Есть кнопки на руле резистивные, есть sony MEX-DV1600U у него есть вход для пульта судя по всему такого : https://www.drive2.ru/l/288230376152759568/ так вот у меня возникло желание впендюрить ему родные кнопки руля чтобы он их кушал.
Я это понимаю как: берем ардуину по выше указанным методам читаем кнопки, понимаем кто есть кто, а потом как это скормить соньке ?

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

wanix
24.05.2017, 07:16
Может я что-то недопонял,но зачем вам ардуина если у вас магнитола и так понимает резистивные кнопки руля? Распаиваете кнопки руля как в джойстике на схеме (номиналы указаны,действия тоже). Ардуина нужна больше для андроида или для эмуляции ик пульта.

Сонька как усилок будет работать, на нее громкость пойдет, остальные на андроид.

sandr2010
24.05.2017, 09:59
Возможно это подойдет вам больше : http://pccar.ru/showthread.php?t=24028 - можно пользовать и магнитолу и андроид.

xemulres
25.05.2017, 20:50
Здравствуйте. Имеется китайский пульт на руль. Подключил его через Pro Micro (https://duino.ru/arduino-pro-micro.html). Но вот беда - работает только половина кнопок, меняю key1 и key2 местами - работает вторая половина кнопок. Как сделать чтобы работали все сразу?

blogsylar
26.05.2017, 11:19
Здравствуйте. Имеется китайский пульт на руль. Подключил его через Pro Micro (https://duino.ru/arduino-pro-micro.html). Но вот беда - работает только половина кнопок, меняю key1 и key2 местами - работает вторая половина кнопок. Как сделать чтобы работали все сразу?

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

kostyamat
27.05.2017, 20:18
Здравствуйте. Имеется китайский пульт на руль. а что за пульт? Интересно. Можно на него ссылку?

xemulres
29.05.2017, 09:33
а что за пульт? Интересно. Можно на него ссылку?
Вот такой
https://ru.aliexpress.com/item/Car-steering-wheel-buttons-Automotive-steering-wheel-controller-Wireless-remote-control-car-DVD-player-controller-Free/32781351578.html?spm=2114.13010608.0.0.Zp5GX2

Las42kuz
05.06.2017, 20:50
Здравствуйте, подключил энкодер к ардуино про микро а можно ли одновременно к этой связки и подрулевой джойстик прикрутить как будет выглядеть скейтч?!

dEzZz
09.07.2017, 20:17
Кому Joycon EXP нужен - пишите в личку - не пригодился)

Chois
27.07.2017, 16:22
добрый день!
помогите написать скетч
хочется оставить управление магнитолой и дополнительно ТОЛЬКО переключать треки на планшете (т.е. только 2-е кнопки TR_NEXT, TR_PREW)
МСР 4131 нет в городе, купил МСР4231 (он 2-х канальный)

Nexus 7 12г. прошивка Тимура (зарядка+отг)
Arduino Leonardo
MCP4231 - 2-х канальный цифровой потенциометр (другой не нашел)

Sketch led - скетч который у меня работает
sketch potten - скетч не работает (наверно потому что там нет "byte addressRedLED = B00010000; " выбор канала наверно) https://mysku.ru/blog/ebay/35610.html
sketch nexus - работает (без подключенной магнитолы) уважаемого lti1
в программировании вообще не шарю, помогите пожалуйста!
схема подключения
https://prnt.sc/g0y2a9

Chois
29.07.2017, 23:59
вот что у меня получилось (может и коряво, но главное работает)

#include <SPI.h>
// библиотека SPI должна быть в стандартном софте, ну или её можно скачать.

const byte POT = B00010000; //выбор канала потенциометра

// Коды имеющихся на руле кнопок
const int next=6;
const int previous=54;
const int vol_up=140;

int csPin=10; // CS на цифровом потенциометре
int wheelPin=A5; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки
int i=0;
int prevButton=0;

int r; //keyboard
unsigned long flag = 0; //keyboard

void setup() {

pinMode(csPin, OUTPUT);
delay(50);
SPI.begin();
delay(50);

SPI.transfer(POT); // команда
SPI.transfer(0); // значение
pinMode(wheelPin, INPUT);

delay(100);
Keyboard.begin(); //keyboard
}

int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0

// читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
int r=analogRead(wheelPin);
//if(r>=release_button - button_release_range && r<=release_button + button_release_range && flag == 0) //keyboard

if (r>=2 && r<=10) return(next);
if (r>=50 && r<=60) return(previous);
if (r>=120 && r<=156) return(vol_up);
}

// ОСНОВНОЙ ЦИКЛ
void loop() {
int currButton=getR(); // заносим в переменную currButton код нажатой кнопки
if (currButton!=prevButton) { // если значение поменялось с прошлого раза

delay(10);
currButton=getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки

if (currButton!=prevButton) { // если код кнопки точно поменялся с прошлого раза
//Serial.println(currButton);
prevButton=currButton; // сохраняем новое значение в переменную prevButton

// Выставляем сопротивление на потенциометре, тем самым посылаем команду на магнитолу.
// Значения сопротивлений даны для Pioneer, для магнитол других марок числа будут другие.
SPI.transfer(0);
switch(currButton) {
case next: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(21);
digitalWrite(csPin, HIGH);

Remote.next();
flag = 0;
delay(10);
Remote.clear();
break; // 16k

case previous: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(50);
digitalWrite(csPin, HIGH);

Remote.previous();
flag = 0;
delay(10);
Remote.clear();
break; // 24k


case vol_up: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(14);
digitalWrite(csPin, HIGH);
break; // 11k

default: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(0);
digitalWrite(csPin, HIGH);
break;

}
}
}
delay(5);
}

Rover
09.09.2017, 01:25
Соберу всю информацию по одному из решений в одном месте, у кого есть возможность закрепите ссылку в первом сообщении.
Работает только с Arduino Pro Micro (https://duino.ru/arduino-pro-micro.html) и Arduino Leonardo (https://duino.ru/arduino-micro-arduino-leonardo.html) на чипе ATmega32u4.
Для начала меняем в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении этого сообщения (http://pccar.ru/showpost.php?p=277286&postcount=182), при этом версия ПО Arduino Software IDE должна быть 1.0.5, скачать setup exe (http://arduino.googlecode.com/files/arduino-1.0.5-r2-windows.exe), скачать zip (https://arduino.googlecode.com/files/arduino-1.0.5-windows.zip) ИЛИ 1.6.5, на других не проверял.
После заливаете этот скетч и считайте коды всех кнопок через "монитор порта" Arduino Software (IDE).
int analogPin=0; //пин для подключения кнопок
int data;

void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data);
delay(1000);
}
Подключаете кнопки к Arduino по следующим схемам, с подтяжкой к - или к +. Номинал сопротивления ~20 кОм.
38555
Потом заливаете этот скетч, только в начале скетча указываете свои значения, то есть вместо 111, 222, 333, 444, 555, 777 указываете значения своих кнопок, а также значение при отпущенных кнопках, в зависимости от схемы подключения будут либо ближе 0 либо ближе к 1023:
//****************** Здесь необходимо указать свои значения ***************

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

int release_button = 1023; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 5; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 30; // время исключающее дребезг контактов в миллисекундах
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()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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;
}
}
Алгоритм работы такой: короткое нажатие, более 10 (int time_tinkling = 10; можно менять в скетче) и менее 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Play/pause; длинное, более 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Alt + Tab, при первом нажатии эмулирует Alt и два раза Tab, то есть переходит предыдущему открытому приложении и в течении 0,8 секунды удерживает Alt, а повторные нажатия на кнопку в течении этого времени эмулируют только Tab. На удержание ни чего не назначен, можно добавить при необходимости.




У меня возникла проблемма, может кто сталкивался.
Скетч этот, ардуина про микро. Всё прекрасно шьётся и работает под Андроидом, Виндой, но вот под WIN 10 странный трабл - если ардуина сидит в USB порту (не важно, ХАБ или на матери), то после перезагрузки или включения компа она как ХИД устройство не реагирует на нажатие клавиш, надо переткнуть, тогда всё норм. Причём СОМ порт виден без всяких траблов. Повторю, это только под десяткой, под семёркой или андроидом всё норм.
Что это может быть?
Как бороться?- электрически перезагружать USB не очень кошерно.
Может быть внедрить функцию "reset" в данный скетч? Например при длительном нажатии AltTab сделать перзагрузку ардуины?
Как это прописать в скетче?

lti1
09.09.2017, 11:07
У меня возникла проблемма, может кто сталкивался.
Скетч этот, ардуина про микро. Всё прекрасно шьётся и работает под Андроидом, Виндой, но вот под WIN 10 странный трабл - если ардуина сидит в USB порту (не важно, ХАБ или на матери), то после перезагрузки или включения компа она как ХИД устройство не реагирует на нажатие клавиш, надо переткнуть, тогда всё норм. Причём СОМ порт виден без всяких траблов. Повторю, это только под десяткой, под семёркой или андроидом всё норм.
Что это может быть?
Как бороться?- электрически перезагружать USB не очень кошерно.
Может быть внедрить функцию "reset" в данный скетч? Например при длительном нажатии AltTab сделать перзагрузку ардуины?
Как это прописать в скетче?
В таком случае правильнее задействовать вывод VBUS, то есть подавать на него логическую единицу после загрузки винды.
После выключения компа USB порт обесточивается? Можно попробовать добавить задержку после подачи питания на ардуино, в setup().void setup()
{
delay(30000); // задержка 30 секунд
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Keyboard.begin();
}

Rover
09.09.2017, 13:45
В таком случае правильнее задействовать вывод VBUS, то есть подавать на него логическую единицу после загрузки винды.
После выключения компа USB порт обесточивается? Можно попробовать добавить задержку после подачи питания на ардуино, в setup().void setup()
{
delay(30000); // задержка 30 секунд
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Keyboard.begin();
}

Увы, это не помогло:dntknw:
Загрузка с нуля - не реагирует на нажатие как ХИД. Передёрнул (в хорошем смысле :big:) через 30 секунд начинает реагировать.
На двух машинах так -на одной WIN10 64 на другой WIN10 32, совершенно разные аппараты, так что дело не в железе.

lti1
09.09.2017, 20:08
Увы, это не помогло:dntknw:
Загрузка с нуля - не реагирует на нажатие как ХИД. Передёрнул (в хорошем смысле :big:) через 30 секунд начинает реагировать.
На двух машинах так -на одной WIN10 64 на другой WIN10 32, совершенно разные аппараты, так что дело не в железе.
До Vbus на китайской pro micro не добраться, под чипом разводка, я проверил.
Тогда пробуйте первый способ описанный здесь (http://arduino-diy.com/arduino-perezagruzit-na-programmnom-urovne), второй, программный способ не заработал у меня на pro micro.

Rover
10.09.2017, 17:50
До Vbus на китайской pro micro не добраться, под чипом разводка, я проверил.
Тогда пробуйте первый способ описанный здесь (http://arduino-diy.com/arduino-perezagruzit-na-programmnom-urovne), второй, программный способ не заработал у меня на pro micro.

И у меня не заработал:no2:

А как скетч поправить, чтобы при длительном нажатии кнопки, эмулирующем AltTab вызвать RESET ардуины?

oleg707
10.09.2017, 18:40
И у меня не заработал:no2:

А как скетч поправить, чтобы при длительном нажатии кнопки, эмулирующем AltTab вызвать RESET ардуины?

а если ватчдогом попробовать воспользоваться? Выставить ватчдог на 250-500 мс, сообытие - делай(1000) - ресет. Только стандартный загрузчик не поддерживает его вроде.

Rover
10.09.2017, 20:20
а если ватчдогом попробовать воспользоваться? Выставить ватчдог на 250-500 мс, сообытие - делай(1000) - ресет. Только стандартный загрузчик не поддерживает его вроде.

Вот какая ещё фигня - ватчдог не получит сигнал тревоги, ардуина определяется вполне корректно, единственное - не даёт компу коды HID устройства. Почему это происходит, я не понимаю.

Мониторинг СОМ порта тоже работает всегда и без проблем.
Поэтому на данный момент мне проще кнопкой на руле (длительное нажатие) перезагрузить ардуину.
В написании скетчей не силён, вот и стуканул о помощи.

oleg707
10.09.2017, 20:32
Вот какая ещё фигня - ватчдог не получит сигнал тревоги, ардуина определяется вполне корректно, единственное - не даёт компу коды HID устройства. Почему это происходит, я не понимаю.

Мониторинг СОМ порта тоже работает всегда и без проблем.
Поэтому на данный момент мне проще кнопкой на руле (длительное нажатие) перезагрузить ардуину.
В написании скетчей не силён, вот и стуканул о помощи.

если ты сделаешь команду delay(10000); то ватчдог вроде должен сработать. Уже не помню свои опыты.
https://geektimes.ru/post/255800/

lti1
10.09.2017, 20:41
А как скетч поправить, чтобы при длительном нажатии кнопки, эмулирующем AltTab вызвать RESET ардуины?
Вначале нужно впаять перемычке между входом RST и цифровым входом/выходом, например 3-им.
В самом начале setup добавляете digitalWrite(3, HIGH);, вот так:void setup()
{
digitalWrite(3, HIGH);
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Keyboard.begin();
}далее добавляем digitalWrite(3, LOW); на удержание Alt+Tab://********************** AltTab + Ещё что то ************************************

if(millis()-eventTime<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)
{
digitalWrite(3, LOW);
//flag = 0;
}
Но всё это, какой-то кривой "костыль".
если ты сделаешь команду delay(10000); то ватчдог вроде должен сработать. Уже не помню свои опыты.
https://geektimes.ru/post/255800/Ардуина не зависает, а просто не определяется 10-ой виндой.

Rover
12.09.2017, 21:21
[QUOTE=lti1;392076]
Но всё это, какой-то кривой "костыль".

Кривой. Но эта поблема с ардуиной и вин 10 не только у меня:
http://arduino.ru/forum/apparatnye-voprosy/arduino-micro-windows-10#comment-133389
Вот вроде бы решение:
https://github.com/arduino/Arduino/issues/3611

возможно ли его применить к нашему конкретному случаю?

Rover
13.09.2017, 17:59
lti1, я пока временно прописал перезагрузку вместо Mute

//********************** 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)
{
digitalWrite(3, HIGH);
}

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;
}





Работает :) А можно дополнить AltTab длинным нажатием , сохранив сам AltTab?
А то делаю, как прописали - ничего не выходит :( ,а мне этой кнопкой пользоваться удобнее

lti1
13.09.2017, 22:28
Rover, забыл уже свой код, так много лет прошло :).
Подправил своё предыдущее сообщение.
Вот так должно быть:
if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1)
{
digitalWrite(3, LOW);
//flag = 0;
}

pine
21.09.2017, 21:04
Я тут немножко полностью перелопатил код для адаптера кнопок. Используется все та же библиотека Tablet, но структура кода больше похожа на классическую реализацию конечного автомата. Да, так длиннее, но как по мне - это более читабельно, чем непонятные числовые флаги :) Кучка switch-case в функциях состояний - для единообразия. Чуть позже перепишу в типовые функции onPress, onRelease, onHold.

Общий GitHub репозиторий тут (https://github.com/p1ne/wheel-adapter/)

Конкретно исходник скетча тут (https://github.com/p1ne/wheel-adapter/tree/master/sketches/wheel-adapter)

Алгоритм работы
- состояние кнопок опрашивается каждые 50 мс
- исходное состояние конечного автомата - NOBUTTON
- если нажали какую-то кнопку, то переходим в состояние соответствующее этой кнопке (см функцию noButton() )
- каждая функция типа noButton(), prev(), next() и т.п. - состояние, параметр buttonState - переход в новое состояние

Как работает с точки зрения пользователя
- если нажали и отпустили кнопки NEXT или PREV быстрее чем 250 мс - переключились между треками
- если держим PREV или NEXT - каждые 250 мс перематываем
- громкость увеличивается или уменьшается каждые 250 мс
- Play/Pause нажимается при отпускании кнопки Play/Pause (для устранения ложных срабатываний)

Alt-Tab и прочее не реализовано ввиду ненужности лично мне, но пулл-реквесты принимаются.

Antoxa
14.10.2017, 17:42
Создал аналогичную тему, в данной тебе постараемся разобрать как подключить резистивную клавиатуру через Bluetooth. Сам пока не силен в данном вопросе, поэтому знатоков приглашаю дать мастер класс.
http://pccar.ru/showthread.php?p=393326#post393326

Antoxa
31.10.2017, 01:36
Создал аналогичную тему, в данной тебе постараемся разобрать как подключить резистивную клавиатуру через Bluetooth. Сам пока не силен в данном вопросе, поэтому знатоков приглашаю дать мастер класс.
http://pccar.ru/showthread.php?p=393326#post393326

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

DizzJK
20.12.2017, 22:18
кто нибудь windows 10 использует? побороли отвал кнопок после перезагрузки?

Nasrok
28.02.2018, 19:04
Коллеги, подскажите, имею вот такую клавиатуру
https://3.downloader.disk.yandex.ru/preview/cdb3573d402b31e00ab6e97f27b32ed1fea1ed21a8069e9285 b1783df5115b54/inf/__aJkf311fmPrL4mdJBn8L2VAUP5aEz5WXQlADLxBdXGLvbyK9 8WFzexj3GPsyH05cggylEXugqTARKix8SbIA%3D%3D?uid=0&filename=IMG_20180228_173018.jpg&disposition=inline&hash=&limit=0&content_type=image%2Fjpeg&tknv=v2&size=1280x815
Подключается к планшету как клавиатура и значения клавиш соответствующие. При отключении NumLock, пререходит в режим стрелок.
Я правильно понял, после прочтения 50 страниц, что для того чтобы полностью раскрыть ее функционал (запуск приложений, альттаб, Home? громкость и т.д., мне нужно подключать ее к ардуино (https://duino.ru/arduino.html), и уже ардуино к планшету?

Или ещё читать? :)

lti1
28.02.2018, 22:33
Коллеги, подскажите, имею вот такую клавиатуру

Подключается к планшету как клавиатура и значения клавиш соответствующие. При отключении NumLock, пререходит в режим стрелок.
Я правильно понял, после прочтения 50 страниц, что для того чтобы полностью раскрыть ее функционал (запуск приложений, альттаб, Home? громкость и т.д., мне нужно подключать ее к ардуино (https://duino.ru/arduino.html), и уже ардуино к планшету?

Или ещё читать? :)
Не правильно.
http://pccar.ru/showthread.php?p=319975#post319975

svoboda120
15.03.2018, 20:38
Доброго времени суток. Нужна помощь-разъяснение знатоков Arduino.
В автомобиле установлен вот такой джойстик.
http://images.vfl.ru/ii/1521131345/a1799973/20970760_s.jpg (http://vfl.ru/fotos/a179997320970760.html)
На нем имеется 5 кнопок и колесико, которое бесконечно вращается вперед и назад. С кнопками все понятно, они назначены и работают. Вопрос по колесику. Возможно ли на его прокрутку вперед и назад назначить действие листания рабочих столов. Т.е. на планшете несколько рабочих столов, которые хотелось бы переключать колесиком по аналогии свайпа пальцем по экрану вправо или влево или как если бы зажали левую кнопку мыши и сделали движение вправо или влево, тем самым перевели планшет на следующий или предыдущий рабочий стол?
P.S. Джойстик подключаю через Arduino Leonardo.

Jeni_
15.08.2018, 13:39
Доброго времени суток. Нужна помощь.
В програмировании я полный ноль.
Помогите пожалуйста, сделать скетч на два входа А0 и А1.
на А0 - привязать кнопки play, следующий трек, предыдущий
на А1 привязать кнопку back, длительное нажатие, alt tab
спасибо!!!

НСО154
15.08.2018, 14:29
Подробней объясни что хочешь получить в итоге?

Vladget
15.08.2018, 14:36
Доброго времени суток. Нужна помощь.
В програмировании я полный ноль.
Помогите пожалуйста, сделать скетч на два входа А0 и А1.
на А0 - привязать кнопки play, следующий трек, предыдущий
на А1 привязать кнопку back, длительное нажатие, alt tab
спасибо!!!

да ужж .. интересно как другим понять к чему и куда?

Jeni_
15.08.2018, 15:47
да ужж .. интересно как другим понять к чему и куда?

А что непонятно ?

Vladget
15.08.2018, 15:52
"В програММировании я полный ноль. "

Если все понятно .. то жди .

Лучше бы ты написал простым языком что и от чего (что имеешь в натуре?) хочешь получить

Jeni_
15.08.2018, 17:03
"В програММировании я полный ноль. "

Если все понятно .. то жди .

Лучше бы ты написал простым языком что и от чего (что имеешь в натуре?) хочешь получить

Есть гу pioneer, хочу подключить к tv-box кнопки руля.
К гу приходят три провода, один условно земля, второй идет на кнопки mode, enter, next ,Previous.
на третий провод приходит vol_up, vol_down, back.

Vladget
15.08.2018, 17:55
Ну уже ближе, Осталось объяснить как связан пионер с тв-боксом (еще неплохо бы определиться с марками как пионера так и тв бокса), и еще ты кнопки с пионера уберешь и подключишь к тв боксу или они (кнопки) должны и пионером управлять и тв боксом?

может тебе надо к юрию с его адаптером

НСО154
15.08.2018, 20:47
Тебе нужен один вход и несколько выходов Arduino.
Вход будет-считывать, , выходы-реагировать.
А что бы написать скетч, нужно понимать принцип по-которому хочешь организовать работу устройств и напряжение кнопок, а что бы знать напряжение кнопок, нужно знать модель бокса и пионера, что бы посмотреть по схеме.
ПС:
А вот так заходить на форум, как ты зашёл...мягко говоря-не совсем уважительно к форумчанин и не красиво)
Удачи тебе в твоих начинаниях)
ПС:
Ещё, зайди сюда (https://www.drive2.ru/b/1591357) ознакомиться, кстати, код рабочий, останется только значения входного поменять под свои хотелки.
Реле ставить не обязательно, можно замыкать на землю, токи небольшие.

Vladget
15.08.2018, 21:09
А там разве напряжения? там же вроде сопротивление относительно массы

НСО154
15.08.2018, 21:14
А там разве напряжения? там же вроде сопротивление относительно массы
Микропроцессор-то реагирует на напряжение, которое задаётся сопротивлением)
Правильней говорить о напряжении, которые протекает через кнопки на микропроцессор, ну а первое зависит от сопротивления.

Vladget
15.08.2018, 21:30
А откуда там напряжение если один конец сопротивления на массе? А вот кусочек текста по твоей ссылке "Контроллер Arduino (https://duino.ru/category/arduino/) постоянно считывает это сопротивление" и судя по скетчу
"
if (c<500)
{
b=1; // button 1 pressed "Трек вперед"
"
в данном случае это как раз 0,43К так что меряется сопротивление

НСО154
15.08.2018, 21:37
А там разве напряжения? там же вроде сопротивление относительно массы
Естественно)
А что там ещё может быть?
Кнопка замыкает цепь, на ней напряжение заданное сопротивлением.
На кнопке в отжатом состоянии, естественно логический "0"

НСО154
15.08.2018, 21:50
Собственно измерение напряжение на входах производится аналого-цифровым преобразователем (АЦП) с коммутатором на 6 каналов. АЦП имеет разрешение 10 бит, что соответствует коду на выходе преобразователя 0…1023. Погрешность измерения не более 2 единиц младшего разряда.

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Это требование особенно важно при использовании резисторных делителей, подключенных к аналоговым входам платы. Сопротивление резисторов делителей не может быть слишком большим.

Программные функции аналогового ввода.

int analogRead(port)

Считывает значение напряжения на указанном аналоговом входе. Входное напряжение диапазона от 0 до уровня источника опорного напряжения (часто 5 В) преобразовывает в код от 0 до 1023.

При опорном напряжении равном 5 В разрешающая способность составляет 5 В / 1024 = 4,88 мВ.

Занимает на преобразование время примерно 100 мкс.

int inputCod; // код входного напряжения
float inputVoltage; // входное напряжение в В

inputCod= analogRead(A3); // чтение напряжения на входе A3
inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)

Почитай (http://mypractic.ru/urok-13-analogovye-vxody-platy-arduino-chtenie-analogovyx-signalov-izmerenie-srednego-znacheniya-signala.html)

Vladget
15.08.2018, 22:00
применительно к этому скетчу что такое с<500 --- 500 чего?

НСО154
15.08.2018, 22:20
применительно к этому скетчу что такое с<500 --- 500 чего?
"С"-это заданный аналоговый вход
"500"-это напряжение заданное резистором на кнопке.

Vladget
15.08.2018, 22:35
ну может быть, ( я не спорил я спрашивал) так и все таки 500 это чего, если там макс 5В то 500 чего

НСО154
15.08.2018, 22:48
ну может быть, ( я не спорил я спрашивал) так и все таки 500 это чего, если там макс 5В то 500 чего
Выделил)
V

Собственно измерение напряжение на входах производится аналого-цифровым преобразователем (АЦП) с коммутатором на 6 каналов. АЦП имеет разрешение 10 бит, что соответствует коду на выходе преобразователя 0…1023. Погрешность измерения не более 2 единиц младшего разряда.

Для сохранения максимальной точности (10 разрядов) необходимо, чтобы внутреннее сопротивление источника сигнала не превышало 10 кОм. Это требование особенно важно при использовании резисторных делителей, подключенных к аналоговым входам платы. Сопротивление резисторов делителей не может быть слишком большим.

Программные функции аналогового ввода.

int analogRead(port)

Считывает значение напряжения на указанном аналоговом входе. Входное напряжение диапазона от 0 до уровня источника опорного напряжения (часто 5 В) преобразовывает в код от 0 до 1023.

При опорном напряжении равном 5 В разрешающая способность составляет 5 В / 1024 = 4,88 мВ.

Занимает на преобразование время примерно 100 мкс.

int inputCod; // код входного напряжения
float inputVoltage; // входное напряжение в В

inputCod= analogRead(A3); // чтение напряжения на входе A3
inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)

500-это приблизительно 2.4в

Jeni_
16.08.2018, 01:57
Ну уже ближе, Осталось объяснить как связан пионер с тв-боксом (еще неплохо бы определиться с марками как пионера так и тв бокса), и еще ты кнопки с пионера уберешь и подключишь к тв боксу или они (кнопки) должны и пионером управлять и тв боксом?

может тебе надо к юрию с его адаптером

TV BOX на android, работает через AV вход.
Если переключить на AV, из кнопок на руле работает только мод и звук - +
как раз то что нужно.
То есть TV BOX управление подключить параллельно, не в разрыв.

Vladget
16.08.2018, 10:27
а что происходит если нажать "след трек" или "пред..." когда работает тв бокс ?- что то происходит , и можно марку твбокса - на нем что есть кнопки? или как думаешь переключать "след - пред"

Jeni_
16.08.2018, 11:51
Помогите пожалуйста подкорректировать этот скеч
Мне необходимо задействовать два входа, A0 и A1

int analogPin=A0;
int data;
int data1 = 0;
int flag = 0;
unsigned long eventTime = 0;

void setup()
{
Serial.begin(9600);
digitalWrite(analogPin, HIGH);
}

void loop()
{
data=analogRead(analogPin);

if(data>=950 && data1 != 0 && flag <= 1)
{
Serial.print("<release:");
Serial.print(data1);
Serial.print(">");
data1 = 0;
flag = 0;
delay(10);
}

if(data>=950)
{
eventTime = millis();
}

if(data<=949 && flag != 1 && millis()-eventTime>=50 && millis()-eventTime<=800)
{
flag = 2;
if(millis()-eventTime <= 60) data1 = data;
}

if(data>=950 && flag == 2)
{
Serial.print("<click:");
Serial.print(data1);
Serial.print(">");
flag = 0;
delay(10);
}

if(data<=949 && flag == 2 && millis()-eventTime>800)
{
Serial.print("<hold:");
Serial.print(data);
Serial.print(">");
data1 = data;
flag = 1;
delay(10);
}
}

Jeni_
17.08.2018, 03:48
:wacko2:

НСО154
17.08.2018, 09:01
Теперь хоть понятно, что тебе нужно)
Вопрос.
Что конкретно нужно передавать по последовательному порту в ТВ-бокс?

Jeni_
17.08.2018, 09:55
Теперь хоть понятно, что тебе нужно)
Вопрос.
Что конкретно нужно передавать по последовательному порту в ТВ-бокс?

Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем.

НСО154
17.08.2018, 15:50
Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем.
Ну допустим привяжем.
Будут кнопки "кидать" что-нибудь на аналоговые входы.
Дальше что делать с тем что они накидают?)))

Vladget
17.08.2018, 16:09
да нет ему нужно тупо замкнуть контакты этих кнопок на твбоксе, а тут наверно сразу вопрос что на этих кнопках ? или надо ставить два реле которые бы тупо щелкали. и наверно еще вопрос возникнет , я его задал но .. так как это будет параллельно с ГУ и при этом от него ничего не отключается что будет если когда работает твбокс нажимать эти две кнопки - на ГУ ничего не происходит? и наоборот если работает ГУ без тв бокса а ты нажимаешь эти кнопки что будет делать тв бокс в фоновом режиме , где он будет когда ты его подключешь в ГУ

НСО154
17.08.2018, 16:14
А вот судя по примеру выложенного им скетча, получается следующие.
Читаем с аналогового входа --->отправляем полученное на тв-бокс по USB.
Все.

Короче голова уже разболелась...пусть мысли свои в порядок приведёт)

Vladget
17.08.2018, 16:30
он же писал
"Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем."
ну пошлешь ты что то на USB а кто там что то ждет
я же писал ему напиши марки и ГУ и бокса хоть посмотрели бы что есть что .

а скетч он просто что то подправил не вдаваясь откуда и куда

Jeni_
18.08.2018, 12:59
он же писал
"Мне надо привязать на А1 Кнопку "Back".
На А0 будут кнопки , next, play, mode, но эти кнопки настраиваются утилитой ,без проблем."
ну пошлешь ты что то на USB а кто там что то ждет
я же писал ему напиши марки и ГУ и бокса хоть посмотрели бы что есть что .

а скетч он просто что то подправил не вдаваясь откуда и куда

Все верно. Все что мне надо, это в скетче прописать второй вход А1 или А2 не важно. но я не пойму как. (((

Vladget
18.08.2018, 15:22
короче ему надо скетч который бы считывал только две кнопки "след трек" "пред трек" и в случае нажатия их на выходе включал бы то ли первое реле то ли второе контакты которых он припаяет тупо к кнопкам тв бокса

НСО154
18.08.2018, 17:14
короче ему надо скетч который бы считывал только две кнопки "след трек" "пред трек" и в случае нажатия их на выходе включал бы то ли первое реле то ли второе контакты которых он припаяет тупо к кнопкам тв бокса
Вспомнил игру из 90-х "Что, Где, Когда"
))))))))))
Кстати, если тему почитать, то можно собрать полноценный контроллер резистивных кнопок)

jonikus81
19.08.2018, 17:19
Всем привет.
Я один такой счастливчик у которого комманды
Remote.rewind();
Remote.forward();
в винде 10 вообще не пашут, а на андройде тупо переключают треки (как некст и превьюс)?
Кстати с библиотекой Tablet такая же балалайка.
IDE 1.0.5

НСО154
19.08.2018, 18:24
Всем привет.
Я один такой счастливчик у которого комманды
Remote.rewind();
Remote.forward();
в винде 10 вообще не пашут, а на андройде тупо переключают треки (как некст и превьюс)?
Кстати с библиотекой Tablet такая же балалайка.
IDE 1.0.5

Бывает))

jonikus81
20.08.2018, 12:47
Бывает))

обидно то, что раньше (с год назад) не было самого устройства и я все делал на макетке и все работало как часики, даже для компа хотел собрать пультик. Потом нашел улитку на руль и сам руль под улитку. Тут появилось время и я собрал само устройство на руль как и хотел, дошло дело до тестов в авто и тут "такое". Такое лечится?

kastava
08.11.2018, 13:22
Соберу всю информацию по одному из решений в одном месте, у кого есть возможность закрепите ссылку в первом сообщении.
Работает только с Arduino Pro Micro (https://duino.ru/arduino-pro-micro.html) и Arduino Leonardo (https://duino.ru/arduino-micro-arduino-leonardo.html) на чипе ATmega32u4.
Для начала меняем в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении этого сообщения (http://pccar.ru/showpost.php?p=277286&postcount=182), при этом версия ПО Arduino Software IDE должна быть 1.0.5, скачать setup exe (http://arduino.googlecode.com/files/arduino-1.0.5-r2-windows.exe), скачать zip (https://arduino.googlecode.com/files/arduino-1.0.5-windows.zip) ИЛИ 1.6.5, на других не проверял.
После заливаете этот скетч и считайте коды всех кнопок через "монитор порта" Arduino Software (IDE).
int analogPin=0; //пин для подключения кнопок
int data;

void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data);
delay(1000);
}
Подключаете кнопки к Arduino по следующим схемам, с подтяжкой к - или к +. Номинал сопротивления ~20 кОм.
38555
Потом заливаете этот скетч, только в начале скетча указываете свои значения, то есть вместо 111, 222, 333, 444, 555, 777 указываете значения своих кнопок, а также значение при отпущенных кнопках, в зависимости от схемы подключения будут либо ближе 0 либо ближе к 1023:
//****************** Здесь необходимо указать свои значения ***************

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

int release_button = 1023; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 5; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 30; // время исключающее дребезг контактов в миллисекундах
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()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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()-eventTime<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;
}
}
Алгоритм работы такой: короткое нажатие, более 10 (int time_tinkling = 10; можно менять в скетче) и менее 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Play/pause; длинное, более 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Alt + Tab, при первом нажатии эмулирует Alt и два раза Tab, то есть переходит предыдущему открытому приложении и в течении 0,8 секунды удерживает Alt, а повторные нажатия на кнопку в течении этого времени эмулируют только Tab. На удержание ни чего не назначен, можно добавить при необходимости.

Подскажите возможно ли к этому скетчу добавить кнопки HOME, POWER, F1,F2,F3 ? Если да то поделитесь инфой что нужно изменить

fishdimka
18.12.2018, 13:57
имеется магнитола на андройд, два энкодера и arduino pro micro
первый энкодер нажатие - "Enter", вращение просто -"Tab"
второй энкодер нажатие - "Alt+Tab" , вращение - "громкость"
подскажите пожалуйста как реализовать скетч и подключение к ардуино?

oleg707
18.12.2018, 22:12
имеется магнитола на андройд, два энкодера и arduino pro micro
первый энкодер нажатие - "Enter", вращение просто -"Tab"
второй энкодер нажатие - "Alt+Tab" , вращение - "громкость"
подскажите пожалуйста как реализовать скетч и подключение к ардуино?

Если подключить юсб клавиатуру к магнитоле и эти комбинации работают, то прошиваете промикру как юсб клавиатуру, на энкодеры подтяжки и конденсаторы по 0.1 мФ и скетч написать. Примеры скетча есть прямо в Ардуино IDE (среде разработки)

skanch
18.12.2018, 22:32
...подскажите пожалуйста как реализовать скетч и подключение к ардуино?
Посмотрите здесь...
http://www.pccar.ru/showpost.php?p=390834&postcount=95
http://pccar.ru/showpost.php?p=319975&postcount=307

Alex15BV
20.12.2018, 17:43
Доброго времени суток Всем!

Подскажите, пожалуйста, чайнику:
- подключил энкодер к Ардуино ПроМикро
- залил свой коротенький скетчик на основе библиотеки Remote
- под Windows все работает норм (уменьшает/прибавляет громкость, отключает/включает звук), в диспетчере определяется как "HID-совместимое устройство управления" и "USB-устройство ввода"
- на Андроиде - ВООБЩЕ ТИШИНА (то есть никакой реакции ни на подключение, ни на манипуляции)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?
Андроид-одноплатник Khadas VIM2. Спасибо за ответы!

oleg707
20.12.2018, 19:59
Доброго времени суток Всем!

Подскажите, пожалуйста, чайнику:
- подключил энкодер к Ардуино ПроМикро
- залил свой коротенький скетчик на основе библиотеки Remote
- под Windows все работает норм (уменьшает/прибавляет громкость, отключает/включает звук), в диспетчере определяется как "HID-совместимое устройство управления" и "USB-устройство ввода"
- на Андроиде - ВООБЩЕ ТИШИНА (то есть никакой реакции ни на подключение, ни на манипуляции)
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?
Андроид-одноплатник Khadas VIM2. Спасибо за ответы!
Питание на юсб есть? Флешку видит? Клавиатуру видит?

svoboda120
20.12.2018, 20:16
Что может быть? Может в системные папки нужно что-то добавить, в buildprop что-то прописать?

У вас что то не так с режимом ОТГ. Посмотрите эту статью (https://www.drive2.ru/b/497265404729622705/). В ней автор описывает прошивку для вашего девайса и одним из преимуществ этой прошивки считает "— разъем microUSB type-C активирован в режим OTG, теперь можно в него подключать устройства". Возможно подтолкнет вас на какие то мысли.

Alex15BV
22.12.2018, 16:59
Доброго времени суток Всем.
Дико извиняюсь... А никто не думал над упрощением обсуждаемого кода? (Над избыточностью переменных и сложностью логических конструкций при проверке)
... или это не нужно никому? Работает, и ладно...

Пример:
зачем сначала "vol_up = 111", потом к этому "button_range = 5"
и потом к этому ещё "data >= vol_up - button_range && data <= vol_up + button_range"

когда можно "vol_up_porog = 120" и затем "data < vol_up_porog"
и к тому же эту переменную можно потом использовать в loop для однозначной идентификации нажатой кнопки (в качестве флага)...

fishdimka
12.01.2019, 14:35
задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"
собрал скетч,
работает только нажатие энкодера Enter "KEY_RETURN"
если не чего не трогаешь просто перелистываются приложения, как будто нажата клавиша "стрелка вправо" KEY_RIGHT_ARROW

подключил так:
pin 16 кнопка энкодера SW
pin 2 нога энкодера CLK
pin 3 нога энкодера DT
GDN средняя нога энкодера и с кнопки GDN

подскажите, что нужно поправить в скетче или что переподключить?

скетч
#include <HID.h>
#include <keyboard.h>
#include <Tablet.h>
#include <Encoder.h>
#define BTN_pin 16 // pin 16 кнопка энкодера SW
const int pin_A = 2; // pin 2 нога энкодера CLK
const int pin_B = 3; // pin 3 нога энкодера 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); //пины энкодера объявляем входами
Serial.begin(9600);
Keyboard.begin(); //подключим как клава
}
void loop()
{
//////////////ЭНКОДЕР///////////
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Keyboard.press(KEY_RIGHT_ARROW);
delay(200);
Keyboard.releaseAll();
}
else {
Keyboard.press(KEY_LEFT_ARROW);
delay(200);
Keyboard.releaseAll();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}

if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_RETURN); //При нажатии на кнопку команда Enter
delay(200); //Делаем небольшую задержку чтоб не засыпало командами.
Keyboard.releaseAll();
}
}

Alex15BV
12.01.2019, 15:34
После комментария "//////////////ЭНКОДЕР///////////" открывающая скобка не лишняя, случайно? (перед encoder_A = digitalRead(pin_A);)

... И инклюды лишние: если используются только функции клавиатуры - то зачем подключать ещё и Tablet, и Encoder?

Alex15BV
12.01.2019, 16:01
задача:
-при повороте энкодера по часовой стрелке срабатывала кнопка "стрелка вправо" KEY_RIGHT_ARROW
-при повороте против часовой "стрелка влево" KEY_LEFT_ARROW
-при нажатии энкодера Enter "KEY_RETURN"


Я в Ардуино чайник, но сделал себе - и работает, как часики: и переключение режимов работы, и длительбность нажатия) :blush:
Сделал на прерываниях (здесь кусок, касающийся только энкодера):

#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

#define KeyEncPin 2 // кнопка энкодера
#define EncAcPin 3 // энкодер - канал А
#define EncBcPin 5 // энкодер - канал В

volatile boolean RightMove = false; // направления вращения энкодера
volatile boolean LeftMove = false;
volatile boolean EncPress = false; // нажатия кнопки энкодера

// ----- обработчики прерываний -------

void EncoderMove() { // вращение энкодера
if (digitalRead(EncBcPin) == HIGH) {
RightMove = true;
}
else {
LeftMove = true;
}
}

void KeyEncPress() { // кнопка энкодера
EncPress = true;
}

void setup() {
pinMode(KeyEncPin, INPUT_PULLUP); // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);
pinMode(EncAcPin, INPUT_PULLUP); // канал-А энкодера - для отслеживания вращения
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMove, FALLING);
pinMode(EncBcPin, INPUT_PULLUP); // канал-В энкодера - для определения направления вращения
pinMode(LedPin, OUTPUT);

Serial.begin(9600); // инициализация интерфейсов
Keyboard.begin();
Mouse.begin();
delay(500);
}

void loop() {
if (RightMove == true) { // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
if (MediaMode == true) {
Tablet.vol_up();
Tablet.clear();
}
else {
Keyboard.press(KEY_UP_ARROW);
delay(10);
Keyboard.release(KEY_UP_ARROW);
}
RightMove = false;
}

if (LeftMove == true) { // если вращаем влево - уменьшаем громкость/стрелка вниз
if (MediaMode == true) {
Tablet.vol_down();
Tablet.clear();
}
else {
Keyboard.press(KEY_DOWN_ARROW);
delay(10);
Keyboard.release(KEY_DOWN_ARROW);
}
LeftMove = false;
}

if (EncPress == true) { // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия и запоминаем кнопку
delay(20);
while (digitalRead(KeyEncPin) == LOW) { // пока не отпустим -
TimePress = millis() - EventStart; // считаем время нажатия
delay(10);
}
KeyNumber = 1; // сохраняем номер нажатой кнопки для обработчика
EncPress = false; // сбрасываем флаг нажатия
NeedWork = 1; // взводим флаг необходимости обработки нажатия
if (TimePress <= 400) { // сохраняем длительность нажатия
ShortKey = 1;
}
else {
ShortKey = 0;
}
}
...
}

fishdimka
12.01.2019, 20:49
скетч не компилируется, ругается на эту строку
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);

Alex15BV
12.01.2019, 20:58
Arduino ProMicro - забыл указать... Не знаю, на чем ты делаешь

fishdimka
12.01.2019, 21:00
на Arduino ProMicro делаю

Alex15BV
12.01.2019, 21:07
Нет проблем никаких :blush:

fishdimka
12.01.2019, 21:19
можешь прислать весь скетч целяком
https://cloud.mail.ru/public/Hdfc/U5ENixwV5

fishdimka
12.01.2019, 21:22
у меня пишет так
https://cloud.mail.ru/public/Hdfc/U5ENixwV5

Alex15BV
12.01.2019, 21:31
ну так понятно... я же говорю: "кусок про энкодер"! У меня ж там и отслеживание длительности нажатия, и кнопки... Бери, что тебе нужно, а остальное выкидывай: переменная ShortKey не объявлена же?

скетч в личке смотри

fishdimka
12.01.2019, 21:41
благодарю

Vogel
17.01.2019, 01:01
скетч в личке смотри
А можно мне тоже, пожалуйста ?

Alex15BV
17.01.2019, 11:13
Доброго времени суток Всем.
Поскольку в этой теме энкодер уже обсуждался, а резистивные кнопки - это основа конструкции: выложу пока здесь... Доведу до конечного вида - положу в "манипуляторы"
... короче джойстик i-Drive из говна и палок:
- Ардуино ПроМикро
- жменька радиодеталек
- энкодер за 50 рублей
- крутилка

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

#include <avr/wdt.h>
#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

// ----- пины Ардуино -----------------

#define KeyAppPin 0 // кнопка APPs
#define KeyModePin 1 // кнопка Mode
#define KeyEncPin 2 // кнопка энкодера
#define EncAcPin 3 // энкодер - канал А
#define EncBcPin 5 // энкодер - канал В
#define KeysPin A0 // кнопки управления
#define MousePin A1 // кнопки джойстика
#define LedPin 6 // светодиод медиа-режима

// ----- рабочие переменные -----------

unsigned long EventStart = 0; // момент нажатия
unsigned long TimePress = 0; // длительность нажатия

// ----- различные флаги --------------

volatile bool RightMove = false; // направления вращения энкодера
volatile bool LeftMove = false;
volatile bool EncPress = false; // нажатия кнопки энкодера
volatile bool AppPress = false; // кнопки APPs
volatile bool MediaMode = false; // кнопки MODE

// ----- обработчики прерываний -------

void EncoderMove() { // вращение энкодера
if (digitalRead(EncBcPin) == HIGH) {
RightMove = true;
}
else {
LeftMove = true;
}
}

void KeyEncPress() { // кнопка энкодера
EncPress = true;
}

void KeyAppPress() { // кнопка APPs
AppPress = true;
}

void KeyModePress() { // кнопка MODE
MediaMode = !MediaMode;
if (MediaMode){
digitalWrite(LedPin, HIGH);
}
else {
digitalWrite(LedPin, LOW);
}
}

void setup() {
pinMode(KeyModePin, INPUT_PULLUP); // кнопка "Mode" - управляем интерфейсом / медиа-функциями
attachInterrupt(digitalPinToInterrupt(KeyModePin), KeyModePress, FALLING);
pinMode(KeyAppPin, INPUT_PULLUP); // кнопка "APP" - при нажатии список запущеных приложений (ALT/TAB)
attachInterrupt(digitalPinToInterrupt(KeyAppPin), KeyAppPress, FALLING);
pinMode(KeyEncPin, INPUT_PULLUP); // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);
pinMode(EncAcPin, INPUT_PULLUP); // канал-А энкодера - для отслеживания вращения
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMove, FALLING);
pinMode(EncBcPin, INPUT_PULLUP); // канал-В энкодера - для определения направления вращения
pinMode(LedPin, OUTPUT);
digitalWrite(LedPin, LOW);

analogReference(DEFAULT); // Aref = 5V, подтягивающий резистор на линии кнопок - 4,7 кОм

Keyboard.begin(); // инициализация USB-HID интерфейсов
Mouse.begin();
wdt_enable(WDTO_4S); // Активируем сторожевой таймер с интервалом 4 секунд
}

void loop() {

static bool FindKey; // признак найденной кнопки
static int DataKey; // значение ADC-кнопки

if (RightMove) { // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
if (MediaMode) {
Tablet.vol_up();
Tablet.clear();
}
else {
Keyboard.press(KEY_UP_ARROW);
Keyboard.release(KEY_UP_ARROW);
}
RightMove = false;
}

if (LeftMove) { // если вращаем влево - уменьшаем громкость/стрелка вниз
if (MediaMode) {
Tablet.vol_down();
Tablet.clear();
}
else {
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
}
LeftMove = false;
}

if (AppPress) { // кнопка "APPs"
Keyboard.press(KEY_LEFT_ALT);
while (digitalRead(KeyAppPin) == LOW) {
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
delay(1000);
wdt_reset();
}
Keyboard.release(KEY_LEFT_ALT);
AppPress = false;
}

if (analogRead(MousePin) > 800 && analogRead(KeysPin) > 800 && !EncPress) { // пока кнопки не нажаты взводим на всякий случай таймер обработки нажатия
EventStart = millis();
}

if (EncPress) { // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия
delay(20);
while (digitalRead(KeyEncPin) == LOW) { // пока не отпустим -
TimePress = millis() - EventStart; // считаем время нажатия
delay(10);
wdt_reset();
}
if (TimePress <= 200) { // действуем по длительности нажатия, если короткое:
if (MediaMode) { // в медиа-режиме - play/pause
Tablet.play_pause();
Tablet.clear();
}
else {
Keyboard.press(KEY_RETURN); // в режиме интерфейса - enter
Keyboard.release(KEY_RETURN);
}
}
else { // если длинное:
if (MediaMode) { // в медиа-режиме - mute
Tablet.mute();
Tablet.clear();
}
else { // в режиме интерфейса - escape
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
}
EncPress = false; // сбрасываем флаг нажатия
}

if (analogRead(MousePin) < 800) { // обнаружили факт нажатия кнопки джойстика
delay(20);
FindKey = false;
DataKey = analogRead(MousePin);
if (DataKey < 100 && !FindKey) { // кнопка "UP" - резистор 1 кОм
if (MediaMode) {
Tablet.forward();
Tablet.clear();
delay(100);
}
else {
Mouse.move(0, -10, 0);
}
FindKey = true;
}
if (DataKey < 350 && !FindKey) { // кнопка "LEFT" - резистор 2 кОм
if (MediaMode) {
Tablet.previous();
Tablet.clear();
delay(100);
}
else {
Mouse.move(-10, 0, 0);
}
FindKey = true;
}
if (DataKey < 600 && !FindKey) { // кнопка "RIGHT" - резистор 3,9 кОм
if (MediaMode) {
Tablet.next();
Tablet.clear();
delay(100);
}
else {
Mouse.move(10, 0, 0);
}
FindKey = true;
}
if (DataKey < 800 && !FindKey) { // кнопка "DOWN" - резистор 10 кОм
if (MediaMode) {
Tablet.rewind();
Tablet.clear();
delay(100);
}
else {
Mouse.move(0, 10, 0);
}
}
}

if (analogRead(KeysPin) < 800) { // обнаружили факт нажатия кнопки управления
delay(20);
FindKey = false;
DataKey = analogRead(KeysPin);
while (analogRead(KeysPin) < 800) {
TimePress = millis() - EventStart;
delay(10);
wdt_reset();
}
if (DataKey < 100) { // кнопка "Home/Menu" - на землю
if (TimePress <= 200) {
Tablet.home();
Tablet.clear();
}
else {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_ESC);
Keyboard.releaseAll();
}
FindKey = true;
}
if (DataKey < 350 && !FindKey) { // кнопка "Enter/Esc" - резистор 1 кОм
if (TimePress <= 200) {
Mouse.click(MOUSE_LEFT);
}
else {
Mouse.click(MOUSE_RIGHT);
}
}
}
wdt_reset(); // производим периодический сброс таймера
}


За код не пинайте сильно - это ПЕРВАЯ моя программа для Ардуино в жизни. Скетч немножко не соответствует прототипу, а соответствует заказанным в Китае платам, уже скоро доедут :big:

Исходники все здесь: информация по пульту управления (https://yadi.sk/d/YBqIbW8rUBnsDA)

urikz
17.01.2019, 13:29
Здравствуйте Alex15BV! Слежу за развитием вашего проекта на Драйве2 и вы все никак мне не даете платы сделать!!! :))) Постоянные улучшения! Архив новых плат и дизайн крепежа плавающего под прорези можно или еще будут варианты ? :))) Вообще красавчик я скажу-снимаю шляпу! Спасибо!

Alex15BV
17.01.2019, 21:36
Если честно, я выкладываю свои поделки скорее как "идеи", нежели как "проекты"... Как их использовать (копировать полностью, или брать только нужное, а или игнорировать вовсе) - это уж каждый сам решает.
Китайцы сильно избаловали: когда комплект плат стоит как один раз пива попить - на каждый новый шаг заказываю новые платы, чтоб всё было красиво :blush: (не люблю всякие сопли/перемычки)

Alex15BV
22.01.2019, 21:12
Доброго времени суток Всем.
Внутренняя часть закончена, остался корпус :big:

https://i110.fastpic.ru/thumb/2019/0122/26/_ff8eb770240643ae34f52ab88a33c926.jpeg (https://fastpic.ru/view/110/2019/0122/_ff8eb770240643ae34f52ab88a33c926.jpg.html)

https://i109.fastpic.ru/thumb/2019/0122/9f/_830df5af7ba7bec02fd07df2e443f39f.jpeg (https://fastpic.ru/view/109/2019/0122/_830df5af7ba7bec02fd07df2e443f39f.jpg.html)

urikz
23.01.2019, 06:16
Жду!!!

mazay66
23.01.2019, 18:31
Поддержу. Интересное изделие получается. Размеры какие? Думаю, не плохо было бы разместить его в корпусе цилиндрической формы (что бы помещался в место для подстаканника, имеющееся во многих авто).

Alex15BV
24.01.2019, 00:24
Добрый день.
Размер основной платы 74х35 мм (сделана под Е39 отсек для мелочевки в центральной консоли). Исходники добавлю завтра - можно переделать как угодно.

urikz
24.01.2019, 06:50
Alex15BV-на драйве качнул.Можно поподробнее фото направляек\пружиновинтов? Спасибо!

Alex15BV
24.01.2019, 09:33
Добрый день.
Всё очень просто: отверстия в плате Д2, а винты М2,5 - и просто вкручиваются внатяг...
Пружинка - и от шариковой ручки, откусано по несколько витков: тут нужно подогнать под длину винтов и жёсткость конструкции (чтобы плата джойстика была притянута к основной, но нажатиям кнопок эта подтяжки не мешала бы)

urikz
24.01.2019, 10:27
А я думал винтовые втулки впаяны...

dk-fsb
24.01.2019, 19:42
Здравствуйте Alex15BV! Слежу за развитием вашего проекта на Драйве2
можно ссылку где почитать:blush:

urikz
25.01.2019, 06:15
dk-fsb
https://www.drive2.ru/c/520021172255981950/
https://www.drive2.ru/c/522233114773161213/

жека 3
25.01.2019, 08:36
Секретные ссылки нет доступа

urikz
25.01.2019, 08:44
Регится нужно наверное... Ссылка на прямую скачку архива от автора - https://yadi.sk/d/YBqIbW8rUBnsDA

dk-fsb
25.01.2019, 13:32
привет всем.может кто подключал китай кнопки или подскажете как подключить к планшету

жека 3
25.01.2019, 14:01
привет всем.может кто подключал китай кнопки или подскажете как подключить к планшету

Попробуй без коробки, я покупал такие кнопки отдельно по блютуз подключаются к телефону нормально

dk-fsb
25.01.2019, 14:05
Попробуй без коробки, я покупал такие кнопки отдельно по блютуз подключаются к телефону нормально

а как они коннектится:dntknw:

жека 3
25.01.2019, 14:08
а как они коннектится:dntknw:

По блютузу

жека 3
25.01.2019, 14:10
Планшет по идее должен их распознать диод на кнопке мигает

dk-fsb
25.01.2019, 14:24
Планшет по идее должен их распознать диод на кнопке мигает

на кнопках нет диода
я боюсь что у тебя другие кнопки мои вот http://sibmarket.net/avtomobilnye-aksessuary/knopki-upravleniya-na-rul/knopki-upravleniya-na-rul-car-steering-wheel-controller-t-3.html

жека 3
25.01.2019, 14:50
https://m.ru.aliexpress.com/item/32949717369.html?spm=a2g0n.orderlist-amp.item.32949717369&aff_trace_key=fe6e821a5d954bad91b40ce8cf3b2cfd-1548359014119-07523-VnYZvQVf&aff_platform=msite&m_page_id=737amp-hXLODl1cMmkNTg6Am2Ypgg1548413370571 да другие типа таких

dk-fsb
25.01.2019, 14:53
вопрос остается тот же как их подключить?

anru
08.02.2019, 14:44
Привет всем. Может кто подскажет что делать с всплываюшими сообшениями при подключении ардуино леонардо через хаб. Открыть юсб устройство программой по умолчанию. Кнопки руля реализованы через ардуино леонардо скетч сдесь брал. Подключено через хаб все работает но сообшения при потери питания на ардуино происходит переинициализация устройства и сериал менеджер и торкьюпро все хотят открыть ардуину хотя в этих программах я не использую юсб а только блютуз соединения. По идее надо леонардо привязать к какой то программе что бы не просился больше ее никто открывать.

dk-fsb
03.03.2019, 16:49
всем привет. спрошу еще раз. есть у универсальные кнопки на рульhttps://ru.aliexpress.com/item/4Key/32895175124.html?spm=a2g0v.search0604.3.23.7a25401 dmvY0mr&ws_ab_test=searchweb0_0%2Csearchweb201602_10_10065 _10068_319_317_10696_453_10084_454_10083_10618_103 07_10301_537_536_10902_10059_10884_10889_10887_321 _322_10915_10103_10914_10911_10910%2Csearchweb2016 03_51%2CppcSwitch_0&algo_pvid=a2cbcdf8-088c-4679-93f7-f74df288ecca&algo_expid=a2cbcdf8-088c-4679-93f7-f74df288ecca-3 . как их подключить к планшету. пробивал этот вариант http://pccar.ru/showpost.php?p=319975&postcount=307 не выходит при каждом нажатии кнопки разное значение причем разрыв значения большой. по этому варианту http://pccar.ru/showpost.php?p=309621&postcount=27 аналогичная ситуация как эти кнопки заставить работать:angry:

mazay66
04.03.2019, 00:37
Когда-то заказывал одну такую кнопку (для управления громкостью и перемоткой). Сложностей при подключении не возникло. С планшетом коннектится по блютуз. Если не изменяет память, для соединения с планшетом, необходимо активировать поиск устройств на данном девайсе любым тонким и острым предметом. Я это делал иглой, вставив ее в отверстие в корпусе.
Привет всем. Может кто подскажет что делать с всплывающими сообщениями при подключении ардуино леонардо через хаб. ...По идее надо леонардо привязать к какой то программе что бы не просился больше ее никто открывать.
Решили проблему? Тоже интересует этот вопрос.

dk-fsb
04.03.2019, 12:59
Когда-то заказывал одну такую кнопку (для управления громкостью и перемоткой). Сложностей при подключении не возникло. С планшетом коннектится по блютуз. Если не изменяет память, для соединения с планшетом, необходимо активировать поиск устройств на данном девайсе любым тонким и острым предметом. Я это делал иглой, вставив ее в отверстие в корпусе.

Решили проблему? Тоже интересует этот вопрос.
привет немного путаешь эти кнопки по блютуз не коннектятся. ты про этот пульт говоришь
https://ru.aliexpress.com/item/Bluetooth-Media-Mp3/32890466097.html?spm=a2g0v.10010108.1000014.2.112e 7ae79pu0et&pvid=80f54f82-4606-41cc-b815-68b9b8683829&gps-id=pcDetailBottomMoreOtherSeller&scm=1007.13338.122670.0&scm-url=1007.13338.122670.0&scm_id=1007.13338.122670.0 у меня такой есть с ним проблем нет.

mazay66
06.03.2019, 21:03
Сам скетч:

#include <avr/wdt.h>
#include <Mouse.h>
#include <Keyboard.h>
#include <Tablet.h>

// ----- пины Ардуино -----------------

#define KeyAppPin 0 // кнопка APPs
#define KeyModePin 1 // кнопка Mode
#define KeyEncPin 2 // кнопка энкодера
#define EncAcPin 3 // энкодер - канал А
#define EncBcPin 5 // энкодер - канал В
#define KeysPin A0 // кнопки управления
#define MousePin A1 // кнопки джойстика
#define LedPin 6 // светодиод медиа-режима

// ----- рабочие переменные -----------

unsigned long EventStart = 0; // момент нажатия
unsigned long TimePress = 0; // длительность нажатия

// ----- различные флаги --------------

volatile bool RightMove = false; // направления вращения энкодера
volatile bool LeftMove = false;
volatile bool EncPress = false; // нажатия кнопки энкодера
volatile bool AppPress = false; // кнопки APPs
volatile bool MediaMode = false; // кнопки MODE

// ----- обработчики прерываний -------

void EncoderMove() { // вращение энкодера
if (digitalRead(EncBcPin) == HIGH) {
RightMove = true;
}
else {
LeftMove = true;
}
}

void KeyEncPress() { // кнопка энкодера
EncPress = true;
}

void KeyAppPress() { // кнопка APPs
AppPress = true;
}

void KeyModePress() { // кнопка MODE
MediaMode = !MediaMode;
if (MediaMode){
digitalWrite(LedPin, HIGH);
}
else {
digitalWrite(LedPin, LOW);
}
}

void setup() {
pinMode(KeyModePin, INPUT_PULLUP); // кнопка "Mode" - управляем интерфейсом / медиа-функциями
attachInterrupt(digitalPinToInterrupt(KeyModePin), KeyModePress, FALLING);
pinMode(KeyAppPin, INPUT_PULLUP); // кнопка "APP" - при нажатии список запущеных приложений (ALT/TAB)
attachInterrupt(digitalPinToInterrupt(KeyAppPin), KeyAppPress, FALLING);
pinMode(KeyEncPin, INPUT_PULLUP); // кнопка энкодера - при нажатии PLAY/PAUSE либо ENTER/ESCAPE
attachInterrupt(digitalPinToInterrupt(KeyEncPin), KeyEncPress, FALLING);
pinMode(EncAcPin, INPUT_PULLUP); // канал-А энкодера - для отслеживания вращения
attachInterrupt(digitalPinToInterrupt(EncAcPin), EncoderMove, FALLING);
pinMode(EncBcPin, INPUT_PULLUP); // канал-В энкодера - для определения направления вращения
pinMode(LedPin, OUTPUT);
digitalWrite(LedPin, LOW);

analogReference(DEFAULT); // Aref = 5V, подтягивающий резистор на линии кнопок - 4,7 кОм

Keyboard.begin(); // инициализация USB-HID интерфейсов
Mouse.begin();
wdt_enable(WDTO_4S); // Активируем сторожевой таймер с интервалом 4 секунд
}

void loop() {

static bool FindKey; // признак найденной кнопки
static int DataKey; // значение ADC-кнопки

if (RightMove) { // обработка вращения энкодера: если вращаем вправо - увеличить громкость/стрелка вверх
if (MediaMode) {
Tablet.vol_up();
Tablet.clear();
}
else {
Keyboard.press(KEY_UP_ARROW);
Keyboard.release(KEY_UP_ARROW);
}
RightMove = false;
}

if (LeftMove) { // если вращаем влево - уменьшаем громкость/стрелка вниз
if (MediaMode) {
Tablet.vol_down();
Tablet.clear();
}
else {
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
}
LeftMove = false;
}

if (AppPress) { // кнопка "APPs"
Keyboard.press(KEY_LEFT_ALT);
while (digitalRead(KeyAppPin) == LOW) {
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
delay(1000);
wdt_reset();
}
Keyboard.release(KEY_LEFT_ALT);
AppPress = false;
}

if (analogRead(MousePin) > 800 && analogRead(KeysPin) > 800 && !EncPress) { // пока кнопки не нажаты взводим на всякий случай таймер обработки нажатия
EventStart = millis();
}

if (EncPress) { // обнаружили факт нажатия кнопки энкодера - определяем длительность нажатия
delay(20);
while (digitalRead(KeyEncPin) == LOW) { // пока не отпустим -
TimePress = millis() - EventStart; // считаем время нажатия
delay(10);
wdt_reset();
}
if (TimePress <= 200) { // действуем по длительности нажатия, если короткое:
if (MediaMode) { // в медиа-режиме - play/pause
Tablet.play_pause();
Tablet.clear();
}
else {
Keyboard.press(KEY_RETURN); // в режиме интерфейса - enter
Keyboard.release(KEY_RETURN);
}
}
else { // если длинное:
if (MediaMode) { // в медиа-режиме - mute
Tablet.mute();
Tablet.clear();
}
else { // в режиме интерфейса - escape
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
}
}
EncPress = false; // сбрасываем флаг нажатия
}

if (analogRead(MousePin) < 800) { // обнаружили факт нажатия кнопки джойстика
delay(20);
FindKey = false;
DataKey = analogRead(MousePin);
if (DataKey < 100 && !FindKey) { // кнопка "UP" - резистор 1 кОм
if (MediaMode) {
Tablet.forward();
Tablet.clear();
delay(100);
}
else {
Mouse.move(0, -10, 0);
}
FindKey = true;
}
if (DataKey < 350 && !FindKey) { // кнопка "LEFT" - резистор 2 кОм
if (MediaMode) {
Tablet.previous();
Tablet.clear();
delay(100);
}
else {
Mouse.move(-10, 0, 0);
}
FindKey = true;
}
if (DataKey < 600 && !FindKey) { // кнопка "RIGHT" - резистор 3,9 кОм
if (MediaMode) {
Tablet.next();
Tablet.clear();
delay(100);
}
else {
Mouse.move(10, 0, 0);
}
FindKey = true;
}
if (DataKey < 800 && !FindKey) { // кнопка "DOWN" - резистор 10 кОм
if (MediaMode) {
Tablet.rewind();
Tablet.clear();
delay(100);
}
else {
Mouse.move(0, 10, 0);
}
}
}

if (analogRead(KeysPin) < 800) { // обнаружили факт нажатия кнопки управления
delay(20);
FindKey = false;
DataKey = analogRead(KeysPin);
while (analogRead(KeysPin) < 800) {
TimePress = millis() - EventStart;
delay(10);
wdt_reset();
}
if (DataKey < 100) { // кнопка "Home/Menu" - на землю
if (TimePress <= 200) {
Tablet.home();
Tablet.clear();
}
else {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_ESC);
Keyboard.releaseAll();
}
FindKey = true;
}
if (DataKey < 350 && !FindKey) { // кнопка "Enter/Esc" - резистор 1 кОм
if (TimePress <= 200) {
Mouse.click(MOUSE_LEFT);
}
else {
Mouse.click(MOUSE_RIGHT);
}
}
}
wdt_reset(); // производим периодический сброс таймера
}


Подскажите, с какой целью в скетч добавлена функция watchdog? Механизм watchdog встроен в контроллеры Atmega, но, не всякий загрузчик (bootloader) Arduino (https://duino.ru/category/arduino/) правильно обрабатывает эту функцию и система заходит в жестокий bootloop. Как в этой ситуации ведет себя про микро?

Alex15BV
06.03.2019, 21:21
Подскажите, с какой целью в скетч добавлена функция watchdog? Механизм watchdog встроен в контроллеры Atmega, но, не всякий загрузчик (bootloader) Arduino правильно обрабатывает эту функцию и система заходит в жестокий bootloop. Как в этой ситуации ведет себя про микро?
Добрый вечер.
Добавлена именно по прямому назначению: сбросить контроллер в случае зависания программы. Когда начал заниматься этим вопросом - тоже помучался. И оптибут пробовал, и МК убивал, и читал кучу статей всяких разных...
А потом товарищ показал, как он сделал у себя: я повторил, и оно заработало "как есть" - с оригинальным бутлоадером и вышеизложеным скетчем.

mazay66
06.03.2019, 21:57
Т.е оптибут не обязательно? Оригинальный бутлоадер не уйдет в bootloop? А насколько часто зависает устройства без отсутствия этой функции?
P.S. Я вот думаю, что mic5219 можно исключить из схемы, если питать устройство стабилизированным напряжением планшета или mp1584. ИХМО, это тот случай, когда на плате про микро предусмотрена возможность замыкания перемычки J1

Alex15BV
06.03.2019, 22:13
Т.е оптибут не обязательно? Оригинальный бутлоадер не уйдет в bootloop? А насколько часто зависает устройства без отсутствия этой функции?
P.S. Я вот думаю, что mic5219 можно исключить из схемы, если питать устройство стабилизированным напряжением планшета или mp1584. ИХМО, это тот случай, когда на плате про микро предусмотрена возможность замыкания перемычки J1
1. Когда в первый раз добавил собаку - МК ушёл в бутлуп, пришлось перешивать через программатор. Прошил оптибут - вообще Дуню убил, восстанавливал путем подмены файлов в системных папках ИДЕ и ручного редактирования конфигов. Вернул всё назад и отказался от ВДТ... А потом вдруг заработало само. За всё время экспериментов зависания были два раза (оно было на промежуточных версиях, но "береженого Бог бережёт"). На крайней версии скетча глюков не было пока.
2. Я просто перенёс на плату Дуню один-в-один. Можно, конечно, питание сделать по нормальному - но я просто не задумался об этом (коли за 200 рублей мне дают полный набор комплектующих)...

skanch
07.03.2019, 00:32
... Я вот думаю, что mic5219 можно исключить из схемы, если питать устройство стабилизированным напряжением планшета или mp1584...
С Pro Micro работал мало, в основном с Pro Mini, но стабилизаторы на этих китайских платах стоят как правило одинаковые. И если сравнивать потребление платой (Pro Mini) на родном стабилизаторе и от MP1584, то mic5219 - это почти 25-30 мА, а MP1584 9-12мА. И ещё один момент: по даташиту максимальное напряжение на mic5219 до 20В, но почему-то мрут уже на 14В... Поэтому если делаешь с "нуля", лучше питание на MP1584.

mazay66
07.03.2019, 10:30
skanch, Это все верно, если питать схему джойстик от бортовой сети авто. Но как я понял, в данном случае, устройство питается от хаба. Т.е. получает уже стабилизированное напряжение +5В. И далее по схеме модуля Про Микро, через диод Шотки идет на понижающий стабилизатор 5В - MIC5219. Получается "масло масляное". А вот если питать джойстик от бортовой сети, а не от хаба, то понижающий стабилизатор нужен.

skanch
07.03.2019, 11:08
skanch, Это все верно, если питать схему джойстик от бортовой сети авто. Но как я понял, в данном случае, устройство питается от хаба. Т.е. получает уже стабилизированное напряжение +5В. И далее по схеме модуля Про Микро, через диод Шотки идет на понижающий стабилизатор 5В - MIC5219. Получается "масло масляное". А вот если питать джойстик от бортовой сети, а не от хаба, то понижающий стабилизатор нужен.
Если ProMicro используется по назначению в виде "джойстика", то питание идёт по линии USB и при этом любое внешнее питание должно быть отключено. На "фирменных" платах Arduino Micro (https://www.arduino.cc/en/uploads/Main/arduino-micro-schematic.pdf) стоят ключи автоматического отключения линии внешнего питания при подключении USB штеккера. На китайских клонах этого нет. Если повторить трассировку печатной платы китайского клона, то просто стабилизатор не использовать, а линии питания VCC, VCC1, AVCC, AVCC1, UVCC и VBUS должны быть соединены и питание заводить по линии от HUB-а. Или делать отдельный DC-DC преобразователь прямо на плате, но линию "плюс" от USB нужно разрывать.

mazay66
14.05.2019, 12:34
Если честно, я выкладываю свои поделки скорее как "идеи", нежели как "проекты"... Как их использовать (копировать полностью, или брать только нужное, а или игнорировать вовсе) - это уж каждый сам решает.
Отпишусь и я по результатам теста собранного изделия. За основу взята идея уважаемого Алексея (Alex15BV). Немного изменена схема питания платы (убрал лишние, на мой взгляд, элементы, добавил пару диодов). Вообщем ничего существенного. Частично изменил функционал и назначение кнопок, для чего пришлось "поковырять" скетч. В результате, получилось, что 9 кнопок и энкодер выполняют более 25 различных задач, которые полностью перекрыли мои "хотелки". Зафиналил два изделия. Распаивал параллельно две платы в надежде на то, что хоть одна да заработает. Заработали обе, нигде не "накосячил".
Подобрал корпус. На мой взгляд, немного не эстетично. Тут, ИХМО, лучше встраивать плату в обшивку/отделку автомобиля, предварительно определившись с местом в авто. Сейчас, в Рено Колеос, это выглядит как на фото. Есть желание убрать корпус и разместить плату джойстика в этой же нише, закрыв её. Ну и что бы "разбавить сухой" текст, выкладываю несколько фото и ссылку на видео (https://www.youtube.com/watch?v=HInXotX8_SA) получившегося устройства.
P.S. После того, как были потрачено много времени, нервов и денег в поисках подходящего устройства ( на фото только некоторые из них) для управления автомобильным планшетом, наконец-то обрел то, что хотел. Основные недостатки трекбола, клавиатуры и пр. кнопок - не полный функционал управления, не эстетичный вид и габариты, опасность/невозможность использования в движении, т.к. требуется концентрация внимания на устройстве. В получившемся джойстике управление интуитивно понятно и не требует отвлечения. Еще раз спасибо Алексею за идею.

Alex15BV
24.05.2019, 13:29
Отпишусь и я по результатам теста собранного изделия. За основу взята идея уважаемого Алексея (Alex15BV). Немного изменена схема питания платы (убрал лишние, на мой взгляд, элементы, добавил пару диодов). Вообщем ничего существенного. Частично изменил функционал и назначение кнопок, для чего пришлось "поковырять" скетч. В результате, получилось, что 9 кнопок и энкодер выполняют более 25 различных задач, которые полностью перекрыли мои "хотелки"...
Приветствую.
Отличная реализация! Самому пока не получается заниматься... Полно бытовых проблем. Прочитал сообщение, увидел фразу "... более 25 различных задач..." - посетила идея: ведь кнопка "MODE" может по кругу переключать флаг режима. В итоге имеем "страничную" систему, уползаем с if на case - и получаем индивидуальную работу пульта под разные ситуации. :unsure2:

mazay66
24.05.2019, 15:23
Я ограничился тремя режимами MODE - мышь, клавиатура и медиа. Причем, case - не стал использовать, что бы не переключаться "по кругу". У меня короткое нажатие всегда переключает между режимом мыши и клавиатурой. Длинное нажатие всегда включает режим МЕДИА (из любого положения). Так, показалось, удобнее.

kyty30v
09.08.2019, 20:02
Всем доброго времени суток. Появилась необходимость прикрутить к нексусу 2013 выносное управление ввиду того, что он конструктивно установлен не совсем удобно для управления руками. Тачпад от ноута через переходник уже затестил, встал вопрос прикрутить пару- тройку доп клавиш. Собственно, полистал эту тему. С ардуино пока никак, не смог на промикро заставить даже светодиод моргать(. Собственно вопрос, а почему вы упираетесь так в ардуино. Нельзя ли допустим распотрошить какой нить старый геймпад и к его выходам напаять кнопки. Далее через переназначение клавиш назначить им необходимые функции, или я чего то упускаю? Ну и наткнулся что мол с ардуино не работает наэкранная клавиатура, это на везде, или особенность какого то отдельного скетча?

oleg707
09.08.2019, 23:15
Всем доброго времени суток. Появилась необходимость прикрутить к нексусу 2013 выносное управление ввиду того, что он конструктивно установлен не совсем удобно для управления руками. Тачпад от ноута через переходник уже затестил, встал вопрос прикрутить пару- тройку доп клавиш. Собственно, полистал эту тему. С ардуино пока никак, не смог на промикро заставить даже светодиод моргать(. Собственно вопрос, а почему вы упираетесь так в ардуино. Нельзя ли допустим распотрошить какой нить старый геймпад и к его выходам напаять кнопки. Далее через переназначение клавиш назначить им необходимые функции, или я чего то упускаю? Ну и наткнулся что мол с ардуино не работает наэкранная клавиатура, это на везде, или особенность какого то отдельного скетча?

Так как раз таки с ардуиной проще всего. Промикро ( которая на 32u4 процессоре) (https://duino.ru/arduino-pro-micro.html) умеет аппаратно притворяться полноценной клавиатурой. Можно собрать примитивную схему, залить готовый или написать самому скетч и имеем полноценную клавиатуру, посылающий нужные нам сочетания клавиш при нажатии внешних кнопок. Также есть программа сериал менеджер, там ещё круче, можно вообще данные гонять ( например забортная температура).
Цена ардуины тоже влияет на популярность.
Наэкранная клавиатура при подключении физической в Андроиде отключается, поэтому в настройках нужно включить, чтобы 2 одновременно могли работать.
Так что решайте, конечно, сами.

kyty30v
09.08.2019, 23:25
Ну вот я и купил на 32u4 что то она мне не поддается, гребаный блинк не могу залить.
Ну если с блинком разобрался с горем пополам. То выше выложенный скетч не удается компилировать, ругается на tablet.

fokin91
15.08.2019, 12:04
Всем доброго времени суток. Появилась необходимость прикрутить к нексусу 2013 выносное управление ввиду того, что он конструктивно установлен не совсем удобно для управления руками. Тачпад от ноута через переходник уже затестил, встал вопрос прикрутить пару- тройку доп клавиш. Собственно, полистал эту тему. С ардуино пока никак, не смог на промикро заставить даже светодиод моргать(. Собственно вопрос, а почему вы упираетесь так в ардуино. Нельзя ли допустим распотрошить какой нить старый геймпад и к его выходам напаять кнопки. Далее через переназначение клавиш назначить им необходимые функции, или я чего то упускаю? Ну и наткнулся что мол с ардуино не работает наэкранная клавиатура, это на везде, или особенность какого то отдельного скетча?

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

Геймпад распотрошить можно, так же можно и распотрошить клавиатуру обычную и вытащить ее кнопки, но это, по крайней мере для меня, сложнее, чем собрать на ардуино (https://duino.ru/category/arduino/) или STM32 (https://duino.ru/maple-mini-na-kontrollere-stm32-cortex-m3-.html) нужный контроллер.

anru
15.09.2019, 13:34
Привет всем. Имеется Ардуино и она подключена у меня в хаб для управления с руля но я хочу подключить с руля управление камерой переднего вида. То есть включение реле подачи тока на камеру и отключение другой кнопкой или по истечении какого-то времени. Это можно реализовать в скетче вместе со скетчем клавиатуры. Скетч брал от сюда.

Alex15BV
15.09.2019, 16:58
Конечно можно: скетч - это же цикл бесконечный... Добавляешь, что тебе нужно - и Ардуинка будет это обрабатывать вместе с клавиатурой.

anru
16.09.2019, 10:51
Здравствуйте. Помогите подредактировать скетч пожалуйста на включение реле от кнопки руля. Скетч прилагаю и схему. Надо чтобы от одного значения включать реле а от другого отключалась или отключалась сама после заданного времени.
https://cloud.mail.ru/public/4X7L/3HAmLnUj4 это примерная схема.
https://cloud.mail.ru/public/2HS7/59sD7ZyGZ это скетч.
Спасибо большое.

архей
01.11.2019, 00:19
В общих чертах накидал с горем пополам вот такой скетч
#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 5; //число строк у нашей клавиатуры

const byte COLS = 5; //число столбцов у нашей клавиатуры

char hexaKeys[ROWS][COLS] = {

{'1','2','3','4','5'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования

{'6','7','8','9','0'},

{'A','B','C','D','E'},

{'F','G','H','I','J'},

{'K','L','M','N','O'}



};

byte rowPins[ROWS] = {2, 3, 4, 5, 6}; //к каким выводам подключаем управление строками

byte colPins[COLS] = {7, 10, 16, 14, 15}; //к каким выводам подключаем управление столбцами

//initialize an instance of class NewKeypad

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup()
{
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT_PULLUP);
pinMode (9,INPUT_PULLUP);

Keyboard.begin();
Serial.begin(9600);
}
// настройка функциональных клавиш
void loop(){
char customKey = customKeypad.getKey();



// назначение действий на кнопки


if (customKey == 'B') {

Keyboard.press(KEY_UP_ARROW);
delay (100);
Keyboard.releaseAll();
}
if (customKey == '2') {

Keyboard.press(KEY_DOWN_ARROW);
delay (100);
Keyboard.releaseAll();


}
if (customKey == 'O') {

Remote.previous();
delay (100);
Remote.clear();


}if (customKey == '7') {

Remote.next();
delay (100);
Remote.clear();

}if (customKey == '4') {

Remote.play_pause();
delay (100);
Remote.clear();

}if (customKey == '5') {

Remote.mute();
delay (100);
Remote.clear();

}if (customKey == '9') {

Keyboard.press(KEY_RETURN);
delay (100);
Keyboard.releaseAll();


Serial.println(customKey);
}

}


// часть кода для регулировки громкости энкодером

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;
}






Все кнопки работают, энкодер работает, нажатия на кнопки назначать получается. Но ! очень хочется реализовать управление с коротким/ длинным нажатием как в скетче Ув. lti1
http://pccar.ru/showpost.php?p=319975&postcount=307.
Ну ни как я не могу въехать, как переделать строки

if(millis()-eventTime>10 && millis()-eventTime<499 && data>=165 && data<=185) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
{
flag = 7;
}
под матричную клавиатуру, в которой нету дребезга, не надо ничего сравнивать.
Очень прошу, на примере одной команды перемотки вперед, подскажите что нужно добавить в мой скетч, в том числе над циклом loop.
вы какую библиотеку Keypad используете ? у меня ваш код не проходит проверку

pakmani
08.07.2020, 16:13
добрый день!
начинаю осваивать Ардуино. стал вопрос с резистивными кнопками ...
точнее как правильно написать скетч, что бы по нажатию кнопки запускалось приложение (конкретно навигатор) и просыпался планшет ... команду на режим сна нашел.

PalЫч
24.01.2023, 00:33
а возможно подключить матричные кнопки ?