Inhoudsopgave:
- Benodigdheden
- Stap 1: CAN-bus snuiven
- Stap 2: Opdrachten naar de stereo verzenden
- Stap 3: De adapter bouwen
- Stap 4: De software
- Stap 5: De projectbijlage
- Stap 6: Laatste gedachten
Video: Stuurwielsleutels naar autoradio-adapter (CAN Bus -> Key1) - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:15
Een paar dagen nadat ik een gebruikte auto had gekocht, ontdekte ik dat ik geen muziek van mijn telefoon kan afspelen via de autoradio. Nog frustrerender was dat de auto bluetooth had, maar alleen spraakoproepen toestond, geen muziek. Het had ook een Windows Phone USB-poort, maar het zou niet werken met een iPhone zonder een dongle van $ 60.
Nadat ik stereo's op mijn vorige auto's had vervangen, zonder veel nadenken of onderzoek, bestelde ik een vervangende stereo van $ 40 van een bekende "goedkope" website. De stereo werd geleverd met een achteruitrijcamera, Car Play en een heleboel extra functies, wat een veel betere waarde leek dan de duurdere dongle die maar één ding doet.
Na het kopen en schilderen van een nieuwe frontplaat, het 3D-printen van een houder en een heleboel extra werk (wat op zichzelf al een instructie zou kunnen zijn), kwam ik tot een onaangename ontdekking. De commando's op het stuurwiel werden via de CAN-bus verzonden, maar de stereo had alleen een Key1-ingang. Omdat ik niet iemand was die halverwege opgaf, bestelde ik een adapter van 60 £, die niet bleek te werken. Op dit punt besloot ik zelf een adapter te maken.
Ik ben geen elektrotechnisch ingenieur, ik heb alleen rudimentaire elektronicakennis en dit was een leer- en verkenningsproject voor mij. Mijn advies zou zijn om eerst de specificaties van uw voertuig te controleren en een compatibele radio te bestellen, maar als u al vastzit (zoals ik was), volg dan de instructies op eigen risico.
Benodigdheden
De adapter (ongeveer 15 $)
- Arduino Pro Mini 5V (of een compatibel bord)
- MCP2515 CAN-busmodule
- 60x80mm perfboard
- X9C104 digitale potentiometer 100K Ohm (afhankelijk van uw stereo)
- DC-DC Step-down regelaar LM2596S 3-40V 3A
- Kabelzekeringhouder + zekering (100-200 Ohm)
- Projectdoos of 3D-printer om het af te drukken
- Auto stereo-aansluitingen (mannelijk + vrouwelijk)
- Soldeerbenodigdheden, draden, enz.
Testhelpers (niet strikt nodig, maar zal het testen veel gemakkelijker maken)
- Arduino (elk 5V-bord is voldoende)
- MCP2515 CAN-busmodule
- Breadboard + jumpers
Stap 1: CAN-bus snuiven
In plaats van dat er een heleboel draden rond de binnenkant van uw auto lopen die een aantal systemen met elkaar verbinden, hebben sommige moderne voertuigen paren draden die naar elk onderdeel lopen. Via deze draden wordt informatie als digitale datapakketten verzonden en alle systemen kunnen alle berichten lezen. Dit is het CAN-busnetwerk (er kunnen meerdere netwerken in uw auto zijn, dus mogelijk is niet alle info zichtbaar).
Wat we willen doen, is verbinding maken met het CAN-busnetwerk en het dataverkeer "snuiven". Op deze manier kunnen we "zien" wanneer een stuurwieltoets wordt ingedrukt. Elk pakket heeft een ID, die het voertuigsubsysteem vertegenwoordigt dat het pakket heeft verzonden, en de gegevens die de systeemstatus vertegenwoordigen. In dit geval proberen we de ID te vinden van het subsysteem dat de stuurwieltoetsberichten verstuurt, en de gegevensrepresentatie van elke toets.
Als je geluk hebt, kun je de waarden voor je auto ergens online vinden en deze stap overslaan.
Dit proces is een beetje ingewikkeld en is al op andere plaatsen uitgelegd, dus ik zal het gewoon samenvatten:
- Vind de juiste waarden voor de CAN-buscommunicatie op uw voertuig. Voor mijn auto (een Fiat Idea uit 2009) was het een baudrate van 50 KBPS en een kloksnelheid van 8 MHz.
- Maak verbinding met het CAN-busnetwerk met behulp van de CAN-busmodule en een Arduino in een "sniffer"-configuratie.
- Lees de CAN-buswaarden op uw laptop uit met een tool zoals https://github.com/alexandreblin/python-can-monito…. Het zal heel moeilijk zijn om dit zonder te doen, omdat er veel berichten worden verzonden, zelfs als de auto niets doet.
- Druk op de stuurwielknop en noteer de waardeveranderingen. Dit kan een beetje lastig zijn, omdat er veel berichten worden verzonden en het misschien moeilijk is om erachter te komen welke welke is.
Hier zijn twee geweldige artikelen waarin het proces diepgaand wordt uitgelegd:
- https://medium.com/@alexandreblin/can-bus-reverse-…
- https://www.instructables.com/id/CAN-Bus-Sniffing-…
Uiteindelijk zou je de subsysteem-ID moeten hebben die we zullen gebruiken om alleen naar de CAN-busberichten op het stuur te luisteren, en een lijst met hexadecimale waarden voor de toetscommando's. In mijn geval zagen de gegevens er als volgt uit:
ID | ID Hex | Byte 0 | Byte 1 | Knop
--------------------------------------------- 964 | 3C4 | 00 | 00 | Geen knoppen 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefoon 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Win 964 | 3C4 | 00 | 02 | omhoog 964 | 3C4 | 00 | 01 | Omlaag 964 | 3C4 | 00 | 04 | Oke
De subsysteem-ID is 3C4 (in dit geval), wat een hexadecimaal getal is, dus we zouden het als 0x3C4 in de Arduino-schetsen moeten schrijven. We zijn ook geïnteresseerd in bytes 0 en 1 (in uw geval kunnen er meer bytes zijn). Dit zijn ook hexadecimale waarden, dus ze moeten ook worden geschreven met een voorloop 0x.
Als je de waarden naar binair converteert, zul je merken dat de bits elkaar niet overlappen (bijvoorbeeld + 0b10000000 en - 0b01000000), zodat er meerdere toetsen tegelijk kunnen worden ingedrukt.
Ik raad aan om de sniffer te bouwen met de materialen die worden vermeld in de sectie "testhelper", zodat je hem later opnieuw kunt gebruiken om je auto te simuleren. Zo hoeft u niet de hele tijd in uw auto te zitten terwijl u de adapter bouwt en test. U kunt de meegeleverde schets gebruiken als simulator. Wijzig "subsystemId", "data0" en "data1" met de waarden die u hebt opgesnoven.
Stap 2: Opdrachten naar de stereo verzenden
Voordat u begint met het bouwen van de adapter, kunt u het beste eerst testen of de stereo opdrachten kan ontvangen.
Ik had een reserve auto-accu, dus ik heb de stereo er rechtstreeks op aangesloten. Als je een 12V tafelmodel stroombron hebt, nog beter. Helaas kon ik online niet veel informatie vinden over de Key1-ingang op mijn apparaat, dus ging ik experimenteren. Ik maakte me op dit moment niet al te veel zorgen over het doorbranden van de stereo, omdat het relatief goedkoop is, en dit was mijn laatste wanhopige poging om het werkend te krijgen met mijn auto.
De stereo heeft een commando-leerscherm, waar het mogelijk is om een van de twee weerstandswaarden (1K en 3,3K) te selecteren en de "voltage"-waarde (0-255) te zien. "Voltage" wordt geciteerd omdat het misleidend is. Ik heb veel tijd besteed aan het toepassen van verschillende spanningen op Key1 zonder geluk. Ik heb ook geprobeerd verschillende weerstanden te gebruiken om de spanning toe te passen zonder geluk.
De doorbraak kwam toen ik probeerde de Key1-draad aan te raken met de batterijaarde, wat resulteerde in een daling van de "spanning" naar 0. Dit in combinatie met verschillende weerstanden zou consistente "spannings" -waarden op het leerscherm produceren.
Nu ik wist hoe ik ingangen naar de stereo moest sturen, had ik een manier nodig om ze vanaf een Arduino te verzenden. Op dit moment heb ik nog nooit gehoord van multiplexers, die samen met enkele weerstanden een snellere en betrouwbaardere oplossing zouden kunnen zijn (ik weet nog steeds niet zeker of dit haalbaar is), dus gebruikte ik een digitale potentiometer. In het begin had ik problemen om de digitale pot aan het werk te krijgen, totdat ik erachter kwam dat ik hem moest aansluiten als een regelweerstand om als een variabele weerstand te fungeren in plaats van als een spanningsdeler. In principe moest ik de RH- en RW-terminals aansluiten.
Naast het verzet was timing cruciaal. Als de weerstandsval te kort is, wordt het commando niet geregistreerd. Als het te lang is, kan het meerdere keren worden geregistreerd. Een daling van 240 ms, gevolgd door een vertraging van 240 ms totdat het volgende commando redelijk betrouwbaar werkte voor mijn stereo. Hoewel dat heel weinig tijd lijkt, betekent dit dat we maximaal 2 opdrachten per seconde kunnen verzenden, wat merkbaar is als je probeert het volume snel hoger of lager te zetten. Ik probeerde met verschillende timings en patronen te spelen, wat de snelheid wel verhoogde, maar niet erg betrouwbaar was. Als je ideeën hebt om dit te verbeteren, laat ze dan achter in de reacties.
Voordat ik verder ga, raad ik aan een prototype te bouwen om te controleren of uw stereo dezelfde soort invoer accepteert. Zelfs als het verschillende spanningen accepteert, zou de adapter moeten werken met kleine aanpassingen aan de bedrading en de Arduino-schets.
Stap 3: De adapter bouwen
Na alle componenten afzonderlijk te hebben getest en ze samen op een breadboard te hebben uitgeprobeerd, was het tijd om ze een meer permanent thuis te geven. Dit kostte een paar uur om componenten uit te leggen en te solderen.
Linksboven bevindt zich de step-down-regelaar, die 12V van de auto-accu omzet naar 5V die door de andere componenten kan worden gebruikt.
Linksonder bevindt zich de CAN-busmodule, die waarden uit het CAN-busnetwerk van de auto leest en doorstuurt naar de Arduino.
Rechtsboven bevindt zich de digitale potentiometer (bedraad als een regelweerstand) die fungeert als een variabele weerstand tussen de grond en de Key1-ingang van de stereo.
Rechtsonder bevindt zich de Arduino, die fungeert als het brein van de adapter en CAN-busberichten omzet in weerstanden die door de stereo worden gelezen.
Op de 12V ingang zit een 150mA zekering, die hoogstwaarschijnlijk het circuit niet zal beschermen, maar er is om brand te voorkomen bij kortsluiting.
Stap 4: De software
Plaats na het downloaden alle drie de.ino-bestanden in één map. Op die manier zullen ze allemaal deel uitmaken van dezelfde schets en samen worden ingezet op de Arudino.
U moet ook de vereiste bibliotheken toevoegen aan de Arduino IDE. Download hiervoor de volgende bestanden:
github.com/autowp/arduino-mcp2515/archive/…
github.com/philbowles/Arduino-X9C/archive/…
voeg ze vervolgens allebei toe door naar Schets> Bibliotheek opnemen>. Zip-bibliotheek toevoegen te gaan …
CanBusStereoAdapter.ino
De basisinstellingen worden in dit bestand uitgevoerd.
Toetscommando CAN-buswaarden worden bovenaan gedefinieerd. Tenzij je dezelfde auto hebt als ik, zul je hoogstwaarschijnlijk je eigen waarden moeten invullen. Je kunt de hexadecimale waarden van de sniffer gebruiken, ik heb binair gebruikt, dus het is gemakkelijker om te zien dat er geen toevallige overlappingen zijn in de bits.
Niet alle auto's hebben dezelfde stuurwielcommando's, dus voel je vrij om de gedefinieerde waarden te verwijderen, toe te voegen of te bewerken.
Vergeet niet uw subsysteem-ID te vervangen in "STEERING_ID".
CanBus.ino
Dit bestand stelt de CAN-bus-luisteraar in, interpreteert de pakketten en plaatst de weerstandswaarden in een circulaire buffer.
Pas de CAN-busconfiguratie in de functie "setupCanBus" aan uw auto aan.
We gebruiken een circulaire buffer omdat, zoals eerder vermeld, de stuurbedieningsinvoer veel sneller is dan de stereo-invoer. Zo missen we geen commando's terwijl de digitale potmeter zijn werk doet. Als we te veel commando's invoeren, worden de oudste als eerste weggegooid, omdat ze het minst belangrijk zijn. Dit stelt ons ook in staat om het geval af te handelen wanneer meerdere knoppen worden ingedrukt, aangezien de stereo-ingang slechts één enkele waarde tegelijk accepteert.
Als u een van de opdrachtdefinities in "CanBusStereoAdapter.ino" hebt gewijzigd, moet u deze ook bijwerken in de functie "handleMessageData". "handleMessageData" controleert of de geleverde CAN-bus dataframes een van de bekende commando's bevatten met behulp van een bitsgewijze EN-bewerking.
Als ik bijvoorbeeld tegelijkertijd op >> en + heb gedrukt, krijgen we een dataframe met een waarde van 0b10010000. >> (voor mijn auto) is 0b00010000 in binair getal, en + is 0b10000000.
--------------- >> -------------- + ------------- << --- -- data0 | 0b10010000 | 0b10010000 | 0b10010000 commando | EN 0b00010000 | EN 0b10000000 | EN 0b00001000 resultaat | = 0b00010000 | = 0b10000000 | = 0b00000000
Hier kunnen we zien dat het resultaat van de AND-bewerking groter zal zijn dan 0 als de opdracht aanwezig is in het dataframe. We hoeven dus alleen maar te controleren op {dataframe} & {opdrachtwaarde} > 0, voor elke opdracht die we hebben gedefinieerd.
Houd er rekening mee dat elk dataframe verschillende commando's bevat, dus het is goed als de commandowaarden hetzelfde zijn, aangezien we ze vergelijken met hun eigen frames. In mijn voorbeeld hebben zowel << als ESC beide dezelfde waarde 0b00001000 (0x08), maar << zit in data0 en ESC in data1.
Nadat we hebben vastgesteld dat een commando in een frame aanwezig is, voegen we een digitale potwaarde toe aan de circulaire buffer. De waarden variëren van 0 tot 99, maar ik heb gemerkt dat de "spanning" die door de stereo wordt gelezen niet lineair is, dus test de waarden zelf.
DigitalPot.ino
Dit bestand haalt waarden uit de circulaire buffer en stuurt ze naar de digitale pot om uit te voeren. In mijn geval "pot.setPotMin(false);" zal de weerstand verhogen tot maximaal, wat de stereo zal lezen als maximale "spanning". Uw stereo kan vereisen dat u de digitale potmeter op het minimum zet, dus test het uit.
Stap 5: De projectbijlage
Ik heb een 3D-printer, dus besloot ik een tweedelig behuizing voor mijn adapter af te drukken. Ik heb een Fusion 360-bestand bijgevoegd dat u kunt bewerken, en gcode-bestanden die op een perfboard van 60x80 mm passen.
Als u niet over een 3D-printer beschikt, kunt u gebruik maken van een kant-en-klare projectbehuizing of een stevige container.
Stap 6: Laatste gedachten
Ik was aanvankelijk van plan om de adapter op constant vermogen aan te sluiten en wakker te worden met bepaalde CAN-busberichten, omdat mijn auto geen ontstekingskabel in het stereocompartiment heeft. Later besloot ik het niet te doen omdat ik niet het risico wilde lopen de batterij leeg te laten lopen en me zorgen te maken over de adapter terwijl ik niet in de auto zit. Ik heb een autozekeringkastsplitter gebruikt om een ontstekingskabel te laten lopen en de adapter niet verder te compliceren.
Uit mijn tests blijkt dat het stroomverbruik 20-30 mA is. Ik heb het teruggebracht tot 10 mA in de slaapstand en kon nog lager gaan door de LED's van de componenten te verwijderen, maar ik besloot me er niet mee bezig te houden, omdat het alleen werkt als de auto rijdt.
Ik ben best tevreden met het eindresultaat. De responstijd is redelijk en er worden zelden opdrachten gemist.
Hoewel mijn tijdsinvestering veel groter was dan de kosten van de in de handel verkrijgbare adapter (die niet werkte), is de kennis die ik heb opgedaan van onschatbare waarde.
Aanbevolen:
Bluetooth toevoegen aan uw oude autoradio: 5 stappen
Voeg Bluetooth toe aan uw oude autoradio: Hallo allemaal! Dit is de eerste keer dat ik een aantal van deze projecten deel, ik hoop dat je op zijn minst wat ideeën kunt opdoen om je oude autoradio weer tot leven te brengen. Mijn moedertaal is geen Engels, dus het spijt me als mijn spelling of mijn grammatica is niet correct
Bluetooth toevoegen aan uw oude autoradio: 11 stappen
Voeg Bluetooth toe aan je oude autoradio: ik heb een stereo in mijn auto, maar die heeft geen bluetooth, dus waarom zou ik die niet toevoegen?
Games uploaden naar Arduboy en 500 games naar Flash-cart: 8 stappen
Spellen uploaden naar Arduboy en 500 spellen naar Flash-cart: Ik heb een zelfgemaakte Arduboy gemaakt met serieel Flash-geheugen dat maximaal 500 spellen kan opslaan om onderweg te spelen. Ik hoop te delen hoe je games kunt laden, inclusief hoe je games opslaat in het seriële flash-geheugen en je eigen geconsolideerde gamepakket kunt maken
Seeed Studio CAN-BUS V2.0 hacken - Aan de slag: 5 stappen
Seeed Studio CAN-BUS V2.0 Hacking - Aan de slag: deze instructable is bedoeld voor beginners die al de weg weten in Arduino. De eerste kennis van hoe je aan de slag moet, is altijd lastig en tijdrovend in elk project. Maar totdat je de weg weet, zou je bijna altijd willen dat je iemand had om te sh
Een directe lijningang toevoegen aan uw autoradio voor een iPod/mp3-speler: 5 stappen
Een directe lijningang aan uw autoradio toevoegen voor een iPod/mp3-speler: deze instructie laat u zien hoe u een aux-ingang, zoals een koptelefoonaansluiting, aan uw auto kunt toevoegen, zodat u naar een iPod/mp3-speler/GPS of alles wat een line-out heeft via de stereo van uw auto. Terwijl ik het zal toevoegen aan mijn '99 Chevy Subu