Bir otomobil, bu günlerde yüzlerce mikrodenetleyicinin haddeleme yığınıdır – sadece herhangi bir Greybeard Mechanic’e sorun ve “Karbüratör” rantını başlatır. Bu sistemlerin ve alt sistemlerin tümü, elektriksel olarak düşmanca bir ortamda birbirleriyle konuşmaları gerekir ve yanlış iletişimin veya hatta geciktiğinin iletişiminin büyük sonuçları olabileceğini söylemesi bir abartı değildir. Araba içi ağ büyük işletmedir. Otomobillerin seri üretimi, otomotiv olmayan donanım hacker için düşük maliyetli alıcı-verici ICS’nin saygınlaştırılmasını sağlar. Öyleyse neden bu olağanüstü kaynak tabanından yararlanan daha fazla hacker projesi görmüyoruz?
Bir arabanın ağının omurgası, kontrolör alanı ağıdır (CAN). HASTADAY’in kendi [Eric Evenchick] bir araba hacker extraordinairedir ve daha sonra okumak için yer imi için yer imini yapmak istediğiniz bir multipart serisindeki Can otobüsüyle ilgili bilmek istediğiniz her şeyi yazdı. Motor, frenler, kapılar ve tüm enstrümantasyon veri incelemeleri (diferansiyel) olabilir. Hızlı ve yüksek güvenilirlik. Aynı zamanda komplike ve uygulamak için biraz pahalı.
1990 yılının sonlarında, çok sayıda üretici, otomotiv ağının kritik olmayan kısımları için yanında çalışan kendi özel otobüs protokollerine sahipti: Kapı-monteli bir konsol, örneğin kapı kilidi şoför ve pencere motorları için nasıl konuşuyor. Ana Can otobüsünü, bunun gibi eleştirel olmayan ve yerel iletişimlerle karıştırmaya değmez, bu nedenle alt ağlar ana kutudan döndürüldü. Bunların ana ağın hızına veya güvenilirlik garantilerine ihtiyacı yoktu ve maliyet nedeniyle uygulanması kolay olmaları gerekiyordu. En küçük mikrodenetleyici, bir pencereyi yukarı ve aşağı yuvarlamak için yeterli olması gerekir.
2000’lerin başında, yerel ara bağlantı ağı (LIN) spesifikasyonu, bu alt ağlara, düşük uygulama maliyetine, orta hız, yeniden yapılandırılabilirlik ve bir ana mikrodenetleyici arasındaki iletişim için öngörülebilir davranışa odaklanarak bir yöntemi standartlaştırdı. bir küme. Küçük mikrodenectroller üzerinde ucuz, basit, uygulanabilir ve orta ölçekli projeler için sadece en iyisi? Bir bilgisayar korsanının rüyası! Neden çoklu mikro projelerinizde Lin kullanmıyorsunuz? Kazanalım ve bunların herhangi birinin sizin için faydalı olup olmadığını görebilirsiniz.
Lin protokolü
Yerel mini ağın Jargon’da çağrıldığı, tek bir ana mikrodenetleyici ve bir dizi köleden oluşan bir Lin “Küme”. Lin, tipik olarak 19,200 baud’da geleneksel 8N1 UART seri olarak başlar ve bir tel ile uzaklaşır. Daha sonra, bu tek kablonun birden fazla kölesi arasında paylaşılan, bir otobüs olarak kullanılmasını sağlayan bir protokol ekler. Kolay UART seri iletişim için kendi ağ protokolünüzü yuvarlamaya çalıştıysanız, Lin gibi bir şeyle bitirirsiniz. Git Şartnamenin (PDF) bir kopyasını (PDF) getirin ve okuyun!
Her lin işlemi temelde aynıdır: Master, yapılacak görevi belirten bir korumalı tanımlayıcıyı (PID) içeren bir başlık gönderir. Görevler “Sıcaklık Sensörü 2” veya “Set Servo 3 Konumu” gibi bir şey olabilir. Göreve bağlı olarak, bir ve sekiz bayt arasında, iki baytlık bir sağlama toplamı ile takip edin. Slavların hangi görevlerin cevap vereceğini ve nasıl cevap vereceğini bilmek zorundadır. Öyleyse “Sarım Servo 3 konumunu” gönderilirse, Servo 3 kölenin bir sonraki baytları dinlemesi ve buna göre reaksiyona girmesi gerekir. Komuta cevap vermeyen tüm köleler, bir sonraki girişe kadar verileri göz ardı edebilir.
“Rapor sıcaklığı sensörü 2” durumunda, sıcaklık sensörüne sahip köle, komutu aldıktan hemen sonra verilerini gönderir. Bayt uzunluğu önceden bilinmekte ve yalnızca sensör 2’nin bu göreve cevap vermesine izin verilir, ustalık tam olarak dinlemeyi, söyleyeceğini, söyleyerek, dört bayt, reaksiyonda dört bayt olduğunu ve ne kadar süreceklerini bilmesini biliyor.
Yüksek Lisans Gönderme Başlıkları ve Slaves Gönderen Bu Yoklama Sistemi, cihazların hiçbirinin aynı anda otobüse erişmeyeceğini garanti eder, bu yüzden Lin sadece tek bir RX / TX hattı ile alır. Giriş, kölelerin ana saate kilitlenmesine yardımcı olan bir senkronizasyon bayt (0x55) içerir, böylece köleler daha az pahalı RC saat kaynakları üzerinde çalışabilir ve otomatik bauding mümkündür.
Mesajların uzunluğu zamanın önünde bilindiğinden, yüksek lisansın yoklama rutininin zamanlaması bir programda yazılabilir. Master, şebekeyi tanımlanmış aralıklarla anlatır ve eğer köle işlem için gerekli zamanın gerektirdiği sürenin 1,4 katı içinde yanıt vermezse, eylemde eksik olduğu varsayılmaktadır. Her iki durumda da, ustası programındaki bir sonraki maddeye geçer ve sırası tekrar ortaya çıkana kadar potansiyel olarak kusurlu köleyi yeniden denemez. Bu, tüm cihazlar için bilinen bir güncelleme oranını garanti eder, bu da hayatı ustayı programlamak için çok daha basit hale getirir.
Bunlar temeller. Master PID’leri gönderir ve bir dizi veri baytını takip eder. Her şey rahat eski UART, çağrı ve yanıt, küçük bir ağ oluşturmak için mümkün olduğunca uyarlanmıştır.
Ekstralar
Bir öğretici vi’den GUI LIN yapılandırma uygulamasıdeo.
Keeping the network that easy requires that the master and slaves all agree on the command set and valid reaction lengths. That’s a lot of information needed for the LIN cluster to function, in principle. helping matters out somewhat, there’s a conventional format for notating all of this laid out in the LIN spec.
There’s also a conventional API for C that both the master and slave microcontrollers can use to make handling coding up behavior in a LIN cluster. Combined, this makes a conventional workflow for specifying and implementing LIN busses — very useful for the automakers, and not useless for the hacker either.
There is also a sleep state and behavior that’s defined for the bus, with associated sleep and wakeup signals. all of the slaves ought to respond to the sleep signal, and any of them ought to automatically go to sleep after a timeout of four seconds if they haven’t heard from the master. any node, slave or master, can send the wakeup command, and after that the master ought to go back to its normal polling schedule.
LIN version 2.0 included a number of optional frame types that make the network much more flexible. In particular, “sporadic frames” make the slave’s reaction optional if it hasn’t gotten any new data because the last update. “Event triggered frames” are like sporadic frames, except they can be additionally responded to by any slave node that has new data.
This introduces the possibility of a collision on the bus, in which case hopefully the checksum doesn’t add up and the master falls back to slave-specific frames as before. These two modes speed up the bus when data updates are infrequent, but add some indeterminacy to the schedule and conditional complexity to the code. use them only if you need them.
The master can also have multiple schedules, and switch among them. The slaves don’t care — they just listen for the tasks that are relevant to them anyway. There’s no reason for the master to send servo position data every period if it hasn’t changed, for instance, even if it makes things conceptually simpler. Your call.
There is even an optional carry layer spec that is compatible with CAN bus and makes it simpler to integrate the local LIN cluster with the bigger network. In short, LIN is a very thoroughly thought through UART bus protocol with good industry adoption. You’ll find good tutorials from every vendor of LIN transceiver hardware. (Here’s a terrific intro from national Instruments.)
Hardware — The Physical Layer
Topping all of this protocol niceness off is a broad variety of LIN transceiver chips ranging from $0.25 to $0.50 for plain transceivers, on up to around a buck or two for “system basis” chips with integrated voltage regulators. These are especially slick, because the transceiver can take care of the sleep/wake logic and turn the power supply to your microcontroller on and off. This makes integrating a slave node that operates at 3.3 V very simple.
Little chip purchases you a lot.
Since the LIN bus is developed for automotive, it’s typically specced for 12 V because that’s what courses through the veins of your car’s wiring harness. LIN transceiver hardware needs to be able to accommodate even higher voltages, because automobile electrical systems can be spiky environments. They also have to cope with bus contention, when the transceiver chip may be trying to pull the LIN line down while someone else is trying to pull it up, so there’s overheating protection built in as well. LIN transceivers are robust little beasties.
In contrast to I2C lines, which are pulled up with puny resistors, an automotive LIN bus is pulled up to 12 V with a 1 kΩ resistor. To pull this line down fast enough, LIN transceivers need to be able to conduct tens of milliamps, so they have slightly beefy (for ICs) transistors built in. The combination of a high voltage and relatively high line current implies that an automotive-spec LIN bus is good for 40 meters, rather than the couple meters that I2C gives you without resorting to drivers. If you need the distance or the noise immunity, LIN is there for you.
But nothing forces you to run your bus at 12 V, even the transceiver hardware. The Microchip transceivers that I’ve seen run down to 5.5 V, while the ones from NXP and Melexis run down at an Arduino-compatible 5 V.
And nothing forces you to use transceiver hardware at all! You could simply connect a PNP transistor (or P-channel MOSFET) to the bus line and drive that with the UART TX, sampling the bus with the RX line. This has the drawback of local echo, but that could be handled in software. Or, with only a few much more parts, there’s this service that we’ve seen before. I couldn’t find any hacker projects implementing LIN transceivers from scratch, though. maybe that’s because the industrial ones are just so cheap.
Güçlülükler ve zayıflıklar
No bus is ideal for all occasions, and LIN is no exception. LIN is not particularly fast, being developed around 19,200 baud UART. Güncellemeleri, bir mikrodenetleyicinin bakış açısıyla oldukça nadir görülür. Zaman aşımı ile tam uzunlukta bir işlem, yaklaşık on milisaniye alır. Master, on altı cihazı seçerse, bu, yaklaşık yedi hertz en kötü durumdaki bir güncelleme oranıdır. Tabii ki, yüksek lisans, her seferinde her cihaza ve mesajların bu uzunluğun yarısı kadar olacağını, ancak 200 Hz’den fazla olmayacaksınız. Öte yandan, güncelleme oranı, güvenilirlik ve sadelik için müthiş olan lapa lapa cihazlar için sıkı zaman aşımları yürütme yeteneği nedeniyle sabittir ve bu kadar yavaş değil I2C’den daha yavaş değildir.
Vahşi, 1.x ve 2.x’de göreceğiniz Lin’in iki ana versiyonu vardır. Yukarıda tartışılan isteğe bağlı çerçeve türlerine ek olarak, iki versiyonun farklı sağlama toplamı formüllerine sahiptir – ve 2.x’teki olanı gerçekten tuhaf – doğru yaptığınızdan emin olmak için web tabanlı bir hesap makinesini gerektirir. MOD-256 eklemek yerine, 255 veya daha büyük bir değerden 255’i çıkarırlar. 0 yerine 1’e kadar sarılan 8 bitlik taşma gibi. Bu, herhangi biriniz için mantıklı mı?
Lin cihazları, otomotiv endüstrisinin dışında, uzun bir atış tarafından I2C veya SPI olarak yaygın değildir, bu nedenle muhtemelen protokolle başa çıkmak için asla zorlanmamışsınızdır. Ancak, sadece bir tel (artı zemin) kullanarak, mümkün olduğunca az sayıda mikrodenetleyici tabanlı modülü, kolay ve ucuz bir şekilde ağlamak istiyorsanız, daha kolay bir şey düşünmek zor. I2C köle kodunu yazmak kesinlikle piknik değildir. Bir UART hattında belirli bir bayt dinlemek için kod yazma ve daha sonra tepki verilemedi.
Düz-vanilya uartınızı bir otobüse dönüştürmek ister misiniz? Lin kitabından bir sayfa veya iki tane alın! Zaten yaptın mı? bize göster!