이 글의 원문은 다음에 있습니다. http://tindevil.com/site/blog/post/3778
아두이노에서 캔통신을 사용하려면 (궃이 아두이노가아니고 AVR 이라고 해도된다~ 아두이노가 AVR CPU를 사용하니 말이다) 캔컨트롤러(MCP2515)와 캔트랜시버(MCP2551) 칩이 필요하다. 이런것들이 미리 탑재된 AT90CAN128 CPU도 있지만 아두이노(=Leonardo)에 탑재된 CPU는 이런것들이 내장되어있지 않으므로 관련칩을 추가해줘야한다.
(다른 회사의 칩들도 있지만.. 그냥 보편적인걸 선택하고 가지고 있다)
데이터시트보고 연결했는데 뭐 역시나 잘 안되더라 (AT90CAN128 할때도 그랬고 -_- 뭔가 단순한것에 걸려있는 느낌이 든다)
그래서 주문을 했다 CAN Shield ! 여기서 Shield 란 아두이노의 확장보드같은 개념인데..
아두이노의 핀배열에 맞춰서 끼울수 있게 대부분 설계되어있다. 그냥 확장보드라고 하자!
CAN Shield 이니깐 아두이노에 CAN 통신을 할 수 있도록 하는 확장보드 이며 위에서 언급한 컨트롤러와, 트랜시버가 설계되어있다.
난 반드시 캔통신을 해보고 싶었다 -_- 혼자 빵판에 해봤자 답이 안나오니 확실히 되는걸 먼저 보고 작업하려하는것이다.
바로 위 사진과 같은것이 캔쉴드이다 (외국 직거래해서 2주넘게 걸렸지만 가격은 절반값이다 : 이 후 난 국내에서 구매를 하지 않고 있다. 직거래가 시간 소요가 많이되는것 말고는 가격면에서는 월등히 뛰어나다 물론 종류도 많고)
구매한 캔쉴드의 상품정보가 궁금하다면? -> (http://www.seeedstudio.com/depot/CANBUS-Shield-p-1240.html)
아두이노 보드와 핀모양이 같으니 그냥 끼우면 되겠지? ㅎㅎ
ㅎㅎ 바로 위와 같은 형태로 말이다! 합체다! 합체를 하면되는것이다.
SeedStudio 의 상품정보를 보면 샘플소스를 다운로드 받을수있다. (github 통해서 배포를 한다)
샘플은 아두이노 라이브러리 형태로 제공하므로 이참에 라이브러리 추가 방법도 같이 적어본다
어느 라이브러리를 받건 위 파일목록형태로 되어있다. 각각의 파일을 클릭하면 소스를 볼수있지만 처음 설치하는것이니 우선 파일을 모두 받는것이 좋다 표시를 해둔 [Download ZIP]을 이용해 위 파일을 모두 받자.
받은 압축파일을 풀면 [CAN_BUS_Shield-master] 라는 이름의 폴더가 나오는데 이 폴더명중 -master를 지워야한다
그러니까 폴더명이 [CAN_BUS_Shield] 게 되어있으면 된다는 것이다. 이것을 아두이노의 설치된 폴더중 library 에 넣어야한다.
맞게 넣었다면 위와 같은 형태가 된다. 만약 -master 라는 이름을 지우지 않고 폴더를 넣은 후 아두이노를 시작한다면
위와 같은 오류를 볼 수 있으므로 이름을 꼭 변경하자(어떤 라이브러리라도 마찬가지다 오류가 나온다면 폴더명을 잘 봐야한다)
그렇다면 아두이노를 실행해보자!
예제를 보게되면 방금 추가한 예제들이 보일것이다.
물론 라이브러리에서도 추가가 가능하다.. 그럼 바로 예제를 해보자.
Receive_Check를 테스트해보았다.
// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13
#include
#include "mcp_can.h"
unsigned char Flag_Recv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
MCP_CAN CAN(10); // Set CS to pin 10
void setup()
{
Serial.begin(115200);
START_INIT:
if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield init ok!");
}
else
{
Serial.println("CAN BUS Shield init fail");
Serial.println("Init CAN BUS Shield again");
delay(100);
goto START_INIT;
}
}
void loop()
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
for(int i = 0; i<len; i++) // print the data
{
Serial.print(buf[i]);Serial.print("\t");
}
Serial.println();
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
바로 위와같은 코드였다.. 잘 보면 처음부분에 캔통신초기화가 있는데.. 이부분이 실패하면 Setup을 계속 돌도록 되어있다. 난 당연히 될줄 알았지만 결과는 대 참패!다 AT90CAN128 로 부터 줄곧 나를 괴롭히던 초기화오류를 .. 무려 CAN Shield를 썼음에도 불구하고 맞이한 것이다.
삽질은 점점 더 절정을 다해 가고 있었고.. 난 멘붕이되었다.
순간! 그래 차가 아니여서 일거야..라고 착각을 하고 차에가서 켜보았지만 물론 결과는 같았다
"init Fail"
알수가 없었다.. CS 핀번호도 Can Sheild 기본값 10에서 바뀌지 않았다. 하지만 되지 않았다..
정말 알 수 없었고 미치고 환장하고 팔짝 뛸 노릇이다.. -_- 지친나머지 잠시 아두이노를 접는다
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13
#include
#include "mcp_can.h"
unsigned char Flag_Recv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
MCP_CAN CAN(10); // Set CS to pin 10
void setup()
{
Serial.begin(115200);
START_INIT:
if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield init ok!");
}
else
{
Serial.println("CAN BUS Shield init fail");
Serial.println("Init CAN BUS Shield again");
delay(100);
goto START_INIT;
}
}
void loop()
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
for(int i = 0; i<len; i++) // print the data
{
Serial.print(buf[i]);Serial.print("\t");
}
Serial.println();
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
'Information > MICOM & SBC' 카테고리의 다른 글
아두이노(arduino) Can Bus Shield 초기화 성공 (0) | 2014.10.04 |
---|---|
아두이노(arduino) Can Leonardo 보드 구매 (0) | 2014.10.04 |
아두이노(Arduino) 란? (0) | 2014.10.01 |
아두이노(Arduino) 개발 환경을 설치하자 (0) | 2014.10.01 |
Serial ISP 제작 (0) | 2012.01.22 |