- Panimula sa CAN
- Paghahambing ng CAN sa paglipas ng SPI & I2C
- MAAARI ang Mga Application ng Protocol
- Paano gamitin ang CAN protocol sa Arduino
- Kinakailangan ang Mga Bahagi
- Diagram ng Circuit
- Ang koneksyon sa pagitan ng dalawang MCP2515 CAN module
- Programming Arduino para sa CAN komunikasyon
- Puwede ang Transmitter Side Code na Paliwanag (Arduino Nano)
- Puwede ang Tagatanggap ng Side Code na Paliwanag (Arduino UNO)
- Paggawa ng CAN komunikasyon sa Arduino
Ngayon ang anumang average na kotse ay binubuo ng halos 60 hanggang 100 mga unit ng sensor dito para sa pandama at pagpapalitan ng impormasyon. Sa mga paninda ng kotse na patuloy na ginagawang mas matalino ang kanilang kotse na may mga tampok tulad ng Autonomous na pagmamaneho, sistema ng Airbag, pagsubaybay sa Pressure ng Tyre, Cruise control system atbp ang inaasahang ito ay mataas lamang. Hindi tulad ng iba pang mga sensor, ang mga sensor na ito ay nagpoproseso ng kritikal na impormasyon at samakatuwid ang data mula sa mga sensor na ito ay dapat iparating gamit ang karaniwang mga protokol ng komunikasyon sa automotive. Halimbawa, ang data ng system ng cruise control tulad ng bilis, posisyon ng throttle atbp ay mahahalagang halaga na ipinadala sa Electronic Control Unit (ECU)upang magpasya ang antas ng bilis ng kotse, ang maling komunikasyon o pagkawala ng data dito ay maaaring humantong sa mga kritikal na pagkabigo. Samakatuwid hindi katulad ng mga karaniwang mga protocol sa komunikasyon tulad ng UART, SPI o I2C, ang mga taga-disenyo ay gumagamit ng mas maaasahang mga protokol ng komunikasyon sa sasakyan tulad ng LIN, CAN, FlexRay atbp.
Sa labas ng lahat ng mga magagamit na mga protokol ang CAN ay higit na nakararami ginagamit at tanyag. Tinalakay na natin kung ano ang CAN at kung paano gagana ang CAN. Kaya, sa artikulong ito titingnan natin muli ang mga pangunahing kaalaman at pagkatapos ay sa wakas ay magpapalitan din kami ng data sa pagitan ng dalawang Arduino na gumagamit ng CAN komunikasyon. Tunog kagiliw-giliw na tama! Kaya, magsimula na tayo.
Panimula sa CAN
Ang CAN aka Controller Area Network ay isang serial bus ng komunikasyon na dinisenyo para sa mga pang-industriya at automotive application. Ito ay isang mensahe na batay sa mensahe na ginagamit para sa komunikasyon sa pagitan ng maraming mga aparato. Kapag maraming mga aparato na CAN ay konektado magkasama tulad ng ipinakita sa ibaba, ang koneksyon ay bumubuo ng isang network na gumaganap tulad ng aming gitnang sistema ng nerbiyos na pinapayagan ang anumang aparato na makipag-usap sa anumang iba pang mga aparato sa node.
Ang isang CAN Network ay binubuo lamang ng dalawang wires CAN CAN High at CAN Low para sa bi-directional data transmission tulad ng ipinakita sa itaas. Kadalasan ang bilis ng komunikasyon para sa CAN ay maaaring saklaw mula sa 50 Kbps hanggang 1Mbps at ang distansya ay maaaring saklaw mula sa 40 metro sa 1Mbps hanggang 1000 metro sa 50kpbs.
Format ng CAN Message:
Sa komunikasyon ng CAN ang data ay naipadala sa network bilang isang partikular na format ng mensahe. Naglalaman ang format ng mensahe na ito ng maraming mga segment ngunit dalawang pangunahing mga segment ang nagpapakilala at data na makakatulong upang magpadala at tumugon sa mga mensahe sa CAN bus.
Identifier o CAN ID: Ang identifier ay kilala rin bilang isang CAN ID o kilala rin bilang PGN (Parameter Group Number). Ginagamit ito upang makilala ang mga CAN device na naroroon sa isang CAN network. Ang haba ng tagakilala ay alinman sa 11 o 29 na mga piraso batay sa uri ng CAN protocol na ginamit.
Karaniwang CAN: 0-2047 (11-bit)
Pinalawak na CAN: 0-2 29 -1 (29-bit)
Data: Ito ang aktwal na data ng sensor / control na kailangang ipadala ang form na isang aparato sa isa pa. Ang data ng laki ay maaaring kahit saan mula sa 0 hanggang 8 bytes ang haba.
Data Length Code (DLC): 0 hanggang 8 para sa bilang ng mga data byte na naroroon.
Mga wire na ginamit sa CAN:
Ang CAN protocol ay binubuo ng dalawang wires katulad ang CAN_H at CAN_L upang magpadala at tumanggap ng impormasyon. Ang parehong mga wire ay kumikilos bilang isang linya ng kaugalian, nangangahulugang ang signal ng CAN (0 o 1) ay kinakatawan ng potensyal na pagkakaiba sa pagitan ng CAN_L at CAN_H. Kung ang pagkakaiba ay positibo at mas malaki kaysa sa isang tiyak na pinakamababang boltahe pagkatapos ito ay 1 at kung ang pagkakaiba ay negatibo ito ay isang 0.
Karaniwan ang isang baluktot na pares na cable ay ginagamit para sa komunikasyon ng CAN. Ang isang solong 120-ohm risistor ay karaniwang ginagamit sa dalawang dulo ng CAN network tulad ng ipinakita sa imahe, ito ay dahil ang linya ay kailangang balansehin at nakatali sa parehong potensyal.
Paghahambing ng CAN sa paglipas ng SPI & I2C
Dahil natutunan na natin kung paano gamitin ang SPI sa Arduino at IIC sa Arduino, ihambing natin ang mga tampok ng SPI at I2C sa CAN
Parameter | SPI | I2C | MAAARI |
Bilis | 3Mbps hanggang 10Mbps | Pamantayan: 100Kbps | 10KBps hanggang 1MBps Nakasalalay din sa haba ng wire na ginamit |
Mabilis: 400 Kbps | |||
Highspeed: 3.4Mbps | |||
Uri | Magkasabay | Magkasabay | Hindi magkasabay |
Bilang ng mga Wires | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 wires (SDA, SCL) | 2 wires (CAN_H, CAN_L) |
Duplex | Buong Duplex | Half Duplex | Half Duplex |
MAAARI ang Mga Application ng Protocol
- Dahil sa katatagan at pagiging maaasahan ng CAN protocol, ginagamit ang mga ito sa mga industriya tulad ng Automotive, Industrial machine, Agrikultura, Kagamitan Medikal atbp.
- Tulad ng pagiging kumplikado ng mga kable ay nabawasan sa CAN pangunahin silang ginagamit sa mga aplikasyon ng automotive tulad ng kotse.
- Mababang gastos upang ipatupad at din ang presyo ng mga sangkap ng hardware ay mas mababa din.
- Madaling idagdag at alisin ang mga CAN bus device.
Paano gamitin ang CAN protocol sa Arduino
Tulad ng Arduino ay hindi naglalaman ng anumang inbuilt CAN port, isang CAN module na tinatawag na MCP2515 ang ginagamit. Ang module na CAN na ito ay nakipag-interfaced sa Arduino sa pamamagitan ng paggamit ng SPI na komunikasyon. Tingnan natin ang tungkol sa higit pa tungkol sa MCP2515 nang detalyado at kung paano ito naka-interfaced sa Arduino.
CAN Module ng MCP2515:
Ang MCP2515 Module ay may CAN controller MCP2515 na kung saan ay mataas ang bilis CAN transceiver. Ang koneksyon sa pagitan ng MCP2515 at MCU ay sa pamamagitan ng SPI. Kaya, madali itong mai-interface sa anumang microcontroller na mayroong SPI interface.
Para sa mga nagsisimula na nais malaman ang CAN Bus, ang modyul na ito ay kikilos bilang isang magandang pagsisimula. Ang CAN SPI board na ito ay perpekto para sa pang-industriya na awtomatiko, pag-aautomat sa bahay at iba pang mga naka-embed na proyekto ng automotive.
Mga Tampok at Pagtukoy ng MCP2515:
- Gumagamit ng High-speed CAN transceiver TJA1050
- Dimensyon: 40 × 28mm
- Kontrol ng SPI para palawakin ang interface ng Multi CAN bus
- 8MHZ kristal oscillator
- 120Ω paglaban ng terminal
- May independiyenteng susi, tagapagpahiwatig ng LED, Tagapagpahiwatig ng kuryente
- Sinusuportahan ang 1 Mb / s CAN operasyon
- Mababang kasalukuyang operasyon ng standby
- Hanggang sa 112 mga node ang maaaring konektado
Pinout ng MCP2515 CAN Module:
Pangalan ng Pin |
PAGGAMIT |
VCC |
5V Power input pin |
GND |
Ground pin |
CS |
Piliin ang pin na SPI SLAVE (Aktibo mababa) |
KAYA |
Nangunguna sa input ng output ng alipin ng input ng master |
SI |
Nangunguna sa pag-input ng input ng alipin ng SPI |
SCLK |
SPI Clock pin |
INT |
Nagambala ang MCP2515 pin |
Sa tutorial na ito tingnan natin kung paano magpadala ng data ng sensor ng kahalumigmigan at temperatura (DHT11) mula sa Arduino Nano patungong Arduino Uno sa pamamagitan ng CAN bus module MCP2515.
Kinakailangan ang Mga Bahagi
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD Display
- CAN Module ng MCP2515 - 2
- 10k Potensyomiter
- Breadboard
- Mga Koneksyon sa Mga Wires
Diagram ng Circuit
Ang koneksyon sa CAN Transmitter side:
Component - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - KAYA |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - LABAS |
A0 |
Mga Koneksyon ng Circuit sa panig ng CAN Receiver:
Component - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - KAYA |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Sa 10K Potentiometer Center PIN |
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 |
Ang koneksyon sa pagitan ng dalawang MCP2515 CAN module
H - CAN Mataas
L - CAN Mababa
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Kapag nagawa na ang lahat ng mga koneksyon, ganito sa ibaba ang aking hardware
Programming Arduino para sa CAN komunikasyon
Una kailangan naming mag-install ng isang silid-aklatan para sa CAN sa Arduino IDE. Ang interfacing MCP2515 CAN Module sa Arduino ay magiging mas madali sa pamamagitan ng paggamit ng sumusunod na library.
- I-download ang ZIP file ng Arduino CAN MCP2515 Library.
- Mula sa Arduino IDE: Sketch -> Isama ang Library -> Magdagdag ng.ZIP Library
Sa tutorial na ito ang pag-coding ay nahahati sa dalawang bahagi ng isa bilang CAN transmitter code (Arduino Nano) at iba pa bilang CAN Receiver code (Arduino UNO) na parehong matatagpuan sa ilalim ng pahinang ito. Ang paliwanag para sa pareho ay ang mga sumusunod.
Bago magsulat ng programa para sa pagpapadala at pagtanggap ng data tiyaking na-install mo na ang silid-aklatan na sumusunod sa mga hakbang sa itaas at ang CAN module MCP2515 ay naisimula sa iyong programa bilang sumusunod.
Pinasimulan ang MCP2515 CAN Module:
Upang makalikha ng koneksyon sa MCP2515 sundin ang mga hakbang:
1. Itakda ang pin number kung saan nakakonekta ang SPI CS (10 bilang default)
MCP2515 mcp2515 (10);
2. Itakda ang rate ng baud at dalas ng oscillator
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Magagamit na Mga Rate ng Baud:
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_250KBPS, CAN_250KBPS, CAN_250KBPS, CAN_250KBPS, CAN_250KBPS
Magagamit na Mga Bilis ng Orasan:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Itakda ang mga mode.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Puwede ang Transmitter Side Code na Paliwanag (Arduino Nano)
Sa seksyon ng transmiter, nakipag-ugnay ang Arduino Nano sa module ng MCP2515 CAN sa pamamagitan ng mga SPI pin at ang DHT11 ay nagpapadala ng data ng Temperatura at Humidity sa CAN bus.
Una ang mga kinakailangang aklatan ay kasama, SPI Library para sa paggamit ng SPI Communication, MCP2515 Library para sa paggamit ng CAN Communication at DHT Library para sa paggamit ng DHT sensor na may Arduino . Nauna naming nakipag-ugnayan sa DHT11 kay Arduino.
# isama
Ngayon ang pangalan ng pin ng DHT11 (OUT pin) na konektado sa A0 ng Arduino Nano ay tinukoy
# tukuyin ang DHTPIN A0
At gayundin, ang DHTTYPE ay tinukoy bilang DHT11.
# tukuyin ang DHTTYPE DHT11
Isang uri ng data ng canMsg struct para sa pagtatago ng CAN format ng mensahe.
struct can_frame canMsg;
Itakda ang pin number kung saan nakakonekta ang SPI CS (10 bilang default)
MCP2515 mcp2515 (10);
At gayun din, object dht para sa klase DHT na may DHT pin na may Arduino Nano at uri ng DHT bilang DHT11 ay naisimula.
DHT dht (DHTPIN, DHTTYPE);
Susunod sa walang bisa na pag-set up ():
Simulan ang komunikasyon sa SPI sa pamamagitan ng paggamit ng sumusunod na pahayag
SPI.begin ();
At pagkatapos ay gamitin ang pahayag sa ibaba upang magsimulang makatanggap ng Mga halagang temperatura at halumigmig mula sa sensor ng DHT11.
dht.begin ();
Susunod na ang MCP2515 ay Nire-RESET gamit ang sumusunod na utos
mcp2515.reset ();
Ngayon ang MCP2515 ay nakatakda sa bilis ng 500KBPS at 8MHZ bilang orasan
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
At ang MCP2525 ay nakatakda sa normal na mode
mcp2515.setNormalMode ();
Sa void loop ():
Ang sumusunod na pahayag ay nakakakuha ng halaga ng Humidity at Temperatura at mga tindahan sa isang integer variable h at t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Susunod na ang CAN ID ay ibinigay bilang 0x036 (Bilang bawat pagpipilian) at DLC bilang 8 at binibigyan namin ang h at t data sa data at data at ipahinga ang lahat ng data na may 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // I-update ang halagang halumigmig sa canMsg.data = t; // I-update ang halaga ng temperatura sa canMsg.data = 0x00; // Rest all with 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Pagkatapos ng lahat, upang maipadala ang mensahe sa CAN BUS ginagamit namin ang sumusunod na pahayag.
mcp2515.sendMessage (& canMsg);
Kaya ngayon ang data ng temperatura at kahalumigmigan ay ipinapadala bilang mensahe sa CAN bus.
Puwede ang Tagatanggap ng Side Code na Paliwanag (Arduino UNO)
Sa seksyon ng tatanggap, ang Arduino UNO ay nakipag-interfaced sa MCP2515 at 16x2 LCD display. Narito ang Arduino UNO ay tumatanggap ng Temperatura at Humidity mula sa CAN bus at ipakita ang data na natanggap sa LCD.
Una ang mga kinakailangang aklatan ay kasama, SPI Library para sa paggamit ng SPI Communication, MCP2515 Library para sa paggamit ng CAN Communication at LiquidCrsytal Library para sa paggamit ng 16x2 LCD kasama ang Arduino .
# isama
Susunod na ang mga LCD pin na ginamit sa pagkonekta sa Arduino UNO ay tinukoy.
Const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Ang isang uri ng data ng struct ay idineklara para sa pagtatago ng CAN format ng mensahe.
struct can_frame canMsg;
Itakda ang pin number kung saan nakakonekta ang SPI CS (10 bilang default)
MCP2515 mcp2515 (10);
Sa walang bisa na pag-set up ():
Una ang LCD ay nakatakda sa 16x2 mode at isang maligayang mensahe ang ipinapakita.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); pagkaantala (3000); lcd.clear ();
Simulan ang komunikasyon sa SPI sa pamamagitan ng paggamit ng sumusunod na pahayag.
SPI.begin ();
Susunod na ang MCP2515 ay Nire-RESET gamit ang sumusunod na utos.
mcp2515.reset ();
Ngayon ang MCP2515 ay nakatakda sa bilis ng 500KBPS at 8MHZ bilang orasan.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
At ang MCP2525 ay nakatakda sa normal na mode.
mcp2515.setNormalMode ();
Susunod sa void loop ():
Ang sumusunod na pahayag ay ginagamit upang matanggap ang mensahe mula sa CAN bus. Kung natanggap ang mensahe ay nakukuha sa kundisyon kung .
kung (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Sa kundisyon kung ang data ay natanggap at nakaimbak sa c anMsg , ang data na may halagang halumigmig at data na may halagang temperatura. Ang parehong mga halaga ay naka-imbak sa isang integer x at y.
int x = canMsg.data; int y = canMsg.data;
Matapos matanggap ang mga halaga, ang mga halaga ng temperatura at halumigmig ay ipinapakita sa 16x2 LCD display gamit ang sumusunod na pahayag.
lcd.setCursor (0,0); lcd.print ("Humidity:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); pagkaantala (1000); lcd.clear ();
Paggawa ng CAN komunikasyon sa Arduino
Kapag handa na ang hardware na i-upload ang programa para sa CAN transmitter at CAN receiver (ang kumpletong mga programa ay ibinibigay sa ibaba) sa kani-kanilang mga board ng Arduino. Kapag pinapatakbo dapat mong mapansin ang halagang temperatura na nabasa ng DHT11 ay ipapadala sa isa pang Arduino sa pamamagitan ng CAN komunikasyon at ipinapakita sa LCD ng 2 nd Arduino tulad ng nakikita mo sa imahe sa ibaba. Ginamit ko rin ang aking AC remote upang suriin kung ang temperatura na ipinakita sa LCD ay malapit sa aktwal na temperatura ng kuwarto.
Ang kumpletong pagtatrabaho ay matatagpuan sa video na naka-link sa ibaba. Kung mayroon kang anumang mga katanungan iwanan ang mga ito sa seksyon ng komento o gamitin ang aming mga forum para sa iba pang mga teknikal na katanungan.