İçindekiler:
- Adım 1: Kullanılan Kaynaklar
- Adım 2: CAN (Kontrolör Alan Ağı)
- 3. Adım: CAN - Özellikler
- Adım 4: Kullanılan Devre
- Adım 5: İletim Hattı Gerilimleri (Diferansiyel Tespiti)
- Adım 6: CAN Standartları ve Çerçeve Formatı
- Adım 7: CAN Standartları ve Çerçeve Formatı
- Adım 8: CAN Standartları ve Çerçeve Formatı
- Adım 9: Dört Çerçeve Türü (çerçeveler)
- Adım 10: Devre - Bağlantıların Detayları
- Adım 11: Devre - Veri Yakalama
- Adım 12: Devre - Veri Yakalama
- Adım 13: Devre - Veri Yakalama
- Adım 14: Arduino Kütüphanesi - CAN
- Adım 15: Github
- Adım 16: Verici Kaynak Kodu
- Adım 17: Kaynak Kodu: Döngü (), Standart CAN 2.0 Paketi Gönderme
- Adım 18: Kaynak Kodu: Döngü (), Genişletilmiş CAN 2.0 Paketi Gönderme
- Adım 19: Alıcı Kaynak Kodu
- Adım 20: Kaynak Kodu: Döngü (), Paketi Alma ve Formatı Kontrol Etme
- Adım 21: Kaynak: Döngü (), Uzak Bir Paket Olup Olmadığını Kontrol Eder
- Adım 22: Kaynak Kodu: Döngü (), Talep Edilen veya Alınan Veri Uzunluğu
- Adım 23: Kaynak Kodu: Döngü (), Veri Alınırsa Yazdırılır
- Adım 24: Dosyaları İndirin
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
Son zamanlarda YouTube kanalımın takipçileri tarafından önerilen bir diğer konu da bugün üzerinde duracağımız CAN (Controller Area Network) protokolüydü. CAN'ın eşzamanlı bir seri iletişim protokolü olduğunu açıklamak önemlidir. Bu, ağa bağlı modüller arasındaki senkronizasyonun, bus'a gönderilen her mesajın başlangıcına göre gerçekleştirildiği anlamına gelir. CAN protokolünün temel kavramlarını tanıtarak başlayacağız ve iki ESP32 ile basit bir montaj gerçekleştireceğiz.
Devremizde ESP'ler hem Master hem de Slave olarak görev yapabilir. Aynı anda birden fazla mikro denetleyiciye sahip olabilirsiniz, çünkü CAN her şeyin çarpışmasıyla otomatik olarak ilgilenir. Bu projenin kaynak kodu süper basittir. Bunu kontrol et!
Adım 1: Kullanılan Kaynaklar
- ESP WROOM 32 NodeMcu'nun iki modülü
- WaveShare'den iki CAN alıcı-verici
- Bağlantılar için jumperlar
- Yakalama için mantıksal analizör
- ESP'ler ve analizör için üç USB kablosu
- Otobüs olarak hizmet etmek için 10 metre bükümlü çift
Adım 2: CAN (Kontrolör Alan Ağı)
- 1980'lerde Robert Bosch GmbH tarafından otomotiv endüstrisine hizmet etmek için geliştirilmiştir.
- Sağlamlığı ve uygulama esnekliği nedeniyle yıllar içinde yaygınlaşmıştır. Askeri teçhizat, tarım makineleri, endüstriyel ve bina otomasyonu, robotik ve tıbbi teçhizat ile kullanılmaktadır.
3. Adım: CAN - Özellikler
- İki telli seri iletişim
- Parçalanma olasılığı ile çerçeve başına maksimum 8 bayt yararlı bilgi
- Düğüme değil mesaja yönlendirilen adres
- Mesajlara öncelik atama ve "beklemede" mesajların iletilmesi
- Hataları tespit etme ve sinyal verme konusunda etkili yetenek
- Çoklu yönetici özelliği (tüm düğümler veri yolu erişimi talep edebilir)
- Çok noktaya yayın özelliği (aynı anda birden fazla alıcı için bir mesaj)
- 40 metrelik bir bus üzerinde 1Mbit/s'ye kadar transfer hızları (bara uzunluğunun artması ile hızın düşmesi)
- Yapılandırma esnekliği ve yeni düğümlerin tanıtılması (veri yolu başına 120 düğüme kadar)
- Standart donanım, düşük maliyet ve iyi kullanılabilirlik
- Düzenlenmiş protokol: ISO 11898
Adım 4: Kullanılan Devre
Burada, Alıcı-Vericilerim var. Her iki tarafta birer tane var ve bir çift tel ile bağlılar. Biri veri göndermekten, diğeri veri almaktan sorumludur.
Adım 5: İletim Hattı Gerilimleri (Diferansiyel Tespiti)
CAN'da baskın bit Sıfır'dır.
Hat Diferansiyel Algılama, Gürültü Hassasiyetini Azaltır (EFI)
Adım 6: CAN Standartları ve Çerçeve Formatı
11 bit tanımlayıcılı standart biçim
Adım 7: CAN Standartları ve Çerçeve Formatı
29 bit tanımlayıcı ile genişletilmiş format
Adım 8: CAN Standartları ve Çerçeve Formatı
Bir protokolün CRC'yi zaten hesapladığını ve ACK ve EOF sinyallerini gönderdiğini belirtmek önemlidir, bunlar CAN protokolü tarafından zaten yapılmıştır. Bu, gönderilen mesajın yanlış yoldan gelmemesini garanti eder. Bunun nedeni, bir bilgi kontrol basamağı ile aynı olan CRC'de (Redundant Cyclic Check veya Redundancy Check) bir sorun verirse, CRC tarafından tanımlanacaktır.
Adım 9: Dört Çerçeve Türü (çerçeveler)
Bir protokolün zaten CRC'yi hesapladığını ve ACK ve EOF sinyallerini gönderdiğini, bunlar CAN protokolü tarafından zaten yapılmış şeyler olduğunu not etmek önemlidir. Bu, gönderilen mesajın yanlış yoldan gelmemesini garanti eder. Bunun nedeni, bir bilgi kontrol basamağı ile aynı olan CRC'de (Redundant Cyclic Check veya Redundancy Check) bir sorun verirse, CRC tarafından tanımlanacaktır.
Dört tip çerçeve (çerçeve)
CAN'de veri iletimi ve alımı dört tip çerçeveye dayanmaktadır. Çerçeve türleri, kontrol bitlerindeki varyasyonlarla veya hatta her durum için çerçeve yazma kurallarındaki değişikliklerle tanımlanacaktır.
- Veri Çerçevesi: Alıcı(lar) için verici verilerini içerir.
- Uzak Çerçeve: Bu, düğümlerden birinden gelen veri talebidir.
- Hata Çerçevesi: Bus'ta bir hata tanımlanırken herhangi bir düğüm tarafından gönderilen ve tüm düğümler tarafından algılanabilen bir çerçevedir.
- Aşırı Yük Çerçevesi: Bir veya daha fazla düğümde aşırı veri yüklenmesi veya gecikme nedeniyle veriyolu üzerindeki trafiği geciktirmeye yarar.
Adım 10: Devre - Bağlantıların Detayları
Adım 11: Devre - Veri Yakalama
11 bit ID'li standart CAN için elde edilen dalga boyları
Adım 12: Devre - Veri Yakalama
29 bit ID ile genişletilmiş CAN için elde edilen dalga boyları
Adım 13: Devre - Veri Yakalama
Mantık analizörü tarafından elde edilen veriler
Adım 14: Arduino Kütüphanesi - CAN
Burada CAN Sürücü Kitaplığını kurabileceğiniz iki seçeneği gösteriyorum
Arduino IDE Kütüphane Yöneticisi
Adım 15: Github
github.com/sandeepmistry/arduino-CAN
Adım 16: Verici Kaynak Kodu
Kaynak Kodu: İçerir ve Kurulum ()
CAN kitaplığını ekleyeceğiz, hata ayıklama için seriyi başlatacağız ve CAN veri yolunu 500 kbps'de başlatacağız.
#include // Biblioteca CAN void setup() { Serial.begin(9600); //inicia a serial para debug while (!Serial); Serial.println("Transmisor CAN"); // CAN a 500 kbps if (!CAN.begin(500E3)) { Serial.println("Falha ao iniciar o controlador CAN"); //caso não seja possível iniciar o controlador while (1); } }
Adım 17: Kaynak Kodu: Döngü (), Standart CAN 2.0 Paketi Gönderme
Standart CAN 2.0'ı kullanarak bir paket gönderiyoruz. 11 bitlik kimlik mesajı tanımlar. Veri bloğu en fazla 8 bayta sahip olmalıdır. Paketi ID 18 ile onaltılı olarak başlatır. 5 bayt paketler ve işlevi kapatır.
void loop() { // CAN 2.0 padrão'yu kullanma //Envia um paote: o id tem 11 bit ve bir mensagem tanımlaması (öncelikli, evento) //o 8 baytlık bir bloco de dados deve possuir'i Serial.println("Enviando paketi …"); CAN.beginPacket(0x12); //id 18 em onaltılık CAN.write('h'); //1º bayt CAN.write('e'); // bayt CAN.write('l'); ///3º bayt CAN.write('l'); ///4º bayt CAN.write('o'); ///5º bayt CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); gecikme(1000);
Adım 18: Kaynak Kodu: Döngü (), Genişletilmiş CAN 2.0 Paketi Gönderme
Bu adımda, kimliğin 29 biti vardır. 24 bit kimlik göndermeye başlar ve bir kez daha 5 bayt paketler ve çıkar.
//Usando CAN 2.0 Estendido //Envia um pacote: o id tem 29 bit e identifica a mensagem (öncelikli, evento) //o 8 byte'lık bir bloco de dados deve possuir Serial.println("Enviando pacote estendido…"); CAN.beginExtendedPacket(0xabcdef); //id 11259375 ondalık sayı (abcdef em hexa) = 24 bit preenchidos até aqui CAN.write('w'); //1º bayt CAN.write('o'); // bayt CAN.write('r'); ///3º bayt CAN.write('l'); ///4º bayt CAN.write('d'); ///5º bayt CAN.endPacket(); //encerra o pacote para envio Serial.println("Enviado."); gecikme(1000); }
Adım 19: Alıcı Kaynak Kodu
Kaynak Kodu: İçerir ve Kurulum ()
Yine, CAN kütüphanesini dahil edeceğiz, seriyi hata ayıklamak için başlatacağız ve CAN veri yolunu 500 kbps'de başlatacağız. Bir hata oluşursa, bu hata yazdırılacaktır.
#include // Biblioteca CAN void setup() { Serial.begin(9600); //inicia a serial para debug while (!Serial); Serial.println("Alıcı CAN"); // CAN a 500 kbps if (!CAN.begin(500E3)) { Serial.println("Falha ao iniciar o controlador CAN"); //caso não seja possível iniciar o controlador while (1); } }
Adım 20: Kaynak Kodu: Döngü (), Paketi Alma ve Formatı Kontrol Etme
Alınan paketin boyutunu kontrol etmeye çalıştık. CAN.parsePacket() yöntemi bana bu paketin boyutunu gösteriyor. Yani bir paketimiz varsa, uzatılıp uzatılmadığını kontrol edeceğiz.
void loop() { // Tenta doğrulama veya tamanho do acote recebido int packageSize = CAN.parsePacket(); if (packetSize) { // Se temos um pacote Serial.println("Recebido paketi. "); if (CAN.packetExtended()) { //verifica se o pacote é estendido Serial.println("Estendido"); }
Adım 21: Kaynak: Döngü (), Uzak Bir Paket Olup Olmadığını Kontrol Eder
Burada, alınan paketin bir veri talebi olup olmadığını kontrol ediyoruz. Bu durumda, veri yoktur.
if (CAN.packetRtr()) { //Verifica se o pacote é um pacote remoto (Requisição de dados), iç içe geçmiş durumda Serial.print("RTR"); }
Adım 22: Kaynak Kodu: Döngü (), Talep Edilen veya Alınan Veri Uzunluğu
Alınan paket bir istek ise talep edilen uzunluğu belirtiriz. Ardından, verilerin uzunluğunu belirten Veri Uzunluğu Kodunu (DLC) elde ederiz. Son olarak, alınan uzunluğu belirtiriz.
Serial.print("Pacote com id 0x"); Serial.print(CAN.packetId(), HEX); if (CAN.packetRtr()) { //se o pacote recebido é de requisição, göstergeler o comprimento soicitado Serial.print(" e requsitou o comprimento "); Serial.println(CAN.packetDlc()); //obtem o DLC (Veri Uzunluğu Kodu, que indica o comprimento dos dados) } else { Serial.print(" e comprimento "); // bazı göstergeler ve tamamlayıcı bilgiler Serial.println(packetSize);
Adım 23: Kaynak Kodu: Döngü (), Veri Alınırsa Yazdırılır
Verileri (seri monitörde) yazdırırız, ancak yalnızca alınan paket bir istek değilse.
//Imprime os dados bazı durumlarda o pacote recebido não foi de requisição while (CAN.available()) { Serial.print((char)CAN.read()); } Seri.println(); } Seri.println(); } }
Adım 24: Dosyaları İndirin
BEN HAYIR
Önerilen:
Pringles Can Gitar Amfisi: 7 Adım
Pringles Can Guitar Amp: Bazen normal amfimi kurmak zorunda kalmadan sadece birkaç riff çalmak için elektro gitarı almak istiyorum. Bu yüzden ucuz, yapımı kolay ve çok basit bir gitar amfisi yaratmak istedim: Pringles Can Amp
Arduino, OBD2 ve CAN Bus Kullanarak Takometre/Tarama Göstergesi: 8 Adım
Arduino, OBD2 ve CAN Bus Kullanan Takometre/Tarama Göstergesi: Herhangi bir Toyota Prius (veya diğer hibrit/özel araç) sahipleri, gösterge panolarında birkaç kadran eksik olabileceğini bileceklerdir! Prius'umun motor devri veya sıcaklık göstergesi yok. Bir performans adamıysanız, zamanlama ilerlemesi gibi şeyleri bilmek isteyebilirsiniz ve
Kütüphanesiz RC5 Uzaktan Kontrol Protokolü Dekoderi: 4 Adım
Kütüphanesiz RC5 Uzaktan Kontrol Protokolü Dekoderi: rc5'in kodunu çözmeden önce, rc5 komutunun ne olduğunu ve yapısının ne olduğunu tartışıyoruz. yani temelde televizyonlarda, cd çalarlarda, d2h'de, ev sinema sistemlerinde vb. kullanılan uzaktan kumandalarda kullanılan rc5 komutu
ESP3866 için Tersine Mühendislik Ritter 8341C Protokolü: 5 Adım
ESP3866 için Tersine Mühendislik Ritter 8341C Protokolü: Merhaba @all.Kendi küçük ev otomasyonum için birincil 433 MHz kontrollü soketler kullanıyorum. Adresi ayarlamak için DIP anahtarlı 3 setim var. Bunlar iyi çalışıyordu. Ama bir süre önce (bir ya da iki yıl önce) "ritter"dan bir dizi priz satın aldım
Ev yapımı Can sıkıcı bir şey (Can sıkıcı bir şey): 4 Adım (Resimlerle)
Ev yapımı Can sıkıcı bir şey (Annoy-a-tron): Thinkgeek.com annoy-a-tron adlı bir şey satıyor. Temel olarak, etkinleştirildiğinde çeşitli aralıklarla bip sesi çıkaran bir cihazdır. Bu talimat, düşünce geek'in sinir bozucu bir tronunun tam bir kopyasını oluşturmasa da, malzemeleriniz ve k