А почему они должны мигать? Посмотри на схему Arduino и поймешь что они ни как не участвуют в этом процессе. Светодиоды подключены к микросхеме FTDI и мигают только при обмене данными с компьютером
Вид для печати
А почему они должны мигать? Посмотри на схему Arduino и поймешь что они ни как не участвуют в этом процессе. Светодиоды подключены к микросхеме FTDI и мигают только при обмене данными с компьютером
О как! Это надежда свыше прямо))) Сегодня прийду и попробую помигать какой нибудь лампочкой, если что-нибудь из порта читаеться... Кстати еще вопросик: Когда мы открываем порт на ардуино, мы пишем Serial.begin(9600); Но какие настройки порта при этом выставляются? какой парити бит? Я точно знаю что на PC я ставлю Even parity. Может ли это влиять?
А разве у I-Bus K-Bus скорость 9600?
Параметры порта посмотри в библиотеке HardwareSerial
Ну на PC я открываю порт с этой скоростью,вроде работает. Ок попробую глянуть. Кстати я использую TX и RX пины, которые я так понил задействованы и для USB, если я подключаю адаптер от +5 стабильного источника, они корректно будут работать? Если да, то можно ли в параллель открыть на чтение порт через ЮСБ, чтобы посмотреть что там в целях отладки?
Эти пины можно использовать для обмена с другими устройствами, но вот в паралель с FTDI наверно не выйдет , так как данные идущие от EBU будут конфликтовать с даннами с FTDI
В общем снова добрались руки до ардуинки, подключил доп светодиод для дебага, и проверил идут ли данные, с сериального порта. И вот на тебе, диод горел не переставая до тех пор пока БМВ монитор не впал в спящий режим. Нажимаю на кнопки и на каждое нажатие диод реагировал. Далее я вставил условие, чтобы мигать если источник монитор (а он монитор).
buf[cnt++] = Serial.read();
if (buf[cnt - 1] == 0xF0) {
debug_blink();
}
как результат, не одного блинка ((( Тут я не могу понять, что я там читаю. Все пакеты от монитора имеют F0. В чем может быть дело? Parity не то?
Может из за того что я вместо 5 КОМ резисторов поставил 5.1? Я даже посмотреть не могу т.к сериалка занята ((((
Код не рабочий или не полный, и просьба код заключать в тег PHP
Резистор не может влиять
Тут нужно принять весь пакет и потом его разбирать
Так и делаю, у меня идет поток данных и заноситься в массив (cnt++), и на каждой итерации идет проверка массива на хотя бы один валидный пакет. Мало того, если я подключаю ардуино через ЮСБ порт к компу и посылаю в сериалку полноценный пакет, то все норм парсится и работает. Но если я подключаю к доп плате (адаптеру), то судя по дебаг диоду пакеты идут, но коды символов явно не те, т.е. 100% данные просто искажаются. В моем случае условие buf[cnt -1] == 0xF0 должно выполняться т.к. все пакеты от монитора имеют src == 0xF0. Вот в этом и засада (
А ты уверен что в пакете есть значение 0xF0 ?
Еще здесь обсуждали вопрос с инверсией.
Попробуй перед сравнением проинвертировать
Ты бы всю функцию принимающую данные выложил я на ошибки проверю
Забавно, но проблема разрешилась и действительно софтверно. Я попробовал способ не через TX RX пины, а через цифровые с SoftwareSerial, в конструкторе включил инверсию логики. И в правду все заработало... Вот тока теперь печатку нужно перепаивать((( Но это малое горе, по сравнению с таким счастьем)))
У меня возник еще один, вопрос, управление реле при помощи ардуино, когда приходит IBUS команда задней передачи. У меня есть слаботочное реле Takamisawa RY12W-K, которое вроде как для камеры хватает (1А держит), хочу подключить по такой схеме:
http://s019.radikal.ru/i626/1203/1e/75c6d20ee7a8.jpg
Если я подключу +12 к реле напрямую от аккумулятора это не грозит мне сгоревшим реле? Проверил на амперметре: потребляет 12МА
Так же интересно, можно ли его использовать для питпния монитора? Моник по амперметру потребляет 0.27А
Посмотри на самом реле его параметры должны быть описаны
Вот что написано:
http://www.icompo.cz/obrazky/rele%20...sawa%2012V.jpg
Вот вопрос, если напрямую питать его от аккумулятора оно выдержит или большая сила тока его грохнет? На сколько мне известно сопротивление катушки 940 Ом. Она не перегреется?
Реле работает от 12в, так что ничего с ним не случится
Код:
#include <SoftwareSerial.h>
//#include <NewSoftSerial.h>
#include <MsTimer2.h>
#define DELAY_ON 1000 //delay before switch-on event
#define DELAY_OFF 10000 //delay before switch-off event
#define DELAY_SWITCH 0 //delay before switch event
#define RELAY_PORT 9
#define POWER_5V_PIN 5
#define IGN_LED 13
#define RX_PIN 4
#define TX_PIN 3
//NewSoftSerial IBUS(RX_PIN, TX_PIN);
SoftwareSerial IBUS(RX_PIN, TX_PIN, true);
struct pktTemplate {
unsigned char src;
unsigned char dst;
unsigned char msglen;
unsigned char msg[256];
};
#define RAD 0x68 //Radio
#define IKE 0x80 //Instrument cluster electronics
#define GLO 0xBF //Global, broadcast address
#define BMBT 0xF0 //On-board monitor operating part
static struct pktTemplate buttonMODETempl = {BMBT, RAD, 2, {0x48, 0x23}}; // BUTTON_MODE_PRESS
int recvPacket(unsigned char *msg, int size)
{
static unsigned char buf[256];
static int cnt = 0;
int avail = 0;
while ((avail = IBUS.available()) > 0) {
// get the new byte:
buf[cnt++] = (unsigned char)IBUS.read();
Serial.println(buf[cnt-1],HEX);
// parsing code here
// return cnt;
if (cnt > 256) { // VERY BIG PACKAGE. NEED ERASE DATA.
memmove((void*)&buf[0], (void*)&buf[127], 128);
cnt = 128;
}
}
return 0;
}
void setup() {
pinMode(POWER_5V_PIN, OUTPUT); // initialize +5V power pin for adapter
pinMode(RELAY_PORT, OUTPUT); // initialize +5V power pin for relay
digitalWrite(POWER_5V_PIN, HIGH); // Enable +5V power for adapter
Serial.begin(9600);
IBUS.begin(9600);
}
void loop() {
unsigned char msg[256];
int read;
if ((read = recvPacket(msg, 256)) > 0) {
//...... some code
}
}
Я заметил только во время сборки монитора что некоторые пакеты читаются неправильно. Незнаю как бороться с этим вот вывод от MID
C0 0D 0E BC E0 42
C0 0D 8E BE E0 0F
C0 0D 8E BB E0 FF
C0 0D 0E BC E0 42
C0 0D 8E BE E0 0F
C0 0D 8E BB E0 FF
Это конечно же полная лажа, должны быть приблизительно такие пакеты:
C0 03 68 01 AA
C0 03 80 01 42
C0 03 C8 01 0A
Можно конечно парсить заведомо неправильную интерпритацию пакетов, но хотелось бы иначе. Если честно, я даже не знаю что делать с этим. Интересно то, что до этого я тестировал с монитором и его пакеты почти все читаются правильно, а вот любой другой девайс - такая вот шняга.
В общем сделал выводы, что SoftwareSerial не годиться для чтения шины. Слишком она медленная и я так понил пакеты пропадают. Но при помощи обычной сериалки я так же не могу ничего прочитать т.к. я чиаю пакеты в инверсивной логиге. Можно ли как то переключить сериалку на другую логику по аналогии с SoftwareSerial ?
Так же есть еще вопросик: Допустим есть усройство которое пишет в шину, допустим я получил доступ к чипу устройства где есть RX TX пины. Если я подсоединяюсь к TX, то я ловлю все что пишет усройство в шину. Если я подсоединяюсь к RX, то получаю все что приходит к устройству. Можно ли как то подключиться сразу к RX и TX, чтобы читать их обоих?
Ребят, кто нибудь слышал про такой вот трансивер: TJA1020. Вроде где то прочитал, что его можно использовать для чтения шины. Вот даташит: http://www.e-lab.de/downloads/DOCs/TJA1020.pdf Кто нибудь сталкивался с подобным чипом?
В общем проблема решена, все мои разные схемы (а спаял я их около 7 разных вариантов которые находил в интернете ) не заработали. Это просто были неправильные пчелы и они делали соответственно неправильный мед. Для правильного меда была куплена специальная пчела за 110 рублей MC33290, это kline трансивер и спаяна, следующим образом:
1 - VBAT (+12в)
3 - GRD (ну это понятно куда)
4 - ISO (IBUS)
5 - TX ( к TX на ардуино)
6 - RX (к RX на ардуино)
8 - EN (сюда +5в, я посадил включение на отдельный пин, на arduino)
Чтение производилось из сериального порта, SoftSerial использовал для отладочного вывода. Теперь все работает без нареканий.
Схему покажешь?
Вот собственно такая вот простая схема, чип и ардуинка. Возможно, как то можно, изощрится и защитить ее, но у меня +5В и +12В стабилизированные, поэтому я не знаю нужно ли тут еще какую нибудь защиту.
http://s019.radikal.ru/i603/1204/f4/276d683a5175.jpg
Так же тут нет защиты от коллизий, использую данную схему исключительно для чтения. На D2 ардуино включает +5V и активирует чип.
Так же подключение TX пина тоже не нужно для чтения, я у себя отключил, однако он полезен если хочешь отладить конкретный девайс у себя на столе))))
P.S. для записи еще 7 пин нуна запитать на +5в, но я опять же этого не делал т.к. только читаю шину.
Пацаны, а есть нормальный пример кода эмуляции cd-changer'а? А то у меня эмуляция работает, но слышно щелчки в колонках, такое впечатление, что при запросе статуса ченджера.. Мож че не так делаю..
Подниму тему.
Купил адаптер на TH3122 Реслера. Но у него в наличии были только USB.
Ардуино+ USB-Shield - ума не хватает запрограммировать :)
Подпаялся напрямую к TH3122 выводам RX/TX.
Воткнул, загрузил скетч вот отсюда (первое сообщение)
http://compcar.ru/forum/showthread.php?t=5204
Вроде данные читает. Но... Не верные.
Т.е. первый байт видит всегда корректно. Дальше - нет.
Хотя читает всегда одинаково посылки. Т.е. не случайный мусор - а просто не верные.
Вопрос. Можно ли TH3122 напрямую к Ардуино включать? Или всеж надо лепить МАХ232+ТН3122?
Ну и небольшой вклад для продолжающих копать тему.
http://en4cer.co.uk/bmw-carputers/fo...topic.php?t=13
Да, еще попутно вопрос.
В скетче коды описаны
+ button press 50 23 3C ED 32 11 FB 1
- button press 50 23 3C ED 32 10 1E 2
> BUTTON PRESS 50 23 3C ED 3B 01 06 11
> BUTTON HOLD 50 23 3C ED 3B 11 B3 12
> BUTTON RELEASE 50 23 3C ED 3B 21 33 13
< BUTTON PRESS 50 23 3C ED 3B 08 0F 21
< BUTTON HOLD 50 23 3C ED 3B 18 FB 22
< BUTTON RELEASE 50 23 3C ED 3B 28 7B 23
VOICE BUTTON PRESS 50 23 3C F9 3B 80 27 31
VOICE BUTTON HOLD 50 23 3C F9 3B 90 BB 32
VOICE BUTTON RELEASE 50 23 3C F9 3B A0 3B 33
Откуда они взялись? Они же не верные. Или это просто для примера?
Моя проблема со щелчками во время эмуляции ченджера решилась тем, что я подключил оба канала аудио :)
Кстати, вот адрес моего проекта, пока там редирект на гитхаб http://imbmw.net/ - исходники .NET MF, разводка платы, всё там ;) Темка на е46 клубе тут
SDL2000, TH3122 подключается напрямую к МК, ибо МК работает с TTL уровнями, а MAX232 только для подключения к COM-порту компа. Проверь что с правильными параметрами открываешь serial port, может поэтому у тебя данные херятся. А чем тебе команды перечисленные не нравятся? Вроде как это команды кнопок на мониторе. Может тебе просто нужны кнопки на руле?
Да, точно. Так чем они тебе не нравятся? Проверяешь отправителя 0x50, и тело, например, 0x3B 0x01 для next. Естественно, сначала надо выделить сообщение из потока.
Да проблема была в том, что читал какую-то фигню. Пока не переподключил на железный сериал.
Да, попутно вопрос. А писать в порт пробовали?
Так пока в планах просто назначит переключение треков на планшете.
Но в будующем хочется и что-нить отсылать в шину
Да. Чтобы писать, надо отслеживать по прерыванию SEN/STA пин на TH3122 и останавливать запись, чтобы не было коллизий (чтобы не писать вместе с другими устройствами в шину одновременно). Поковыряй мой проект. Он правда не на сях, но зато код читабельный и структурированный - многое станет понятным ;)
Я думал, что ТН3122 сам рулит коллизиями.
Но все равно спасибо. Посмотрю Ваш проект
Все верно, нужно лишь дождаться от TH3122 разрешения на запись, а до тех пор буферизировать сообщения. Без него пришлось бы еще отслеживать последнее изменение логического состояния на линии, ждать после этого 50мс и только потом начинать запись.
SEN/STA=”0” - передача разрешена
SEN/STA=”1” - запрещена.
Я правильно понял?
Т.е. можно эту ногу кинуть на какой-нить из выводов Ардуины, и смотреть уровень сигнала на ней?
P.S. Извиняюсь за глупые вопросы. Только осваиваю Ардуинку :)
Все верно. Еще полезно будет почитать даташит по TH3122. Да и по всему железу полезно читать даташиты, там всё подробно расписано :)
Дык читаю усиленно :) Но на всяк случай лучше переспросить. Уж больно долго ждать если что ТН3122
Вот нашел магнитолу от Е46 кассетную. Будет подопытным кроликом. Хочется научиться выводить текст
А сейчас какая магнитола?
Сейчас у меня БМВ Х3. Предыдуший тоже был Х3, он был с монитором. Но как известно, монитор на этих сериях - беспонтовая вещь. Поэтому след. машину брал без этой мультимедиа (только магнитола с МР3 и ченджер), купил дохлый монитор, чисто из-за фирменного вида (он на Х3 откидывающийся). Выкинул потроха, и буду запихивать планшет.
Шаговый двигатель привода вроде удалось оживить. Жужжит.
Сейчас на авто проверил - кнопки Ардуина ловит. Буду запихивать планшет. А дальше - по результатам