Очень нужна Ваша помощь в программировании!!!!
- Войдите на сайт для отправки комментариев
Втр, 22/12/2015 - 07:39
Здравствуйте товарищи! Совсем недавно начал изучать 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 }
Уважаемые модераторы! Можно попросить Вас удалить мои темы в связи с неправильным их размещением? Ранее на форумах необщался, поэтому прошу прощения за свои косяки и впредь обещаю размещать всё как положено!
Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.
Удалять не будем. Можем отредактировать.
Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.
Да,нет! Очень даже интересно! И развёрнутый код легче читается. Парень проделал большую работу, просто подсказать некому.
Здравствуйте товарищи! Совсем недавно начал изучать arduino. Появилась потребность сделать при помощи платы arduino nano v3.0 адаптер подрулевого джойстика для нештатной магнитолы...
Сашенька, скажи, ты брал где-то готовые блоки скетчей? Подскажи, пожалуйста.
Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.
Да,нет! Очень даже интересно! И развёрнутый код легче читается. Парень проделал большую работу, просто подсказать некому.
Обычно сперва читают описание проблемы, а затем уже код. Если код длинный, то до описания могут и не дойти, а значит шансы на помощь снижаются.