andynvkz Опубликовано 11 июля, 2019 Жалоба Поделиться Опубликовано 11 июля, 2019 (изменено) Если вы сделали AUX или он у вас уже был, но этого вам мало, делаем управляемый MP3. Для этого нужно вывод AUX-CONT что замкнули на массу разомкнуть, так как из за него и вывод M-BUS+ тоже замкнут на массу. Выводим провод M-BUS+ (M-BUS- не нужен, это просто масса), и подключаем Ардуинку, любую, у меня завалялась stm32f103. Подключил ее вот так: ( если нет пина толерантного к 5 вольтам то ставим стабилитрон D1 на 3,3в ) Разобрал и вытащил потроха из переносных 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, управление с руля так же работает Изменено 12 июля, 2019 пользователем andynvkz Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.