Вопрос по преобразованию байтового сигнала в резистивный

avasilkov547
Offline
Зарегистрирован: 29.06.2018

Привет всемогущие, помогите разобраться. Хочу подружить мультируль в авто с магнитолой используя SoftwareSerial.

На руле 4 кнопки, сам руль при нажатии любой кнопки выдаёт байтовый сигнал по одному проводу, на магнитолу необходимо подать одним проводом со стабильным напряжением при нажатии кнопки руля (т.е. при нажатии разных кнопок - на магнитолу разное напряжение). Напряжение любое до 5v, а магнитола подстроится.  Получается сигнал на магнитолу можно снять с ардуино с конкретного пина или определить пины на которых при нажатии кнопки будет выдаваться +5v на определённых пинах а там уже через резистивные делители соеденить и подать на магнитолу

Сам знаком с ардуино только 2-ую неделю. Накопал такой вот скетч, который читает сигнал от руля "как я понял это пин 2" и выдаёт "как я понял на пины 4,5,6,7 напряжение +5v" при нажатии соответствующей кнопки, а так же при нажатии должен загораться светодиод и гаснуть при отпускании. К сожалению с автором скетча связи уже нет(. Автор писал, что делал на версии 1.0.1. Я поступил также - плату подключил к компу, прошил, подключил - не работает((. Светодиод не загорается, при нажатии кнопок по очереди замерял напряжение на всех пинах 4,5,6,7. На всех пинах плавающее напряжение при нажатии любой кнопки руля.

Светодиод рабочий, с платой вопросов нет, при заливке скетча ошибок небыло. Разобрал код, всё вроде логически верно. Может неправильно подключаю или не стыковка где в скетче.

Прошу помидорами не кидать если что. Помогите подружить руль с магнитолой. Заранее Спасибо!

/*
Опытным путем определил коды кнопок

00 7b 4b cf cf 7b cb 4b 4b cf cf cf cf 00 Громкость + 
00 7b 4b cf cf 7b 4b 4b cb cf cf cf cf 00 Громкость -
00 7b 4b cf cf 7b cb 4f 4b cb 7b cf ff 00 Поиск вперед
00 7b 4b cf cf 7b 4b 7b 4b 7b cf cf ff 00 Поиск назад

При длительном нажатии идет код кнопки и после него последовательность
00 ff которя повторяется до тех пор пока кнопка не будет отпущена 
в коде кнопки явно виден префикс 00 7b 4b cf cf 7b

Код кнопки определяется байтами с 7 по 11 включительно

*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);
byte VolUpArray[] = {
0x00, 0x7b, 0x4b, 0xcf, 0xcf, 0x7b, 0xcb, 0x4b, 0x4b, 0xcf, 0xcf, 0xcf, 0xcf, 0x00};
byte VolDwArray[] = {
0x00, 0x7b, 0x4b, 0xcf, 0xcf, 0x7b, 0x4b, 0x4b, 0xcb, 0xcf, 0xcf, 0xcf, 0xcf, 0x00};
byte SeekUpArray[] = {
0x00, 0x7b, 0x4b, 0xcf, 0xcf, 0x7b, 0xcb, 0x4f, 0x4b, 0xcb, 0x7b, 0xcf, 0xff, 0x00};
byte SeekDwArray[] = {
0x00, 0x7b, 0x4b, 0xcf, 0xcf, 0x7b, 0x4b, 0x7b, 0x4b, 0x7b, 0xcf, 0xcf, 0xff, 0x00};
byte BufArray[15];
boolean VolUpKey;
boolean VolDwKey;
boolean SeekUpKey;
boolean SeekDwKey;
int led = 13;
byte ii;
unsigned long time;

void setup() 
{
pinMode(led,OUTPUT); //Будет отражать нажатие кнопки
pinMode(4,OUTPUT); // для резистивного делителя
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT); 
mySerial.begin(2400); // на скорости 2400 - читаются следующие данные
}

void loop() // run over and over
{
ii =0;
VolUpKey = true;
VolDwKey = true;
SeekUpKey = true;
SeekDwKey = true;
Sig(0);
digitalWrite(led,LOW);
if (mySerial.available() > 0) { // В буфере порта есть данные
ii =0;
BufArray[ii] = mySerial.read();
time = millis();
while(ii <=11) {
if (BufArray[ii] != VolUpArray[ii] && VolUpKey) VolUpKey = false;
if (BufArray[ii] != VolDwArray[ii] && VolDwKey) VolDwKey = false;
if (BufArray[ii] != SeekUpArray[ii] && SeekUpKey) SeekUpKey = false;
if (BufArray[ii] != SeekDwArray[ii] && SeekDwKey) SeekDwKey = false; 
if (mySerial.available() > 0) {
ii++;
BufArray[ii] = mySerial.read();
}
if ((millis() - time) >300) ii = 14; 
}
if (ii >=11) {
if (VolUpKey) Sig(1); 
if (VolDwKey) Sig(2); 
if (SeekUpKey) Sig(3); 
if (SeekDwKey) Sig(4); 
//Для контроля включаем/ыфключаем светодиод
if (VolUpKey || VolDwKey || SeekUpKey || SeekDwKey) { 
digitalWrite(led,HIGH);
} 
else { 
digitalWrite(led,LOW); 
Sig(0);
} 
// Ждем перерыва в поступлении данных больше чем 0,2 сек., т.е. пока не будет отпущена кнопка
// При нажатой кнопке здесь будет последовательность 00 ff 00 ff 00 ff .......
// Если нужно сделать повторение нажатия кнопки, это можно сделать обаботкой этих данных 
time = millis();
while( abs(millis() - time ) < 300) {
if (mySerial.available() > 0) { 
ii = mySerial.read();
time = millis();
} 
else {
delay(100);
} 
}
} 
} 
}

////////////////////////////////////////////////////////////////////////////////
// Установка выходного сигнала для магнитолы
// Если значение level от 1 до 4 один выход будет в 1. 
// В остальных случаях все каналы выключены
////////////////////////////////////////////////////////////////////////////////
void Sig(int level){
// Установим на одном из выходов (4...7) единицу
for( int cikl=1; cikl <5; cikl++){
if (level == cikl) {
digitalWrite(cikl+3, HIGH);
} 
else {
digitalWrite(cikl+3, LOW);
}
}
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

avasilkov547, из Вашего сообщения трудно понять, чего Вы на самом деле хотите:

1. Если "разобраться" - то начинать следует с изучения языка программирования, потом - практикум - помигать светодиодом и пр. В результате Вы научитесь разрешать подобные проблемы самостоятельно. Но срок будет исчисляться месяцами.

2. Если "подружить...", то обращайтесь в раздел "Ищу исполнителя", где за денежку заказываете работу. Ваша проблема будет разрешена в кратчайшие сроки, но самостоятельно решать подобные проблемы Вы, естественно, не научитесь.

avasilkov547
Offline
Зарегистрирован: 29.06.2018

andriano пишет:

avasilkov547, из Вашего сообщения трудно понять, чего Вы на самом деле хотите:

1. Если "разобраться" - то начинать следует с изучения языка программирования, потом - практикум - помигать светодиодом и пр. В результате Вы научитесь разрешать подобные проблемы самостоятельно. Но срок будет исчисляться месяцами.

2. Если "подружить...", то обращайтесь в раздел "Ищу исполнителя", где за денежку заказываете работу. Ваша проблема будет разрешена в кратчайшие сроки, но самостоятельно решать подобные проблемы Вы, естественно, не научитесь.

помигать светодиодом пробовал, в коде раборался, все стало понятно кроме библиотеки SoftwareSerial.

а тут прошу помощи подсказать что куда подключать при использовании такого скетча, многие писали что всё работает, только у меня не выходит(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

avasilkov547, я, честно говоря, сколько ни перечитывал, так и не сумел понять Вашего исходного сообщения.

Я так понимаю, что если Вы хотите создать какое-либо устройство, то следует составить схему и написать скетч. При этом скетч должен соответствовать схеме.

Схемы я не вижу. И из сообщения №2, если я его правильно понял, следует, что схемы у Вас просто нет. А для чего тогда написан скетч?

Нич-чего не понимаю!

avasilkov547
Offline
Зарегистрирован: 29.06.2018

так а схема тут и не нужна.  пин 2 читает сигнал от руля и выдаёт на пины 4,5,6,7 напряжение, в зависимости от нажатой кнопки. т.е. вход исходного сигнала и выход необходимого, аппаратная часть состоит и 1 платы ардуино и всё

sadman41
Offline
Зарегистрирован: 19.10.2016

Так пин 2 и читает. И выдает. Просто читает херню какую-то и херню выдает. Тут даже код не нужен, чтобы понять этот простой факт.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ссылку на первоисточник в студию

странно . Руль выдает сериалом? Четто я такого не встречал пока. Как правило резистивная матрица.

и проблема согласования руля и чужой магнитолы - в трансляции одних сопротивлений в другие

а исчо встречал подобие шима, который на рц цепоке формирует напряжение. Кстати выдаваемый сериалом байт своим напонением вполне может имитировать шим.

avasilkov547
Offline
Зарегистрирован: 29.06.2018
avasilkov547
Offline
Зарегистрирован: 29.06.2018

И на сколько я успел разобраться в ардуино, может сейчас скажу глупость но вроде как pin 2 неможет работать по цифре, типа нет символа "~" возле пина

avasilkov547
Offline
Зарегистрирован: 29.06.2018

inspiritus пишет:

Ссылку на первоисточник в студию

странно . Руль выдает сериалом? Четто я такого не встречал пока. Как правило резистивная матрица.

и проблема согласования руля и чужой магнитолы - в трансляции одних сопротивлений в другие

а исчо встречал подобие шима, который на рц цепоке формирует напряжение. Кстати выдаваемый сериалом байт своим напонением вполне может имитировать шим.

В том то и проблемма, кнопки на руле НЕ резистивная матрица! при включенном зажигании на этот провод приходит приверно 4,7v а при нажатии на любую кнопку напряжение падает до 3,6 и скачет рандомно +-1v, т.е. если бы кнопки были резистивные на мультиметр подавалось бы стабильное напряжение при нажатии и при нажатии разных кнопок - разное напряжение. и это точно не ваговский can! т.к. для can-шины нужно минимум 2 провода.

К сути: Опытным путем автор скетча определил коды кнопок (незнаю как) и написал сие творение. пишет что всё работает

sadman41
Offline
Зарегистрирован: 19.10.2016

Для UART тоже нужны два провода и земля. А после информациии о чтении CAN через резистивный делитель я просто вашу сцылку закрыл и забыл. Что ваш там автор определил и в какой канаве торчит сейчас - никому неизвестно.

avasilkov547
Offline
Зарегистрирован: 29.06.2018

sadman41 пишет:

Для UART тоже нужны два провода и земля. А после информациии о чтении CAN через резистивный делитель я просто вашу сцылку закрыл и забыл. Что ваш там автор определил и в какой канаве торчит сейчас - никому неизвестно.

читать can-шину это для других модификаций. у меня НЕ CAN!!! у меня сигнал Serial

sadman41
Offline
Зарегистрирован: 19.10.2016

Хорошо, допустим что ваш волшебный руль имеет один провод и гонит по нему даннные, которые вы принимаете как можете - т.е. полагая, что это uart.

Зачистите loop() и сделайте там Sig(0); delay(1000); Sig(1); delay(1000); Sig(2);... и т.д. Это переберет все уровни громкости, так? Замерьте напряжение на выводах - меняется? Магнитола реагирует?