Очень нужна ваша помощь с программированием!!!
- Войдите на сайт для отправки комментариев
Здравствуйте товарищи! Совсем недавно начал изучать arduino. Появилась потребность сделать при помощи платы arduino nano v3.0 адаптер подрулевого джойстика для нештатной магнитолы. Вся клавиатура джойстика представлена матрицей 3x3 — т.е. всего 9 ключей. Но 3 из них отвечают за работу колеса (энкодера). Оставшиеся 6 ключей отвечают за кнопки. На просторах интернета удалось найти скетч этого джойстика а также протокол управления моей магнитолой JVC. У меня возникли сложности с соединением этих двух скетчей. Знающие люди пожалуйста помогите разобраться. Заранее спасибо! Вот скетчи:
/////////////////////////////////////////////////////////////////
// alpine
#define alpinePin 12
#define cmdPower 0x09
#define cmdSource 0x0A
#define cmdBand 0x0D
#define cmdVolumeDown 0x15
#define cmdVolumeUp 0x14
#define cmdUp 0x0E
#define cmdDown 0x0F
#define cmdLeft 0x13
#define cmdRight 0x12
#define cmdPlay 0x07
#define cmdAProc 0x06
#define cmdMute 0x16
#define cmdAngleUp 0x4C
#define cmdAngleDown 0x4B
#define cmdCDChange 0x03
/////////////////////////////////////////////////////////////////
// джойстик
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] =
{
{1,4},
{2,5},
{6,3}
};
// состояния направлений енкодера
const byte encoderdirection[3][3] = // 0 - на месте, 1 - вниз, 2 - вверх
{
{0, 1, 2}, // 0
{2, 0, 1}, // 1
{1, 2, 0} // 2
};
// 10 9 8 7 6 5
// строки
// красный ч красный
// коричневый ч желтый 6
// черный ч черный
// столбцы
// зеленый б красный
// голубой б черный
// желтый б желтый
// номера пинов
const byte rowPins[rows] = {10, 9, 8}; // строки (желтый, зеленый, голубой)
const byte colPins[cols] = {7, 5}; // столбцы (черный, красный)
#define encoderPin 6 // пин енкодера (коричневый)
byte encodervalue;
// маски для клавиш
#define MaskMediaButton 1
#define MaskRadioButton 2
#define MaskVolumeUpButton 4
#define MaskVolumeDownButton 8
#define MaskOkButton 16
#define MaskMuteButton 32
#define MaskScrollDown 64
#define MaskScrollUp 128
unsigned long starttime;
bool workkbd;
/////////////////////////////////////////////////////////////////
void setup()
{
int i;
// строки - на выход
for (i = 0; i < rows; ++i)
{
pinMode(rowPins[i], OUTPUT);
}
// столбцы - на вход
for (i = 0; i < cols; ++i)
{
pinMode(colPins[i], INPUT);
digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор
}
// столбец для енкодера
pinMode(encoderPin, INPUT);
digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор
encodervalue = 0;
// управление Alpine
pinMode(alpinePin, OUTPUT);
starttime = millis();
workkbd = false;
}
// сканирование джойстика
byte scan(void)
{
int i, j;
byte code = 0;
for (i = 0; i < rows; ++i)
{
digitalWrite(rowPins[i], LOW);
// кнопки
for (j = 0; j < cols; ++j)
{
if(digitalRead(colPins[j]) == false)
{
code |= 1 << (keys[i][j] - 1);
}
}
// енкодер
if (digitalRead(encoderPin) == false)
{
int oldencodervalue = encodervalue;
encodervalue = i;
switch (encoderdirection[oldencodervalue][encodervalue])
{
case 1: // вниз
code |= 64;
break;
case 2: // вверх
code |= 128;
break;
}
}
digitalWrite(rowPins[i], HIGH);
}
return code;
}
// отправка байта
void SendByte(byte data)
{
for (int i = 0; i < 8; ++i)
{
digitalWrite(alpinePin, HIGH);
delayMicroseconds(560);
digitalWrite(alpinePin, LOW);
if (data & 1)
{ // 1
delayMicroseconds(1680);
}
else
{ // 0
delayMicroseconds(560);
}
data >>= 1;
}
}
// отправка команды
void Send(byte command)
{
digitalWrite(alpinePin, HIGH);
delayMicroseconds(9000);
digitalWrite(alpinePin, LOW);
delayMicroseconds(4500);
SendByte(0x86);
SendByte(0x72);
SendByte(command);
SendByte(~command);
digitalWrite(alpinePin, HIGH);
delayMicroseconds(560);
digitalWrite(alpinePin, LOW);
}
// цикл программы
void loop(void)
{
byte code;
code = scan();
if (workkbd == false)
{
if (millis() - starttime > 3000)
workkbd = true;
return;
}
if (code & MaskMediaButton)
Send(cmdDown);
if (code & MaskRadioButton)
Send(cmdUp);
if (code & MaskVolumeUpButton)
Send(cmdRight);
if (code & MaskVolumeDownButton)
Send(cmdLeft);
if (code & MaskOkButton)
Send(cmdPlay);
if (code & MaskMuteButton)
Send(cmdMute);
if (code & MaskScrollDown)
Send(cmdVolumeDown);
if (code & MaskScrollUp)
Send(cmdVolumeUp);
}
Протокол управления магнитолой
/*
JVC
Communicate with JVC car radio over 3.5mm Remote connector
Connect Arduino PIN to Base of NPN transistor
Emitter is tied to ground
Collector is tied to 3.5mm TIP
Ground 3.5mm Ring/Sleeve
By Dan Guerra (deguerra98@yahoo.com)
*/
int PIN = 7; // Digital IO pin connected to base of transistor
int Length = 537; // Length in Microseconds
int IncomingByte = 0; // Initialize Serial Buffer
int Reps = 3; // Number of times to repeat each transmission
void setup() {
pinMode(PIN, OUTPUT); // Set pin to output
digitalWrite(PIN, LOW); // Make PIN low to shut off transistor
Serial.begin(9600);
Serial.println("1 - Volume Up");
Serial.println("2 - Volume Down");
Serial.println("3 - Source");
Serial.println("4 - Sound");
Serial.println("5 - Mute");
Serial.println("6 - Skip Fwd");
Serial.println("7 - Skip Back");
Serial.println("8 - Skip Fwd Hold");
Serial.println("9 - Skip Back Hold");
}
void loop() {
if (Serial.available() > 0) {
IncomingByte = Serial.read();
switch (IncomingByte) {
case '1':
JVCVolUp();
break;
case '2':
JVCVolDn();
break;
case '3':
JVCSource();
break;
case '4':
JVCSound();
break;
case '5':
JVCMute();
break;
case '6':
JVCSkipFwd();
break;
case '7':
JVCSkipBack();
break;
case '8':
JVCSkipFwdHold();
break;
case '9':
JVCSkipBackHold();
break;
default:;
}
}
}
void JVCVolUp() { // Send 0x04
for (int i = 1; i <= Reps; i++); {
Preamble();
bZERO();
bZERO();
bONE(); // 4
bZERO();
bZERO();
bZERO(); // 0
bZERO();
Postamble();
}
}
void JVCVolDn() { // Send 0x05
for (int i = 1; i <= Reps; i++); {
Preamble();
bONE();
bZERO();
bONE(); // 5
bZERO();
bZERO();
bZERO(); // 0
bZERO();
Postamble();
}
}
void JVCSource() { // Send 0x08
for (int i = 1; i <= Reps; i++); {
Preamble();
bZERO();
bZERO();
bZERO(); // 8
bONE();
bZERO();
bZERO(); // 0
bZERO();
Postamble();
}
}
void JVCSound() { // Send 0x0D
for (int i = 1; i <= Reps; i++); {
Preamble();
bONE();
bZERO();
bONE(); // D (13)
bONE();
bZERO();
bZERO(); // 0
bZERO();
Postamble();
}
}
void JVCMute() { // Send 0x0E
for (int i = 1; i <= Reps; i++); {
Preamble();
bZERO();
bONE();
bONE(); // E (14)
bONE();
bZERO();
bZERO(); // 0
bZERO();
Postamble();
}
}
void JVCSkipFwd() { // Send 0x12
for (int i = 1; i <= Reps; i++); {
Preamble();
bZERO();
bONE();
bZERO(); // 2
bZERO();
bONE();
bZERO(); // 1
bZERO();
Postamble();
}
}
void JVCSkipBack() { // Send 0x13
for (int i = 1; i <= Reps; i++); {
Preamble();
bONE();
bONE();
bZERO(); // 3
bZERO();
bONE();
bZERO(); // 1
bZERO();
Postamble();
}
}
void JVCSkipFwdHold() { // Send 0x14
for (int i = 1; i <= Reps; i++); {
Preamble();
bZERO();
bZERO();
bONE(); // 4
bZERO();
bONE();
bZERO(); // 1
bZERO();
Postamble();
}
}
void JVCSkipBackHold() { // Send 0x15
for (int i = 1; i <= Reps; i++); {
Preamble();
bONE();
bZERO();
bONE(); // 5
bZERO();
bONE();
bZERO(); // 1
bZERO();
Postamble();
}
}
void bONE() { // Send a binary ONE over the line
digitalWrite(PIN, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(PIN, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length * 3); // for 537 * 3 = 1611us
}
void bZERO() { // Send a binary ZERO over the line
digitalWrite(PIN, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(PIN, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length); // for 537us
}
void Preamble() {
digitalWrite(PIN, LOW); // Not sure what this does
delayMicroseconds(Length * 1);
digitalWrite(PIN, HIGH); // AGC
delayMicroseconds(Length * 16);
digitalWrite(PIN, LOW); // AGC
delayMicroseconds(Length * 8);
bONE(); // 1 Start Bit
bONE(); // (7 bit device code)
bONE();
bONE(); // 7
bZERO();
bZERO();
bZERO(); //4
bONE();
}
void Postamble() {
bONE();
bONE(); // 2 stop bits
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...