andynvkz Опубликовано 20 июня, 2019 Жалоба Поделиться Опубликовано 20 июня, 2019 (изменено) Если вы сделали AUX http://mazda3.ru/board/topic/40045-audio-vkhod-dlia-mazda-3-s-minimalnymi-zatratami/ или он у вас уже был, но этого вам мало, делаем управляемый MP3. Для этого нужно вывод AUX-CONT что замкнули на массу разомкнуть, так как из за него и вывод M-BUS+ тоже замкнут на массу. Выводим провод M-BUS+ (M-BUS- не нужен, это просто масса), и подключаем Ардуинку, любую, у меня завалялась stm32f103. Подключил ее вот так: Разобрал и вытащил потроха из переносных USB/SDCARD колонок: можно и из таких: а можно и полноценный mp3 плеер, не важно набросал прошивку, прошивка компилируется под любую плату, только не забудьте изменить пины вначале кода что и куда вы подпояли под свою дуину #define MBUS_DELAY 10 // мсек задержка между приемопередачей данных шины m-bus #define mBusIn PB8 //пин входа с шины m-bus #define mBusOut PB9 //пин выхода на шину m-bus #define onpower PB12 // пин On Power #define plstp PB13 // пин Play/Stop #define ff PB14 // пин Forwarding #define fr PB15 // пин Reversing uint64_t mbusMsg = 0ULL; boolean PlayOn = false; byte st = 0ULL; uint64_t Status = 0xD94020100000000; // ответ статуса трек 02 диск 01 class MBus{ public: void send(uint64_t message); boolean receive(uint64_t *message); void sendZero(); void sendOne(); void writeHexBitWise(uint8_t message); boolean checkSum(uint64_t *message); }; MBus mBus; void MBus::send(uint64_t message){ // отправка данных в m-bus uint8_t printed=0; uint8_t parity=0; for(int8_t i=16; i>=0; i--){ uint8_t output=((message & ((uint64_t)0xF<<i*4) )>>i*4); parity=parity^output; if(!output&&!printed){ //nop } else{ writeHexBitWise(output); printed++; } } parity = (parity+1)&0x0F; writeHexBitWise(parity); } boolean MBus::receive(uint64_t *message){ // чтение данных из m-bus *message=0; if(digitalRead(mBusIn)==LOW){ unsigned long time=micros(); boolean gelesen=false; uint8_t counter=0; while((micros()-time)<4000){ if(digitalRead(mBusIn)==HIGH&&!gelesen){ if((micros()-time)<1400&&(micros()-time)>600){ // 0 *message*=2; counter++; gelesen=true; } else if((micros()-time)>1400){ // 1 *message*=2; *message+=1; counter++; gelesen=true; } } if(gelesen&&digitalRead(mBusIn)==LOW){ gelesen=false; time=micros(); } } if(counter%4||!checkSum(message)||counter==0){ *message=0; return false; } else{ (*message)=(*message)>>4; return true; } } return false; } boolean MBus::checkSum(uint64_t *message){ // проверка контрольной суммы uint8_t parity=0; uint8_t test=0; for(uint8_t i=16; i>0; i--){ test=((*message & ((uint64_t)0xF<<i*4) )>>i*4); parity=parity^test; } parity = (parity+1)&0x0F; if(parity==(*message & ((uint64_t)0xF))) return true; else return false; } void MBus::sendZero(){ // формируем лог 0 digitalWrite(mBusOut, HIGH); delayMicroseconds(600); digitalWrite(mBusOut, LOW); delayMicroseconds(2400); } void MBus::sendOne(){ // формируем лог 1 digitalWrite(mBusOut, HIGH); delayMicroseconds(1800); digitalWrite(mBusOut, LOW); delayMicroseconds(1200); } void MBus::writeHexBitWise(uint8_t message){ // отправка байта побитно for(int8_t i=3; i>-1; i--){ uint8_t output=((message & (1<<i) )>>i); if(output==1) sendOne(); else sendZero(); } } void setup() { // код инициализации при запуске // put your setup code here, to run once: pinMode(mBusIn, INPUT); // настраиваем порты pinMode(mBusOut,OUTPUT); pinMode(onpower,OUTPUT); pinMode(plstp,OUTPUT); pinMode(ff,OUTPUT); pinMode(fr,OUTPUT); PlayOn=false; // Serial.begin(9600); } void loop() { // основной код программы // put your main code here, to run repeatedly: if(mBus.receive(&mbusMsg)){ // Принимаем данные с шины m-bus // Serial.println(mbusMsg,HEX); // Печатаем принятые данные в терминал ( для отладки ) delay(MBUS_DELAY); if (mbusMsg==0x59 && PlayOn){ // Send status mBus.send(Status); // сообщаем что проигрываем трек 02 диск 01 delay(MBUS_DELAY); return; } if (mbusMsg==0x58){ // команда Ping CD-Changer mBus.send(0xD8); // отвечаем Ping OK delay(MBUS_DELAY); return; } if (mbusMsg==0x59 && !PlayOn){ // запрашивает готовность mBus.send(0xDB910000000); // сообщаем что у нас один диск delay(MBUS_DELAY); mBus.send(0xDC1010399990); // и три трека на диске с общим временем 99мин 99сек delay(MBUS_DELAY); return; } if (mbusMsg==0x511012){ // приняли команду Play mBus.send(0xD95020100000000); // сообщаем что раскручиваем трек 02 диск 01 delay(MBUS_DELAY); mBus.send(Status); // сообщаем что проигрываем трек 02 диск 01 delay(MBUS_DELAY); if (PlayOn==false){ // если плеер не включен, то включаем питания digitalWrite(onpower, HIGH); delay(500); digitalWrite(onpower, LOW); } PlayOn=true; return; } if (mbusMsg==0x511402){ // приняли команду Stop (при нажатии кнопки радио либо CD) mBus.send(0xD90020100000000); delay(MBUS_DELAY); PlayOn=false; digitalWrite(onpower, HIGH); delay(500); digitalWrite(onpower, LOW); return; } if (mbusMsg==0x5130011){ // приняли команду трек назад mBus.send(0xD95010100000000); delay(MBUS_DELAY); digitalWrite(fr, HIGH); delay(100); digitalWrite(fr, LOW); mBus.send(Status); return; } if (mbusMsg==0x5130031){ // приняли команду трек вперед mBus.send(0xD95030100000000); delay(MBUS_DELAY); digitalWrite(ff, HIGH); delay(100); digitalWrite(ff, LOW); mBus.send(Status); return; } if (mbusMsg==0x5130021){ mBus.send(0xD95020100000000); delay(MBUS_DELAY); mBus.send(Status); return; } if (mbusMsg==0x511042){ // приняли команду перемотка вперед mBus.send(0xD96020100000000); delay(MBUS_DELAY); digitalWrite(ff, HIGH); delay(100); digitalWrite(ff, LOW); mBus.send(Status); return; } if (mbusMsg==0x511082){ // приняли команду перемотка назад mBus.send(0xD97020100000000); delay(MBUS_DELAY); digitalWrite(fr, HIGH); delay(100); digitalWrite(fr, LOW); mBus.send(Status); return; } if ((mbusMsg >> 16)==0x514){ // приняли команду нажатия кнопки RDM или RPT mbusMsg=mbusMsg >> 8; st=mbusMsg; Status=Status&0xFFFFFFFFFFF00FF; //сброс статуса RPT/RDM; if (st==0x02) Status=Status|0x000000000000200; //установка для RDM if (st==0x40) Status=Status|0x000000000004000; //установка для RPT mBus.send(Status); delay(MBUS_DELAY); return; } } } включается повторным нажатием кнопки CD, управление с руля так же работает ___________________________________________________________________________________________________________________________________________________________________________________________________________ Более интересный вариант stm32 и vs1053: Прошивку скоро выложу, по возможностям полное управление Изменено 8 ноября, 2019 пользователем andynvkz 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
felixych Опубликовано 20 июня, 2019 Жалоба Поделиться Опубликовано 20 июня, 2019 единственно с чем я пока не разобрался так это при нажатии кнопки перемотки назад голова пикает, но команду в шину не выдаетРазбираться будешь ?Подождем новый скетч. Или этот перезалей. В NANO какие пины подключать? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Witamin Опубликовано 20 июня, 2019 Жалоба Поделиться Опубликовано 20 июня, 2019 кружок юный электроник) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
andynvkz Опубликовано 20 июня, 2019 Автор Жалоба Поделиться Опубликовано 20 июня, 2019 (изменено) единственно с чем я пока не разобрался так это при нажатии кнопки перемотки назад голова пикает, но команду в шину не выдаетРазбираться будешь ?Подождем новый скетч. Или этот перезалей. В NANO какие пины подключать? нашел ошибку в проверке контрольной суммы, схему дорисую, там еще 4 транзистора для подключения к кнопкам mp3 плеера (хотя при моем варианте пин play/stop не нужен) кружок юный электроник) Нет, просто ценники на ютуры не оправданны, за эти деньги можно 2-din магнитолу купить, мне лично жалко выкидывать 3к за китайское фуфло, которая как пишут глючит и нет возможности обновлять прошивки, когда придет ЦАП буду собирать полный аналог CD чейнджера, все это не более 500р. ну и интересно ))) Изменено 11 июля, 2019 пользователем andynvkz Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
andynvkz Опубликовано 21 июня, 2019 Автор Жалоба Поделиться Опубликовано 21 июня, 2019 (изменено) Кстати если нет пина толерантного к 5 вольтам то ставим стабилитрон D1 на 3,3в Изменено 22 июня, 2019 пользователем andynvkz Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
felixych Опубликовано 21 июня, 2019 Жалоба Поделиться Опубликовано 21 июня, 2019 (изменено) можно Изменено 21 июня, 2019 пользователем felixych Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
andynvkz Опубликовано 21 июня, 2019 Автор Жалоба Поделиться Опубликовано 21 июня, 2019 (изменено) ) Изменено 22 июня, 2019 пользователем andynvkz Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
andynvkz Опубликовано 10 июля, 2019 Автор Жалоба Поделиться Опубликовано 10 июля, 2019 исправил ошибки Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.