兩個Arduino 與兩個MCP2515 CAN模組通訊實現(用到ec11編碼器)
Arduino 與MCP2515 CAN模組通訊實現
接線:Arduino與mcp2515模組(資料傳送端和接收端接線一樣),注意在這裡兩個J1都要短接(保證迴路中有120歐姆電阻)):
Arduino與EC11旋轉編碼器接線(資料傳送端):
Arduino | EC11 |
---|---|
D2 | CLK |
D3 | DT |
D4 | SW |
VCC | 5V |
GND | GND |
程式寫入前要安裝好庫檔案(包括使用說明):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);
}
}
}
此測試程式結果可通過串列埠監視器檢視,但因後來調整過,還有待完善。
相關文章
- 兩個有名管道實現qq通訊
- 兩個視窗如何實現通訊
- 實現兩個視窗通訊方法之postMessage
- 在如何實現兩個JBoss之間的訊息通訊?
- 在同一個Activity下實現兩個Fragment之間的通訊Fragment
- 兩個機器人聊天對話實現原始碼機器人原始碼
- 兩個 Node.js 程式如何在h5直播原始碼中實現通訊?Node.jsH5原始碼
- 兩個專案用訊息佇列通訊佇列
- MQ實現兩個應用系統之間的通訊-----實際操作(二)MQ
- android native service編寫及兩個服務程式通訊Android
- offer通過--7兩個棧實現佇列-2佇列
- offer通過--8兩個棧實現佇列-2佇列
- 無監督學習中的兩個非概率模型:稀疏編碼與自編碼器模型
- FI中用到的取得會計相關日期的兩個通用模組
- 兩個棧實現佇列佇列
- python兩個子執行緒通過queue通訊Python執行緒
- ZYNQ有兩個CPU?(三)——SGI非同步通訊非同步
- 兩個棧實現佇列操作佇列
- [ Shell ] 兩個 case 實現 GetOptions 效果
- JavaScript實現兩個數的交換JavaScript
- 用兩個棧實現佇列佇列
- Delphi 簡單命名管道在兩個程式間通訊
- java 一個類實現兩個介面的案例Java
- 建立工程,編寫一個介面有兩個按鈕的程式,通過定時器控制這兩個按鈕上的文字變化。定時器
- java實現兩個文字相似度 simHash 實現Java
- 通過Guava實現兩個包含不同物件的List合併成一個ListGuava物件
- 呼叫函式實現兩個數交換函式
- 如何實現兩個div等高效果
- 這兩個願望我實現了
- 分享兩個實用的shell指令碼指令碼
- 【劍指offer】兩個棧實現一個佇列佇列
- 【劍指offer】兩個佇列實現一個棧佇列
- 【Spring AOP】暴力打通兩個切面之間的通訊Spring
- 【附加題1】通過程式碼實現兩個超大的數字相加的結果?
- 【GMT43智慧液晶模組】例程三:CAN通訊實驗
- pandas 實現兩個dataframe相減的方式
- 兩個數換值四種方法實現
- 高效圖片輪播,兩個ImageView實現View