팜 시스템

기본적인 아두이노 실습

user1016 2025. 5. 15. 21:18

 드디어 대면으로 팀원들끼리 하는 제대로된 팜 시스템 첫 스터디이다. 스터디 방식은 번갈아 가며 코드와 회로를 만들고 동작시켜 보며 서로 의문이 드는걸 해결하는 과정이었다.

 

 우리가 선정한 책은 아두이노의 기초 문법을 자세하게 설명해 주기 보다는 다양한 IoT(가운대 o만 소문자,ppt에 ioT했다가 한소리를 들었다...)실습을 할 수 있는 책이다. 실제로 Ch2 이후부터는 전부 IoT에 관한 실습이다. 만약 내가 아두이노를 어느정도 알고 IoT학습에 중점을 두고 있다 하면 추천할것 같은 책이다.

 

 오늘 스터디에서는 Ch1,Ch0을 끝내고 다음주 부터 본격적은 IoT실습에 들어갈 예정이다. 그랬으나... 만나서 본격적인 학습을 하는게 처음이라서 그런지 영 속도가 붙지 않았다. 결론만 말하자면 Ch1 작품2 까지 나갔으며 나머지 3개의 챕터는 나가지 못했다. 따로 자습을 하기로 했다. 속도가 붙지 않았던 이유로는 1. 스터디의 구체적인 진행방식이 정해져 있지 않았음. , 2.Ch.0은 거의 준비하는 과정뿐인데 다운로드하는데 시간이 조금 걸렸었음. 이 있었다. 이 문제는 첫 스터디여서 생긴 문제였고 다음 스터디부터는 빠르게 진도를 나갈수 있을것 같다.

 

이 보드가 우리가 사용하는 보드이다. 보드를 준비하는 과정에서 5핀 케이블을 빼먹어 오늘 실습에는 사용할 수 없었지만 오늘 실습에는 wifi기능이 필요가 없기 때문에 다른 우노 보드로 실습을 진행하였다.

 가장 기초적인 실습 LED켜기 부분이다. 여태 살아오면서 몇번을 한지는 모르겠지만 확실히 아는만큼 보이는것 같다. 현재 마이크로프세서라는 과목을 듣고 있는데 아두이노로 프로그래밍 하는게 아닌 AVR로 프로그래밍을 하고 있다. 아두이노에서 하는것과 전체적인 결은 비슷하지만 AVR에서는 입출력 포트, 보드의 특정 기능 활성화, 전송속도 조절 이런걸 조금더 가독성 없게..? 설정 하고 있다. 예를들어 아두이노에서 특정 핀을 출력으로 설정 하려면 pinMode(RED_LED,output); 이렇게 해주면 되지만 AVR에서는 PORTD|=0x01; 이렇게 해줘야 한다. 가독성이 없지만 눈에 익숙해지기만 한다면 조금더 간편하게 설정 할 수 있고 조금더 복잡한 회로, 다양한 기능들을 설정할 수 있다는 장점이 있는 것 같다. 무튼 이렇게 마이크로 프로세서라는 어려운 길을 가다 오랜만에 아두이노를 보니 반갑기도 하면서 내가 배우는 어려운 내용들이 여기에도 적용되 있구나~ 라는 생각을 했다.

 

 이 부분에서 살펴볼건 1.setup은 처음 실행할때 한번만 실행되는 함수이다. 2.loop는 계속 반복해서 실행되는 함수이다. 3.#define는 RED_LED라는 값을 우리는 D4로 설정하겠다는 것이다. 3코드는 더 복잡하고 긴 코드를 짤때 우리 인간이 조금더 편리하게 짜기 위해 필요한 과정이다. 내가 무슨 핀에 무슨 장치를 달아놨나 다 작성하면서 코드를 짜는건 귀찮으니까.

  두번째 실습은 시리얼 모니터로 데이터를 주고받는 실습이다. Serial.available()은 시리얼 버퍼에 읽을 수 있는 데이터의 수가 몇 바이트인지 반환하는 코드이다. 이때 if문은 ()안이 0이 아니기만 하면 실행되기 때문에 >0이 왜 필요한가 싶었지만 >0을 붙이는게 더 올바르게 코드를 표시하는 방법이라고 한다. 

 여기서 들었던 의문은 adda를 시리얼 모니터로 보내면 출력은 "a ok"가 두번 뜬다는 것이다. 처음에는 아무것도 출력되지 않을거라 생각했다. 그런데 저렇게 출력되는 이유는 read로 문자 하나씩 sData에 저장해 비교하기 때문이다. 그러면 최대 몇개의 문자까지 저장가능한가? 64바이트 64개의 문자를 저장가능하다고 한다.

 시리얼 모니터로 LED제어하기 부분이다. 이때 제어 문자로 r,b 이렇게 쓰면 의도치 않은 오류가 발생할 수 있다. 여기서 쓰는게 15번 줄 이다. 15번 줄의 해석은 문자열 타입 변수 StrData에 시리얼 모니터로 입력된 값을 줄바꿈전까지 받아 저장한다. 이다. 16번 줄의 해석은 StrData.indexOf("RED_ON") 은 RED_ON이라는 문자열이 처음 발견된 인덱스를 반환하는 코드이다. 그리고 발견되지 않았다면 -1을 반환한다. 즉 if문은 RED_ON이라는 문자열이 발견되면 실행되는 것 이다. 

 만약 StrData에 RED_ONYELLOW_ON 이렇게 되있으면 두개의 LED가 다 켜질까? 결론은 아니다. RED_ON이 발견된 처음의 인덱스만 반환하기 때문에 StrData.indexOf("RED_ON")을 하면 0이 반환될것이고 빨간색 LED만 켜질것 이다.

 

이렇게 3번째 스터디가 끝이났다. 블로그 작성도 어색하고 이제 슬슬 요령을 찾아갈 때라고 생각한다. 다음 작성때는 실습때 많은 사진을 찍어 블로그 작성을 조금더 풍성하게 해보면 좋을 것 같다.