- CAN'a Giriş
- CAN'ın SPI ve I2C'ye göre karşılaştırılması
- CAN Protokol Uygulamaları
- Arduino'da CAN protokolü nasıl kullanılır
- Gerekli Bileşenler
- Devre şeması
- İki MCP2515 CAN modülü arasındaki bağlantı
- CAN iletişimi için Arduino programlama
- CAN Verici Yan Kod Açıklaması (Arduino Nano)
- CAN Alıcı Yan Kod Açıklaması (Arduino UNO)
- Arduino'da CAN iletişiminin çalışması
Günümüzde herhangi bir ortalama araba, bilgiyi algılamak ve değiş tokuş etmek için içinde yaklaşık 60 ila 100 sensör biriminden oluşur. Otomobil üreticileri, Otonom sürüş, Hava yastığı sistemi, Lastik Basıncı izleme, Hız sabitleme sistemi vb. Özelliklerle otomobillerini sürekli daha akıllı hale getirirken, bu sayının sadece yükselmesi bekleniyor. Diğer sensörlerin aksine, bu sensörler kritik bilgileri işler ve bu nedenle bu sensörlerden gelen veriler standart otomotiv iletişim protokolleri kullanılarak iletilmelidir. Örneğin hız, gaz kelebeği konumu vb. Gibi hız sabitleme sistemi verileri Elektronik Kontrol Birimine (ECU) gönderilen hayati değerlerdir.arabanın hızlanma seviyesine karar vermek için, burada bir yanlış iletişim veya veri kaybı kritik arızalara yol açabilir. Bu nedenle, UART, SPI veya I2C gibi standart iletişim protokollerinin aksine, tasarımcılar LIN, CAN, FlexRay vb. Gibi çok güvenilir otomobil iletişim protokolleri kullanır.
Mevcut tüm protokoller arasında CAN daha ağırlıklı olarak kullanılır ve popülerdir. CAN'ın ne olduğunu ve CAN'ın nasıl çalıştığını zaten tartışmıştık. Bu nedenle, bu yazıda temellere tekrar bakacağız ve sonunda CAN iletişimini kullanarak iki Arduino arasında veri alışverişi yapacağız. Kulağa ilginç geliyor doğru! Öyleyse başlayalım.
CAN'a Giriş
CAN aka Controller Area Network, endüstriyel ve otomotiv uygulamaları için tasarlanmış bir seri iletişim veri yoludur. Birden fazla cihaz arasında iletişim için kullanılan mesaj tabanlı bir protokoldür. Birden fazla CAN cihazı aşağıda gösterildiği gibi birbirine bağlandığında, bağlantı, merkezi sinir sistemimiz gibi davranan bir ağ oluşturur ve herhangi bir cihazın düğümdeki başka herhangi bir cihazla konuşmasına izin verir.
Bir CAN Ağı, yukarıda gösterildiği gibi iki yönlü veri iletimi için yalnızca CAN Yüksek ve CAN Düşük kablodan oluşacaktır. Tipik olarak CAN için iletişim hızı 50 Kbps ile 1Mbps arasında değişir ve mesafe 1Mbps'de 40 metre ile 50kpbs'de 1000 metre arasında değişebilir.
CAN Mesajının Formatı:
CAN iletişiminde, veriler ağda belirli bir mesaj formatında iletilir. Bu mesaj formatı birçok segment içerir, ancak CAN veriyolundaki mesajların gönderilmesine ve yanıtlanmasına yardımcı olan tanımlayıcı ve veridir.
Tanımlayıcı veya CAN Kimliği: Tanımlayıcı, CAN Kimliği veya PGN (Parametre Grup Numarası) olarak da bilinir. Bir CAN ağında bulunan CAN cihazlarını tanımlamak için kullanılır. Tanımlayıcının uzunluğu, kullanılan CAN protokolünün türüne bağlı olarak 11 veya 29 bittir.
Standart CAN: 0-2047 (11 bit)
Genişletilmiş CAN: 0-2 29 1 (29 bit)
Veri: Bu, bir cihazdan diğerine gönderilmesi gereken gerçek sensör / kontrol verileridir. Boyut verileri, 0 ila 8 bayt uzunluğunda herhangi bir yerde olabilir.
Veri Uzunluğu Kodu (DLC): Mevcut veri baytı sayısı için 0 ila 8.
CAN'da kullanılan teller:
CAN protokolü, bilgi göndermek ve almak için CAN_H ve CAN_L olmak üzere iki kablodan oluşur. Her iki kablo da diferansiyel hat olarak işlev görür, yani CAN sinyali (0 veya 1) CAN_L ve CAN_H arasındaki potansiyel farkla temsil edilir. Fark pozitifse ve belirli bir minimum voltajdan büyükse, o zaman 1'dir ve fark negatifse 0'dır.
Normalde CAN iletişimi için bükümlü çift kablo kullanılır. Resimde gösterildiği gibi CAN ağının iki ucunda genellikle tek bir 120 ohm direnç kullanılır, bunun nedeni hattın dengelenmesi ve aynı potansiyele bağlanması gerektiğidir.
CAN'ın SPI ve I2C'ye göre karşılaştırılması
SPI'yi Arduino ile ve IIC'yi Arduino ile kullanmayı zaten öğrendiğimiz için, SPI ve I2C'nin özelliklerini CAN ile karşılaştıralım.
Parametre | SPI | I2C | YAPABİLMEK |
Hız | 3Mbps - 10Mbps | Standart: 100Kbps | 10KBps ila 1MBps Ayrıca kullanılan telin uzunluğuna bağlıdır |
Hızlı: 400 Kb / sn | |||
Yüksek hız: 3.4Mbps | |||
Tür | Senkron | Senkron | Eşzamansız |
Tel Sayısı | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 tel (SDA, SCL) | 2 kablo (CAN_H, CAN_L) |
Dubleks | Tam dubleks | Yarım Dubleks | Yarım Dubleks |
CAN Protokol Uygulamaları
- CAN protokolünün sağlamlığı ve güvenilirliğinden dolayı Otomotiv, Endüstriyel makineler, Tarım, Tıbbi Ekipman vb. Sektörlerde kullanılmaktadır.
- CAN'da kablolama karmaşıklığı azaldığından, çoğunlukla otomobil gibi otomotiv uygulamalarında kullanılırlar.
- Düşük uygulama maliyeti ve ayrıca donanım bileşenlerinin fiyatı da daha düşüktür.
- CAN veri yolu cihazlarını eklemek ve çıkarmak kolaydır.
Arduino'da CAN protokolü nasıl kullanılır
Arduino herhangi bir dahili CAN portu içermediğinden, MCP2515 adlı bir CAN modülü kullanılır. Bu CAN modülü, SPI iletişimi kullanılarak Arduino ile arayüzlenir. MCP2515 hakkında daha fazlasını ve Arduino ile nasıl arayüzlendiğini görelim.
MCP2515 CAN Modülü:
MCP2515 Modülünde yüksek hızlı CAN alıcı-vericisi olan bir CAN denetleyicisi MCP2515 bulunur. MCP2515 ile MCU arasındaki bağlantı SPI üzerinden yapılır. Bu nedenle, SPI arayüzüne sahip herhangi bir mikrodenetleyici ile arayüz oluşturmak kolaydır.
CAN Bus öğrenmek isteyen yeni başlayanlar için bu modül iyi bir başlangıç olacaktır. Bu CAN SPI kartı endüstriyel otomasyon, ev otomasyonu ve diğer otomotiv gömülü projeleri için idealdir.
MCP2515'in Özellikleri ve Spesifikasyonu:
- Yüksek hızlı CAN alıcı-vericisi TJA1050 kullanır
- Boyut: 40 × 28mm
- Çoklu CAN veriyolu arabirimini genişletmek için SPI kontrolü
- 8MHZ kristal osilatör
- 120Ω terminal direnci
- Bağımsız anahtar, LED göstergesi, Güç göstergesi vardır
- 1 Mb / sn CAN işlemini destekler
- Düşük akım bekleme işlemi
- 112'ye kadar düğüm bağlanabilir
MCP2515 CAN Modülünün Pin Çıkışı:
Pin Adı |
KULLANIM |
VCC |
5V Güç giriş pimi |
GND |
Zemin pimi |
CS |
SPI SLAVE seçme pini (Aktif düşük) |
YANİ |
SPI ana giriş bağımlı çıkış kablosu |
Sİ |
SPI ana çıkış bağımlı giriş kablosu |
SCLK |
SPI Saat pimi |
INT |
MCP2515 kesinti pimi |
Bu eğitimde , Arduino Nano'dan Arduino Uno'ya CAN veri yolu modülü MCP2515 aracılığıyla nem ve sıcaklık (DHT11) sensörü verilerinin nasıl gönderileceğini görelim.
Gerekli Bileşenler
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD Ekran
- MCP2515 CAN Modülü - 2
- 10k Potansiyometre
- Breadboard
- Kabloların Bağlanması
Devre şeması
CAN Verici tarafındaki bağlantı:
Bileşen - Pim |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - ÇIKIŞ |
A0 |
CAN Alıcı tarafındaki Devre Bağlantıları:
Bileşen - Pim |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
10K Potansiyometre Merkez PIN'ine |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K |
GND |
İki MCP2515 CAN modülü arasındaki bağlantı
H - CAN Yüksek
L - CAN Düşük
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Tüm bağlantılar yapıldıktan sonra, donanımım aşağıdaki gibi görünüyordu
CAN iletişimi için Arduino programlama
Öncelikle Arduino IDE'de CAN için bir kütüphane kurmamız gerekiyor. MCP2515 CAN Modülünü Arduino ile arabirim kurmak, aşağıdaki kitaplığı kullanarak daha kolay hale gelir.
- Arduino CAN MCP2515 Kütüphanesinin ZIP dosyasını indirin.
- Arduino IDE'den: Sketch -> Include Library ->.ZIP Kitaplığı Ekle
Bu eğitimde kodlama, biri CAN verici kodu (Arduino Nano) ve diğeri CAN Alıcı kodu (Arduino UNO) olmak üzere iki bölüme ayrılmıştır ve her ikisi de bu sayfanın altında bulunabilir. Aynısının açıklaması aşağıdaki gibidir.
Veri göndermek ve almak için program yazmadan önce, yukarıdaki adımları izleyerek kitaplığı kurduğunuzdan ve CAN modülü MCP2515'in aşağıdaki şekilde programınızda başlatıldığından emin olun.
MCP2515 CAN Modülünü başlatın:
MCP2515 ile bağlantı oluşturmak için aşağıdaki adımları izleyin:
1. SPI CS'nin bağlı olduğu pin numarasını ayarlayın (varsayılan olarak 10)
MCP2515 mcp2515 (10);
2. Baud hızını ve osilatör frekansını ayarlayın
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Mevcut Baud Hızları:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_125KBPS, CAN_200KBPS, CAN_125KBPS.
Kullanılabilir Saat Hızları:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Modları ayarlayın.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN Verici Yan Kod Açıklaması (Arduino Nano)
Verici bölümünde, MCP2515 CAN modülü ile SPI pinleri aracılığıyla arayüzlenen Arduino Nano ve DHT11, Sıcaklık ve Nem verilerini CAN veriyoluna gönderir.
Öncelikle gerekli kütüphaneler dahil edilmiştir, SPI İletişimini kullanmak için SPI Kitaplığı, CAN İletişimi kullanmak için MCP2515 Kitaplığı ve Arduino ile DHT sensörünü kullanmak için DHT Kitaplığı . Daha önce DHT11'i Arduino ile arayüzledik.
#Dahil etmek
Şimdi Arduino Nano'nun A0'ına bağlı DHT11'in (OUT pin) pin adı tanımlanmıştır.
#define DHTPIN A0
Ayrıca DHTTYPE , DHT11 olarak tanımlanır.
#define DHTTYPE DHT11
Bir canMsg CAN mesajı biçimini depolamak için yapı veri türü.
struct can_frame canMsg;
SPI CS'nin bağlı olduğu pin numarasını ayarlayın (varsayılan olarak 10)
MCP2515 mcp2515 (10);
Ayrıca Arduino Nano ile DHT pinli DHT sınıfı için nesne dht ve DHT11 olarak DHT tipi başlatılır.
DHT dht (DHTPIN, DHTTYPE);
Geçersiz kurulumda () sonraki:
Aşağıdaki ifadeyi kullanarak SPI iletişimine başlayın
SPI.begin ();
DHT11 sensöründen Sıcaklık ve nem değerlerini almaya başlamak için aşağıdaki ifadeyi kullanın.
dht.begin ();
Daha sonra, MCP2515 aşağıdaki komutu kullanarak SIFIRLANIYOR
mcp2515.reset ();
Artık MCP2515, saat olarak 500KBPS ve 8MHZ hızına ayarlanmıştır
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Ve MCP2525 normal moda ayarlandı
mcp2515.setNormalMode ();
Boşluk döngüsünde ():
Aşağıdaki ifade Nem ve Sıcaklık değerini alır ve h ve t tamsayı değişkeninde depolar.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Daha sonra CAN Kimliği 0x036 (seçime göre) ve DLC 8 olarak verilir ve h ve t verilerini verilere ve verilere verir ve tüm verileri 0 ile dinlendiririz.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // canMsg.data = t'deki nem değerini güncelleyin ; // canMsg.data = 0x00'deki sıcaklık değerini güncelleyin ; // Hepsini 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Sonuçta , mesajı CAN BUS'a göndermek için aşağıdaki ifadeyi kullanıyoruz.
mcp2515.sendMessage (& canMsg);
Böylece artık sıcaklık ve nem verileri CAN veriyoluna mesaj olarak gönderilir.
CAN Alıcı Yan Kod Açıklaması (Arduino UNO)
Alıcı bölümünde, Arduino UNO, MCP2515 ve 16x2 LCD ekran ile arayüz oluşturdu. Burada Arduino UNO, Sıcaklık ve Nemi CAN veri yolundan alır ve LCD'de alınan verileri görüntüler.
Öncelikle gerekli kütüphaneler dahil edilmiştir; SPI İletişimini kullanmak için SPI Kitaplığı, CAN İletişimi kullanmak için MCP2515 Kitaplığı ve Arduino ile 16x2 LCD kullanmak için LiquidCrsytal Kitaplığı .
#Dahil etmek
Daha sonra Arduino UNO ile bağlantıda kullanılan LCD pinleri tanımlanır.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
CAN mesaj formatını saklamak için bir struct veri türü bildirilmiştir.
struct can_frame canMsg;
SPI CS'nin bağlı olduğu pin numarasını ayarlayın (varsayılan olarak 10)
MCP2515 mcp2515 (10);
Geçersiz kurulumda ():
Önce LCD 16x2 moduna ayarlanır ve bir karşılama mesajı görüntülenir.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("DEVRE DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); gecikme (3000); lcd.clear ();
Aşağıdaki ifadeyi kullanarak SPI iletişimine başlayın.
SPI.begin ();
Daha sonra MCP2515, aşağıdaki komut kullanılarak SIFIRLANACAKTIR.
mcp2515.reset ();
Şimdi MCP2515, saat olarak 500KBPS ve 8MHZ hızına ayarlanmıştır.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Ve MCP2525 normal moda ayarlanmıştır.
mcp2515.setNormalMode ();
Sonraki boşluk döngüsünde ():
Aşağıdaki ifade mesajı CAN veri yolundan almak için kullanılır. Mesaj alınırsa if durumuna geçer.
eğer (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Olarak ise durum verisi alındıktan c saklanan anMsg , sıcaklık değerine sahip nem değerini ve verilerin olan veri. Her iki değer de x ve y tamsayılarında saklanır.
int x = canMsg.data; int y = canMsg.data;
Değerler alındıktan sonra aşağıdaki açıklama kullanılarak 16x2 LCD ekranda sıcaklık ve nem değerleri görüntülenir.
lcd.setCursor (0,0); lcd.print ("Nem:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Sıcaklık:"); lcd.print (y); gecikme (1000); lcd.clear ();
Arduino'da CAN iletişiminin çalışması
Donanım hazır olduğunda, ilgili Arduino kartlarına CAN vericisi ve CAN alıcısı için programı yükleyin (tüm programlar aşağıda verilmiştir). Güç verildiğinde, DHT11 tarafından okunan sıcaklık değerinin CAN iletişimi yoluyla başka bir Arduino'ya gönderileceğini ve aşağıdaki resimde görebileceğiniz gibi 2. Arduino'nun LCD'sinde görüntüleneceğini fark etmelisiniz. LCD'de görüntülenen sıcaklığın gerçek oda sıcaklığına yakın olup olmadığını kontrol etmek için AC uzaktan kumandamı da kullandım.
Tam çalışma aşağıda bağlantısı verilen videoda bulunabilir. Herhangi bir sorunuz varsa yorum bölümüne bırakın veya diğer teknik sorular için forumlarımızı kullanın.