Cuprins:

Cheile volanului la adaptorul stereo auto (CAN Bus -> Key1): 6 pași
Cheile volanului la adaptorul stereo auto (CAN Bus -> Key1): 6 pași

Video: Cheile volanului la adaptorul stereo auto (CAN Bus -> Key1): 6 pași

Video: Cheile volanului la adaptorul stereo auto (CAN Bus -> Key1): 6 pași
Video: Activare can bus. Cum se activeaza can bus-ul ( Activate can bus. How to activate the canbus ) 2024, Septembrie
Anonim
CAN Bus Sniffing
CAN Bus Sniffing

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

Trimiterea comenzilor către stereo
Trimiterea comenzilor către stereo

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

La câteva zile după ce am cumpărat o mașină uzată, am descoperit că nu pot reda muzică de pe telefon prin intermediul stereo-ului mașinii. Și mai frustrant a fost că mașina avea bluetooth, dar permitea doar apelurile vocale, nu muzica. De asemenea, avea un port USB Windows Phone, dar nu ar funcționa cu un iPhone fără un dongle de 60 $.

După ce am înlocuit stereo-urile de pe mașinile mele anterioare, fără prea multe gânduri sau cercetări, am comandat un stereo de schimb de 40 $ de pe un cunoscut site web „ieftin”. Stereo a venit cu o cameră de marșarier, Car Play și o grămadă de funcții suplimentare, care păreau o valoare mult mai bună decât dongle mai scump, care face doar un singur lucru.

După ce am cumpărat și pictat o nouă placă, am imprimat 3D o montură și o mulțime de lucrări suplimentare (care ar putea fi instructabile de la sine), am ajuns la o descoperire neplăcută. Comenzile tastelor volanului au fost trimise prin magistrala CAN, dar stereo-ul avea doar o intrare Key1. Nefiind unul care să renunțe la jumătatea drumului, am comandat un adaptor de 60 GBP, care s-a dovedit a nu funcționa. În acest moment am decis să fac eu un adaptor.

Nu sunt inginer electric, am doar cunoștințe electronice rudimentare și acesta a fost un proiect de învățare și explorare pentru mine. Sfatul meu ar fi să verificați mai întâi specificațiile vehiculului și să comandați un aparat radio compatibil, dar dacă sunteți deja blocat (așa cum am fost), urmați instructivul pe propriul risc.

Provizii

Adaptorul (aprox. 15 $)

  • Arduino Pro Mini 5V (sau o placă compatibilă)
  • Modul de magistrală CAN MCP2515
  • Perfboard 60x80mm
  • Potentiometru digital X9C104 100K Ohm (depinde de stereo)
  • Regulator DC-DC LM2596S 3-40V 3A
  • Suport siguranțe cablu + siguranță (100-200 Ohm)
  • Cutie de proiect sau imprimantă 3D pentru a o imprima
  • Mufe stereo auto (masculin + feminin)
  • Materiale de lipit, fire etc.

Asistenți pentru testare (nu sunt strict necesari, dar vor face testarea mult mai ușoară)

  • Arduino (orice placă de 5V va funcționa)
  • Modul de magistrală CAN MCP2515
  • Breadboard + jumperi

Pasul 1: CAN Bus Sniffing

În loc să aibă o grămadă de fire care circulă în interiorul mașinii dvs. interconectând o grămadă de sisteme, unele vehicule moderne au perechi de fire care rulează către fiecare componentă. Informațiile sunt trimise ca pachete de date digitale prin aceste fire, iar toate sistemele pot citi toate mesajele. Aceasta este rețeaua de autobuz CAN (pot exista mai multe rețele în mașină, astfel încât toate informațiile ar putea să nu fie vizibile).

Ceea ce vrem să facem este să ne conectăm la rețeaua de autobuz CAN și să „adulmecăm” traficul de date. Astfel putem „vedea” când este apăsată o tastă de volan. Fiecare pachet are un ID, care reprezintă subsistemul vehiculului care a trimis pachetul și datele care reprezintă starea sistemului. În acest caz, încercăm să găsim ID-ul subsistemului care trimite mesajele cheii volanului și reprezentarea datelor fiecărei chei.

Dacă aveți noroc, ați putea găsi valorile pentru mașina dvs. undeva online și puteți sări peste acest pas.

Acest proces este puțin implicat și a fost deja explicat în alte locuri, așa că îl voi rezuma doar:

  • Găsiți valorile corecte pentru comunicația autobuzului CAN de pe vehiculul dvs. Pentru mașina mea (o Fiat Idea din 2009) era o rată de 50 KBPS și o viteză de ceas de 8 MHz.
  • Conectați-vă la rețeaua de magistrală CAN utilizând modulul de magistrală CAN și un Arduino într-o configurație „sniffer”.
  • Citiți valorile autobuzului CAN de pe laptop folosind un instrument precum https://github.com/alexandreblin/python-can-monito…. Va fi foarte dificil să o faci fără ea, deoarece sunt trimise o mulțime de mesaje chiar și atunci când mașina nu face nimic.
  • Apăsați butonul volanului și observați modificările valorii. Acest lucru poate fi un pic dificil, deoarece sunt trimise o mulțime de mesaje și ar putea fi greu să ne dăm seama care este.

Iată două articole grozave care explică procesul în profunzime:

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

În cele din urmă, ar trebui să aveți ID-ul subsistemului pe care îl vom folosi pentru a asculta numai mesajele CAN din volan și o listă de valori hexazecimale pentru comenzile cheii. În cazul meu, datele arătau astfel:

ID | ID Hex | Octet 0 | Octet 1 | Buton

--------------------------------------------- 964 | 3C4 | 00 | 00 | Fără butoane 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefon 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Câștigă 964 | 3C4 | 00 | 02 | Sus 964 | 3C4 | 00 | 01 | Jos 964 | 3C4 | 00 | 04 | Bine

ID-ul subsistemului este 3C4 (în acest caz), care este un număr hexazecimal, așa că ar trebui să-l scriem ca 0x3C4 în schițele Arduino. De asemenea, suntem interesați de octeții 0 și 1 (în cazul dvs. ar putea exista mai mulți octeți). Acestea sunt, de asemenea, valori hexazecimale, deci ar trebui să fie scrise și cu 0x.

Dacă convertiți valorile în binar, veți observa că biții nu se suprapun (de exemplu + 0b10000000 și - 0b01000000), astfel încât mai multe taste pot fi apăsate în același timp.

Vă sugerez să construiți snifferul cu materialele listate în secțiunea „test helper”, astfel încât să îl puteți refolosi ulterior pentru a simula mașina. Acest lucru vă va scuti de nevoia să stați tot timpul în mașină în timp ce construiți și testați adaptorul. Puteți utiliza schița furnizată pentru a acționa ca simulator. Modificați „subsystemId”, „data0” și „data1” cu valorile pe care le-ați detectat.

Pasul 2: Trimiterea comenzilor către stereo

Trimiterea comenzilor către stereo
Trimiterea comenzilor către stereo

Înainte de a începe să construiți adaptorul, este mai bine să testați mai întâi dacă stereo poate primi comenzi.

Aveam o baterie de rezervă pentru mașină, așa că am conectat stereo-ul direct la acesta. Dacă aveți o sursă de alimentare de 12V, chiar mai bine. Din păcate, nu am putut găsi multe informații online despre intrarea Key1 de pe unitatea mea, așa că am recurs la experimentare. Nu eram prea îngrijorat de arderea stereo-ului în acest moment, deoarece este relativ ieftin și aceasta a fost ultima mea încercare de a-l face să funcționeze cu mașina mea.

Stereo are un ecran de învățare a comenzilor, unde este posibil să selectați una dintre cele două valori de rezistență (1K și 3,3K) și să vedeți valoarea „tensiunii” (0-255). „Tensiunea” este citată pentru că este înșelătoare. Am petrecut mult timp aplicând diferite tensiuni la Key1 fără noroc. De asemenea, am încercat să folosesc diferite rezistențe pentru a aplica tensiunea fără noroc.

Descoperirea a venit atunci când am încercat să ating firul Key1 la masa bateriei, ceea ce a dus la scăderea „tensiunii” la 0. Acest lucru, în combinație cu rezistențe diferite, ar produce valori „de tensiune” consistente pe ecranul de învățare.

Acum, că știam să trimit intrări la stereo, aveam nevoie de o modalitate de a le trimite de pe un Arduino. În acest moment nu am auzit de multiplexoare, care, împreună cu unele rezistențe, ar fi putut fi o soluție mai rapidă și mai fiabilă (încă nu sunt sigur dacă acest lucru este fezabil), așa că am folosit un potențiometru digital. La început, am avut probleme cu punerea în funcțiune a potului digital, până când mi-am dat seama că trebuie să-l conectez ca reostat pentru a acționa ca un rezistor variabil în locul unui divizor de tensiune. Practic a trebuit să conectez terminalele RH și RW.

Pe lângă rezistență, sincronizarea a fost crucială. Dacă scăderea rezistenței este prea scurtă, comanda nu va fi înregistrată. Dacă este prea mult timp, s-ar putea să vă înregistrați de mai multe ori. O scădere de 240 ms, urmată de o întârziere de 240 ms până când următoarea comandă a funcționat destul de fiabilă pentru stereo-ul meu. Deși pare foarte puțin timp, înseamnă că putem trimite maximum 2 comenzi pe secundă, ceea ce se observă dacă încercați să măriți sau să reduceți rapid volumul. Am încercat să mă joc cu diferite timing-uri și tipare, ceea ce a crescut viteza, dar nu a fost foarte fiabil. Dacă aveți idei despre cum să îmbunătățiți acest lucru, vă rugăm să le lăsați în comentarii.

Înainte de a continua mai departe, vă sugerez să creați un prototip pentru a verifica dacă stereo-ul dvs. acceptă același tip de intrare. Chiar dacă acceptă tensiuni diferite, adaptorul ar trebui să funcționeze cu ușoare modificări ale cablajului și schiței Arduino.

Pasul 3: Construirea adaptorului

Construirea adaptorului
Construirea adaptorului
Construirea adaptorului
Construirea adaptorului
Construirea adaptorului
Construirea adaptorului

După ce am testat separat toate componentele și le-am încercat împreună pe o placă, a venit timpul să le oferim o locuință mai permanentă. Acest lucru a durat câteva ore de așezare a componentelor și lipire.

În stânga sus se află regulatorul de coborâre, care transformă 12V din bateria mașinii, în 5V care poate fi utilizat de celelalte componente.

În partea stângă jos se află modulul de autobuz CAN, care citește valorile din rețeaua de autobuze CAN ale mașinii și le transmite către Arduino.

În dreapta sus se află potențiometrul digital (cablat ca reostat) care acționează ca un rezistor variabil între sol și intrarea Key1 a stereo-ului.

În partea dreaptă jos se află Arduino, care acționează ca creierul adaptorului, transformând mesajele magistralei CAN în rezistențe care sunt citite de stereo.

La intrarea de 12V este o siguranță de 150mA, care cel mai probabil nu va proteja circuitul, dar este acolo pentru a preveni un incendiu în cazul unui scurtcircuit.

Pasul 4: Software-ul

Software-ul
Software-ul

După descărcare, puneți toate cele trei fișiere.ino într-un singur folder. Astfel, toate vor face parte din aceeași schiță și vor fi dislocate împreună la Arudino.

De asemenea, trebuie să adăugați bibliotecile necesare la Arduino IDE. Pentru aceasta, descărcați următoarele fișiere:

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

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

apoi adăugați-le pe amândouă accesând Sketch> Include Library> Add. Zip Library …

CanBusStereoAdapter.ino

Configurarea de bază este efectuată în acest fișier.

Comanda cheie Valorile magistralei CAN sunt definite în partea de sus. Dacă nu aveți aceeași mașină ca mine, cel mai probabil va trebui să vă puneți propriile valori. Puteți utiliza valorile hexazecimale din sniffer, am folosit binar, astfel încât este mai ușor să vedeți că nu există suprapuneri accidentale în biți.

Toate mașinile nu au aceleași comenzi pe volan, așa că nu ezitați să eliminați, să adăugați sau să editați valorile definite.

Nu uitați să înlocuiți ID-ul subsistemului în „STEERING_ID”.

CanBus.ino

Acest fișier configurează ascultătorul magistralei CAN, interpretează pachetele și plasează valorile rezistenței într-un buffer circular.

Reglați configurația magistralei CAN în funcția „setupCanBus” pentru a se potrivi mașinii dvs.

Folosim un tampon circular deoarece, așa cum am menționat mai devreme, intrarea comenzii volanului este mult mai rapidă decât intrarea stereo. În acest fel, nu ratăm nicio comandă în timp ce potențiometrul digital își face treaba. Dacă introducem prea multe comenzi, cele mai vechi vor fi aruncate mai întâi, deoarece acestea sunt cele mai puțin importante. Acest lucru ne permite, de asemenea, să gestionăm cazul când sunt apăsate mai multe butoane, deoarece intrarea stereo acceptă o singură valoare la un moment dat.

Dacă ați modificat oricare dintre definițiile comenzilor din „CanBusStereoAdapter.ino”, va trebui, de asemenea, să le actualizați în funcția „handleMessageData”. „handleMessageData” verifică dacă cadrele de date furnizate de magistrala CAN conțin oricare dintre comenzile cunoscute utilizând o operație ȘI bitbit.

De exemplu, dacă am apăsat >> și + în același timp, ceea ce ne va oferi un cadru de date cu o valoare de 0b10010000. >> (pentru mașina mea) este 0b00010000 în binar și + este 0b10000000.

--------------- >> -------------- + ------------- << --- - date0 | 0b10010000 | 0b10010000 | 0b10010000 comanda | ȘI 0b00010000 | ȘI 0b10000000 | ȘI 0b00001000 rezultat | = 0b00010000 | = 0b10000000 | = 0b00000000

Aici putem vedea că rezultatul operației ȘI va fi mai mare decât 0 dacă comanda este prezentă în cadrul de date. Deci, tot ce trebuie să facem este să verificăm pentru {data frame} & {value value}> 0, pentru fiecare comandă definită.

Rețineți că fiecare cadru de date conține comenzi diferite, deci este ok dacă valorile comenzilor sunt aceleași, deoarece le verificăm în raport cu propriile cadre. În exemplul meu, ambele << și ESC au ambele aceeași valoare 0b00001000 (0x08), dar << este în data0 și ESC în data1.

După ce am stabilit că o comandă este prezentă într-un cadru, adăugăm o valoare digitală a potului la tamponul circular. Valorile variază de la 0 la 99, dar am observat că „tensiunea” citită de stereo nu este liniară, așa că testați valorile pentru dvs.

DigitalPot.ino

Acest fișier scoate valori din bufferul circular și le trimite la potul digital pentru a le executa. În cazul meu "pot.setPotMin (false);" va crește rezistența la maxim, pe care stereo o va citi ca „tensiune” maximă. Stereo-ul dvs. poate necesita setarea potului digital la minim, așa că testați-l.

Pasul 5: Incinta Proiectului

Incinta Proiectului
Incinta Proiectului

Am o imprimantă 3D, așa că am decis să imprim o carcasă din două părți pentru adaptorul meu. Am inclus un fișier Fusion 360 pe care îl puteți edita și fișiere gcode care se vor potrivi cu un perfboard de 60x80mm.

Dacă nu aveți acces la o imprimantă 3D, puteți utiliza o carcasă de proiect gata pregătită sau un container robust.

Pasul 6: Gânduri finale

Am planificat inițial ca adaptorul să fie conectat la o alimentare constantă și să mă trezesc pe anumite mesaje CAN bus, deoarece mașina mea nu are un fir de aprindere în compartimentul stereo. Mai târziu m-am hotărât să nu-l fac, deoarece nu voiam să risc să scurg bateria și să mă îngrijorez de adaptor în timp ce sunt departe de mașină. Am folosit un separator de cutie de siguranțe pentru mașină pentru a rula un fir de aprindere și nu trebuie să complicați mai mult adaptorul.

Din testele mele, consumul de energie este de 20-30 mA. L-am scăzut la 10 mA în modul de repaus și aș putea să cobor și mai mult prin îndepărtarea LED-urilor de pe componente, dar am decis să nu mă deranjez cu el, deoarece va funcționa doar în timp ce mașina funcționează.

Sunt destul de mulțumit de rezultatul final. Timpul de răspuns este rezonabil și rareori lipsește comenzile.

Chiar dacă investiția mea în timp a fost mult mai mare decât costul adaptorului disponibil comercial (care nu a funcționat), cunoștințele pe care le-am acumulat sunt de neprețuit.

Recomandat: