고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

C#과 아두이노 연동

2015-10-14 14:11:00

개요

 

c#은 마이크로 소프트에서 개발한 객제 지향 프로그래밍 언어입니다. 닷넷이라는 플랫폼에 걸맞게 새로운 프로그래밍 언어라는 슬로건을 달고 만든 언어인데요.

 

마이크로소프트의 프로그래밍 언어라고하면 대표적인 C언어가 있으나 C#은 C언어보다는 JAVA언어와 유사한 문법을 지니고 있습니다.

아래의 코드는 C#에서 Hello world!를 출력하는 코드입니다.

프로그래밍 언어를 공부하는 유저라면 아래의 코드를 보더라도 한눈에 JAVA와 비슷한것을 볼 수 있습니다.

 

 

 

하지만 JAVA와 비슷한 문법을 따라가지만 C언어의 특징도 가지고 있기 때문에(구조체나 포인터) 어떻게 보면 프로그래밍 언어를 대표하는 C와 JAVA의 장점만을 모아서 섞어 만든 언어라고도 볼 수 있습니다.

 

아래의 사진을 보시면 C#이 프로그래밍 개발에서 얼마나 많이 쓰이는 언어인지 알 수 있습니다.(출처 : REDMONK 2015년 6월 기준)

(1위부터 순서대로 => 1 JavaScript, 2 Java, 3 PHP, 4 Python, 5 C#, 5 C++, 5 Ruby, 8 CSS, 9 C, 10 Objective-C)

 

 

 

또 C#의 장점이라 하면 비주얼베이직과 같이 UI개발이 쉽습니다.

손쉽게 UI개발이 가능한데 사용법도 쉬우니까 조금만 공부하면 아두이노와 연동하기도 쉽습니다.

 

이번글에서는 버튼을 만들어서 LED를 켜고 꺼보겠습니다.

 

 

c# 사용하기

 

C#을 사용하기 위해서는 비주얼 스튜디오의 설치가 필요합니다. 

비주얼 스튜디오는 마이크로소프트 홈페이지에서 설치할 수 있는데요. 설치 방법에 대해서는 인터넷에서 손쉽게 정보를 얻을 수 있습니다.

(학생일 경우 무료로 비주얼스튜디오를 사용할 수 있습니다.)

 

코코아팹의 아래 링크에서도 간단한 설명을 볼 수 있습니다. (Visual Micro 사용할때도 비주얼 스튜디오 2013을 사용하였습니다~!!)

http://kocoafab.cc/tutorial/view/462

 

1. UI만들기

 

비주얼 스튜디오가 다 설치되었다면 아래 사진을 따라해보시면 됩니다.

FILE - NEW - PROJECT를 클릭합니다.

 

 

 

프로젝트를 누르시면 아래와 같은 창을 볼 수 있습니다.

우리가 사용할 언어는 C#이기 때문에 템플릿에서 C#을 클릭합니다. 

그리고 나서 Windows Forms Application을 클릭합니다.

Windows Forms Application은 간단하게 설명하면 UI가 있는 윈도우 창을 생성할 수 있는 프로젝트입니다.

우리는 LED를 켰다 껐다 할 수 있는 윈도우 창이 필요합니다.

 

프로젝트 이름은 편하게 지으시면 됩니다. 여기서는 기본 이름(Windows Forms Application1)으로 하겠습니다.

 

 

 

생성하고 나면 아래와 같은 창을 볼 수 있습니다.(C#의 확장자는 .cs입니다.)

흰색의 배경이 있는 창이 이제 우리가 꾸며볼 윈도우 입니다. 현재는 아무런 도구가 들어있지 않기 때문에 그냥 흰색 배경입니다.

이 창에 우리는 버튼을 빨리 만들고 싶기 때문에(?) 사진 왼쪽 상단에 보이는 Toolbox를 눌러줍시다.

Toolbox는 이 윈도우 창을 꾸며줄 여러 컴포넌트가 존재합니다.

 

 

 

툴박스를 누르면 새로운 창을 왼쪽에서 볼 수 있는데 Common Controls를 누르면 자주 쓰이는 툴이 보입니다.

버튼을 만들어야 하기 때문에 2번째에 보이는 Button을 클릭 후 중앙에 있는 윈도우 창에서 사진을 올리듯이 드래그를 통해 버튼을 만들어 줍시다!!

 

 

 

버튼을 2개 만들어 보았습니다~!! 하나는 켜는 버튼이고 하나는 끄는 버튼입니다.

근데 이름이 버튼1, 버튼2라니 좀 그렇네요. 이름을 LED ON, LED OFF로 바꿔봅시다.

 

 

 

버튼을 클릭 후 왼쪽 하단을 보면 Properties가 보입니다. 이 탭에서는 버튼에 관한 속성을 설정할 수 있습니다. 

버튼의 이름을 바꿔야하기 때문에 중간쯤에 보시면 Text라는 요소를 볼 수 있습니다. Button1로 되어있는데 각각 LED ON LED OFF로 바꿔줍시다.

 

 

 

LED ON과 LED OFF버튼을 만들었습니다. 

저는 폰트 크기까지 변경해서 글씨를 살짝 크게 만들었습니다.(폰트의 크기또한 Properties에서 조절할 수 있습니다. Font라는 항목을 보실 수 있어요.)

여기까지 잘 따라오셨다면 반은 오신거에요~!!!!!!!

 

 

 

2. 소스코드 만들기

 

이제는 코드를 만들 차례입니다.

위 버튼을 만들고나서 Form1이라는 창을 더블클릭하고 LED ON버튼 LED OFF버튼을 각각 더블 클릭한다면 아래와 같은 기본틀은 구성되어 있는 소스코드 창을 볼 수 있습니다.

 

 

 

소스코드 창을 보면 이제부터 머리가 아파지기 시작하는데 어려운것이 없습니다.

 

button1_Click은 버튼1(LED ON)을 더블 클릭 했을 때 생기는데 이 함수에서는 LED ON을 눌렀을때의 이벤트를 만들어 줄 수 있습니다.

마찬가지로 button2_Click은 버튼2(LED OFF)을 더블 클릭 했을 때 생기고 이 함수에서는 LED OFF를 눌렀을때의 이벤트를 만들어 줄 수 있습니다.

Form1_Load는 Form1 윈도우 창을 눌렀을 때 생기는 함수로 창이 열렸을 때의 이벤트를 설정할 수 있습니다.

 

자, 우리가 할일은 LED ON을 눌렀을 때 아두이노에게 LED를 켜라는 신호를 주고, LED OFF를 눌렀을 때 아두이노에게 LED를 끄라는 신호를 주면 됩니다.

 

 

그런데 일단 버튼에 신호를 주기전에 중요한 것이 있습니다!

C#과 아두이노가 서로 통신이 되게 해야 합니다. 

아두이노와 C#은 시리얼통신을 통해 서로 데이터를 전송할 수 있습니다!

 

소스코드 상단에 아래와 같은 구문을 추가해 줍시다.

 

using System.IO.Ports;  //시리얼 통신을 사용하기 위한 선언

 

 

 

시리얼통신을 사용하기 위한 환경을 만들었으면 이제 사용하기 위해 시리얼포트를 생성합니다.

 

private SerialPort arduSerialPort = new SerialPort();  //시리얼 포트 생성

 

 

 

우리가 만든 폼에서는 시리얼포트에 대한 정보를 작성합니다.

포트를 열고 어떤 포트 번호를 사용하고 어느정도의 Baud rate를 사용할지 정해줘야 그 포트와 통신을 하겠죠?

 

arduSerialPort.PortName = "COM10";    //아두이노가 연결된 시리얼 포트 번호 지정
arduSerialPort.BaudRate = 9600;       //시리얼 통신 속도 지정
arduSerialPort.Open();                //포트 오픈

 

 

 

위 과정까지 끝났다면 이제 시리얼 포트를 사용하기 위한 준비는 끝났습니다.

이제 버튼을 눌렀을 때 이벤트를 지정해 줍시다.

 

버튼을 눌렀을 때 중요한것은 아두이노에게 값을 전달해 주는 것입니다.

전달하는 방법은 간단합니다.

 

arduSerialPort.Write("1"); //연결된 시리얼포트로 "1"의 값을 전달
arduSerialPort.Write("2"); //연결된 시리얼포트로 "2"의 값을 전달

 

 

 

버튼을 눌렀으면 이제 누른 버튼은 사용하지 못하게 막습니다.

 

button1.Enabled = false; //버튼1을 비활성화
button2.Enabled = true;  //버튼2를 활성화

 

 

 

위 정도까지 소스를 만약 이해했다면 위 소스만으로도 이제 완성할 수 있습니다.

아래는 전체소스입니다.

 

C# 코드

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private SerialPort arduSerialPort = new SerialPort();  //시리얼 포트 생성
        public Form1()
        {
            InitializeComponent();
            arduSerialPort.PortName = "COM10";    //아두이노가 연결된 시리얼 포트 번호 지정
            arduSerialPort.BaudRate = 9600;       //시리얼 통신 속도 지정
            arduSerialPort.Open();                //포트 오픈
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            arduSerialPort.Write("1"); //연결된 시리얼포트로 "1"의 값을 전달

            button1.Enabled = false; //버튼1을 비활성화
            button2.Enabled = true;  //버튼2를 활성화     
        }

        private void button2_Click(object sender, EventArgs e)
        {
            arduSerialPort.Write("0"); //연결된 시리얼포트로 "0"의 값을 전달

            button1.Enabled = true;  //버튼1를 활성화
            button2.Enabled = false; //버튼2을 비활성화
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (true == arduSerialPort.IsOpen) //포트가 열려있다면
            {
                arduSerialPort.Close();        //포트를 닫는다
            }
        }

    }
}

 

 

 

아두이노에서는 0과 1의 값을 받고 그 값에 따라 LED를 켜고 끄는 정도의 소스만 업로드해주시면 됩니다.

 

아두이노 코드

const int ledPinNum = 13;

void setup() {
	Serial.begin(9600);
	pinMode(ledPinNum, OUTPUT);
}

void loop() {
	//계속적으로 문자를 읽어들인다
	char ch = Serial.read(); 
	//'0'를 읽을 경우 LED을 OFF 시킨다
	if (ch == '0') { 
		digitalWrite(ledPinNum, LOW);
		
	//'1'을 읽을 경우 LED를 ON 시킨다
	} else if (ch == '1') { 
		digitalWrite(ledPinNum, HIGH);
	}
}

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

C#, 아두이노, 기타

송덕원 2015-10-17 02:09:09

잘 봤습니다. 혹시 반대로 아두이노에서 값을 읽어오는 예제와 관련된 글도 포스팅 예정이신가요?

수박쨈 2015-10-21 16:54:52

아 간단한 소개글만 올리려 했었는데 일단은 사용뒤에 올릴 수 있다면 올리도록 하겠습니다.

usa1234 2017-01-22 16:43:42

C# 으로 오렌지보드 블루투스로 연결하려고 하는데 저 코드에서 어떻게 응용하면 좋을까요?

배우고싶어요 2017-11-24 16:03:42

아두이노를 이용해서 데이터를 보낸것을 C#으로 수신하는 예제는 없나요?