İki Arduino kartını birbirine bağlamak ve birbirine veri göndermek için bu güçlü seri iletişim protokolünü kullanın.
Denetleyici Alan Ağı (CAN) veri yolu, çeşitli endüstriyel, otomotiv ve havacılık uygulamalarında yaygın olarak kullanılan sağlam ve güvenilir bir iletişim protokolüdür. Bir CAN veri yolu ağı üzerinden mikrodenetleyiciler ve cihazlar arasında veri iletimi için tasarlanmıştır. Bunu henüz bilmiyor olabilirsiniz, ancak sosyal medyada gördüğünüz o çılgın araba kontrol paneli modlarının ardındaki şey budur.
Bir Arduino ve breadboard kullanarak MCP2515 CAN modülü ile bir CAN veri yolunun nasıl oluşturulacağını size göstereceğiz. Ayrıca Arduino CAN kütüphanesini inceleyeceğiz ve CAN veri yolu üzerinden nasıl veri gönderilip alınacağını göstereceğiz.
CAN Veri Yolu Nedir?
CAN veri yolu, Bosch tarafından 1980'lerde geliştirilen bir seri iletişim protokolüdür. Yüksek güvenilirliği ve sağlamlığı nedeniyle çeşitli uygulamalarda yaygın olarak kullanılmaktadır. Yalnızca iki hat üzerinden minimum gecikmeyle yüksek hızlarda cihazlar arasında veri aktarımına izin verir: CAN Yüksek ve CAN Düşük.
1994 yılında CAN veri yolu, otomotiv uygulamalarındaki elektronik kontrolörler arasında hızlı seri veri alışverişi için özel olarak tasarlanmış uluslararası bir standart (ISO 11898) haline geldi. hakkındaki kapsamlı kılavuzumuza göz atın. CAN veri yolu nedir ve otomotiv sistemlerinde oynadığı rol nedir? daha fazla ayrıntı için
CAN veri yolunun bu kadar popüler olmasının sebeplerinden biri de hata tespit ve düzeltme özellikleridir. Protokol, veri iletimindeki hataları algılayabilir ve düzeltebilir. Bu, endüstriyel otomasyon gibi veri bütünlüğünün kritik olduğu uygulamalar için idealdir.
MCP2515 CAN Modülünü Tanımak
MCP2515 CAN Bus Denetleyici modülü, yaygın olarak kullanılan CAN Protokolü sürüm 2.0B için olağanüstü destek sağlayan bir cihazdır. Bu modül, 1 Mbps'ye kadar yüksek veri hızlarında iletişim için idealdir.
MCP2515 IC, çok çeşitli mikrodenetleyicilerle iletişimi sağlayan bir SPI Arayüzüne sahip bağımsız bir CAN denetleyicisidir. Öte yandan TJA1050 IC, MCP2515 CAN kontrolör IC'si ile fiziksel CAN veri yolu arasında bir arabirim görevi görür.
Daha fazla rahatlık için, 120 ohm sonlandırma takmanıza olanak tanıyan ve kablolarınızı CAN_H & CAN_L diğer CAN modülleriyle iletişim için vidalar.
Özellik |
Şartname |
---|---|
alıcı-verici |
TJA1050 |
Mikrodenetleyici arayüzü |
SPI (Çoklu CAN veri yolu entegrasyonuna izin verir) |
kristal osilatör |
8MHz |
Sonlandırma |
120Ω |
Hız |
1 Mbps |
Güç tüketimi |
Düşük akım bekleme işlemi |
Boyut |
40x28mm |
Düğüm kapasitesi |
112 düğüme kadar destekler |
adresinden ek bilgi alabilirsiniz. MCP2515 veri sayfası Daha gelişmiş bir proje için bu modüle ihtiyacınız olması durumunda.
CAN Mesaj Yapısı
CAN mesaj yapısı birden çok bölümden oluşur, ancak bu proje için en kritik bölümler tanımlayıcı ve verilerdir. CAN ID veya Parametre Grup Numarası (PGN) olarak da bilinen tanımlayıcı, CAN üzerindeki cihazları tanımlar. ağ ve tanımlayıcının uzunluğu, CAN protokolünün türüne bağlı olarak 11 veya 29 bit olabilir. kullanılmış.
Bu sırada veriler, iletilen gerçek sensör/kontrol verilerini temsil eder. Veriler, 0 ila 8 bayt uzunluğunda olabilir ve Veri Uzunluğu Kodu (DLC), mevcut veri baytlarının sayısını gösterir.
Arduino MCP2515 CAN Veri Yolu Kitaplığı
Bu kütüphane uygular CAN V2.0B protokolü1 Mbps'ye kadar hızlarda çalışabilen. Hem standart (11 bit) hem de genişletilmiş (29 bit) verileri desteklerken 10 MHz'e kadar hızlarda çalışabilen bir SPI arabirimi sağlar. Dahası, öncelikli mesajların depolanmasına izin veren iki alma arabelleği ile birlikte gelir.
CAN Veriyolunu Başlatma
CAN veri yolunu başlatmak için ihtiyaç duyacağınız kurulum kodu:
#katmak
#katmakMCP2515 mcp2515(10); // CS pinini ayarla
geçersizkurmak(){
sırasında (!Seri);
Seri.başlamak(9600);
SPI.başlamak(); //SPI iletişimine başlar
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
Bu, MCP2515'i 500Kbps CAN bit hızı ve 8MHz osilatör frekansı ile başlatır.
MCP2515 CAN Çalışma Modları
MCP2515 CAN veri yolu denetleyicisi ile kullanılan üç çalışma modu vardır:
- setNormalMod(): denetleyiciyi mesaj gönderecek ve alacak şekilde ayarlar.
- setLoopbackMode(): denetleyiciyi mesaj gönderecek ve alacak şekilde ayarlar, ancak gönderdiği mesajlar da kendisi tarafından alınır.
- setListenOnlyMode(): denetleyiciyi yalnızca mesajları alacak şekilde ayarlar.
Bunlar, MCP2515 CAN veri yolu denetleyicisinin çalışma modunu ayarlamak için kullanılan işlev çağrılarıdır.
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
CAN Bus Üzerinden Veri Gönderme
CAN veri yolu üzerinden mesaj göndermek için, gönderMsgBuf() yöntem:
imzasızkarakter veri[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, veri);
Bu, kimliğe sahip bir mesaj gönderir 0x01 ve bir veri yükü {0x01, 0x02, 0x03, 0x04}. İlk parametre CAN ID, ikincisi mesaj önceliği, üçüncüsü veri yükünün uzunluğu ve dördüncüsü veri yükünün kendisidir.
bu gönderMsgBuf() method mesajın başarılı bir şekilde gönderilip gönderilmediğini gösteren bir değer döndürür. Bu değeri arayarak kontrol edebilirsiniz. checkError() yöntem:
eğer (CAN.checkError()) {
Seri.yazdır("Mesaj gönderirken hata.");
}
Bu, mesajın iletimi sırasında bir hata oluşup oluşmadığını kontrol eder ve gerekirse bir hata mesajı yazdırır.
CAN Veri Yolundan Veri Alma
CAN veri yolu üzerinden bir mesaj almak için, readMsgBuf() yöntem:
imzasızkarakter uzunluk = 0;
imzasızkarakter buf[8];
imzasızkarakter canID = 0;
eğer (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}
Bu, CAN veriyolunda bir mesaj olup olmadığını kontrol eder ve ardından mesajı buf sıralamak. Mesajın uzunluğu, len değişken ve mesajın kimliği saklanır köpekgil değişken.
Bir mesaj aldıktan sonra, veri yükünü gerektiği gibi işleyebilirsiniz. Örneğin, veri yükünü seri monitöre yazdırabilirsiniz:
Seri.Yazdır("Kimliği olan mesaj alındı");
Seri.Yazdır(canID, HEX);
Seri.Yazdır(" ve veriler: ");için (int ben = 0; ben < len; ben++) {
Seri.Yazdır(buf[i], HEX);
Seri.Yazdır(" ");
}
Seri.yazdır();
Bu, alınan mesajın kimliğini ve veri yükünü seri monitöre yazdırır.
CAN Bus Alıcı-Vericisini Breadboard'a Bağlama
Bu örnek projede iki cihazı bağlamak üzere bir CAN veri yolu oluşturmak için şunlara ihtiyacınız olacak:
- İki mikrodenetleyici (bu örnek için iki Arduino Nano kartı)
- İki MCP2515 CAN modülü
- Breadboard
- jumper telleri
- Bir I2C 16x2 LCD ekran modülü
- HC-SR04 ultrasonik sensör
Bu proje örneği için, Arduino taslağında dört kitaplık kullanılmıştır. var Yeni Ping Ultrasonik sensör için kullanımı kolay bir arayüz sağlayan kitaplığın yanı sıra SPI kitaplığıArduino kartı ile MCP2515 CAN veri yolu denetleyicisi arasındaki iletişimi kolaylaştıran. bu LiquidCrystal_I2C kütüphane ekran modülü için kullanılır.
Son olarak, mcp2515 kitaplığı MCP2515 yongası ile arayüz oluşturmak, verileri CAN veri yolu ağı üzerinden kolayca iletmemize olanak tanır.
Donanım Kurulumu (HC-SR04 Örneği)
HC-SR04 sensör ve LCD kullanılan bu projede Arduino Nano kartlarından biri alıcı, diğer Arduino ise gönderici görevi görecek. Verici bileşenlerinizi aşağıdaki bağlantı şemasına göre bağlayın:
İşte alıcı devresinin şeması:
Son olarak, kullanarak iki düğümü birbirine bağlayın. CAN_H Ve CAN_L gösterildiği gibi çizgiler:
Modülleri bağlarken, güç kaynağı voltajının belirtilen aralıkta olduğundan ve CAN H Ve CAN L pimler veriyoluna düzgün bir şekilde bağlanmıştır.
MCP2515 CAN Veri Yolu Modülünü Programlama
MCP2515 modülünü programlarken, ağdaki diğer CAN cihazlarıyla başarılı iletişim sağlamak için doğru bit hızını kullanmanın önemli olduğunu unutmayın.
Gönderen kodu:
#katmak
#katmak
#katmakMCP2515 mcp2515(10);
sabitbayt trigPin = 3;
sabitbayt yankıPin = 4;
Yeni Ping sonar(trigPin, yankıPin, 200);yapıcan_framecanMsg;
geçersizkurmak(){
Seri.başlamak(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}geçersizdöngü(){
imzasızint mesafe = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN kimliği 0x036 olarak
canMsg.can_dlc = 8; //CAN veri uzunluğu 8 olarak
canMsg.data[0] = mesafe; //[0] içindeki nem değerini güncelle
canMsg.data[1] = 0x00; //hepsi 0 ile dursun
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
mcp2515.sendMessage(&canMsg);//CAN mesajını gönderir
gecikme(100);
}
Alıcı kodu:
#katmak
#katmak
#katmakMCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
yapıcan_framecanMsg;geçersizkurmak(){
Seri.başlamak(9600);mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.arka ışık();
lcd.setCursor(0, 0);
lcd.Yazdır("MUO CAN ÖĞRETİCİSİ");
gecikme(3000);
lcd.temizlemek();
}
geçersizdöngü(){
eğer (mcp2515.mesajı oku(&canMsg) == MCP2515::ERROR_OK) // veri almak için
{
int mesafe = canMsg.data[0];
lcd.setCursor(0,0);
lcd.Yazdır("Mesafe: ");
lcd.Yazdır(mesafe);
lcd.Yazdır("santimetre ");
}
}
Arduino Projelerinizi Bir Sonraki Seviyeye Taşıyın
CAN veri yolu ve Arduino'nun kombinasyonu, çeşitli uygulamalarda kullanılan karmaşık iletişim ağlarını oluşturmak veya öğrenmek için güçlü bir platform sağlar. Zorlu bir öğrenme eğrisi gibi görünse de, bir devre tahtasında kendi kurulumunuzu yapmak, karmaşık DIY projelerinde CAN veri yolu ağı kullanmanın inceliklerini öğrenmenin oldukça kullanışlı bir yoludur.