Re: Адаптер рулевых кнопок.
Используй для энкодера нижеприведенный код
PHP код:
//http://compcar.ru
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности сопротивления
#define encoder0PinA 2
#define encoder0PinB 3
byte bytes[4];
unsigned long math_time,old_time,real_time, res_dt1, res_d;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
res_d = analogRead(PIN); // прочитать данные АЦП
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность нажатия
res_dt1 = analogRead(PIN); // прочитать данные АЦП
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}
if( math_time > 70) //если нет дребезга то короткое нажатие
{
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
void doEncoderA() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinB)==HIGH) bytes[1]=24; else bytes[1]=15;
Serial.write(bytes, 4);
}
void doEncoderB() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinA)==HIGH) bytes[1]=15; else bytes[1]=24;
Serial.write(bytes, 4);
}
Re: Адаптер рулевых кнопок.
ну, я его не с балды поменял, у меня с "else" очень плохо работает - обратно громкость меняет... тем не менее поставил на пробу этот код:
PHP код:
//http://compcar.ru
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности сопротивления
#define encoder0PinA 2
#define encoder0PinB 3
byte bytes[4];
unsigned long math_time,old_time,real_time, res_dt1, res_d;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
res_d = analogRead(PIN); // прочитать данные АЦП
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность нажатия
res_dt1 = analogRead(PIN); // прочитать данные АЦП
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}
if( math_time > 70) //если нет дребезга то короткое нажатие
{
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
void doEncoderA() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinB)==HIGH) bytes[1]=24; else bytes[1]=15;
Serial.write(bytes, 4);
}
void doEncoderB() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinA)==HIGH) bytes[1]=15; else bytes[1]=24;
Serial.write(bytes, 4);
}
все аналогично...
Через несколько секунд кручения энкодером вместо 1023 начал показывать 261888
UPDATE:
кстати, поставил скетч отсюда: http://www.compcar.ru/forum/showpost...39&postcount=1
значения тоже умножаются на 256 через несколько оборотов...
Хотя MONITOR показывает вот такое:
25 7 25 7 25 7 25 7 25 7 25 7 25 7 25 7
25 7 25 7 25 7 25 7 25 7 25 7 25 7 25 7
25 7 25 7 25 7 25 7 25 7 25 7 25 7 5 7
5 7 5 7 5 7 5 7 5 7 5 7 5 7 5 7 5 7
то есть в нем всегда правильно отображается!
Поставил отсюда: http://www.compcar.ru/forum/showpost...6&postcount=19
все работает и в hotkey и в monitor, не умножаются числа...
Re: Адаптер рулевых кнопок.
Не знаю в чем проблема, нет возможности проверить.
А программу какую используешь?
Да! обнулять массив после отправки данных не нужно
не нужно
Цитата:
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;
Re: Адаптер рулевых кнопок.
Программа HotKey_V2.9
файлик от 23 января...
Обнулял - от безысходности =) А вдруг помогло бы =)
Re: Адаптер рулевых кнопок.
Попробуй вот этот скетч
PHP код:
//http://compcar.ru
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности сопротивления
#define encoder0PinA 2
#define encoder0PinB 3
byte bytes[4];
unsigned long math_time,old_time,real_time, res_dt1, res_d;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
for(byte i=0; i<4; i++) bytes[i]=0;
res_d = analogRead(PIN); // прочитать данные АЦП
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность нажатия
res_dt1 = analogRead(PIN); // прочитать данные АЦП
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}
if( math_time > 70) //если нет дребезга то короткое нажатие
{
bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
void doEncoderA() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinB)==HIGH) bytes[1]=24; else bytes[1]=15;
Serial.write(bytes, 4);
delay(1);
}
void doEncoderB() // обработка прерывания
{
for(byte i=0; i<4; i++) bytes[i]=0;
if(digitalRead(encoder0PinA)==HIGH) bytes[1]=15; else bytes[1]=24;
Serial.write(bytes, 4);
delay(1);
}
Re: Адаптер рулевых кнопок.
Выложил обновленную версию программы.
Чтобы не испортить настройки меняем только экзешник
Попробуйте и отпишитесь
Re: Адаптер рулевых кнопок.
Обновил, попробовал этот скетч, но:
Все тоже самое =(
Delay в энкодерах пытался выставить 10,100,1000 - не помогло...
Re: Адаптер рулевых кнопок.
нету идей больше? =(
энкодер у меня из старой японской магнитолы 2001 года, с трещеткой...
Вложений: 1
Re: Адаптер рулевых кнопок.
Всех приветствую.
Планирую установку carpc в AUDI a6 f4. Думал приобрести данное устройства чтобы подключить кнопки руля и MMI к компу, это возможно?
Хочется использовать все кнопки и крутилку для управления компом.
Re: Адаптер рулевых кнопок.
если этими кнопками не планируется управлять штатной системой , то возможно