兩個Arduino 與兩個MCP2515 CAN模組通訊實現(用到ec11編碼器)

紳士0310發表於2020-12-30

Arduino 與MCP2515 CAN模組通訊實現

接線:Arduino與mcp2515模組(資料傳送端和接收端接線一樣),注意在這裡兩個J1都要短接(保證迴路中有120歐姆電阻)):
在這裡插入圖片描述
Arduino與EC11旋轉編碼器接線(資料傳送端):

ArduinoEC11
D2CLK
D3DT
D4SW
VCC5V
GNDGND

程式寫入前要安裝好庫檔案(包括使用說明):https://github.com/autowp/arduino-mcp2515

程式(資料傳送端)

 //定義引腳連線
#include <SPI.h>
#include <mcp2515.h>

 int CLK = 2;//CLK->D2
 int DT = 3;//DT->D3
 int SW = 4;//SW->D4
 const int interrupt0 = 0;// Interrupt 0 在 pin 2 上
 int count = 0;//計數值
 int lastCLK = 0;//CLK歷史值
 struct can_frame canMsg1;
 MCP2515 mcp2515(10);

 void setup()
 {
   pinMode(SW, INPUT);
   digitalWrite(SW, HIGH);
   pinMode(CLK, INPUT);
   pinMode(DT, INPUT);
   attachInterrupt(interrupt0, ClockChanged, CHANGE);//設定中斷0的處理函式,電平變化觸發
   Serial.begin(9600);
   SPI.begin();
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);//波特率和晶振頻率(必須有)
  mcp2515.setNormalMode();
  canMsg1.can_id = 0x1B500101 | CAN_EFF_FLAG;//擴充套件幀方式
  canMsg1.can_dlc = 4;//資料位數,此程式實際只用到了2個
 }
  
 void loop()
 {
   if (!digitalRead(SW) && count != 0) //讀取到按鈕按下並且計數值不為0時把計數器清零
   {
     count = 0;
     Serial.print("count:");
     Serial.println(count);
   }
   if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK)
  {
    if(canMsg1.can_id==CANID)
    {
      int x =canMsg1.data[0];
      Serial.println(x);
      
      
     }
    }
    delay(20);//延時必須有,不然loop程式會卡住
 }
  
 //中斷處理函式
 void ClockChanged()
 {
   int clkValue = digitalRead(CLK);//讀取CLK引腳的電平
   int dtValue = digitalRead(DT);//讀取DT引腳的電平
   if (lastCLK != clkValue)
   {
     lastCLK = clkValue;
     count += (clkValue != dtValue ? 1 : -1);//CLK和DT不一致時+1,否則-1
     Serial.print("count:");
     Serial.println(count);
  canMsg1.data[0] = count;
  canMsg1.data[1] = 0x01;
  mcp2515.sendMessage(MCP2515::TXB1,&canMsg1);
   }
 }

接收端程式

#include <SPI.h>
#include <mcp2515.h>
#include <Wire.h>


struct can_frame canMsg1;
MCP2515 mcp2515(10);


void setup() {

  delay(1000);
  
  SPI.begin();
  
  Serial.begin(9600);
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
  mcp2515.setNormalMode();
  canMsg1.can_id = 0x1B500101 | CAN_EFF_FLAG;
  canMsg1.can_dlc = 4;
  
  Serial.println("------- CAN Read ----------");
  Serial.println("ID  DLC   DATA");
}

void loop() {
  if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK)
  {
    if(canMsg1.can_id==0x1B500101 | CAN_EFF_FLAG)
    {
      int x =canMsg1.data[0];
      int y =canMsg1.data[1];
      Serial.println(x);
      Serial.println(y);
      delay(200);
     }
    }

      }

此測試程式結果可通過串列埠監視器檢視,但因後來調整過,還有待完善。

相關文章