[아두이노 기초] 전체 글 목록


이번시간에는 시리얼통신을 사용하는 방법과 시리얼통신을 활용해 led등의 장치를 조작해보는 일을 해보도록 하겠습니다.

시리얼(RS232) 통신은 무엇인가?

rs232 통신은 주로 ibm 호환 pc에서 쓰이는 시리얼 통신 방법입니다.

예전에는 모뎀연결에 rs232통신을 많이 사용하였으며 최장 1.5m정도로 다소 짧은 통신 거리를 가지고 있습니다.

최근에 나오는 노트북들은 두께,무게를 줄이기 위해서 UART포트를 없애고 있는 추세입니다.

아두이노에서는 기본으로 제공하고 있는 usb포트를 이용해서 UART통신이 가능합니다.

빨간부분이 시리얼통신을 가능하게 해주는 칩입니다.


시리얼 통신 시작하기

1. 우노보드와 pc를 동봉되어있는 usb케이블로 연결합니다.

2. pc에 연결된 usb의 포트번호를 아두이노 ide에서 설정해 줍니다.

3. 아래의 코드를 작성해 줍니다.

void setup()

{

Serial.begin(9600);//시리얼 통신을 보드레이트 9600으로 시작

// Serial.println(“Hellow Arduino”);

}

 

void loop()

{

char read_data;

 

if (Serial.available())//시리얼통신으로 수신된 데이터가 있을때 true

{

read_data = Serial.read();//read_data에 Serial.read()함수로 한글자 불러와 저장

Serial.print(read_data);//read_data를 시리얼로 출력

}

delay(10);

}

설명 : ide의 시리얼통신 창에서 메세지를 입력하면 그메세지가 그대로 ide의 시리얼통신창에 뜨도록 하는 코드입니다.

10ms마다 반복하며 수신된 데이터가 있을때 다시 그데이터를 송신해주는 방식입니다.

4. ide의 시리얼 모니터 실행후 메세지 입력

시리얼 모니터 - 오른쪽위의 돋보기아이콘

5. 시리얼 모니터에 메세지 출력되는지 확인


시리얼 통신으로 LED제어하기

우리는 위에서 시리얼통신이 이상없이 동작하는 것을 확인하였습니다.

그럼 이번에는 시리얼로 아두이노에 명령을 입력했을때 아두이노에서 그 명령에 맞는 동작을 할수 있도록 만들어 보도록 합시다.


1. 회로구성

기본 LED제어 회로와 다른것이 없습니다.

2. 코드 작성

int led1 = 7;

int led2 = 6;

int led1_status = LOW; // LED1 상태

int led2_status = LOW; // LED2 상태

void setup()

{

pinMode(led1, OUTPUT);//핀모드 설정 출력

pinMode(led2, OUTPUT);

digitalWrite(led1, LOW);//핀의 초기값 LOW = LED OFF

digitalWrite(led2, LOW);

Serial.begin(9600);//시리얼 통신 시작

}

void loop()

{

char read_data;

if (Serial.available())

{

read_data = Serial.read();//시리얼통신으로 수신한데이터 read_data에 저장


if( read_data == '1' && led1_status == LOW)//read_data값이 1이고 led1이 off상태일때

{

digitalWrite(led1, HIGH);//led1 on

led1_status = HIGH;

Serial.println("LED1 ON");

}

else if( read_data == '1' && led1_status == HIGH )//led1이 on상태일때

{

digitalWrite(led1, LOW);//led2 on

led1_status = LOW;

Serial.println("LED1 OFF");

}

if( read_data == '2' && led2_status == LOW)

{

digitalWrite(led2, HIGH);

led2_status = HIGH;

Serial.println("LED2 ON");

}

else if( read_data == '2' && led2_status == HIGH )

{

digitalWrite(led2, LOW);

led2_status = LOW;

Serial.println("LED2 OFF");

}

}

delay(10);

}

 


설명 : 시리얼로 메세지를 받아 1일때는 led1에대한 동작을 하고 2일때는 led2에대한 동작을 하도록 하였고 동작정보를 시리얼로 출력하도록 하였다.

이때 led현재상태를 저장하는 변수(led1_status, led2_status)를 만들어 off상태일때는 on하고 on상태일때는 off하도록 설정 하였다.

코드를 업로드 한뒤 시리얼모니터에 1 또는 2를 입력하면 아두이노에 연결된 led가 동작할 것이다.

또한 위와 같이 시리얼로 아두이노가 어떤 동작을 하였는지 출력되는 것을 볼수 있다.


시리얼 통신 복습하기

1. LED를 전 후 좌 우 4방향에 배치 한뒤 숫자키패드의 화살표 키를 이용하여 4개의 LED를 제어하기

위의 코드의 if문만 조금 수정하면 쉽게 성공하실수 있을 것입니다.


오늘은 시리얼 통신에 대해 알아보았습니다. pc와 아두이노 간의 통신이 생각보다 정말 간단하죠.

다음시간에는 아날로그 입출력에 대해 공부해보도록 하겠습니다.


[아두이노 기초] 전체 글 목록

우리는 디지털 입출력방법에 대해 배웠으므로 이번시간에는 부저를 사용하여 소리를 내어보도록 하겠습니다.

그렇다면 부저는 무엇일까요?

부저는 TV, 세탁기, 에어컨 등에서 Alarm음으로 사용되기도 하고 도난 경보기, 디지털 도어 록등에서 사용되는 작은 스피커라고 생각하면 됩니다.


디지털 출력으로 부저 울리기

1초에 한번씩 부저를 켰다 껐다 반복하도록 제작

디지털핀 8번으로 출력을 주어 부저를 동작하게하는 구조입니다.

int buzzer = 8;

void setup()

{

pinMode(buzzer, OUTPUT);

}

 

void loop()

{

digitalWrite(buzzer, HIGH); // Buzzer on

delay(1000);

digitalWrite(buzzer, LOW); // Buzzer off

delay(1000);

}

pinMode로 8번핀을 출력으로 설정하였습니다.

digitalWrite를 사용하여 부저를 on한뒤 1초뒤에 off하는것을 반복합니다.


코드를 업로드한뒤 동작을 확인하여보면 1초에 한번씩 부저가 켜졌다 꺼졌다 하는것을 볼수 있습니다.


실습예제

1. 버튼으로 디지털입력을 받아서 부저를 울리도록 구현

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저는 출력핀에 연결

int buzzer = 8;

int button =9;

void setup()

{

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(buzzer,HIGH);

else

digitalWrite(buzzer,LOW);

}

2. 버튼으로 디지털입력을 받으면 LED는 켜져있고 부저는 ON/OFF반복 구현 

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저, led는 출력핀에 연결

int led=7;

int buzzer = 8;

int button =9;

int buzzer_count=0;

int buzzer_flag=0;

void setup()

{

pinMode(led, OUTPUT);

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(led,HIGH);

else

digitalWrite(led,LOW);


if(buzzer_count<200)

{

buzzer_count++;

}

else

{

buzzer_count=0;

if(buzzer_flag==0)

buzzer_flag=1;

else

buzzer_flag=0;

}

if(buzzer_flag)

digitalWrite(buzzer.HIGH);

else

digitalWrite(buzzer,LOW);

}

코드를 꼭 이해하시고 더좋은 방향을 바꾸어 보시길 바랍니다.

다음시간에는 시리얼 통신에 대해 알아보도록 하겠습니다.

[아두이노 기초] 전체 글 목록

1. 디지털 출력이란?

아두이노에서 출력은 크게 디지털 방식과 아날로그 방식으로 나눌 수 있다.그중 디지털 출력은 마이크로 컨트롤러의 특정 핀의 전압을 HIGH 또는 LOW로 설정하는 것입니다. 


위에 보이는 부분이 디지털 입출력핀 입니다. 총 13개를 사용할수 있습니다.


2. LED 제어하기

아두이노 하드웨어 외부에 브레드보드를 이용해서 LED를 깜박이도록 해보겠습니다.

500msec(0.5) 간격으로 LED 2개가 동시에 켜졌다가 꺼졌다가를 반복하도록 설정해 봅시다.

필요한 부품은 브래드보드 1개, 아두이노 uno, led와 1k옴 저항 2개 입니다.


A. 회로구성하기

회로구성을 아래 그림과 같이 합니다.

회로를 간단히 설명하자면 디지털출력 핀 8, 9번에서 5v출력을 내어주면 저항을 거쳐 led로 들어가 불이켜지게 된후 gnd그라운드로 빠져나가게 되는것입니다. (여기서 적색 5v선은 사용하지 않습니다.)


B. 소스코드 작성하기

int led1 = 8;

int led2 = 9;

 

void setup()

{

pinMode(led1, OUTPUT);

pinMode(led2, OUTPUT);

}

 

void loop()

{

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

 

delay(500);

 

digitalWrite(led1, LOW);

digitalWrite(led2, LOW);

 

delay(500);

}

소스코드에 내용을 하나하나 설명하도록 하겠습니다.

int led1 =8 int led2 = 9 : led가 연결된 디지털 핀의 번호를 설정

void setup() : 반복문에 들어가기전 설정하는 부분

pinMode(led1,OUTPUT) : 해당핀의 모드를 설정합니다. (대문자 주의)

OUTPUT=출력  INPUT=입력

void loop() : 코드가 시작되고 계속해서 반복되는 부분 ex)while(1)

digitalWrite(led1,HIGH) : led1번핀에 HIGH신호를 준다. 5v출력->LED ON

delay(500) : 500ms(0.5초)동안 딜레이를 준다.

digitalWrite(led1,LOW) : led1번핀에 LOW신호를 준다 5v출력 x->LED OFF


코드를 보드에 업로드 하고 동작을 확인해 보면 2개의 LED가 0.5초 간격으로 동시에 켜지고 동시에 꺼지는 것을 확인할 수 있습니다.


C. 여러 예제 직접 시도해보기

이부분이 가장 중요한 부분입니다. 항상 자신이 직접 생각해보는 것이 중요하기 때문에 간단한 소스코드지만 이것을 조금씩 수정해보며 해결해 보시길 바랍니다.

1. 2개의 LED를 서로 번갈아가며 깜빡이게 만들기.

2. LED1은 0.5초 간격 LED2는 0.25초 간격으로 깜빡이게 만들기.

꼭 해보시길 바랍니다! 궁금한 사항이 있으면 댓글로 질문해주세요. 빠른시간안에 답변해드리겠습니다.




[아두이노 기초] 전체 글 목록

통합개발환경(IDE)란?

아두이노 개발을 쉽게 할수 있도록 도와주는 도구로써 관련 라이브러리와 컴파일과 관련된 기계어를 아두이노에 업로드 해주는 스케치 프로그램이다.


다운로드 및 설치방법

통합개발환경(IDE) 다운로드

다운로드를 눌러 사이트로 접속하면 위의 사진과 같이 보일것이다. 그럼 오른쪽에 자신의 컴퓨터에 맞는 버전을 골라 다운로드후 설치하면 된다.

윈도우10를 쓰는 경우는 윈도우 앱스토어에서 아두이노 IDE를 검색하여 설치하여도 간단히 설치할 수 있다.


IDE사용 방법

IDE를 처음 실행시키면 위의 화면이 보입니다.

그럼 차례대로 기능을 알아보도록 합시다.

 컴파일 버튼 : 작성한 코드를 컴퓨터 언어로 컴파일

 업로드 버튼 : 컴파일 후 아두이노로 코드 업로드

시리얼 모니터 : 아두이노와 시리얼 통신을 하여 상태를 읽고 씀

텍스트에디터 : 스케치를 작성하는 부분

콘솔 :  프로그램의 에러나 컴파일 상태를 나타내는 부분


IDE기본 세팅 방법

IDE를 설치 하였으니 처음 아두이노를 연결하는 방법을 알아보도록 하자.

우리는 아두이노 UNO보드를 사용할 것이므로 

툴-보드매니저-Arduino/Genuino UNO를 선택해준다.


선택을 완료했으면 아두이노와 IDE를 연결할 포트를 설정해 주자.

툴-포트-COM번호(Arduino/Genuino Uno) 


이렇게 해주면 기본 세팅이 완료된다.

다음시간에는 간단한 LED를 키고 끌수 있는 것을 직접 코딩해보도록 하자.


c언어는 기본적으로 순차적진행 이에요. a->b->c이러한 순서로 내려가면서 차례대로 수행하게 되죠

예를들어 

printf("hello world\n");

printf("c언어 시작!\");

이문장은

hello world

c언어 시작!

이렇게 출력이 되죠

그렇다면 만약에 ~~~이면 a를 실행하고 ~~~가 아니면 b를 실행하게 할수있는 방법이 있을까요?

그방법이 바로 if문이에요.

if문은 괄호 안에 내용이 참이면 아래부분을 실행하고 거짓이면 {}안에 부분을 실행하지않고 내려가게 된답니다.

 if(조건내용)

{실행될부분}


그럼 if문을 이용한 간단한 코드를 보도록 해요.

#include<stdio.h>

int main()

{

int a, b, c, big;

printf("비교할 숫자 3개를 입력하세요\n");

scanf("%d%d%d",&a,&b,&c);

if(a>b)

big=a;

else

big=b;

if(big<c)

big=c;

printf("%d,%d,%d중 가장큰수는 %d 입니다.\n",a,b,c,big);

return 0;

}


3가지 수를 입력받아 가장큰수를 비교하는 코드에요.

a랑 b를 비교해서 큰수를 big안에 넣고 그 big과 c를 비교해서 big보다 c가 더크면 big=c 를 해주게되죠.

그런데 여기서 else는 무엇일까요?

else는 if안에 조건이 거짓이면 나를 실행해!!하고 이야기해주는 부분이에요.

그러니까 a=1 b=2일때 a>b이면 이것은 거짓이죠.

이때 else문이 실행되어 big=b가 되는 거에요.


이번엔 이 예제를 보도록 해요.

#include<stdio.h>

main()

{

int score;

char grade;

puts("성적을 입력하세요:");

scanf("%d",&score);

if(score>=90)

grade='A';

else if(score>=80)

grade='B';

else if(score>=70)

grade='C';

else if(score>=60)

grade='D';

else

grade='F';

printf("%d%c입니다\n",score, grade);

}

성적을 socre에 입력받고 그결과를 if문으로 비교해서 내성적이 A인지 B인지 C인지 계속 비교해 나가고 있어요.

방금 if와 else는 봤는데 else if는 무엇일까요?

else if는 위에있는 if문이 거짓이면 날 비교해!! 하는 함수에요. 

if-> else if-> else if-> else

if가아니면 else if 안에 조건을 비교해! 얘도 아니면 다음 else if안에 조건을 비교해! 다아니면 else야!

결국 위에 코드는 90이상이면 A 90이상은 아닌데 80이상이면 B 80이상도 아닌데 70이상이면 C 이런식으로 계속비교해 나가는 거죠.


오늘은 if문에대해서 살짝 살펴봤어요. 다음 시간에는 if문과 비슷한 switch문에대해 살펴보도록 해요.


+ Recent posts