Bu projede, MCP2515 CAN Kontrol Modülü, MCP2515 CAN Veri Yolu Denetleyicisi ile Arduino arasında nasıl arabirim kurulacağını ve son olarak iki MCP2515 CAN Kontrol Cihazı ve CAN Protokolü yardımıyla iki Arduino kartı arasında iletişimin nasıl etkinleştirileceğini öğreneceğiz.Basit CAN Kontrollü Alan Ağı, bir Mikrodenetleyicinin ve çevre cihazlarının bir ana cihaza veya bir bilgisayara ihtiyaç duymadan iletişim kurmasına izin veren bir veri yolu standardıdır. Robert Bosch GmbH tarafından geliştirilen CAN protokolü, otomobillerde bir kontrol ünitesi ile bileşenleri arasındaki iletişim için kullanılan temel bir protokoldür.
Örneğin, Motor Kontrol Ünitesi bir arabada kullanılan ana kontroldür. Bu ünite, hava akışı, basınç, sıcaklık, valf kontrolü, hava kontrolü için motorlar vb. Gibi birçok sensör ve aktüatöre bağlıdır. Bu modüller ile kontrol ünitesi arasındaki iletişim CAN Bus üzerinden sağlanır.
CAN Veriyolu, CAN Denetleyici ve diğer önemli hususlar hakkında biraz daha fazla bilgi edinmek için, MCP2515 CAN Veriyolu Denetleyici Modülü çok faydalıdır.
MCP2515 CAN Veriyolu Denetleyici Modülü Hakkında Kısa Bir Not
MCP2515 CAN Veri Yolu Denetleyicisi, CAN Protokolü sürüm 2.0B'yi destekleyen ve 1Mbps'de iletişim için kullanılabilen basit bir Modüldür. Tam bir iletişim sistemi kurmak için iki CAN Bus Modülüne ihtiyacınız olacaktır.
Projede kullanılan modül aşağıdaki görselde gösterilmiştir.
Bu özel modül, MCP2515 CAN Denetleyici IC ve TJA1050 CAN Alıcı-Verici IC'ye dayanmaktadır. MCP2515 IC, bağımsız bir CAN Denetleyicisidir ve mikro denetleyicilerle iletişim için entegre SPI Arabirimine sahiptir.TJA1050 IC'ye gelince, MCP2515 CAN Denetleyici IC ve Fiziksel CAN Veriyolu arasında bir arayüz görevi görür.
Aşağıdaki görüntü, tipik bir MCP2515 Modülündeki bileşenleri ve pimleri göstermektedir.
MCP2515 CAN Bus Modülünün Şeması
Modülün şemasını görmeden önce, hem IC'ler, yani MCP2515 ve TJA1050 hakkında birkaç şeyi anlamanız gerekir.MCP2515 IC, dahili olarak üç ana alt bileşenden oluşan ana denetleyicidir: CAN Modülü, Kontrol Mantığı ve SPI Bloğu.CAN Modülü, CAN Veriyolunda mesajların iletilmesinden ve alınmasından sorumludur. Control Logic, tüm bloklar arasında arayüz oluşturarak MCP2515'in kurulumunu ve çalışmasını yönetir. SPI Bloğu, SPI İletişim arayüzünden sorumludur.TJA1050 IC'ye gelince, MCP2515 CAN Kontrol Cihazı ile fiziksel CAN Veriyolu arasında bir arayüz görevi gördüğünden, bu IC, kontrol cihazından verileri alıp veri yoluna aktarmaktansorumludur.Aşağıdaki resim MCP2515 CAN Modülünün şemasını gösterir ve MCP2515 IC ve TJA1050 IC'nin Modüle nasıl bağlandığını gösterir.
MCP2515 ile Arduino Arayüzü İçin Devre Şeması
Aşağıdaki görüntü, MCP2515 CAN Modülünü Arduino ile arabirim kurmanın devre şemasını ve CAN Protokolü üzerinden iki Arduino arasındaki olası iletişimi göstermektedir.MCP2515 Modülünün pimleri net değilse, aşağıdaki görüntü faydalı olabilir.
Gerekli Bileşenler
Devre tasarımı
Daha önce bahsedildiği gibi, CAN Denetleyici IC, herhangi bir Mikroişlemci ile arayüz oluşturmak için SPI İletişim Protokolünü kolaylaştırır. Bu nedenle, MCP2515 Modülünün SPI Pinini yani SCK, MOSI (SI), MISO (SO) ve CS'yi ilgili Arduino'nun SPI Pinlerine bağlayın (devre şemasına bakın).Bu tür iki bağlantı yapın: bir çift bir verici, diğeri bir alıcı görevi görür. Şimdi bu verici ve alıcı arasındaki iletişim için, her bir MCP2515 Modülünün CANH ve CANL pinlerini bağlayın.
Kod
Koda girmeden önce, MCP2515 Modülü için bir kitaplık indirmeniz gerekir. Birçok kütüphaneler vardır ama ben kullandım bu belirli bir.İndirin ve çıkarılan içerikleri Arduino'nun kütüphaneler dizinine yerleştirin.İletişim bir Verici Modülü ve bir Alıcı Modülü içerdiğinden, kod aynı zamanda Verici Kodu ve Alıcı Kodu olarak da bölünmüştür.
Transmitter Code
| #include <SPI.h> |
| #include <mcp_can.h> |
|
|
| const int spiCSPin = 10; |
| int ledHIGH = 1; |
| int ledLOW = 0; |
|
|
| MCP_CAN CAN(spiCSPin); |
|
|
| void setup() |
| { |
| Serial.begin(115200); |
|
|
| while (CAN_OK != CAN.begin(CAN_500KBPS)) |
| { |
| Serial.println("CAN BUS init Failed"); |
| delay(100); |
| } |
| Serial.println("CAN BUS Shield Init OK!"); |
| } |
|
|
| unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7}; |
| |
| void loop() |
| { |
| Serial.println("In loop"); |
| CAN.sendMsgBuf(0x43, 0, 8, stmp); |
| delay(1000); |
| } |
Receiver Code
| #include <SPI.h> |
| #include "mcp_can.h" |
|
|
| const int spiCSPin = 10; |
| const int ledPin = 2; |
| boolean ledON = 1; |
|
|
| MCP_CAN CAN(spiCSPin); |
|
|
| void setup() |
| { |
| Serial.begin(115200); |
| pinMode(ledPin,OUTPUT); |
|
|
| while (CAN_OK != CAN.begin(CAN_500KBPS)) |
| { |
| Serial.println("CAN BUS Init Failed"); |
| delay(100); |
| } |
| Serial.println("CAN BUS Init OK!"); |
| } |
|
|
|
|
| void loop() |
| { |
| unsigned char len = 0; |
| unsigned char buf[8]; |
|
|
| if(CAN_MSGAVAIL == CAN.checkReceive()) |
| { |
| CAN.readMsgBuf(&len, buf); |
|
|
| unsigned long canId = CAN.getCanId(); |
|
|
| Serial.println("-----------------------------"); |
| Serial.print("Data from ID: 0x"); |
| Serial.println(canId, HEX); |
|
|
| for(int i = 0; i<len; i++) |
| { |
| Serial.print(buf[i]); |
| Serial.print("\t"); |
| if(ledON && i==0) |
| { |
|
|
| digitalWrite(ledPin, buf[i]); |
| ledON = 0; |
| delay(500); |
| } |
| else if((!(ledON)) && i==4) |
| { |
|
|
| digitalWrite(ledPin, buf[i]); |
| ledON = 1; |
| } |
| } |
| Serial.println(); |
| } |
| } |
Çalışma Şekli
Tüm işler kütüphaneler (SPI ve CAN) tarafından yapıldığından, bu projenin çalışması çok basittir. CAN mesaj tabanlı iletişim olduğundan, 0 ile 8 bayt arasında herhangi bir yere mesaj göndermeniz gerekir.Bu projede verici 1 1 2 3 0 5 6 7. Bu mesaj CAN Bus üzerinden iletilir ve alıcı bu mesajı alır ve seri monitöründe görüntülenir.Ayrıca, 0 inci ve 4 inci yukarıdaki sırayla, yani 1 ve bit 0 AÇIK ve KAPALI alıcı ve sırayla ayrı ayrı ekstre edilir Arduino arasında Pin 2'ye bağlı LED.
Kullanıldığı Örnek AlanlarGiriş bölümünde belirtildiği gibi CAN, otomobil alanında yaygın olarak kullanılmaktadır. Uygulamalardan bazıları şunları içerir:
- Elektronik Vites Değiştirme Sistemi
- Otomasyonda Ana Arayüz (endüstriyel gibi)
- Tıbbi malzeme
- Robotik
- Araba Motorunun Otomatik Çalıştırılması / Durdurulması