Vairo ratų klavišai prie automobilio stereo adapterio (CAN magistralė -> 1 raktas): 6 žingsniai
Vairo ratų klavišai prie automobilio stereo adapterio (CAN magistralė -> 1 raktas): 6 žingsniai
Anonim
CAN autobusų uostymas
CAN autobusų uostymas

Key1) "src =" https://content.instructables.com/ORIG/F3X/UXCI/KCT3F9KZ/F3XUXCIKCT3F9KZ-p.webp

Komandų siuntimas į „Stereo“
Komandų siuntimas į „Stereo“

1 raktas) "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300' %} ">

Praėjus kelioms dienoms po to, kai nusipirkau naudotą automobilį, sužinojau, kad negaliu leisti muzikos iš savo telefono per stereo aparatūrą. Dar labiau apmaudu buvo tai, kad automobilis turėjo „Bluetooth“, bet leido tik balso skambučius, o ne muziką. Jis taip pat turėjo „Windows Phone“USB prievadą, tačiau jis neveiks su „iPhone“be 60 USD raktų.

Pakeisdamas stereo aparatus savo ankstesniuose automobiliuose, daug negalvodamas ir neatlikęs tyrimų, iš gerai žinomos „pigios“svetainės užsisakiau 40 USD kainuojantį stereo aparatą. Prie stereo buvo pridėta atbulinės eigos kamera, „Car Play“ir daugybė papildomų funkcijų, kurios atrodė daug vertingesnės nei brangesnis raktas, kuris atlieka tik vieną dalyką.

Nusipirkęs ir nudažęs naują priekinę plokštę, 3D spausdindamas laikiklį ir atlikdamas daugybę papildomų darbų (kurie gali būti patys pamokomi), aš padariau nemalonų atradimą. Vairo klavišo komandos buvo siunčiamos per CAN magistralę, tačiau stereofoninis įrenginys turėjo tik „Key1“įvestį. Būdamas ne tas, kuris pasiduoda pusiaukelėje, užsisakiau 60 svarų sterlingų adapterį, kuris pasirodė neveikiantis. Šiuo metu nusprendžiau pats pasidaryti adapterį.

Nesu elektros inžinierius, turiu tik pradines elektronikos žinias ir tai man buvo mokymosi ir tyrinėjimo projektas. Mano patarimas būtų pirmiausia patikrinti savo automobilio specifikacijas ir užsisakyti suderinamą radiją, bet jei jau esate įstrigęs (kaip ir aš), vadovaukitės instrukcijomis savo rizika.

Prekės

Adapteris (apie 15 USD)

  • „Arduino Pro Mini 5V“(arba suderinama plokštė)
  • MCP2515 CAN magistralės modulis
  • 60x80 mm perforatorius
  • X9C104 skaitmeninis potenciometras 100K omų (priklauso nuo jūsų stereo)
  • DC-DC žemyn reguliuojamas reguliatorius LM2596S 3-40V 3A
  • Kabelio saugiklių laikiklis + saugiklis (100-200 omų)
  • Projekto dėžutė arba 3D spausdintuvas, kad ją išspausdintumėte
  • Automobilinės stereo lizdai (vyras + moteris)
  • Litavimo reikmenys, laidai ir kt.

Testavimo pagalbininkai (nebūtinai reikalingi, bet tai labai palengvins testavimą)

  • „Arduino“(tiks bet kuri 5 V plokštė)
  • MCP2515 CAN magistralės modulis
  • Duonos lenta + džemperiai

1 žingsnis: CAN magistralės uostymas

Vietoj to, kad aplink jūsų automobilio vidų eitų daugybė laidų, jungiančių daugybę sistemų, kai kuriose šiuolaikinėse transporto priemonėse prie kiekvieno komponento yra laidų poros. Per šiuos laidus informacija siunčiama kaip skaitmeniniai duomenų paketai, o visos sistemos gali nuskaityti visus pranešimus. Tai yra CAN magistralės tinklas (jūsų automobilyje gali būti keli tinklai, todėl visa informacija gali būti nematoma).

Mes norime prisijungti prie CAN magistralės tinklo ir „užuosti“duomenų srautą. Taip galime „matyti“, kai paspaudžiamas vairo mygtukas. Kiekvienas paketas turi ID, vaizduojantį transporto priemonės posistemį, išsiuntusį paketą, ir duomenis, nurodančius sistemos būseną. Šiuo atveju mes bandome rasti posistemio, kuris siunčia vairo rakto pranešimus, ID ir kiekvieno rakto duomenis.

Jei jums pasisekė, galite rasti savo automobilio vertes kažkur internete ir galite praleisti šį veiksmą.

Šis procesas yra šiek tiek susijęs ir jau buvo paaiškintas kitose vietose, todėl aš tik apibendrinsiu:

  • Raskite teisingas savo transporto priemonės CAN magistralės ryšio vertes. Mano automobiliui (2009 m. „Fiat Idea“) jis buvo 50KBPS duomenų perdavimo greitis ir 8MHz taktinis dažnis.
  • Prisijunkite prie CAN magistralės tinklo naudodami CAN magistralės modulį ir „Arduino“konfigūraciją.
  • Skaitykite savo nešiojamojo kompiuterio CAN magistralės vertes naudodami tokį įrankį kaip https://github.com/alexandreblin/python-can-monito…. Tai padaryti be jo bus labai sunku, nes daug žinučių siunčiama net tada, kai automobilis nieko nedaro.
  • Paspauskite vairo mygtuką ir atkreipkite dėmesį į vertės pasikeitimus. Tai gali būti šiek tiek sudėtinga, nes siunčiama daug pranešimų ir gali būti sunku išsiaiškinti, kuris yra kuris.

Čia yra du puikūs straipsniai, kuriuose išsamiai paaiškinamas procesas:

  • https://medium.com/@alexandreblin/can-bus-reverse-…
  • https://www.instructables.com/id/CAN-Bus-Sniffing-…

Galų gale turėtumėte turėti posistemio ID, kurį naudosime klausydamiesi tik vairo CAN magistralės pranešimų, ir šešioliktainių pagrindinių komandų verčių sąrašą. Mano atveju duomenys atrodė taip:

ID | Šešiakampis ID | 0 baitas 1 baitas | Mygtukas

-------------------------------------------- 964 | 3C4 | 00 | 00 | Nėra mygtukų 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefonas 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Laimėti 964 | 3C4 | 00 | 02 | Iki 964 | 3C4 | 00 | 01 | Žemyn 964 | 3C4 | 00 | 04 | Gerai

Posistemio ID yra 3C4 (šiuo atveju), kuris yra šešioliktainis skaičius, todėl turėtume jį parašyti kaip 0x3C4 „Arduino“eskizuose. Mus taip pat domina 0 ir 1 baitai (jūsų atveju gali būti daugiau baitų). Tai taip pat šešioliktainiai skaičiai, todėl jie taip pat turėtų būti parašyti su pirmuoju 0x.

Jei konvertuosite reikšmes į dvejetaines, pastebėsite, kad bitai nesutampa (pvz., + 0b10000000 ir - 0b01000000), todėl vienu metu galima paspausti kelis klavišus.

Siūlau statyti snifferį iš medžiagų, išvardytų skyriuje „bandymo pagalbininkas“, kad vėliau galėtumėte jį pakartotinai panaudoti, kad imituotumėte savo automobilį. Taip sutaupysite, kad nereikės visą laiką sėdėti automobilyje, kol kuriate ir bandote adapterį. Pateiktą eskizą galite naudoti kaip simuliatorių. Pakeiskite „subsystemId“, „data0“ir „data1“naudodami tas vertes, kurias jūs užfiksavote.

2 veiksmas: komandų siuntimas į stereo

Komandų siuntimas į „Stereo“
Komandų siuntimas į „Stereo“

Prieš pradedant kurti adapterį, geriausia pirmiausia išbandyti, ar stereo gali priimti komandas.

Turėjau atsarginę automobilio akumuliatorių, todėl prijungiau stereo aparatą tiesiai prie jo. Jei turite 12 V maitinimo šaltinį, dar geriau. Deja, internete neradau daug informacijos apie „Key1“įvestį savo įrenginyje, todėl ėmiausi eksperimentų. Šiuo metu pernelyg nesijaudinau dėl to, kad sudeginsiu stereo aparatą, nes jis yra palyginti pigus, ir tai buvo paskutinis mano bandymas, kad jis veiktų su mano automobiliu.

Stereo įrenginyje yra komandų mokymosi ekranas, kuriame galima pasirinkti vieną iš dviejų varžos verčių (1K ir 3,3K) ir pamatyti „įtampos“vertę (0-255). Cituojama „įtampa“, nes ji yra klaidinanti. Nesėkmingai praleidau daug laiko „Key1“pritaikydamas skirtingas įtampas. Aš taip pat nesėkmingai bandžiau naudoti skirtingus rezistorius įtampai įvesti.

Proveržis įvyko, kai bandžiau prisiliesti prie „Key1“laido prie akumuliatoriaus korpuso, todėl „įtampa“nukrito iki 0. Tai kartu su skirtingais rezistoriais mokymosi ekrane sukuria pastovias „įtampos“vertes.

Dabar, kai žinojau, kaip siųsti įvestis į stereofoninį grotuvą, man reikėjo būdo juos siųsti iš „Arduino“. Šiuo metu aš negirdėjau apie multiplekserius, kurie kartu su kai kuriais rezistoriais galėjo būti greitesnis ir patikimesnis sprendimas (aš vis dar nesu tikras, ar tai įmanoma), todėl naudoju skaitmeninį potenciometrą. Iš pradžių turėjau problemų, kad skaitmeninis puodas veiktų, kol supratau, kad turiu jį prijungti kaip reostatą, kad veikčiau kaip kintamasis rezistorius, o ne įtampos daliklis. Iš esmės turėjau prijungti RH ir RW terminalus.

Be pasipriešinimo, labai svarbus buvo laikas. Jei pasipriešinimo kritimas yra per trumpas, komanda nebus užregistruota. Jei jis per ilgas, jis gali būti užregistruotas kelis kartus. 240 ms kritimas, po to 240 ms vėlavimas, kol kita komanda dirbo gana patikimai mano stereofonui. Nors tai atrodo labai mažai laiko, tai reiškia, kad galime siųsti ne daugiau kaip 2 komandas per sekundę, o tai pastebima, jei bandote greitai padidinti arba sumažinti garsumą. Bandžiau žaisti su skirtingu laiku ir modeliais, o tai padidino greitį, bet nebuvo labai patikima. Jei turite idėjų, kaip tai patobulinti, palikite jas komentaruose.

Prieš tęsdamas, siūlau sukurti prototipą, kad patikrintumėte, ar jūsų stereo sistema priima tą patį įvestį. Net jei jis priima skirtingą įtampą, adapteris turėtų veikti su nedideliais laidų ir „Arduino“eskizo pakeitimais.

3 žingsnis: adapterio kūrimas

Adapterio kūrimas
Adapterio kūrimas
Adapterio kūrimas
Adapterio kūrimas
Adapterio kūrimas
Adapterio kūrimas

Išbandžius visus komponentus atskirai ir kartu išbandžius juos ant duonos lentos, atėjo laikas suteikti jiems pastovesnius namus. Komponentų išdėstymas ir litavimas užtruko kelias valandas.

Viršutiniame kairiajame kampe yra nuleidimo reguliatorius, kuris 12V iš automobilio akumuliatoriaus paverčia 5V, kurį gali naudoti kiti komponentai.

Apačioje kairėje yra CAN magistralės modulis, kuris nuskaito vertes iš automobilio CAN magistralės tinklo ir persiunčia jas „Arduino“.

Viršuje dešinėje yra skaitmeninis potenciometras (prijungtas kaip reostatas), kuris veikia kaip kintamasis rezistorius tarp žemės ir stereofoninio „Key1“įvesties.

Apatiniame dešiniajame kampe yra „Arduino“, kuris veikia kaip adapterio smegenys, paversdami CAN magistralės pranešimus į pasipriešinimą, kurį skaito stereo.

12 V įėjime yra 150 mA saugiklis, kuris greičiausiai neapsaugos grandinės, tačiau yra skirtas užkirsti kelią gaisrui, jei jis trumpas.

4 žingsnis: programinė įranga

Programinė įranga
Programinė įranga

Atsisiuntę įdėkite visus tris.ino failus į vieną aplanką. Tokiu būdu visi bus to paties eskizo dalis ir kartu bus dislokuoti „Arudino“.

Taip pat turite pridėti reikiamas bibliotekas prie „Arduino IDE“. Norėdami tai padaryti, atsisiųskite šiuos failus:

github.com/autowp/arduino-mcp2515/archive/…

github.com/philbowles/Arduino-X9C/archive/…

tada pridėkite juos abu, eidami į Eskizas> Įtraukti biblioteką> Pridėti. Zip biblioteką …

„CanBusStereoAdapter.ino“

Šiame faile atliekama pagrindinė sąranka.

Pagrindinė komanda CAN magistralės reikšmės yra apibrėžtos viršuje. Jei neturite tokio paties automobilio kaip aš, greičiausiai turėsite įvesti savo vertybes. Galite naudoti šešioliktaines reikšmes iš snifferio, aš naudojau dvejetainę, kad būtų lengviau pamatyti, kad bitai neatsitiktinai sutampa.

Visi automobiliai neturi vienodų vairo komandų, todėl nedvejodami pašalinkite, pridėkite arba redaguokite apibrėžtas vertes.

Nepamirškite pakeisti posistemio ID „STEERING_ID“.

CanBus.ino

Šis failas nustato CAN magistralės klausytoją, interpretuoja paketus ir įterpia pasipriešinimo vertes į apskritą buferį.

Sureguliuokite CAN magistralės konfigūraciją „setupCanBus“funkcijoje, kad ji atitiktų jūsų automobilį.

Mes naudojame apvalų buferį, nes, kaip minėta anksčiau, vairo komandų įvestis yra daug greitesnė nei stereo įvestis. Tokiu būdu nepraleidžiame jokių komandų, kol skaitmeninis potenciometras daro savo. Jei įvesime per daug komandų, pirmiausia bus atmestos seniausios, nes jos yra mažiausiai svarbios. Tai taip pat leidžia mums valdyti atvejį, kai paspaudžiami keli mygtukai, nes stereo įvestis vienu metu priima tik vieną reikšmę.

Jei pakeitėte bet kurį komandų apibrėžimą „CanBusStereoAdapter.ino“, taip pat turėsite juos atnaujinti naudodami funkciją „handleMessageData“. „handleMessageData“patikrina, ar pateiktuose CAN magistralės duomenų rėmuose yra žinomų komandų, naudojant operaciją bitiniu būdu.

Pavyzdžiui, jei vienu metu paspaudžiau >> ir +, gausime duomenų rėmelį, kurio vertė 0b10010000. >> (mano automobiliui) dvejetainis yra 0b00010000, o + yra 0b10000000.

--------------- >> -------------- + ------------- << --- - duomenys0 | 0b10010000 | 0b10010000 | 0b10010000 komanda | IR 0b00010000 | IR 0b10000000 | IR 0b00001000 rezultatas | = 0b00010000 | = 0b10000000 | = 0b00000000

Čia matome, kad AND operacijos rezultatas bus didesnis nei 0, jei komanda bus duomenų rėme. Taigi viskas, ką turime padaryti, tai patikrinti, ar kiekvienai apibrėžtai komandai yra {data frame} ir {command value}> 0.

Atminkite, kad kiekviename duomenų rėmelyje yra skirtingos komandos, todėl gerai, jei komandų reikšmės yra vienodos, nes mes jas tikriname pagal jų pačių rėmus. Mano pavyzdyje tiek <<, tiek ESC turi tą pačią reikšmę 0b00001000 (0x08), bet << yra data0, o ESC - data1.

Nustačius, kad kadre yra komanda, pridedame skaitmeninį puodo vertę prie apskrito buferio. Reikšmės svyruoja nuo 0 iki 99, tačiau pastebėjau, kad stereofoninė „įtampa“nėra tiesinė, todėl išbandykite vertes patys.

DigitalPot.ino

Šis failas išskiria vertes iš apskrito buferio ir siunčia jas į skaitmeninį puodą vykdyti. Mano atveju "pot.setPotMin (false);" padidins pasipriešinimą iki maksimalaus, kurį stereo įrašys kaip maksimalią „įtampą“. Jūsų stereofonui gali tekti nustatyti minimalų skaitmeninį puodą, todėl išbandykite.

5 žingsnis: projekto aptvaras

Projekto aptvaras
Projekto aptvaras

Turiu 3D spausdintuvą, todėl nusprendžiau savo adapteriui atspausdinti dviejų dalių korpusą. Įtraukiau „Fusion 360“failą, kurį galite redaguoti, ir „gcode“failus, kurie tiks 60x80 mm perforatoriui.

Jei neturite prieigos prie 3D spausdintuvo, galite naudoti paruoštą projekto korpusą arba tvirtą konteinerį.

6 žingsnis: paskutinės mintys

Iš pradžių planavau, kad adapteris bus prijungtas prie nuolatinio maitinimo ir atsibus po tam tikrų CAN magistralės pranešimų, nes mano automobilyje nėra uždegimo laido stereo skyriuje. Vėliau nusprendžiau prieš tai, nes nenorėjau rizikuoti išsikrauti akumuliatoriaus ir nerimauti dėl adapterio, kol esu toli nuo automobilio. Aš naudoju automobilio saugiklių dėžės skirstytuvą, kad paleisčiau uždegimo laidą ir nereikėtų dar labiau apsunkinti adapterio.

Remiantis mano bandymais, energijos suvartojimas yra 20-30 mA. Miego režimu jį sumažinau iki 10 mA, o nuėmęs šviesos diodus nuo komponentų galėčiau nukristi dar žemiau, tačiau nusprendžiau su tuo nesivarginti, nes jis veiks tik automobiliui veikiant.

Esu labai patenkinta galutiniu rezultatu. Atsakymo laikas yra pagrįstas ir retai praleidžia komandas.

Nors mano laiko investicijos buvo daug didesnės už parduodamo adapterio (kuris neveikė) kainą, įgytos žinios yra neįkainojamos.