вот что у меня получилось (может и коряво, но главное работает)
Код:
#include <SPI.h>
// библиотека SPI должна быть в стандартном софте, ну или её можно скачать.
const byte POT = B00010000; //выбор канала потенциометра
// Коды имеющихся на руле кнопок
const int next=6;
const int previous=54;
const int vol_up=140;
int csPin=10; // CS на цифровом потенциометре
int wheelPin=A5; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки
int i=0;
int prevButton=0;
int r; //keyboard
unsigned long flag = 0; //keyboard
void setup() {
pinMode(csPin, OUTPUT);
delay(50);
SPI.begin();
delay(50);
SPI.transfer(POT); // команда
SPI.transfer(0); // значение
pinMode(wheelPin, INPUT);
delay(100);
Keyboard.begin(); //keyboard
}
int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0
// читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
int r=analogRead(wheelPin);
//if(r>=release_button - button_release_range && r<=release_button + button_release_range && flag == 0) //keyboard
if (r>=2 && r<=10) return(next);
if (r>=50 && r<=60) return(previous);
if (r>=120 && r<=156) return(vol_up);
}
// ОСНОВНОЙ ЦИКЛ
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 next: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(21);
digitalWrite(csPin, HIGH);
Remote.next();
flag = 0;
delay(10);
Remote.clear();
break; // 16k
case previous: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(50);
digitalWrite(csPin, HIGH);
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
break; // 24k
case vol_up: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(14);
digitalWrite(csPin, HIGH);
break; // 11k
default: digitalWrite(csPin, LOW);
SPI.transfer(POT);
SPI.transfer(0);
digitalWrite(csPin, HIGH);
break;
}
}
}
delay(5);
}