아두이노는 연결 후 코드를 작성할 때 Arduino IDE
라는 프로그램을 이용함. (연결은 케이블 TYPE B
를 사면 됌)
위 그림과 같이 IDE는 다음과 같은 메뉴를 가지고 있는데 일단 연결하려면 툴
들어가서 보드와 포트를 설정해준다.
보드는 연결한 보드의 종류를 선택해주고, 포트는 아두이노를 연결한 포트를 선택하면 된다. 그러면 다음과 같은 과정으로 컴파일, 아두이노로 업로드가 이루어진다.
체크박스 클릭 -> 화살표 버튼 클릭 (이는 메뉴에도 있으며, 스케치 메뉴에서도 선택가능하다.)
맨 오른쪽에 돋보기 모양 보이는가? 저것은 Serial Monitor
라고 한다. 이는 우리가 흔히 코딩할 때 이용하는 command 창과 같은 것이다. 다른 점은 굳이 이 command 창이 필요하지 않으면 안써도 된다.
이제 구동 방법 알았으니 바로 코드 짜보자. setup()
함수는 처음에 아두이노가 업로드를 마치고 처음 실행하는 함수이다.
즉 아두이노를 초기화 한다는 것이다. 또한 실행 중에 아두이노 reset
버튼 누르면 setup()
함수 실행되는데, 위 말과 같은 말이다.
loop()는 아두이노가 실행될 때 계속 반복하는 함수이다. 이 함수안에서 무한 루프를 돌리면 다시 loop()를 실행할 수 없게 된다.
또한 이런 loop() 함수의 특징때문에 delay를 걸어줄 함수도 존재한다. delay(1000)
면 1초이다.
setup()부터 보자. setup에서는 어떤 pin을 어떤 모드로 이용할 건지 정의하고, 변수 초기화를 해주거나, Serial Monitor
를 이용할 것이라면 즉 command 창을 통해서 input을 받고 output을 출력해 낼 것이라면, Serial.begin()으로 초기화 해주자.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
for(int i=0;i<8;i++){
pinMode(led[i], OUTPUT);
}
}
필자는 처음에 불키는 것부터 만들었지만 그 코드를 저장하지 못하였기 때문에 7 세그먼트
로 바로넘어가겠다. 위와 같이 선언해주면 총 8개의 pin을 선언하게 된 것이다.
중요한 점은 Arduino는 정말 C와 문법이 같아서 컴공생이 쓰기 좋다는 것이다.
그리고 loop()는 다음과 같이 작성하였는데, 이 코드는 아두이노에서 받은 숫자를 binary
로 표현하는 방법을 몰라서 if else로 0~9까지의 케이스를 전부 나눴다.
binary
표현법을 알면 카르노 맵그려서 조건문 여러개로 나누지 않아도 된다.
void loop() {
// put your main code here, to run repeatedly:
while(Serial.available() > 0){
a = Serial.read();
if(a != '\n'){
for(int i = 0; i < 8; i++){
digitalWrite(led[i], HIGH);
}
}
else{
continue;
}
if(a == '1'){
digitalWrite(led[0], LOW);
digitalWrite(led[4], LOW);
}
else if(a == '2'){
digitalWrite(led[5], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[7], LOW);
digitalWrite(led[3], LOW);
digitalWrite(led[2], LOW);
}
else if(a == '3'){
digitalWrite(led[5], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[7], LOW);
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
}
else if(a == '4'){
digitalWrite(led[6], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[7], LOW);
digitalWrite(led[0], LOW);
}
else if(a == '5'){
digitalWrite(led[5], LOW);
digitalWrite(led[6], LOW);
digitalWrite(led[7], LOW);
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
}
else if(a == '6'){
digitalWrite(led[5], LOW);
digitalWrite(led[6], LOW);
digitalWrite(led[7], LOW);
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
digitalWrite(led[3], LOW);
}
else if(a == '7'){
digitalWrite(led[5], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[0], LOW);
}
else if(a == '8'){
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
digitalWrite(led[3], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[5], LOW);
digitalWrite(led[6], LOW);
digitalWrite(led[7], LOW);
}
else if(a == '9'){
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[5], LOW);
digitalWrite(led[6], LOW);
digitalWrite(led[7], LOW);
}
else if(a == '0'){
digitalWrite(led[0], LOW);
digitalWrite(led[2], LOW);
digitalWrite(led[3], LOW);
digitalWrite(led[4], LOW);
digitalWrite(led[5], LOW);
digitalWrite(led[6], LOW);
}
else if(a == 'q'){
Serial.end();
}
else {
digitalWrite(led[1], LOW);
}
}
}
HIGH는 원래 전류를 주는 것이고, LOW는 전류를 주지 않는 것이다. 근데 코드 작성한 것을 보면, 세그먼트에 아무것도 표시하지 않을 때 HIGH를 이용하고 켜야될 부분에 LOW를 이용했다. 이는 브레드보드에서 POWER부분을 5V로 이용해서 그렇다. 이는 브레드 보드 설명때 언급하겠다.
else if
에서 \n
를 처리해준 이유는 Serial Monitor
에서 입력을 받을 때 Enter
가 들어가서다. 조용히 continue
로다가 처리해줬다.
Serial.Available()
은 입력으로 들어간 글자개수다. abc\n 들어가면 4가 출력된다. 평소에는 0값을 가진다.
Serial.end()는 Serial Monitor에서 더이상 값을 받거나 출력하지 않고 종료한다.
브레드 보드 (bread board)는 크게 3가지로 나뉜다. 연결 전선, 저항, 이용할 기기.
7 세그먼트를 설계할 때 다음과 같이 연결하였다.
컴공생은 이 브레드보드 설계가 가장 어렵다. 인터넷 보고 얼른 배우도록 한다. 이때는 V = IR 공식을 볼 필요가 있다.
여기 설명 잘해준다. 보고오자
따라서 저항과 전선이 같이 쓰여야 전류를 잘 전달 할 수 있고, 전압을 적절하게 잘 넣어줘야 한다는 것을 알 수 있다.
power은 7 segment를 넣을 때 5V로 넣어주어야 하는데, 아래의 공식을 보면 우리는 5V를 구동전압으로 넣어줬다는 것을 알 수 있다.
이 공식을 보면 우리가 왜 반대로 LOW, HIGH
를 반대로 봤는지 알 수 있다.
오직 불을 킬 때는 구동전압을 0V (GND)
로 설정하였다. 그래서 HIGH, LOW를 안바꿔도 됐다.
그래서 설계 후 컴파일, 업로드한 아두이노는 다음과 같다.
아래 그림은 까먹을 까봐 정리한 종류별 저항 값이다.