본문 바로가기
PLC 자동제어 학습/아두이노 보드 수업

아두이노와 C언어 문법수업, 연산자와 for문의 수업

by 인터넷떠돌이 2017. 11. 16.
반응형

안녕하세요?


이번 포스팅에서는 이번주 수요일에 있었던 수업의 내용인, 아두이노 보드와 이를 제어하기 위한 C언어 문법을 수업했는데, 그 내용을 올리고자 합니다. 


먼저 언급해야 할 것은, 크로스 컴파일이라고 해야 할까요? 여기서 나오는 모든 C언어로 씌여진 연산은 모두 'PC'가 아니라 '아두이노 보드'에서 처리한 것이라는 것을 알려드려야 겠습니다. 그래서 여기서는 컴파일이라고 하는 것이 아니라 정확히는 '크로스 컴파일'이라고 해서, 기계어로 변환한 언어가 PC가 아니라 아두이노 보드로 건너가(cross)된다고 해서 크로스 컴파일 이라고 합니다.



먼저 먼저 아두이노 보드에는 모니터가 없으니, 결과를 보기 위해서 Serial.begin이라는 함수를 사용합니다. 여기서 Serial이라는 것은 C언어에서 객체라고 하고, . 이후에 오는 내용인 begin이벤트라고 합니다.



1씩 증가하는 코드를 loop쪽에 했으니, 아두이노 통합개발 환경인 스케치의 시리얼 모니터에서 제대로 1씩 증가하는 것을 볼 수 있었습니다.



먼저 1byte는 8bit이며, float라는 실수를 선언하는 변수는 4바이트로 설정이 됩니다. 그렇게 실수를 선언하고 Serial.println(변수, 숫자); 라고 하면, 실수로 선언된 변수를 소숫점 몇 자리까지 표시하겠다는 의미가 됩니다. 이 경우에는 소수점 3자리까지 나타내겠다고 했습니다.



무언가 코딩이 꼬인것 같기는 하지만, 일단 소수점 3자리까지는 나오는 것을 볼 수 있었습니다.



다음은 10이라고 정수로 선언된 변수를 다양한 진수로 나타내고자 합니다. DEC : 10진수, HEX : 16진수, OCT : 8진수, BIN : 2진수 이렇게 변환이 되게 됩니다.



Serial.println(변수, DEC); 라는 형식으로 코딩을 하여서, 제 의도되로 10이라는 숫자를 다른 진수로 바꾸는 데는 성공하였습니다.




다음은 사소한 것일지는 모르지만, \t라는 것을 문자로 표현이라고 할까요? 정확히는 이 기호를 쓰면 탭키를 쓴 간격만큼 띄워지는 효과를 볼 수 있습니다.



그 결과입니다. 시리얼 모니터 상에서 띄워지는 것을 볼 수 있습니다.



다음은 \t대신에 \n이라는 것을 사용하고자 합니다.



이번에는 아랫줄로 줄 바뀜이 일어나는 것을 볼 수 있습니다.



먼저 ++변수 라는 연산자와 변수++라는 연산자가 있습니다. 둘의 차이점은 1씩 증가를 하는데, 전자는 먼저 1을 더해놓고 나서, 연산에 들어갑니다. 하지만 후자의 경우에는 변수를 먼저 연산하고 나서 1씩 증가를 한다는 차이점이 있습니다. --변수변수-- 도 마찬가지 입니다.


그런데, 변수 +=숫자; 이렇게 증감 연산자를 사용하게 되면, 숫자만큼 더해지면서 변수를 증가시키라는 의미가 되게 됩니다. 물론 *와 -, /도 적용이 가능합니다.



2씩 증가가 되는 것을 제대로 볼 수 있었습니다.




이번에는 %를 사용해서 나머지를 구하는 연산자인데, 문제는 변수 = 변수 % 숫자; 이것은 상당히 중요한 구문입니다. 왜냐하면 아래의 결과를 먼저 봐 주시기 바랍니다.



0에서 9까지의 숫자만 반복된다. 즉, 10의 진수로 바꿀 수 있는데, 이걸 달리 말하면 숫자로 지정한 진수만큼 바꿀 수 있다는 의미가 됩니다. 그래서 5라는 숫자를 집어 넣으면 5진법, 이런 식으로 다른 공식을 사용하지 않고도 간단하게 코딩을 할 수 있다는 것입니다.



실제로 시도해 보면



그러한 결과가 나온다는 것을 알 수 있습니다.



다음은 관계 연산자입니다. 여기서 주의해야 할 것은 3가지 인데, 우선 첫째는 비주얼 베이직에서는 if문에서 같다는 표시가 = 하나라서 C언어인 아두이노에서 == 인 것과 헷갈릴 수 있다는 것입니다. 그리고 둘째는 != 이 같지 않다는 의미라는 것을 잊어 버리는 안된다는 것이며, 마지막으로 이상과 이하라는 의미를 나타내는 >=와 <=에서 괄호가 먼저 나온다는 것을 잊으면 안된다는 것입니다.



다음은 논리 연산자입니다. 일반적으로 관계 연산자가 2개 이상 복합적으로 나오게 되면, 이 위 스크린샷에서 보이는 논리 연산자가 나오게 되는 것입니다. && 는 AND, || 는 OR, ! 는 Not이라는 것입니다. 그리고 ^는 exclusive OR이라는 것으로 ^이 왜 중요한가 하면, 입출력에 사용이 되는 그레이 코드를 연산이 가능한 2진수로 바꾸기 위해서는 ^만 잘 활용하면 된다는 것입니다.




다음은 비트 연산자입니다. 이에 대해서도 자세히 설명을 해야 하기는 하겠지만, 문제는 설명이 너무 길어집니다.



왜 이런 결과가 나왔는지에 대해서 설명하자면, 이것도 한개의 포스팅 꺼리가 되기에 하는 수 없이 이번 포스팅에서는 이런 비트 연산자가 있다는 것을 언급하고 끝내야 겠습니다.



다음은 for문입니다. for문은 반복문으로서, 제어문에 속하고 있으며, 다음과 같은 구성이 되어 있습니다.


For(초기식; 조건식; 증강식)

{                              

                             }


여기서 중요한 것이 { } 괄호인데, 무조건 for믄의 아래에서 부터 시작해야 하며, 이 { }가 없으면 for문 바로 아래의 문장만을 반복한다고 합니다. 결국 { } 안의 공간은 바로 제어문이 제어하는 공간입니다. 그리고 또 중요한 것이 조건식으로, 조건식이 충족되지 않으면, For문은 끝나고 나가야만 합니다.



일단은 제 의도대로 반복문에 따라 i값이 1에서 부터 5까지 증가하는 것을 볼 수 있었습니다. 여기서 비주얼 베이직과 다른 차이점이 또 하나 나옵니다. 바로 비주얼 베이직에서는 for문을 시작할 때 조건식에 사용할 i와 같은 값을 미리 선언하지 않았어도 되었습니다. 하지만, 아두이노 통합 개발환경인 스케치에서는 int i;라고 void setup() 이전에 변수 선언을 해야만 했습니다.



다음은 아날로그 출력입니다. 일단 아날로그는 아두이노 우노의 경우에는 물결무늬가 있는 3,5,6,9,10,11만이 아날로그 출력이 가능하다고 합니다. 일단 void setup()부분에서 pinMode를 설정하지 않아도 됩니다. 그리고 아두이노 보드이다 보니, 최대 출력이 5V에 그치며, 그 출력의 범위를 프로그램에서는 0에서 255까지 설정할 수 있습니다.


당연하지만 당연하게도, 255라고 설정을 하면, analogWrite에서 5V 최대로 출력이 되게 됩니다. 만약에 127정도로 설정을 하면 아마 약 2.5V의 출력이 나오게 됩니다. 그래서 이를 이용하면 LED의 밝기를 서서히 올리거나 내리는 역할도 가능하게 됩니다.



일단 브레드 보드를 이용해서 실습을 한 화면입니다. 다만 여기서는 회로의 선을 만드는 데는 그렇게 까지 깊숙한 실습을 하지 않았습니다만, 앞으로는 실습이 점점 복잡해 질 것이 기대가 된다고 해야 할까요?

반응형