본문 바로가기

3. 아두이노 릴레이 컨트롤을 위해 코딩해보기.

by ㅋㅋ잠자 2015. 11. 4.
728x90

안녕하세요. 도정진입니다.

   

저도 아두이노를 처음 만져보고 몇 시간 사용해 보면서 글을 적습니다. 아두이노를 처음 사용하시는 모든 분들이 저처럼 처음에 당황하지 않길 바라면서 ..

   

기본적으로 아두이노 코드 작성은 C++ 정도만 알아도 문제없이 가능합니다.

   

기반 코드로는 코드 모양을 봐서 객체지향이라 .. 자바인가?

   

   

는 아니고 C++ 기반 맞네요.. ㅎㅎ

   

   

처음에 말씀드린데로 저는 우분투 14.04 를 기반하여 xfce4 를 화면으로 하여 작업하고 있습니다.

   

(우분투 화면을 직접 보지는 않고 xrdp 로 원격으로 보고 작업합니다.)

   

   

뭐 이런식으로 말이죠 ㅎ

   

   

   

   

   

-1 . 아두이노를 이번에 갑작스레 구매하게 된 이유.

   

먼저 아두이노를 구매하게 된 이유는 단순히 0(LOW) / 1(HIGH) 를 컨트롤 하기 위함입니다.

   

그거 하나 하려고 아두이노를 사는건 조금.. 돈이 아깝기는 한데 INTEL NUC DN2820FYKH 에서 직접적으로 컨트롤이 가능한 상태이고 적용이 쉽다는 점 때문입니다.

   

아두이노를 사지 않고 단순히 0 / 1 컨트롤을 할 수 있는 방법을 여러가지 생각해 보았습니다. 그런데 문제는 제가 쓰는 미니 서버용 보드 DN2820FYKH 에는 그렇게 컨트롤이 가능한 핀이 있겠지만 문제는 보드 손상을 시키면서 까지 작업하기는 싫어서.. --> 결론 : 컨트롤 가능한 핀이 없다. 된것입니다.

   

   

   

   

실제로 보면 왼쪽 상단 , 가운데 상단 보시면 핀이 있지만 이게 정식으로 판매 되기 전의 개발 메인보드이고 실제 똑같은 제품이지만 판매용에는 저 핀이 없는 상태입니다.

   

혹시나 그냥 납땜만 안해 둔 것일 수도 있어서 여러가지 검색을 해 보았지만 GPIO 처럼 활용을 하는 경우는 본 적이 없습니다. 그래서 최대한 보드에 손을 안대기 위해

   

USB 선택적 절전모드라는 것도 알아보았습니다. USB3.0 은 외장 디스크가 물려 있어서 항시 켜져 있어야 하고 USB2.0 포트는 뒤에 있는데 이것을 절전모드 / 정상모드 이렇게 전환하면서 0V (LOW) / 5V (HIGH) 로 조정을 할까 고민을 많이 했으나..

   

혹은 IR 리시버가 GPIO 로 작동하니까 커널단에서 살짝 손대면 사용가능하지 않을까 생각도 많이 했으나.... 보드 손상하는 것이 싫어서 놔두기로 했습니다.

   

커널단에서 직접적으로 (echo) 를 통해서 되지 않음을 판단하고.. 결국 USB 시리얼통신으로 조작이 가능한 아두이노를 사게 된 것입니다.

   

이렇게 볼때 .. 라즈베리파이 위에 왜 아두이노를 붙이는가.. 이유도 살짝 이해가 가기 시작합니다.

   

추가적으로 릴레이의 경우 접점이 있으면 추가적으로 전원이 필요할것 같아서 SSR 릴레이를 주문했습니다. 설명은 아래의 주소를 참고하시길 바랍니다.

   

https://ko.wikipedia.org/wiki/%EB%B0%98%EB%8F%84%EC%B2%B4_%EB%A6%B4%EB%A0%88%EC%9D%B4

   

   

   

   

   

   

0 . 핀 번호 보기 & 특이점?

   

   

아두이노 나노는 아두이노 우노 (조금 많이 큰 버전) 과 같은 칩셋을 사용합니다. 그래서 라이브러리도 거의 100퍼 호환됩니다.

   

전원은 USB 에서 5V를 공급받을 수 있고 PC와 연결시에는 아래의 USB 변환칩을 통해 시리얼 연결이 기본적으로 활성화 됩니다.

   

이 경우가 아니라면 우측 아래의 VIN 핀과 GND 핀을 통해 전원을 공급받고 우측 상탄의 시리얼 핀을 통해 데이터를 주고 받을 수 있습니다.

   

정확하지는 않지만 우측 가운데 6개 핀은 ISP 를 이용해 칩을 프로그래밍 하는 것으로 알고 있습니다.

(아님 말구요 ~!)

   

핀 번호는 그냥 보드에 쓰인거 보시면 되고 기본적으로 디지털 핀의 경우에 0 / 1 출력 밖에 되지 않고 읽는 것도 그것밖에 되지 않습니다.

   

아래의 아날로그 (A ~~) 로 되어 있는 핀은 1024 단계로 입출력이 가능한 것으로 알고 있습니다.

   

일단 저는 그냥 디지털 출력 1개의 핀만 사용할 것으로.. 기타 설명은 생략... bb\

   

   

   

   

   

1 . 기본 아두이노 코드 구성

   

제가 실은 정확히 알고 설명하는 것이 아닙니다. 여러가지 게시글을 보고 알아낸것을 블로그에 적고 있으니.. 정확하다고 생각하시면 안됩니다 ㅎㅎ

   

기본적으로 코드가 아래와 같이 두 블럭으로 생겼습니다. (이 보다 더 복잡한 코드로 가게 되면 함수는 많아 지겠지만 ..)

   

   

구성이 셋업 부분과 루프 부분으로 나뉘어 있습니다.

   

셋업의 경우 아두이노가 처음 시작될 때 딱 한번 실행되는 구간이고 , 루프는 아두이노가 켜져 있을 동안 계속 실행되는 부분입니다.

   

그 외에는 미리 정의되어 있는 함수 몇가지를 알면 되고, C++ 에서 사용하는 문법 사용해서 코드 작성해 주시면 됩니다.

   

아래의 문서를 참고하시면 정확하게 이해가 갈껍니다.

   

http://cafe.naver.com/makezone/55

http://cafe.naver.com/makezone/64

http://cafe.naver.com/makezone/69

http://cafe.naver.com/makezone/114

   

실은 제가 시간이 없어서 잘 만들어진 가이드가 있어서 링크로 남깁니다... (귀찮은 건.. 비밀)

   

   

   

   

   

   

2 . 위에서 습득한 얕은 지식으로 코드 작성하기.

   

자 그럼 일단 짜기 전에 핀을 잡아봐야될것 같습니다.

   

음 .. 이 게시글 처음에 썻던 사진을 다시 재탕하겠습니다.

   

   

일단 릴레이를 사용하려면 3개의 핀이 필요합니다.

   

0V / 5V / DigitalOUT 핀

   

(다른 제품은 그냥 0V , 신호핀만 연결하는 제품이 다수던데 이거는 3개의 핀이 필요하네요.)

   

   

그렇게 핀 배열을 생각해 보았을 때..

   

   

시그널핀으로 D2 핀 / 그라운드로 GND 핀 / 5V 출력으로 5V 핀..

   

바로 짜보겠습니다.

   

   

끝.

   

const int relaypin=2; // 핀을 전역변수로 설정

   

void setup() {

pinMode(relaypin,OUTPUT); // 아웃풋 설정

Serial.begin(9600); // 시리얼 초기화 함수

Serial.println("arduino ready"); // 셋업함수가 끝나면 바로 문자열 보냄

}

   

void loop() {

char serialdata; // 시리얼 값이 8비트 (1바이트임) 으로 char 변수 선언

if(Serial.available() > 0) serialdata=Serial.read();

// 내장된 시리얼 함수를 통해 데이터가 오면 serialdata 저장

if(serialdata=='1') { // 시리얼 입력 값이 1이면

digitalWrite(relaypin,HIGH); // 2번핀에 HIGH 신호 보냄

Serial.println("relay power on"); // 시리얼로 켰다고 신호 보냄

}

else if (serialdata=='0') { // 시리얼 입력 값이 0 이면

digitalWrite(relaypin,LOW); // 2번핀에 LOW 신호 보냄

Serial.println("relay power off"); // 시리얼로 껏다고 신호 보냄

}

}

   

   

   

   

3 . 동작 테스트 해보기

   

코드를 작성 하였으면 업로드를 통해 아두이노 보드에 주입합니다.

   

   

   

   

컴파일 하고 업로딩이 완료 됩니다.

   

   

그 다음 아두이노 IDE 를 통한 시리얼 통신을 해 보겠습니다.

   

   

   

동작 준비가 완료 되었을 때,

   

   

   

1이라고 값을 보냈을 때,

   

   

   

0이라고 값을 보냈을 때,

   

   

   

동작이 매우 정상적입니다. 하드웨어적으로 작동 영상은 아래에서 보여드리겠습니다.

   

한편, 실은 매일 xrdp 를 통해 화면을 뛰우고 작업할 수는 없음으로 우분투 패키지 중에서 minicom 을 이용해 SSH 상에서 관리해 보도록 하겠습니다.

   

apt-get install minicom

   

   

설치하고 minicom -s 라고 터미널에 입력합니다. 그럼 설정창이 나옵니다.

   

minicom -s

   

   

시리얼 포트 셋업으로 이동합니다.

   

   

키보드에서 A 를 누르고 장치를 설정합니다.

(기본적으로 시리얼 포트는 아두이노 IDE 에서 설정한 것이랑 똑같이 적어주면 됩니다.)

   

그 다음 E 를 누르고 속도를 지정해 줍니다.

   

   

처음에는 115200 으로 설정이 되어 있을 겁니다. 상기 2번에서 썻던 코드를 보면 아두이노 시리얼 포트 속도는 9600 으로 지정하였습니다.

   

그래서 B 를 눌러서 9600 으로 속도를 낮추고 엔터를 통해 저장합니다.

   

   

설정이 끝나고 Save setup as df1 을 입력하여 마무리 합니다.

   

그리고 일단 exit 으로 minicom 설정에서 빠져나옵니다.

   

그 다음 터미널에 minicom 이라고 입력하면 바로 아두이노와 통신이 가능한 상태가 됩니다.

   

   

이런식으로 에러가 뜨면 아두이노 IDE 에서 사용을 하고 있거나 다른 프로그램에서 아두이노 시리얼 포트를 잡고 있는 것이니 관련 프로그램을 꺼주시길 바랍니다.

   

   

이런식으로 SSH 상에서도 아두이노와 시리얼 통신이 가능합니다.

   

   

똑같이 키보드로 1 0 입력하면 반응 합니다.

   

이렇게 아래의 영상으로 확인해 보겠습니다.

   

   

   


   

   

정상적으로 작동이 됩니다.

   

다음은 릴레이 조립과 케이스 제작으로 다음 글을 이어가겠습니다.

   

감사합니다.

728x90

댓글0