İçindekiler:

Araba Stereo Adaptörüne Direksiyon Tuşları (CAN Bus -> Key1): 6 Adım
Araba Stereo Adaptörüne Direksiyon Tuşları (CAN Bus -> Key1): 6 Adım

Video: Araba Stereo Adaptörüne Direksiyon Tuşları (CAN Bus -> Key1): 6 Adım

Video: Araba Stereo Adaptörüne Direksiyon Tuşları (CAN Bus -> Key1): 6 Adım
Video: Direksiyon kumanda bağlantısı 2024, Kasım
Anonim
CAN Otobüs Kokusu
CAN Otobüs Kokusu
Stereoya Komut Gönderme
Stereoya Komut Gönderme

Kullanılmış bir araba satın aldıktan birkaç gün sonra, telefonumdan araba teybi aracılığıyla müzik çalamadığımı keşfettim. Daha da sinir bozucu olan, arabada bluetooth'un olması, ancak müziğe değil, yalnızca sesli aramalara izin vermesiydi. Ayrıca bir Windows Phone USB bağlantı noktasına sahipti, ancak 60$'lık bir dongle olmadan bir iPhone ile çalışmaz.

Daha önceki arabalarımdaki stereoları çok fazla düşünmeden veya araştırmadan değiştirdikten sonra, iyi bilinen "ucuz" bir web sitesinden 40$'lık bir yedek stereo sipariş ettim. Stereo, bir geri görüş kamerası, Car Play ve sadece tek bir şey yapan daha pahalı dongle'dan çok daha iyi bir değer gibi görünen bir dizi ekstra özellik ile geldi.

Yeni bir ön yüz satın alıp boyadıktan, bir montajı 3D bastıktan ve bir sürü ekstra çalışmadan (ki bu kendi başına bir talimat olabilir) sonra tatsız bir keşfe geldim. Direksiyon simidi tuş komutları CAN veri yolu üzerinden gönderildi, ancak stereoda yalnızca bir Key1 girişi vardı. Yarı yolda bırakacak biri olmadığım için 60£'luk bir adaptör sipariş ettim ve çalışmadığı ortaya çıktı. Bu noktada kendime bir adaptör yapmaya karar verdim.

Elektrik mühendisi değilim, sadece temel elektronik bilgim var ve bu benim için bir öğrenme ve keşif projesiydi. Benim tavsiyem, önce aracınızın özelliklerini kontrol etmek ve uyumlu bir radyo sipariş etmek olacaktır, ancak zaten takılırsanız (benim gibi) talimatları takip edin, riski size aittir.

Gereçler

Adaptör (yaklaşık 15$)

  • Arduino Pro Mini 5V (veya uyumlu bir kart)
  • MCP2515 CAN veri yolu modülü
  • 60x80mm perfboard
  • X9C104 dijital potansiyometre 100K Ohm (teyp sisteminize bağlıdır)
  • DC-DC Düşürücü regülatör LM2596S 3-40V 3A
  • Kablo sigorta tutucu + sigorta (100-200 Ohm)
  • Yazdırmak için proje kutusu veya 3D yazıcı
  • Araba stereo jakları (erkek + dişi)
  • Lehimleme malzemeleri, teller vb.

Test yardımcıları (kesinlikle gerekli değildir ancak testi çok daha kolay hale getirir)

  • Arduino (herhangi bir 5V kartı yapacaktır)
  • MCP2515 CAN veri yolu modülü
  • Breadboard + jumper'lar

Adım 1: CAN Bus Sniffing

Bir grup sistemi birbirine bağlayan arabanızın içinde dolaşan bir grup kablo yerine, bazı modern araçlarda her bileşene giden bir çift kablo bulunur. Bilgiler bu teller aracılığıyla dijital veri paketleri olarak gönderilir ve tüm sistemler tüm mesajları okuyabilir. Bu, CAN veri yolu ağıdır (arabanızda birden fazla ağ olabilir, bu nedenle tüm bilgiler görünmeyebilir).

Yapmak istediğimiz şey, CAN bus ağına bağlanmak ve veri trafiğini "koklamak". Bu şekilde bir direksiyon simidi tuşuna ne zaman basıldığını "görebiliriz". Her paketin, paketi gönderen araç alt sistemini ve sistem durumunu temsil eden verileri temsil eden bir kimliği vardır. Bu durumda, direksiyon simidi anahtar mesajlarını gönderen alt sistemin kimliğini ve her bir anahtarın veri temsilini bulmaya çalışıyoruz.

Şanslıysanız, arabanızın değerlerini çevrimiçi bir yerde bulabilir ve bu adımı atlayabilirsiniz.

Bu süreç biraz ilgili ve başka yerlerde zaten açıklandı, bu yüzden kısaca özetleyeceğim:

  • Aracınızdaki CAN bus iletişimi için doğru değerleri bulun. Arabam için (2009 Fiat Idea) 50KBPS baud hızı ve 8MHz saat hızıydı.
  • CAN bus modülünü ve "sniffer" konfigürasyonunda bir Arduino'yu kullanarak CAN bus ağına bağlanın.
  • https://github.com/alexandreblin/python-can-monito… gibi bir araç kullanarak dizüstü bilgisayarınızda CAN veri yolu değerlerini okuyun. Araba hiçbir şey yapmıyorken bile çok fazla mesaj gönderildiği için onsuz yapmak çok zor olacak.
  • Direksiyon simidi düğmesine basın ve değer değişikliklerini not edin. Birçok mesaj gönderildiği için bu biraz zor olabilir ve hangisinin hangisi olduğunu anlamak zor olabilir.

İşte süreci derinlemesine açıklayan iki harika makale:

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

Sonunda, yalnızca direksiyon simidi CAN veri yolu mesajlarını dinlemek için kullanacağımız alt sistem kimliğine ve tuş komutları için bir onaltılık değerler listesine sahip olmalısınız. Benim durumumda veriler şöyle görünüyordu:

Kimlik | Kimlik Altıgen | Bayt 0 | Bayt 1 | Buton

------------------------------------------ 964 | 3C4 | 00 | 00 | Düğme yok 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 | 964 kazan | 3C4 | 00 | 02 | Yukarı 964 | 3C4 | 00 | 01 | Aşağı 964 | 3C4 | 00 | 04 | Tamam

Alt sistem kimliği 3C4'tür (bu durumda), onaltılık bir sayıdır, bu yüzden Arduino eskizlerinde 0x3C4 gibi yazmalıyız. Ayrıca 0 ve 1 baytlarıyla da ilgileniyoruz (sizin durumunuzda daha fazla bayt olabilir). Bunlar aynı zamanda onaltılık değerlerdir, bu nedenle başında 0x ile yazılmalıdırlar.

Değerleri ikiliye dönüştürürseniz, bitlerin örtüşmediğini fark edeceksiniz (örneğin + 0b10000000 ve - 0b01000000), bu aynı anda birden fazla tuşa basılabilmesi anlamına gelir.

Sniffer'ı "test yardımcısı" bölümünde listelenen malzemelerle oluşturmanızı öneririm, böylece daha sonra arabanızı simüle etmek için yeniden kullanabilirsiniz. Bu, adaptörü oluştururken ve test ederken sizi sürekli arabanızda oturmaktan kurtarır. Simülatör olarak hareket etmek için sağlanan çizimi kullanabilirsiniz. Kokladığınız değerlerle "subsystemId", "data0" ve "data1" öğelerini değiştirin.

Adım 2: Komutları Stereoya Gönderme

Stereoya Komut Gönderme
Stereoya Komut Gönderme

Adaptörü oluşturmaya başlamadan önce, stereonun komutları alıp almadığını test etmek en iyisidir.

Yedek bir araba aküsüm vardı, bu yüzden stereoyu doğrudan ona bağladım. 12V tezgah üstü güç kaynağınız varsa, daha da iyi. Ne yazık ki ünitemdeki Key1 girişi hakkında çevrimiçi olarak fazla bilgi bulamadım, bu yüzden denemeye başvurdum. Nispeten ucuz olduğu için bu noktada stereoyu yakma konusunda aşırı endişe duymadım ve bu benim arabamla çalışmasını sağlamak için son hendek denememdi.

Stereo, iki direnç değerinden (1K ve 3.3K) birini seçmenin ve "voltaj" değerini (0-255) görmenin mümkün olduğu bir komut öğrenme ekranına sahiptir. "Gerilim" yanıltıcı olduğu için alıntılanmıştır. Key1'e şanssız farklı voltajlar uygulayarak çok zaman harcadım. Voltajı şanssız uygulamak için farklı dirençler kullanmayı da denedim.

Atılım, Key1 kablosunu akü toprağına değdirmeyi denediğimde geldi ve bunun sonucunda "voltaj" 0'a düştü. Bu, farklı dirençlerle birlikte öğrenme ekranında tutarlı "voltaj" değerleri üretecekti.

Artık stereoya nasıl girdi göndereceğimi bildiğime göre, onları bir Arduino'dan göndermenin bir yoluna ihtiyacım vardı. Bu noktada, bazı dirençlerle birlikte daha hızlı ve daha güvenilir bir çözüm olabilecek çoklayıcıları duymadım (bunun mümkün olup olmadığından hala emin değilim), bu yüzden dijital bir potansiyometre kullandım. İlk başta, voltaj bölücü yerine değişken bir direnç olarak işlev görmesi için onu bir reosta olarak bağlamam gerektiğini anlayana kadar dijital potu çalıştırmakta sorunlar yaşadım. Temel olarak RH ve RW terminallerini bağlamam gerekiyordu.

Direncin yanı sıra zamanlama da çok önemliydi. Direnç düşüşü çok kısaysa, komut kaydedilmeyecektir. Çok uzunsa, birden çok kez kaydedilebilir. 240ms'lik bir düşüş, ardından bir sonraki komuta kadar 240ms'lik bir gecikme, stereo'm için oldukça güvenilir çalıştı. Bu çok az bir süre gibi görünse de, saniyede maksimum 2 komut gönderebileceğimiz anlamına gelir; bu, sesi hızlı bir şekilde artırmaya veya azaltmaya çalışıyorsanız fark edilir. Hızı artıran ancak çok güvenilir olmayan farklı zamanlamalar ve kalıplarla oynamayı denedim. Bunu nasıl geliştireceğinize dair herhangi bir fikriniz varsa, lütfen bunları yorumlarda bırakın.

Daha fazla ilerlemeden önce, stereo sisteminizin aynı tür girişi kabul edip etmediğini kontrol etmek için bir prototip oluşturmanızı öneririm. Farklı voltajları kabul etse bile, adaptör kablolamada ve Arduino çiziminde küçük değişikliklerle çalışmalıdır.

3. Adım: Bağdaştırıcıyı Oluşturma

Adaptörü Oluşturma
Adaptörü Oluşturma
Adaptörü Oluşturma
Adaptörü Oluşturma
Adaptörü Oluşturma
Adaptörü Oluşturma

Tüm bileşenleri ayrı ayrı test ettikten ve bir devre tahtası üzerinde birlikte denedikten sonra, onlara daha kalıcı bir yuva vermenin zamanı gelmişti. Bu, bileşenlerin yerleştirilmesi ve lehimlenmesi için birkaç saat sürdü.

Sol üstte, araç aküsünden 12V'yi diğer bileşenler tarafından kullanılabilecek 5V'a dönüştüren kademeli düşürme regülatörü bulunur.

Sol altta, aracın CAN veri yolu ağından değerleri okuyan ve bunları Arduino'ya ileten CAN veri yolu modülü bulunur.

Sağ üstte, zemin ve stereo'nun Key1 girişi arasında değişken bir direnç görevi gören dijital potansiyometre (reostat olarak kablolu) bulunur.

Sağ altta, adaptörün beyni olarak görev yapan ve CAN bus mesajlarını stereo tarafından okunan dirençlere dönüştüren Arduino var.

12V girişinde, büyük olasılıkla devreyi korumayacak, ancak kısa devre durumunda yangını önlemek için orada bulunan 150mA'lık bir sigorta bulunur.

4. Adım: Yazılım

Yazılım
Yazılım

İndirdikten sonra, üç.ino dosyasını tek bir klasöre koyun. Bu şekilde hepsi aynı taslağın bir parçası olacak ve birlikte Arudino'ya konuşlandırılacak.

Arduino IDE'ye gerekli kütüphaneleri de eklemeniz gerekir. Bunu yapmak için aşağıdaki dosyaları indirin:

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

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

ardından Sketch > Include Library > Add. Zip Library… seçeneğine giderek ikisini de ekleyin.

CanBusStereoAdapter.ino

Bu dosyada temel kurulum yapılır.

Tuş komutu CAN bus değerleri en üstte tanımlanır. Benimle aynı arabaya sahip değilseniz, büyük olasılıkla kendi değerlerinizi girmeniz gerekecek. Sniffer'dan onaltılık değerleri kullanabilirsiniz, ben ikili kullandım, böylece bitlerde kazara çakışma olmadığını görmek daha kolay.

Tüm arabalar aynı direksiyon komutlarına sahip değildir, bu nedenle tanımlanan değerleri kaldırmaktan, eklemekten veya düzenlemekten çekinmeyin.

"STEERING_ID" içindeki alt sistem kimliğinizi değiştirmeyi unutmayın.

CanBus.ino

Bu dosya CAN veri yolu dinleyicisini kurar, paketleri yorumlar ve direnç değerlerini dairesel bir arabelleğe koyar.

"setupCanBus" işlevinde CAN bus yapılandırmasını aracınıza uyacak şekilde ayarlayın.

Dairesel bir tampon kullanıyoruz çünkü daha önce de belirtildiği gibi direksiyon komut girişi stereo girişten çok daha hızlı. Bu sayede dijital potansiyometre işini yaparken hiçbir komutu kaçırmayız. Çok fazla komut girersek, en az önemli oldukları için en eskileri önce atılır. Bu aynı zamanda, stereo giriş bir seferde yalnızca tek bir değeri kabul ettiğinden, birden fazla düğmeye basıldığında durumu ele almamızı sağlar.

"CanBusStereoAdapter.ino" içindeki komut tanımlarından herhangi birini değiştirdiyseniz, bunları "handleMessageData" işlevinde de güncellemeniz gerekir. "handleMessageData", sağlanan CAN veri yolu veri çerçevelerinin bit düzeyinde AND işlemi kullanarak bilinen komutlardan herhangi birini içerip içermediğini kontrol eder.

Örneğin, >> ve + tuşlarına aynı anda basarsam, bu bize 0b10010000 değerinde bir veri çerçevesi verecektir. >> (arabam için) ikili dosyada 0b00010000 ve + 0b10000000'dır.

--------------- >> -------------- + ------------- << --- -- veri0 | 0b10010000 | 0b10010000 | 0b10010000 komutu | VE 0b00010000 | VE 0b10000000 | VE 0b00001000 sonuç | = 0b00010000 | = 0b10000000 | = 0b00000000

Burada, eğer komut veri çerçevesinde mevcutsa, AND işleminin sonucunun 0'dan büyük olacağını görebiliriz. Yani tek yapmamız gereken tanımladığımız her komut için {veri çerçevesi} & {komut değeri} > 0 olup olmadığını kontrol etmektir.

Her veri çerçevesinin farklı komutlar içerdiğini unutmayın, bu nedenle komut değerleri aynıysa sorun değil, çünkü onları kendi çerçevelerine göre kontrol ediyoruz. Örneğimde hem << hem de ESC aynı 0b00001000 (0x08) değerine sahiptir, ancak << data0'da ve ESC data1'dedir.

Bir çerçevede bir komutun bulunduğunu belirledikten sonra dairesel tampona bir dijital pot değeri ekliyoruz. Değerler 0 ile 99 arasındadır, ancak stereo tarafından okunan "voltajın" doğrusal olmadığını fark ettim, bu yüzden değerleri kendiniz test edin.

DigitalPot.ino

Bu dosya, değerleri dairesel tampondan çıkarır ve yürütmek için dijital pota gönderir. Benim durumumda "pot.setPotMin(false);" direnci, stereonun maksimum "voltaj" olarak okuyacağı maksimuma yükseltecektir. Stereo cihazınız, dijital potu minimuma ayarlamanızı gerektirebilir, bu yüzden test edin.

Adım 5: Proje Kapsamı

Proje Muhafazası
Proje Muhafazası

Bir 3D yazıcım var, bu yüzden adaptörüm için iki parçalı bir muhafaza yazdırmaya karar verdim. Düzenleyebileceğiniz bir Fusion 360 dosyası ve 60x80mm'lik bir perfboard sığacak gcode dosyaları ekledim.

Bir 3D yazıcıya erişiminiz yoksa, hazır bir proje muhafazası veya sağlam bir kap kullanabilirsiniz.

6. Adım: Son Düşünceler

Arabamın stereo bölmesinde bir ateşleme kablosu olmadığından, başlangıçta adaptörün sabit güce bağlı olmasını ve belirli CAN veri yolu mesajlarında uyanmasını planladım. Daha sonra, pili boşaltma riskini almak ve arabadan uzaktayken adaptör hakkında endişelenmek istemediğim için buna karşı karar verdim. Ateşleme kablosunu çalıştırmak için bir araba sigorta kutusu ayırıcı kullandım ve adaptörü daha fazla karmaşıklaştırmama gerek kalmadı.

Testlerime göre güç tüketimi 20-30 mA. Uyku modunda 10 mA'ya düşürdüm ve LED'leri bileşenlerden çıkararak daha da düşebilirdim, ancak bununla uğraşmamaya karar verdim çünkü sadece araba çalışırken çalışacaktır.

Sonuçtan oldukça memnunum. Yanıt süresi makuldür ve komutları nadiren kaçırır.

Zaman yatırımım piyasada satılan adaptörün (işe yaramayan) maliyetinden çok daha fazla olsa da, edindiğim bilgiler paha biçilemez.

Önerilen: