понял... завтра буду опять пытаться все наладить... Это уже последний штрих в мое проекте
спсб
Вид для печати
я так понимаю клавиши нажимаешь по очереди, когда нажимаешь на руле кнопку, клавиши должны быть отжаты, когда добавляешь - клавиша на руле должа быть нажата, так?
Чип, спасибо тебе большое... заработал... Я тупо не так сохранял кнопки.
Вещь супер. Проект свое доделал. УРАААААААААА
Вот и отлично.
Обновил программу. Вылечил баг с автозагрузкой .
У меня тоже прогресс. Все кнопочки заработали. Победил перепоршивкой скетча. Причём процесс был довольно странный: первая перешивка полностью отключила адаптер. Он практически перестал реагировать на кнопки и выдавал значения в шестизначном виде. Причём изредка нажатие на кнопку вызывало некое фиксированное значение, причём одинаковое для любой кнопки. После некоторых нехороших слов, прошил еще раз, и всё получилось. Все кнопки работают. В общем, какой-то непонятный процесс.
Да, програмку стоит обновить из предыдущего поста?
Из исправлений только кнопка автозагрузки стала корректно работать, из остального ничего не трогал
Я батник использую
Хорошая новость для пользователей iCar-DS.
В iCar-DS появилась поддержка Piltik, Joystik, Encoder
с икаром программа из шапки не нужна, она встроена
Что-то у меня вообще новая версия программы не хочет стабильно работать...
После сна вообще не подхватывает ардуино, вернее программа её видит, но в окне где должны быть цыфры пустое поле, помогает перезагрузка.
Иногда вместо 850 показывает 248788(в общем длинное число) и не реагирует на нажатия.
Старая версия программы работает стабильно, но примерно раз в неделю зависает наглухо, после перезагрузки всё норм...
Винда какая?
Win7 x86 пробовал разные сборки...
Версия драйверов какая?
Если есть возможность подьехать в офис www.carmonitor.ru, подвозите устройство, проверим и отремонтируем.
а когда самое раннее можно завтра в офис подъехать (проблема с подключением joystick к subaru forester)?
P.S. на сайте carmonitor.ru кстати никогда не мог адрес найти... где он там? что-то вроде вернадского просп, да?
Завтра буду с 13-00 до 19-00
тел. 8-926-7782358
Что-то у меня совсем странно ведёт себя ардуино....
Вчера замучался, перестала даже управлять нормально "пионером" оказалось, почему то все показания вырасли на 20....
Сегодня всё переделал, поставил как положено 3.3к и 0.01мкф, но результат тот же, показания скачут, иногда в программе выскакивают значения 154567, при нажатии 6345 или 2354. в общем не пойми что, но при этом магнитола пионер управляется нормально....
По выше указанному номеру много дней не могу дозвониться....
Телефон работает по будням с 10 до 19
Здравствуйте!
Помогите, пожалуйста!
решил сделать кнопки+энкодер, попытался соединить 2 кода в один... вот что получилось:
Если начинаю резко крутить энкодер - программа начинает читать неверные значения, а именно вместо 2048 - 1372830241 (число написал примерно, на самом деле их слишком много, выскакивают разные, иногда повторяются), кнопки при этом глюке тоже показывают неверные значения, тоже увеличенные до больших размеров, но все пропорционально... например вместо 20 показывает 248912, а вместо 250 показывает 5448912Код:#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0PinC 4
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности при дребезге
byte bytes[4];
//byte bytes[2]={0,7};
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); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, 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(digitalRead(encoder0PinC)==LOW)
{
res_d=res_d+2000;
// Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
// bytes[1]=7;
}
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); // отправить прочитаное значение компьютеру
bytes[0] = 0;
bytes[1] = 0;
bytes[2] = 0;
bytes[3] = 0;
}
}
// обработка прерывания
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){res_d=2048;
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;}
// Serial.write( bytes,2);
// bytes[0]=0;}
}
// обработка прерывания
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){res_d=2084;
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;}
// Serial.write( bytes,2);
// bytes[0]=0;}
}
и т.д... Через пару сек может все встать на свои места или через 10-20 сек... Где ошибка?
UPDATE:
Сейчас вместо 1000 четко показывал 256000, еще покрутил - показал 65536000
вместо 990 - 253440
вместо 1023 - 261888
ну то есть просто умножает на 256 программа или скетч... потом все нормально становится
Используй для энкодера нижеприведенный код
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);
}
ну, я его не с балды поменял, у меня с "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, не умножаются числа...
Не знаю в чем проблема, нет возможности проверить.
А программу какую используешь?
Да! обнулять массив после отправки данных не нужно
не нужно
Цитата:
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;
Программа HotKey_V2.9
файлик от 23 января...
Обнулял - от безысходности =) А вдруг помогло бы =)
Попробуй вот этот скетч
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);
}
Выложил обновленную версию программы.
Чтобы не испортить настройки меняем только экзешник
Попробуйте и отпишитесь
Обновил, попробовал этот скетч, но:
Все тоже самое =(
Delay в энкодерах пытался выставить 10,100,1000 - не помогло...
нету идей больше? =(
энкодер у меня из старой японской магнитолы 2001 года, с трещеткой...
Всех приветствую.
Планирую установку carpc в AUDI a6 f4. Думал приобрести данное устройства чтобы подключить кнопки руля и MMI к компу, это возможно?
Хочется использовать все кнопки и крутилку для управления компом.
если этими кнопками не планируется управлять штатной системой , то возможно
Можно, но только через коммутатор
Это реле работающее от +12в и имеющее две группы перекидных контактов
Загрузил скетч из первого сообщени, Hotkey.exe вроде отрабатывал нажатия нормально.
Казалось бы, всё ОК.. стал менять скетч... загружаю... и всё блин, словил ошибку
И всё, больше ничего не заливается. Вытаскивать, bootloader загружать теперь?Цитата:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Перемычка установлена?
Если скинешь фото могу нарисовать на нем в каком месте сделать надрез термоусадки
Пока не надо... Оказалось, ардуинка работает. :) Правда, она вообще всегда как-то странно у меня работает - пока машина холодная, Hotkey.exe не показыавает ничего ... Как прогреется - показывает 980 плюс-минус... Нажатия отрабатывает, например VOL+ = 184 и т.д.
Как только машина чуть остынет, вместо 980 "в спокойном состоянии" уже что-то вроде 320... VOL + = 58... Вроде того. Потом исчезают совсем показания. В чем может быть причина такого странного поведения, и как стабилизировать показания? Схема резиствных кнопока такая: от кнопок к SIDу (SAAB Informational Display) идут два провода - референс земля (pin 23) и вход на собственный оцифровщик SID-а (pin 24)... Вот на этих двух проводах между кнопками и SID-ом моя дуинка и висит:
http://dl.dropbox.com/u/27657611/Pho...9-5_Scheme.png
Так ты параллельно подключился?