兩個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);
}
}
}
此測試程式結果可通過串列埠監視器檢視,但因後來調整過,還有待完善。
相關文章
- 兩個視窗如何實現通訊
- 實現兩個視窗通訊方法之postMessage
- android native service編寫及兩個服務程式通訊Android
- 兩個 Node.js 程式如何在h5直播原始碼中實現通訊?Node.jsH5原始碼
- offer通過--7兩個棧實現佇列-2佇列
- offer通過--8兩個棧實現佇列-2佇列
- 兩個專案用訊息佇列通訊佇列
- MQ實現兩個應用系統之間的通訊-----實際操作(二)MQ
- 兩個棧實現佇列佇列
- 兩條寬頻,兩個路由器如何組建成同一個區域網路由器
- 【nodejs原理&原始碼賞析(5)】net模組與通訊的實現NodeJS原始碼
- 兩個棧實現佇列操作佇列
- [ Shell ] 兩個 case 實現 GetOptions 效果
- ZYNQ有兩個CPU?(三)——SGI非同步通訊非同步
- Java Pom兩個模組需要互相引用怎麼辦Java
- 建立工程,編寫一個介面有兩個按鈕的程式,通過定時器控制這兩個按鈕上的文字變化。定時器
- java 一個類實現兩個介面的案例Java
- 從0到1實現一個模組間通訊的服務元件元件
- java實現兩個文字相似度 simHash 實現Java
- 270行程式碼實現一個AMD模組載入器行程
- 通過Guava實現兩個包含不同物件的List合併成一個ListGuava物件
- 分享兩個實用的shell指令碼指令碼
- JavaScript實現兩個數的交換JavaScript
- 【Spring AOP】暴力打通兩個切面之間的通訊Spring
- 從Android到ReactNative開發(二、通訊與模組實現)AndroidReact
- 【附加題1】通過程式碼實現兩個超大的數字相加的結果?
- Flutter 入門與實戰(五十七):兩個模擬器來聊天 — Provider 綜合應用FlutterIDE
- LeetCode-175:組合兩個表LeetCode
- SQL 兩個表組合查詢SQL
- 從Android到React Native開發(二、通訊與模組實現)AndroidReact Native
- 呼叫函式實現兩個數交換函式
- Python實現工廠模式的兩個例子Python模式
- pandas 實現兩個dataframe相減的方式
- 利用訊號量semaphore實現兩個程式讀寫同步 Linux CLinux
- Arduino 驅動火焰感測器模組UI
- Unity如何在兩個編輯器中轉移資源Unity
- rk3566 新增MCP2515模組
- 兩行程式碼 寫個代理行程