136283090Если вы установили планшет в автомобиль, то возникает желание управлять им с рулевых кнопок автомобиля, при этом если оставили автомагнитолу не хочется терять возможность управлять и магнитолой, для этого я разработал плату которая с этим прекрасно справляется.

Давайте разберемся как это реализовать по шагово.

 

Видео версия статьи управление резистивными кнопками при помощи arduino
{youtube}gakYJC0xZTU{/youtube}

 

Для начала нам необходимо приобрести плату Arduino Leonadro или ArduinoMicro, главное отличие этих контроллеров в том что на них установлены микропроцессоры Atmega32u4 которая имеет на борту встроенную поддержку USB-соединения, благодаря чему не требуется вспомогательный процессор. Это позволяет устройствам на Atmega32u4 появляться на подключенном планшете (с поддержкой OTG) или компьютере в качестве мыши или клавиатуры в дополнение к виртуальному (CDC) последовательному порту (COM). В общем подойдет любой arduino совместимый контроллер который построен на Atmega32u4.

Вторым шагом после того как приобрели необходимый вам контроллер необходимо скачать ArduinoIDE и установить для того чтобы установились драйвера, затем чтобы работали все функции скачайте подготовленную мной портативную версию ArduinoIDE вот ЗДЕСЬ, в этот архив уже добавлены все необходимые библиотеки и изменены файлы для работы в качестве медиа клавиатуры.

podresДалее в качестве примера я выбрал Arduino Leonardo и нам необходимо собрать схему как указано на картинке слева. Т.е установить подтягивающий резистор на 10кОм между ногами GND и A0, это нужно для того чтобы АЦП процессора не показывал паронормальные явления. Т.е нам нужные стабильные значения, в данном случае значение АЦП в терминале будет показывать 0 (где брать значения читайте ниже), если мы поставим Резистор между 5v и A0 значение АЦП в терминале будет показывать 1023. Благодаря встроенному 10-и битному АЦП мы и будем читать резистивные кнопки автомобиля.

podres1

Теперь после того как мы подключили подтягивающий резистор необходимо подключить резистивные кнопки, для этого берем 1 резистор на 1 кОм ещё один на 2 кОм, (будем собирать своего рода делитель напряжения) и 2 кнопки. По идее это всё можно и не собирать если у вас на руках резистивные кнопки автомобиля у них обычно 4 и более кнопок но всего 2 провода. Как можно видать на схеме справа у нас  2 кнопки но их количество можно увеличить скажем до 100 но будет управляться всего 2 мя проводами. 1 конец провода соединяем к порту A0 второй к порту 5v

podres2Слева можете наблюдать схему как всё подключено, Подтягивающий резистор R1 на 10 кОм подключен между GND и A0, далее 2 резистора R2 и R3 выступают в качестве резистивной клавиатуры один конец этих сопротивлений соединен с портом A0 вторые концы к кнопкам S1 и S2 в свою очередь выводы кнопок подключены к порту 5v. Так что же произойдет если мы нажмем на кнопку кнопку S1? У нас через резистор R2 пойдёт напряжение на порт A0, но пойдёт туда не 5в а меньше так как на резисторе R2 произойдёт падение напряжения и на порту A0 окажеться примерно 4.5 если нажать на S2 то у него в цепи стоит R3, сопротивление которого больше чем у R1 значит падение на нем тоже будет больше и на порт A0 придет примерно 4.1в, эти разные значения мы и будем считывать. 

provod3

 И так мы всё подключили, теперь будем программировать, запустите arduino с распакованной папки arduino-1.0.5-r2 которую скачивали чуть выше. Теперь скопируйте код который под спойлером ниже и вставьте в ArduinoIDE. После того как загрузиться программа в ардуино, откройте Сервис -> Монитор порта. Если всё правильно подключено вы увидите что каждые пол секунды у вас появляется 0. Когда я нажимаю кнопку S1 у меня появляется значение ~930 оно немного может меняться, когда нажимаю кнопку S2 появляется значение ~853. Вот мы и считали резистивные кнопки, запишем их на какой нибудь листок S1 - 930, S2-853.

Ниже скетч для считывания значений кнопок.

//GENMC.ru рулевое управление планшетом
int rknop; 

void setup()
{
Serial.begin(9600); 

pinMode(rknop,INPUT); 
}

void loop()
{
rknop=analogRead(A0);
Serial.println(rknop);  
delay(500);  
}
И так значения считали, теперь давайте сделаем переключение музыки и т.д. нам понадобятся следующие команды:
Remote.next(); //следующая песня
Remote.previous(); //предыдущая песня
Remote.play_pause(); //плей и паузу
Remote.increase(); //громкость прибавить
Remote.decrease(); //громкость убавить
Remote.mute(); //Убрать звук
Remote.play(); // Воспроизвести
Remote.stop(); //Остановить воспроизведение
Remote.forward(); //Ускорить воспроизведение
Remote.rewind(); //Обратное воспроизведение
int rknop; // это переменная которая хранит  значения наших кнопок.
void setup()
{
Serial.begin(9600); //это скорость соединения с компьютером (для сериал монитора в нашем случае)

pinMode(rknop,INPUT); 
}

void loop()
{
rknop=analogRead(A0); //Считываем значения на порту A0 и записываем значения в переменную rknop
Serial.println(rknop); //Отправляем данные переменной rknop на компьютер
delay(500);  //небольшая задержка в пол секунды, её можно удалить но значения в сериал мониторе будет меняться очень быстро

///////////////////////////////////////////
if(rknop < 960 && rknop > 900) //здесь мы делаем условие. Т.е если у наз значение переменной rknop больше 900 и меньше 960 то делаем какоето действие которая ниже. На сколько мы помним при нажатии кнопки S1 у нас значения были ~930 так вот мы могли написать просто if(rknop == 930) что означает если rknop равно 930 то делем дейсвие которое ниже, но наши значения немного игрют поэтому мы задаем никий промежуток от 900 до 960
{
Remote.next(); //отправляем команду следующая песня
delay(200);      //делаем небольшую задержу чтоб устройство успело отправить необходимые команды на планшет или компьютер и не засыпать его командами
Remote.clear();//очищаем команду
}

////////////////////////////////////////////
if(rknop < 880 && rknop > 820)
{
Remote.previous(); //предыдущая песня
delay(200);
Remote.clear();
}

//далее все повторяется, просто добавляйте значения (которые считали с кнопок) и команды (команды над спойлером) столько сколько у вас кнопок.
}

 После того как загрузите этот скетч в arduino, включите на компьютере плеер с музыкой и попробуйте нажать кнопку S1 по идее должно произойти переключение музыки на следующую при нажитии кнопки S2 на предыдущую. Для того чтобы добавить остальные команды просто добавляем ещё один пункт значений присваиваем им нужные значения и загружаем в ардуино, в общем то и всё. (если устройство работает на компьютере то будет и работать на планшете с OTG) 

Далее поговорим как связать один рулевой пульт с планшетом и магнитолой:

Магнитолы фирмы Sony и Pioneer для управления используют определённые сопротивления (номиналы на картинках ниже), от фирм Alpain и Kewoor определённый протокол похожий на IR сигнал пульта от телевизора только он передается по проводу. 

24fa4dbf6e31

 ed5f018s 960

  

Для того чтобы управлять всем этим я разработал специальную плату для управления с рулевых кнопок. Схема устройства

  

5468

Для управления магнитолами Pioneer и Sony используется микросхема MCP4131-104 это цифровой потенциометр на котором можно регулировать сопротивление от 0 кОм до 100 кОм в 129 шагов (этого достаточно чтоб управлять магнитолами) Для управления Alpain и Kenwood микросхему MCP4131-104 ставить не нужно а просто замкнуть перемычку 1 и 2 или если смотреть на ноги микросхемы MCP-4131-104 замкнуть CS(D5) с P0W(JACK 3.5 +), в этом случае выход D5 arduino напрямую пойдёт на вывод JACK3.5 + и в прошивке необходимо указать сигнальный вывод порт D5 для передачи кодов на магнитолы. В качестве источника питания используется микросхема MC34063 она имеет отличное кпд по сравнению с LM7805, но обвязка немного сложнее чтоб получить 5в. Напряжение на вывод +12V можно подавать от 6-до40. По идее питане можно и не разводить, а брать напрямую с USB устройства но в таком случае значение АЦП плавают в зависимости от напряжения на порту USB вследствии чего трудно настроить резистивные кнопки или вообще не возможно.

123335665

Далее под спойлерами представлены скетчи для управления магнитолами

Скетч для управления магнитолами Pioneer


#include <SPI.h&gt// библиотека SPI должна быть в стандартном софте, ну или её можно скачать. // Коды имеющихся на руле кнопок const int VOL_UP=1; const int VOL_DN=2; const int PREV_TR=3; const int NEXT_TR=4; const int MODE=5; const int MUTE=6; int csPin=5; // CS на цифровом потенциометре int wheelPin=A5; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки int i=0; int prevButton=0; void setup() { pinMode(csPin, OUTPUT); delay(50); SPI.begin(); delay(50); SPI.transfer(0); // команда SPI.transfer(0); // значение pinMode(wheelPin, INPUT); delay(100); //Serial.begin(9600); } int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 // читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине int r=analogRead(wheelPin); //Serial.println®; // Ищем, какая кнопка соответствует этому сопротивлению. // Данные значения сопротивлений подходят для Suzuki Swift, для других автомобилей числа будут другие. if (r>=9 && r<=15) return(VOL_UP); if (r>=18 && r<=26) return(VOL_DN); if (r>=120 && r<=156) return(PREV_TR); if (r>=60 && r<=80) return(NEXT_TR); if (r>=33 && r<=47) return(MODE); if (r>=2 && r<=6) return(MUTE); // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // ОСНОВНОЙ ЦИКЛ void loop() { int currButton=getR(); // заносим в переменную currButton код нажатой кнопки if (currButton!=prevButton) { // если значение поменялось с прошлого раза delay(10); currButton=getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки if (currButton!=prevButton) { // если код кнопки точно поменялся с прошлого раза //Serial.println(currButton); prevButton=currButton; // сохраняем новое значение в переменную prevButton // Выставляем сопротивление на потенциометре, тем самым посылаем команду на магнитолу. // Значения сопротивлений даны для Pioneer, для магнитол других марок числа будут другие. SPI.transfer(0); switch(currButton) { case VOL_UP: SPI.transfer(21); break; // 16k case VOL_DN: SPI.transfer(31); break; // 24k case PREV_TR: SPI.transfer(14); break; // 11k case NEXT_TR: SPI.transfer(10); break; // 8k case MODE: SPI.transfer(2); break; // 1.6k case MUTE: SPI.transfer(4); break; // 3k default: SPI.transfer(0); break; // 0k } } } delay(5); }

Скетчи для остальных магнитол добавлю чуть позже