А ты не считал какое суммарное сопротивление получится при нажатии на кнопку S6 ?
Вид для печати
А ты не считал какое суммарное сопротивление получится при нажатии на кнопку S6 ?
Нет, не считал, а что?
При таком большом сопротивлении будет сильная зависимость от температуры и от наводок бортовой сети автомобиля. Попробуй протестируй , а то может быть это у меня паранойя :)
Я бы поменял все сопротивления на 100 ом
Я как понимаю резисторы тут делят напряжение и по напряжению на выходе получается сигнал, который ардуино должен единообразно интерпретировать.
Ну а если в качестве питания 12В (14,7В) использовать? Возможно делится напряжение будет единообразно... правда падение напряжения до 9В возможно.
Какие-то пределы нужно прописывать для каждой кнопки.
Есть код для подключения модуля из 5 кнопок с резисторной обвязкой
Хочу его адаптировать под управление рулевыми кнокпами
В коде строка int adc_key_val[5] ={50, 200, 400, 600, 800 } - значения на анал. входе (от 0 до 1023)
Как эти значения связаны с сопротивлением резисторов?
Вот у меня какие значения при нажатых кнопках выдал мультиметр:Код://ADKeyboard Module
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
void setup()
{
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat
Serial.begin(9600); // 9600 bps
}
void loop()
{
adc_key_in = analogRead(0); // read the value from the sensor
digitalWrite(13,LOW);
key = get_key(adc_key_in); // convert into key press
if (key != oldkey) // if keypress is detected
{
delay(50); // wait for debounce time
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey)
{
oldkey = key;
if (key >=0){
digitalWrite(13,HIGH);
switch(key)
{
case 0:Serial.println("S1 OK");
break;
case 1:Serial.println("S2 OK");
break;
case 2:Serial.println("S3 OK");
break;
case 3:Serial.println("S4 OK");
break;
case 4:Serial.println("S5 OK");
break;
}
}
}
}
delay(100);
}
// Convert ADC value to key number
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)k = -1; // No valid key pressed
return k;
}
82ом кнопка "-"
164ом кнопка "+"
284ом кнопка "SRC"
463ом кнопка ">>|"
792ом кнопка "|<<"
1470ом кнопка ">"
Я надеюсь их удастся единообразно трактовать при нажатии.
http://big-e.ru/files/Buttons.jpg
Подключать планирую так.
Общее питание 12В.
На землю один конец , а второй на аналоговый вход через делитель.
Цепь раздельной оказалась, поэтому можно и без 12В обойтись.
Подключил к +5В и земле:
без нажатия кнопок на выходе 4,94В
с нажатой любой кнопкой 4,96В
Практически не изменилось значение.
Что я не пойму как подключать к ардуине... а именно к аналоговому входу.
Я не понял, ты бы лучше схему подключения нарисовал
Вот она, схема:
http://big-e.ru/files/Buttons.jpg
Как сие к ардуино подключить не знаю.
Может резистор R7 выпаять надо? тогда уровень логического нуля будет при разомкнутых кнопках.
В шапке темы есть схема подключения
Так?
http://big-e.ru/files/but.jpg
А значения емкости и сопротивления оставить как есть?
Все верно.
R7 можно выкинуть, хотя на работу он не повлияете
Chip
Сегодня носил нашу схему на работу к себе, товарищ сделал ряд уточнений по номиналам резистора и кондера, что наверное правильно, я же с твоей схемы тупо передрал
и получилось так:
http://big-e.ru/files/but1.jpg
Причем при расчете исходили из того, чтобы при нажатии 1ой кнопки питание по цепи получалось бы 1В. Прикинули и получили, что резистор для этого нужен на 330 ом. Ну а дальше посчитали и получили, что каждая следующая нажатая кнопка добавит ~0.6В. А при не нажатых кнопках питание через цепь будет 4,6В. Кондер он мне посоветовал, почему-то 0,1мкФ.
Вопрос: Правильно ли мы прикинули и будет ли ардуино правильно трактовать кнопки при том, что шаг каждой 0,6В.
Если взять, что 5В=1023, то 0,6В=122 (1В =204), ну то есть, чтобы правильно идентифицировать кнопку, я должен оценить ряд:
204 326 448 570 692 814 936
с каким-то допуском +-
Попробуй свою схему на практике , потом расскажешь.
А твои рекомендации по номиналам, какие?
Свои рекомендации я выложил в шапке.
Можешь заменить резистор на 2к, но не меньше
Ну раз гуру сказал, значит так тому и быть...
Паяю...на 3,3 кОм.
Кондер могу 0,1, могу 0,014 мкФ
с кондером 0,1м возможно что будет лучше сглаживать помехи, но и может притормаживать.
Резистор тебе можно поставить 2к-2,2к
Работает!!! :)
Что бы я делал без этого форума и его Админа, на котором все держится.
Chip
Поясни строки кода:
зачем второй байт?PHP код:
bytes[0] = res_d & 255; // преобразовать в 2-байта
bytes[1] = (res_d & 768) >> 8;
Потому что значение 1023 в один байт не укладывается
А вообще рекомендую более свежую версию скетча и софта
Учту, спасибо!
Вот финальная схема, которую я (в кавычках) наконец реализовал:
http://big-e.ru/files/but2.jpg
Код для этой схемы, передрал отсюда http://www.compcar.ru/forum/showpost...&postcount=227 и адаптировал под свою задачу
Код:// Функция проверки нажатия рулевой кнопки
// Возвращает false если кнопка не была нажата
// и true если нажата
// ButtonName принимает значения в зависимости от нажатой кнопки +, -, >, R=>>|, L=|<<, S=SRC, X=None
boolean WheelButonPush_IsPushed()
{
bool result;
result=false;
unsigned long buttonVal;
buttonVal=0;
ButtonName='X';
res_d = analogRead(WheelButtonsPin);
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(WheelButtonsPin);
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis();
math_time = real_time - old_time;
res_dt1 = analogRead(WheelButtonsPin);
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}
if( math_time > 70)
{
buttonVal=res_d;
ButtonName='X';
// Serial.println (res_d);
if ((buttonVal>25) && (buttonVal<45))
{
ButtonName='-'; //35-36
result=true;
}
if ((buttonVal>60) && (buttonVal<85))
{
ButtonName='+'; //72-73
result=true;
}
if ((buttonVal>110) && (buttonVal<135))
{
ButtonName='S'; //122
result=true;
}
if ((buttonVal>175) && (buttonVal<200))
{
ButtonName='R'; //187
result=true;
}
if ((buttonVal>275) && (buttonVal<295))
{
ButtonName='L'; //285
result=true;
}
if ((buttonVal>415) && (buttonVal<440))
{
ButtonName='>'; //429
result=true;
}
if ((buttonVal>645) && (buttonVal<670))
{
ButtonName='X'; //658-659
result=false;
}
buttonVal=0;
}
return result;
}
Подскажите плз, собрал также, работает нормально, но где-то через минут 20 толи подвисает, толи еще чтото потом через пол минуты отпускает и опять нормально работает. куда нужно копать?
собрал на ардуине нано v3
Возможно ардуиной проблемы? попробуй другие скетчи
дома на 7ке работает. в машине на XP пишет FT_Open - Device not found
в чем может быть проблемка?
и еще в 7ке определяется как carmonitor joystik
а в ХР просто USB serial port (COM15)
Попробуй драйвер переустановить
kadushkin
не компилица твой код:confused:
Небольшой "трикс" для владельцев ардуин без специального "кнопочного" входа.
PORTC - это очень хитрый порт :D
В часть его встроены внутренние "подтяжки". Что открывает чуть больший простор для творчества.Конкретно, ноги A0-A5.
Ниже схема и код, который без проблем снимает значения рулевых кнопок Киа Соренто с ноги А1.
http://img-fotki.yandex.ru/get/6523/...8a7_cb0c1c24_L
Если где было, прошу сильно не пинать :)PHP код:
//v_down=167
//v_up=124
//preset=235
//seek=25
//mode=67
void setup() {
Serial.begin(9600);
PORTC |= B00000010; //вот это самая главная строчка для корректной работы АЦП (нога А1) для А2 это будет выглядеть так PORTC |= B00000100;
}
void loop() {
Serial.print(analogRead(1));
Serial.print('\n');
delay(100);
}
Также, имейте в виду, что внутренней подтяжки может не хватить для конкретной резистивной матрицы, тогда придется подбирать делитель самостоятельно и ставить внешние резисторы.
Подскажите пож, на первых 25 страницах не нашел...
На какой максимальный номинал резистора можно настроить это решение?
Дело в том, что я хочу привернуть морду, где кнопки исходно не резистивные (каждая с транзисторным ключом), но в принципе нормально замыкаются, просто разбег в зав-ти от силы нажатия слишком большой, на сотни Ом.
Хочется пустить эти кнопки через разные доп сопротивления, и, учитывая указанную погрешность, речь будет идти о кОмах, чтобы не было пересечений.
Всего 8 кнопок, соотв будет грубо говоря так - 1кОм, 2, 3... 8 + к каждому 50-600 Ом добавится при нажатии.
Помогите пож. Carduino v7, Win7, собрал по схеме с первой страницы.
Hkey_config не реагирует на подключаемые ко входу сопротивления, 0 постоянно.
Немогу вкурить, как ставить "Driver_CDM20814_WHQL_Certified". Пытался "обновить" драйвера для устройства, подсунув эту папку - не выходит. Как эту хрень ставить?
В устройствах и принтерах - "CarDuino Nano V.7". В стандартном компиляторе скетч "blink" успешно работает, т.е. девайс вроде бы рабочий.
Значит вход закорочен на GNDЦитата:
Hkey_config не реагирует на подключаемые ко входу сопротивления, 0 постоянно.
Если все работает, то драйвер устанавливать не нужноЦитата:
В устройствах и принтерах - "CarDuino Nano V.7". В стандартном компиляторе скетч "blink" успешно работает, т.е. девайс вроде бы рабочий.
Нет, отключил вообще обвязку - сразу появляется 0 после запуска конфига.
Вот так выглядит всё: http://youtu.be/kIB3uzoJcxc
Без резистора смещения на входе A5 будет 0
Прошу простить мою упрямость ) Но оч хочу разобраться, что всё-таки делаю не так.
Вот, напаял всё прямо на плату. Сопротивление из двух (прямо 3.3 не было, из пары получилось 3.18кОм). Через переключатель подключено сопротивление около 200 Ом.
Ничего не меняется. Всегда "0".
https://www.youtube.com/watch?featur...&v=KiEItNSZz84
Админы на форумах, для того что бы помогатьЦитата:
Прошу простить мою упрямость
Судя по морганию синего светодиода, у тебя не залит скетч
Спасибо за помощь! Да, делал по инстре, про скетч соотв забыл.
Теперь перехват работает + диапазон сопротивлений мне вполне подходит, супер.
Но теперь затык такой. В конфиге ловлю сопротивление, фиксирую нажатие на клавиатуре, получаю строку вида <895>Key1=17 Key2=18 Key3=18 />, сохраняю.
Запускаю Hotkey.exe, он ловит сопротивление, показывает 895, но нажатия в винде не эмулирует ( Пробовал разные символы задавать.
И ещё вопросик: а после отключения ардуино скетч придётся снова заливать? как сделать, чтобы он там был постоянно прописан?
Достаточно прошить 1 раз и он там будет находится, пока не прошьешь новый скетчЦитата:
а после отключения ардуино скетч придётся снова заливать? как сделать, чтобы он там был постоянно прописан?
Что за комбинация горячих клавиш такая?Цитата:
Но теперь затык такой. В конфиге ловлю сопротивление, фиксирую нажатие на клавиатуре, получаю строку вида <895>Key1=17 Key2=18 Key3=18 />, сохраняю.
Попробуй курсор эмулировать
Я пробую эмулировать любые клавиши, не получается. Не жмёт оно их.
Хоть сочетания, хоть просто "1". (
Hotkey.exe показывает (если его развернуть) пойманный код, но больше ничего не происходит
В веду в курс дел.
У меня Adroino nano 3.0 c замкнутыми ножками 25 и 26 (спасибо Chip за внятное объяснение где и куда)
сделано по схеме http://www.compcar.ru/forum/attachme...7&d=1309418390
только без кон 0.01мфр.
Кнопки руля подключены все как надо рабочие, сняты данные всех кнопок.
скетч от Hamster единственный который работал
(у него как и у меня тоже хондовские кнопки руля может из за этого).
Код:/// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY (200)
#define KEY_CH_PLUS_DELAY (200)
#define KEY_VOL_MINUS_DELAY (150)
#define KEY_VOL_PLUS_DELAY (150)
#define KEY_MODE_DELAY (300)
// Значения кнопок
#define KEY_CH_MINUS (175)
#define KEY_CH_PLUS (330)
#define KEY_VOL_MINUS (0)
#define KEY_VOL_PLUS (73)
#define KEY_MODE (530)
// Погрешность при чтении кнопок
#define KEY_DELTA (30)
// Коды кнопок, что отсылаем в порт внешней проге
#define CH_MINUS (1)
#define CH_PLUS (2)
#define VOL_MINUS (3)
#define VOL_PLUS (4)
#define MODE (5)
#define NONE (0)
unsigned long LastTimeKeyPressed = millis();
int LastKeyPressed = NONE;
void setup()
{
Serial.begin(9600);
}
void loop()
{
ReadSteering();
delay(50);
}
// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()
{
unsigned long TimeKeyPressed;
int KeyPressed = NONE;
int dt1 = analogRead(5);
delay(50);
int dt2 = analogRead(5);
if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
{
// Регистрируем время нажатия кнопки
TimeKeyPressed = millis();
//CH_MINUS
if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
{
if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
{
LastKeyPressed = CH_MINUS;
KeyPressed = CH_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//CH_PLUS
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
{
if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
{
LastKeyPressed = CH_PLUS;
KeyPressed = CH_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_MINUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
{
if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
{
LastKeyPressed = VOL_MINUS;
KeyPressed = VOL_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_PLUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
{
if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
{
LastKeyPressed = VOL_PLUS;
KeyPressed = VOL_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//MODE
else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
{
if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
{
LastKeyPressed = MODE;
KeyPressed = MODE;
LastTimeKeyPressed = TimeKeyPressed;
}
}
if (KeyPressed != NONE)
{
Serial.print(char(255));
Serial.print(KeyPressed,DEC);
}
//Serial.print(dt1,DEC);
//Serial.print(" ");
//Serial.println(dt2,DEC);
}
}
все работало стабильно на XP и на Win 7, установил Win 8 Pro и после этого тишина.
Сам ардионо находит и опознан я даже с машины заново закачивал скеч все проходило без проблем, обновлял драйвера для Win8 на всякий случай нечего не изменилось.
В Serial Monitor смотрел при нажатии кнопок нет реакции, по идее вроде проблема в дровах, но они последние которые я нашел для Win8 Pro может нужны какие то другие? я ставил CDM 2.08.24 WHQL Certified, и закачивал через Ardoino 1.0.1.
Завтра попробую подключить к лептопу проверить работает все на XP Pro SP3 но это все ровно не помогает найти причину, есть ли у кого то идеи в чем может быть проблема?
Кроме идей перейти на Win7.
Причина по которой я перешел на Win 8 Pro это то что она выходит из Гибернацим очень быстро 30 сек, со временем приобрету SSD и будет за 5-10 сек.
Вытащил его с машины начал экспериментировать заметил что у меня стояло сопротивление 4.5 кило ом заменил на 3.28Ком припаял 1 кнопку залил скеч вижу сколько выдает при нажатии, решил вернуть в машину и записать новые значения кнопок но тут он взбесился и начал выдавать в Serial Monitor всякую хрень без остановки в виде
&&&&&&&&&&&&&&&&&&
0
&&&&&&&&&&&&&&&&&
0
&&&&&&&&&&&&&&&&&
там конечно были немножко другие символы.
Раньше помню тоже как то было такое вроде, но решили как то.
В чем может быть проблема проверял кнопки руля работают и через тестер дают сопротивление.
Это нормально.
Serial Monitor пытается отображать бинарные значения в кодировке ASC-II
А Вы что хотели в нем увидеть, реальные обозначения или сопротивления нажатых кнопок?