Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12
  1. #1
    Местный Аватар для Murkur
    Регистрация
    31.01.2012
    Возраст
    44
    Сообщений
    157
    Вес репутации
    224

    По умолчанию Энкодер iDrive от BMW 7 E65

    Всем привет.
    Достал себе салон "Комфорт" от BMW E65 и хочу установить в свою машину, не BMW. Все регулировки электросидений расположены на подлокотнике, который тоже буду устанавливать. И ещё решил задействовать поворотный энкодер на этом же подлокотнике, который можно использовать для управления компом.
    Нажмите на изображение для увеличения. 

Название:	bmw_panel_01.jpg 
Просмотров:	788 
Размер:	31.8 Кб 
ID:	16750
    Сам энкодер устроен на оптопаре с вращающимся щелевым диском, как в старых мышках. Плюс есть ещё джойстик, который добавляет 8 направлений: вперёд, назад, влево, вправо и ещё 4 по диагонали. А вращающийся диск ещё и нажимается.
    Но пока не могу разобраться, как подключить оптопару. Дело в том, что там, как я предполагаю, стоит не простой ИК-приёмник, а измеритель угловой скорости и направления вращения.
    Можно, конечно, заменить этот датчик на простой ИК-приёмник, но это уже будет крайний вариант, если с этим не разберусь
    Распайку на этой маленькой плате нарисовал схематически. На этой схеме, думаю, что выходы "b" и "c" - это плюс и минус соответственно. Логику датчика смотрел по даташиту похожего сенсора Sharp IS471.
    Может кто имел дело с такими датчиками и сможет подсказать, как правильно построить логику или написать код для Ардуино?
    Спасибо.
    Нажмите на изображение для увеличения. 

Название:	IMG_0894.JPG 
Просмотров:	1348 
Размер:	136.4 Кб 
ID:	16751Нажмите на изображение для увеличения. 

Название:	IMG_0895.JPG 
Просмотров:	605 
Размер:	162.3 Кб 
ID:	16752Нажмите на изображение для увеличения. 

Название:	IMG_0896.JPG 
Просмотров:	507 
Размер:	308.4 Кб 
ID:	16753Нажмите на изображение для увеличения. 

Название:	IMG_0898_03.jpg 
Просмотров:	786 
Размер:	84.2 Кб 
ID:	16754Нажмите на изображение для увеличения. 

Название:	IMG_0901_04.jpg 
Просмотров:	456 
Размер:	181.3 Кб 
ID:	16755Нажмите на изображение для увеличения. 

Название:	photo_sensor_1.jpg 
Просмотров:	450 
Размер:	36.1 Кб 
ID:	16756
    Последний раз редактировалось Murkur; 04.11.2013 в 22:33.
    MSI E350IA-E45, AMD Zacate E-350, RAM - 4 Gb, HDD - 120 Gb, M2-ITX, GPS - RoyalTek RGM-3600, 8" TFT, Win 7

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    Моя версия
    b(+)
    c(-)
    a(out)
    d(out)
    Остается выяснить какой напряжение нужно подавать на b и c
    Скорее всего +5в но прежде чем подключать нужно удостовериться в этом
    Последний раз редактировалось Chip; 18.10.2013 в 03:09.

  3. #3
    !!!
    Регистрация
    30.12.2007
    Сообщений
    116
    Вес репутации
    272

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    помница мне что с джостика в бмв все по шине ibas идет
    на форуме есть тема как её читать

    не каких проблем с отлаживанием работы все до тебя бмв сделало

  4. #4
    Местный
    Регистрация
    23.01.2011
    Возраст
    44
    Сообщений
    183
    Вес репутации
    237

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    А контакты подписаны на этом энкодере ?
    Просто подобный я подключал с помощью одного одноформутчанина используя плату microsin. Сейчас стоит работает в авто.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	d83c41682702.jpg 
Просмотров:	2412 
Размер:	79.8 Кб 
ID:	16790  

  5. #5
    Местный
    Регистрация
    23.01.2011
    Возраст
    44
    Сообщений
    183
    Вес репутации
    237

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    Могу исходниками поделится, почту в личку скинь

  6. #6
    Местный Аватар для Murkur
    Регистрация
    31.01.2012
    Возраст
    44
    Сообщений
    157
    Вес репутации
    224

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    Цитата Сообщение от Artemka181 Посмотреть сообщение
    Могу исходниками поделится, почту в личку скинь
    А что это за плата microsin? Просто я уже реализовал поворот энкодера, одиночное и длительное нажатие через Ардуину. Теперь ещё буду пробовать джойстик подключать, у которого 8 положений.
    Есть ещё один вопрос... Как можно реализовать обратную связь для энкодера, чтобы она работала, как в оригинале? Тоесть, когда крутишь энкодер, то электродвигатель в нём создаёт ступенчатое сопротивление оборотам. В оригинале, кажется, было 30 ступенек на один оборот.
    MSI E350IA-E45, AMD Zacate E-350, RAM - 4 Gb, HDD - 120 Gb, M2-ITX, GPS - RoyalTek RGM-3600, 8" TFT, Win 7

  7. #7
    Местный
    Регистрация
    23.01.2011
    Возраст
    44
    Сообщений
    183
    Вес репутации
    237

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    Плата, сайтик microsin.ru По поводу обратной связи я не знаю не сталкивался. У меня такого нет

  8. #8
    Местный Аватар для Murkur
    Регистрация
    31.01.2012
    Возраст
    44
    Сообщений
    157
    Вес репутации
    224

    По умолчанию 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(encoder0PinAINPUT);
      
    digitalWrite(encoder0PinAHIGH );
      
    pinMode(encoder0PinBINPUT);
      
    digitalWrite(encoder0PinBHIGH );
      
     
    // вход кнопки энкодера
     
    pinMode(encoder0PinCINPUT);
     
    digitalWrite(encoder0PinCHIGH );
      
     
    // входы джойстика
     
    pinMode(joy0PinAINPUT);
      
    digitalWrite(joy0PinAHIGH );
      
    pinMode(joy0PinBINPUT);
      
    digitalWrite(joy0PinBHIGH );
      
    pinMode(joy0PinCINPUT);
      
    digitalWrite(joy0PinCHIGH );
      
    pinMode(joy0PinDINPUT);
      
    digitalWrite(joy0PinDHIGH );
      
    pinMode(joy0PinEINPUT);
      
    digitalWrite(joy0PinEHIGH );
      
    pinMode(joy0PinFINPUT);
      
    digitalWrite(joy0PinFHIGH );
      
    pinMode(joy0PinGINPUT);
      
    digitalWrite(joy0PinGHIGH );
      
    pinMode(joy0PinHINPUT);
      
    digitalWrite(joy0PinHHIGH );

     
    // выход светодиода
     
    pinMode(ledPinOUTPUT);
     
    digitalWrite(ledPinledVal);
     
     
    Serial.begin(115200);
     }
    //=================================================

    void loop()
    {
    // Энкодер
       
    digitalRead(encoder0PinA);
       if ((
    encoder0PinALast == LOW) && (== HIGH)) {
         if (
    digitalRead(encoder0PinB) == LOW) {
          
    bytes[0] = 0xEE;           
          
    bytes[1] = 0
          
    bytes[2] = encoder0PinA;
          
    bytes[3] = 1;  
          
    Serial.writebytes,4);  // EE000201
         
    } else {
          
    bytes[0] = 0xEE;           
          
    bytes[1] = 0
          
    bytes[2] = encoder0PinB;
          
    bytes[3] = 1;  
          
    Serial.writebytes,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(ledPinledVal);
         
    delay(200);
         
    digitalWrite(13,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = encoder0PinCbytes[3] = 1;  
         
    Serial.writebytes,4); // EE000301
       
    }
       else { 
    ignoreUp false;
         
    btnUpTime millis();
       }
     }

     
    // Проверить, нажата ли кнопка дольше времени удержания
     
    if (buttonVal == LOW && buttonLast == LOW && (millis() - btnDnTime) > long(holdTime))
     {
        
    ledVal = !ledVal;
        
    digitalWrite(ledPinledVal);
        
    delay(200);
        
    digitalWrite(13,LOW);//выключаем
        
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = encoder0PinCbytes[3] = 2;  
        
    Serial.writebytes,4); // EE000302
        
    ignoreUp true;
        
    btnDnTime millis();
     }
     
    buttonLast buttonVal;
     

    // Джойстик //
    //////////////
      
    if (digitalRead(joy0PinA)==LOW) {//влево
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinAbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001900
      
    }
      if (
    digitalRead(joy0PinB)==LOW) {
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinBbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001800
      
    }
      if (
    digitalRead(joy0PinC)==LOW) {
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinCbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001700
      
    }
      if (
    digitalRead(joy0PinD)==LOW) {//
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinDbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001600
      
    }
      if (
    digitalRead(joy0PinE)==LOW) {//
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinEbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001C00
      
    }
      if (
    digitalRead(joy0PinF)==LOW) {//отмена
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinFbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001B00
      
    }
      if (
    digitalRead(joy0PinG)==LOW) {//
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinGbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001A00
      
    }
      if (
    digitalRead(joy0PinH)==LOW) {//вправо
         
    digitalWrite(ledPin,HIGH);//включаем светодиод 
         
    delay(200);
         
    digitalWrite(ledPin,LOW);//выключаем
         
    bytes[0] = 0xEEbytes[1] = 0bytes[2] = joy0PinHbytes[3] = 0;  
         
    Serial.writebytes,4);  // EE001D00
      
    }

    MSI E350IA-E45, AMD Zacate E-350, RAM - 4 Gb, HDD - 120 Gb, M2-ITX, GPS - RoyalTek RGM-3600, 8" TFT, Win 7

  9. #9
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    И ещё, как сделать обратную связь на этом энкодере? Там стоит обычный электродвигатель и из него выходит только 2 провода. Как именно подавать на него импульсы, чтобы он не крутился, а просто замирал на месте и создавал небольшое сопротивление кручению,
    Нужно замкнуть провода из электромотора между собой

    Пока не могу только разобраться, как сделать функцию нажатия кнопки с поворотом энкодера. Может кто подскажет?
    Нужно проверять нажатие кнопки и вращение, если кнопка нажата и не было вращения то значит было только нажатие
    Последний раз редактировалось Chip; 04.11.2013 в 15:32.

  10. #10
    Местный Аватар для Murkur
    Регистрация
    31.01.2012
    Возраст
    44
    Сообщений
    157
    Вес репутации
    224

    По умолчанию Re: Энкодер iDrive от BMW 7 E65

    Цитата Сообщение от Chip Посмотреть сообщение
    Нужно замкнуть провода из электромотора между собой
    Замкнуть провода просто на короткое замыкание? А что же тогда будет идти на двигатель?
    Ааа, понял - это ж елементарно И лучше неверное не замыкать провода между собой, а через Ардуину подавать на них одинаковое напряжение.

    Цитата Сообщение от Chip Посмотреть сообщение
    Нужно проверять нажатие кнопки и вращение, если кнопка нажата и не было вращения то значит было только нажатие
    Дело в том, что иногда и простое нажатие получается с небольшим кручением, так как нет фиксации. Для этого и хочу сделать небольшое сопротивление через двигатель.
    Последний раз редактировалось Murkur; 04.11.2013 в 22:31.
    MSI E350IA-E45, AMD Zacate E-350, RAM - 4 Gb, HDD - 120 Gb, M2-ITX, GPS - RoyalTek RGM-3600, 8" TFT, Win 7

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •