Вложений: 7
Энкодер iDrive от BMW 7 E65
Всем привет.
Достал себе салон "Комфорт" от BMW E65 и хочу установить в свою машину, не BMW. Все регулировки электросидений расположены на подлокотнике, который тоже буду устанавливать. И ещё решил задействовать поворотный энкодер на этом же подлокотнике, который можно использовать для управления компом.
Вложение 16750
Сам энкодер устроен на оптопаре с вращающимся щелевым диском, как в старых мышках. Плюс есть ещё джойстик, который добавляет 8 направлений: вперёд, назад, влево, вправо и ещё 4 по диагонали. А вращающийся диск ещё и нажимается.
Но пока не могу разобраться, как подключить оптопару. Дело в том, что там, как я предполагаю, стоит не простой ИК-приёмник, а измеритель угловой скорости и направления вращения.
Можно, конечно, заменить этот датчик на простой ИК-приёмник, но это уже будет крайний вариант, если с этим не разберусь :)
Распайку на этой маленькой плате нарисовал схематически. На этой схеме, думаю, что выходы "b" и "c" - это плюс и минус соответственно. Логику датчика смотрел по даташиту похожего сенсора Sharp IS471.
Может кто имел дело с такими датчиками и сможет подсказать, как правильно построить логику или написать код для Ардуино?
Спасибо.
Вложение 16751Вложение 16752Вложение 16753Вложение 16754Вложение 16755Вложение 16756
Re: Энкодер iDrive от BMW 7 E65
Моя версия
b(+)
c(-)
a(out)
d(out)
Остается выяснить какой напряжение нужно подавать на b и c
Скорее всего +5в но прежде чем подключать нужно удостовериться в этом
Re: Энкодер iDrive от BMW 7 E65
помница мне что с джостика в бмв все по шине ibas идет
на форуме есть тема как её читать
не каких проблем с отлаживанием работы все до тебя бмв сделало
Вложений: 1
Re: Энкодер iDrive от BMW 7 E65
А контакты подписаны на этом энкодере ?
Просто подобный я подключал с помощью одного одноформутчанина используя плату microsin. Сейчас стоит работает в авто.
Re: Энкодер iDrive от BMW 7 E65
Могу исходниками поделится, почту в личку скинь
Re: Энкодер iDrive от BMW 7 E65
Цитата:
Сообщение от
Artemka181
Могу исходниками поделится, почту в личку скинь
А что это за плата microsin? Просто я уже реализовал поворот энкодера, одиночное и длительное нажатие через Ардуину. Теперь ещё буду пробовать джойстик подключать, у которого 8 положений.
Есть ещё один вопрос... Как можно реализовать обратную связь для энкодера, чтобы она работала, как в оригинале? Тоесть, когда крутишь энкодер, то электродвигатель в нём создаёт ступенчатое сопротивление оборотам. В оригинале, кажется, было 30 ступенек на один оборот.
Re: Энкодер iDrive от BMW 7 E65
Плата, сайтик microsin.ru По поводу обратной связи я не знаю не сталкивался. У меня такого нет
Re: Энкодер iDrive от BMW 7 E65
Немного продвинулся с этим энкодером. Получилось реализовать вращение влево/вправо, одиночное и длинное нажатие, а также 8 направлений вертикальной оси. Всё подключено через Ардуину и успешно управляет iCarDS.
Пока не могу только разобраться, как сделать функцию нажатия кнопки с поворотом энкодера. Может кто подскажет?
И ещё, как сделать обратную связь на этом энкодере? Там стоит обычный электродвигатель и из него выходит только 2 провода. Как именно подавать на него импульсы, чтобы он не крутился, а просто замирал на месте и создавал небольшое сопротивление кручению, но при этом энкодер можно было бы поворачивать? Тоесть, энкодер будет проворачиваться ступеньками.
Пока использую такой код:
PHP код:
#define encoder0PinC 3
#define ledPin 13 // цифровой выход светодиода
#define debounce 100 // ms время антидребезга при нажатии и отпускании кнопки
#define holdTime 500 // ms время удержания: как долго ждать срабатывания днинного нажатия
// Контакты джойстика
#define joy0PinA 22
#define joy0PinB 23
#define joy0PinC 24
#define joy0PinD 25
#define joy0PinE 26
#define joy0PinF 27
#define joy0PinG 28
#define joy0PinH 29
// Переменные кнопки
byte bytes[4];
int buttonVal = 0; // значение, считанное с кнопки
int buttonLast = 0; // буферное значение предыдущего состояния кнопки
long btnDnTime; // время, сколько кнопка была нажата
long btnUpTime; // время отпускания кнопки
boolean ignoreUp = false; // игнорировать отпускание кнопки,
//потому что сработало длительное нажатие
// Переменные энкодера
int encoder0PinA = 2;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
// Светодиод
boolean ledVal = false; // состояние LED
//=================================================
void setup()
{
// входы энкодера
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH );
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH );
// вход кнопки энкодера
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH );
// входы джойстика
pinMode(joy0PinA, INPUT);
digitalWrite(joy0PinA, HIGH );
pinMode(joy0PinB, INPUT);
digitalWrite(joy0PinB, HIGH );
pinMode(joy0PinC, INPUT);
digitalWrite(joy0PinC, HIGH );
pinMode(joy0PinD, INPUT);
digitalWrite(joy0PinD, HIGH );
pinMode(joy0PinE, INPUT);
digitalWrite(joy0PinE, HIGH );
pinMode(joy0PinF, INPUT);
digitalWrite(joy0PinF, HIGH );
pinMode(joy0PinG, INPUT);
digitalWrite(joy0PinG, HIGH );
pinMode(joy0PinH, INPUT);
digitalWrite(joy0PinH, HIGH );
// выход светодиода
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledVal);
Serial.begin(115200);
}
//=================================================
void loop()
{
// Энкодер
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
bytes[0] = 0xEE;
bytes[1] = 0;
bytes[2] = encoder0PinA;
bytes[3] = 1;
Serial.write( bytes,4); // EE000201
} else {
bytes[0] = 0xEE;
bytes[1] = 0;
bytes[2] = encoder0PinB;
bytes[3] = 1;
Serial.write( bytes,4); // EE000401
}
}
encoder0PinALast = n;
// \\ Энкодер
buttonVal = digitalRead(encoder0PinC); // прочитать состояние кнопки
// Проверить нажатие кнопки и записать длительность нажатия
if (buttonVal == LOW && buttonLast == HIGH && (millis() - btnUpTime) > long(debounce))
{
btnDnTime = millis();
}
// Проверить, отпущена ли кнопка и записать длительность отжатия
if (buttonVal == HIGH && buttonLast == LOW && (millis() - btnDnTime) > long(debounce))
{
if (ignoreUp == false) {
ledVal = !ledVal;
digitalWrite(ledPin, ledVal);
delay(200);
digitalWrite(13,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = encoder0PinC; bytes[3] = 1;
Serial.write( bytes,4); // EE000301
}
else { ignoreUp = false;
btnUpTime = millis();
}
}
// Проверить, нажата ли кнопка дольше времени удержания
if (buttonVal == LOW && buttonLast == LOW && (millis() - btnDnTime) > long(holdTime))
{
ledVal = !ledVal;
digitalWrite(ledPin, ledVal);
delay(200);
digitalWrite(13,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = encoder0PinC; bytes[3] = 2;
Serial.write( bytes,4); // EE000302
ignoreUp = true;
btnDnTime = millis();
}
buttonLast = buttonVal;
// Джойстик //
//////////////
if (digitalRead(joy0PinA)==LOW) {//влево
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinA; bytes[3] = 0;
Serial.write( bytes,4); // EE001900
}
if (digitalRead(joy0PinB)==LOW) {
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinB; bytes[3] = 0;
Serial.write( bytes,4); // EE001800
}
if (digitalRead(joy0PinC)==LOW) {
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinC; bytes[3] = 0;
Serial.write( bytes,4); // EE001700
}
if (digitalRead(joy0PinD)==LOW) {//
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinD; bytes[3] = 0;
Serial.write( bytes,4); // EE001600
}
if (digitalRead(joy0PinE)==LOW) {//
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinE; bytes[3] = 0;
Serial.write( bytes,4); // EE001C00
}
if (digitalRead(joy0PinF)==LOW) {//отмена
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinF; bytes[3] = 0;
Serial.write( bytes,4); // EE001B00
}
if (digitalRead(joy0PinG)==LOW) {//
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinG; bytes[3] = 0;
Serial.write( bytes,4); // EE001A00
}
if (digitalRead(joy0PinH)==LOW) {//вправо
digitalWrite(ledPin,HIGH);//включаем светодиод
delay(200);
digitalWrite(ledPin,LOW);//выключаем
bytes[0] = 0xEE; bytes[1] = 0; bytes[2] = joy0PinH; bytes[3] = 0;
Serial.write( bytes,4); // EE001D00
}
}
Re: Энкодер iDrive от BMW 7 E65
Цитата:
И ещё, как сделать обратную связь на этом энкодере? Там стоит обычный электродвигатель и из него выходит только 2 провода. Как именно подавать на него импульсы, чтобы он не крутился, а просто замирал на месте и создавал небольшое сопротивление кручению,
Нужно замкнуть провода из электромотора между собой
Цитата:
Пока не могу только разобраться, как сделать функцию нажатия кнопки с поворотом энкодера. Может кто подскажет?
Нужно проверять нажатие кнопки и вращение, если кнопка нажата и не было вращения то значит было только нажатие
Re: Энкодер iDrive от BMW 7 E65
Цитата:
Сообщение от
Chip
Нужно замкнуть провода из электромотора между собой
Замкнуть провода просто на короткое замыкание? А что же тогда будет идти на двигатель?
Ааа, понял - это ж елементарно :) И лучше неверное не замыкать провода между собой, а через Ардуину подавать на них одинаковое напряжение.
Цитата:
Сообщение от
Chip
Нужно проверять нажатие кнопки и вращение, если кнопка нажата и не было вращения то значит было только нажатие
Дело в том, что иногда и простое нажатие получается с небольшим кручением, так как нет фиксации. Для этого и хочу сделать небольшое сопротивление через двигатель.