아두이노 스케치 코드를 pcDuino에서 컴파일하고 실행하는 방법

본 가이드는 인터넷에 연결된 pcDuino를 가정하고 설명하고 있으므로 pcDuino를 미리 인터넷에 연결 시킬 것을 권장합니다.

아래의 글자색은 빨강은 유저가 타이핑하는 스트링, 초록은 보게되는 메세지, 프롬프트는 파랑으로 나타나게 됩니다.

그럼 스케치를 pcDuino에서 컴파일 할수 있는 환경을 구축하도록 하겠습니다. 이러한 셋업은 한번만 하여 놓으면 됩니다.

먼저 pcDuino에서 터미널 창을 실행시키고 아래와 같이 명령을 입력하여 git을 설치합니다.

ubuntu@ubuntu:~$ sudo apt-get install git

home 폴더에서 명령을 타이핑하여야 합니다. 그 다음 아래와 같이 명령을 입력합니다.


ubuntu@ubuntu:~$ cd


ubuntu@ubuntu:~$ pwd

/home/Ubuntu

그 다음으로 아래와 같이 타이핑하여 github에서 개발환경 배포판을 클론합니다.


ubuntu@ubuntu:~$ git clone https://github.com/pcduino/c_enviroment
Cloning into 'c_enviroment'...
remote: Counting objects: 250, done.
remote: Compressing objects: 100% (166/166), done.
remote: Total 250 (delta 87), reused 232 (delta 69)
Receiving objects: 100% (250/250), 302.59 KiB | 78 KiB/s, done.
Resolving deltas: 100% (87/87), done.

클론이 끝나면 c_enviroment 폴더가 생기게 됩니다. 아래의 명령을 타이핑하여 폴더가 생성되었는지 확인합니다.


ubuntu@ubuntu:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos arduino c_enviroment sample

개발환경이 다운로드 되었고 이제 어떻게 컴파일을 하는 지 알아 보겠습니다.

c_envoroment 폴더로 이동합니다.

ubuntu@ubuntu:~$ cd c_enviroment
ubuntu@ubuntu:~/c_enviroment$ ls
Makefile hardware libraries output sample

아래와 같이 make를 실행하여 라이브러리와 예제들을 컴파일 합니다.

ubuntu@ubuntu:~/c_enviroment$ make

여러 컴파일 명령이 화면에 나타나고 메세지의 마지막에는 아래와 같은 메세지가 표시됩니다.


make[1]: Leaving directory `/home/ubuntu/c_enviroment/sample'

컴파일된 바이너리 파일은 output/test 폴더에 있습니다.


ubuntu@ubuntu:~/c_enviroment$ cd output/test
ubuntu@ubuntu:~/c_enviroment/output/test$ ll
total 660
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 06:59 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 27 06:49 ../
-rwxrwxr-x 1 ubuntu ubuntu 13868 Apr 27 06:58 adc_test*
-rwxrwxr-x 1 ubuntu ubuntu 28284 Apr 27 06:58 adxl345_test*
-rwxrwxr-x 1 ubuntu ubuntu 14209 Apr 27 06:58 interrupt_test*
-rwxrwxr-x 1 ubuntu ubuntu 13726 Apr 27 06:58 io_test*
-rwxrwxr-x 1 ubuntu ubuntu 13712 Apr 27 06:59 linker_button_test*
-rwxrwxr-x 1 ubuntu ubuntu 13907 Apr 27 06:59 linker_buzzer_test*
-rwxrwxr-x 1 ubuntu ubuntu 13689 Apr 27 06:59 linker_hall_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 13760 Apr 27 06:59 linker_joystick_test*
-rwxrwxr-x 1 ubuntu ubuntu 13769 Apr 27 06:59 linker_led_bar_test*
-rwxrwxr-x 1 ubuntu ubuntu 13690 Apr 27 06:59 linker_led_test*
-rwxrwxr-x 1 ubuntu ubuntu 14290 Apr 27 06:59 linker_light_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 13696 Apr 27 06:59 linker_magnetic_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 14175 Apr 27 06:59 linker_potentiometer_test*
-rwxrwxr-x 1 ubuntu ubuntu 13658 Apr 27 06:59 linker_relay_test*
-rwxrwxr-x 1 ubuntu ubuntu 28530 Apr 27 06:59 linker_rtc_test*
-rwxrwxr-x 1 ubuntu ubuntu 14136 Apr 27 06:59 linker_sound_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 13832 Apr 27 06:59 linker_temperature_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 13714 Apr 27 06:59 linker_tilt_test*
-rwxrwxr-x 1 ubuntu ubuntu 13689 Apr 27 06:59 linker_touch_sensor_test*
-rwxrwxr-x 1 ubuntu ubuntu 40523 Apr 27 06:58 liquidcrystal_i2c*
-rwxrwxr-x 1 ubuntu ubuntu 40523 Apr 27 06:58 liquidcrystal_spi*
-rwxrwxr-x 1 ubuntu ubuntu 38242 Apr 27 06:59 pn532_readAllMemoryBlocks*
-rwxrwxr-x 1 ubuntu ubuntu 38238 Apr 27 06:59 pn532readMifareMemory*
-rwxrwxr-x 1 ubuntu ubuntu 38240 Apr 27 06:59 pn532readMifareTargetID*
-rwxrwxr-x 1 ubuntu ubuntu 38263 Apr 27 06:59 pn532writeMifareMemory*
-rwxrwxr-x 1 ubuntu ubuntu 13842 Apr 27 06:58 pwm_test*
-rwxrwxr-x 1 ubuntu ubuntu 32336 Apr 27 06:58 serial_test*
-rwxrwxr-x 1 ubuntu ubuntu 14449 Apr 27 06:58 spi_test*
-rwxrwxr-x 1 ubuntu ubuntu 18822 Apr 27 06:59 tone_test*

각 실행 파일에 대한 소스는 sample 폴더에 있습니다.

ubuntu@ubuntu:~/c_enviroment/output/test$ cd ../../sample
ubuntu@ubuntu:~/c_enviroment/output/test$ ll
total 148
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 06:49 ./
drwxr-xr-x 7 ubuntu ubuntu 4096 Apr 27 06:58 ../
-rw-rw-r-- 1 ubuntu ubuntu 1368 Apr 27 06:49 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 467 Apr 27 06:49 adc_test.c
-rw-rw-r-- 1 ubuntu ubuntu 6589 Apr 27 06:49 adx.c
-rw-rw-r-- 1 ubuntu ubuntu 5416 Apr 27 06:49 adxl345_test.c
-rw-rw-r-- 1 ubuntu ubuntu 92 Apr 27 06:49 core.h
-rw-rw-r-- 1 ubuntu ubuntu 830 Apr 27 06:49 interrupt_test.c
-rw-rw-r-- 1 ubuntu ubuntu 781 Apr 27 06:49 io_test.c
-rw-rw-r-- 1 ubuntu ubuntu 430 Apr 27 06:49 linker_button_test.c
-rw-rw-r-- 1 ubuntu ubuntu 1420 Apr 27 06:49 linker_buzzer_test.c
-rw-rw-r-- 1 ubuntu ubuntu 390 Apr 27 06:49 linker_hall_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 327 Apr 27 06:49 linker_joystick_test.c
-rw-rw-r-- 1 ubuntu ubuntu 2202 Apr 27 06:49 linker_led_bar_test.c
-rw-rw-r-- 1 ubuntu ubuntu 613 Apr 27 06:49 linker_led_test.c
-rw-rw-r-- 1 ubuntu ubuntu 1197 Apr 27 06:49 linker_light_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 404 Apr 27 06:49 linker_magnetic_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 647 Apr 27 06:49 linker_potentiometer_test.c
-rw-rw-r-- 1 ubuntu ubuntu 331 Apr 27 06:49 linker_relay_test.c
-rw-rw-r-- 1 ubuntu ubuntu 2505 Apr 27 06:49 linker_rtc_test.c
-rw-rw-r-- 1 ubuntu ubuntu 646 Apr 27 06:49 linker_sound_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 1145 Apr 27 06:49 linker_temperature_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 405 Apr 27 06:49 linker_tilt_test.c
-rw-rw-r-- 1 ubuntu ubuntu 389 Apr 27 06:49 linker_touch_sensor_test.c
-rw-rw-r-- 1 ubuntu ubuntu 797 Apr 27 06:49 liquidcrystal_i2c.c
-rw-rw-r-- 1 ubuntu ubuntu 831 Apr 27 06:49 liquidcrystal_spi.c
-rw-rw-r-- 1 ubuntu ubuntu 2002 Apr 27 06:49 pitches.h
-rw-rw-r-- 1 ubuntu ubuntu 3149 Apr 27 06:49 pn532_readAllMemoryBlocks.c
-rw-rw-r-- 1 ubuntu ubuntu 1690 Apr 27 06:49 pn532readMifareMemory.c
-rw-rw-r-- 1 ubuntu ubuntu 1117 Apr 27 06:49 pn532readMifareTargetID.c
-rw-rw-r-- 1 ubuntu ubuntu 2326 Apr 27 06:49 pn532writeMifareMemory.c
-rw-rw-r-- 1 ubuntu ubuntu 498 Apr 27 06:49 pwm_test.c
-rw-rw-r-- 1 ubuntu ubuntu 2079 Apr 27 06:49 serial_test.c
-rw-rw-r-- 1 ubuntu ubuntu 785 Apr 27 06:49 spi_test.c

위에서 보이는 샘플 스케치 파일(여기서는 linker_led_test.c)의 내용을 확인하려면 아래와 같이 타이핑하십시오.

ubuntu@ubuntu:~/c_enviroment/sample$ cat linker_led_test.c
/*
* LED test program
*/
#include <core.h>
int led_pin = 1;

void setup()
{
if(argc != 2){
goto _help;
}
led_pin = atoi(argv[1]);
if((led_pin < 0) || (led_pin > 13)){
goto _help;
}
pinMode(led_pin, OUTPUT);
return;

_help:
printf("Usage %s LED_PIN_NUM(0-13)n", argv[0]);
exit(-1);
}
void loop()
{
digitalWrite(led_pin, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(led_pin, LOW); // set the LED off
delay(1000); // wait for a second
}

스케치 파일 수정하기

이러한 샘플코드를 수정하기 위해서는 텍스트 에디터가 필요합니다. 여기서는 nano를 사용하는데 다른 텍스트 에디터를 사용하여도 문제가 없습니다. nano가 인스톨 되지 않았다면 아래의 명령으로 설치하십시오.


ubuntu@ubuntu:~/c_enviroment/sample$ sudo apt-get install nano

nano가 다운로드 되고 설치되는 메세지가 보일 것입니다.

아래와 같이 명령을 타이핑하여 에디터를 엽니다.

ubuntu@ubuntu:~/c_enviroment/sample$ nano linker_led_test.c

아래와 같은 화면이 나오면서 소스코드를 수정할수 있습니다.





위의 소스코드를 보고 눈치빠른 독자는 눈치 채셨겟지만 위의 스케치 코드는 command line에서 컴파일됩니다. 이 예제는 command line에서 실행파일이 실행되었을때 어떻게 파라메터를 전달할 수있는지를 보여줍니다. 이러한 파라메터 전달은 옵션이지만 pcDuino상에서 작성한 스케치를 실행하는데 몇몇 도움을 줍니다.

나만의 스케치 코드 만들어 보기

그럼 이제 나만의 스케치 코드를 만들고 컴파일 한뒤에 실행시켜 보도록 하겠습니다. 버튼이 7번핀에 연결되고, 이 버튼일 눌리면 8번에 연결되어 있는 LED를 켜도록 하겠습니다.

아래와 같이 타이핑하여 에디터로 들어갑니다.

ubuntu@ubuntu:~/c_enviroment/sample$ nano button_led.c

아래의 코드를 카피하여 붙여 넣습니다. 참고로 나노에서 오른쪽 마우스 버튼을 누르면 붙여 넣기가 됩니다.

#include <core.h> // Required first line to run on pcDuino
int ledPin = 8;
int buttonPin = 7;
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}

void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}

위의 스케치 코드는 아두이노 예제 코드( http://arduino.cc/en/tutorial/button)를 약간 수정한 것입니다.

Make파일 수정하기 및 컴파일하기

컴파일을 위해서 새로 만든 이 스케치 코드를 sample 폴더의 Make 파일에 추가하여야 합니다. Make파일을 텍스트 에디터로 아래와 같이 입력하여 엽니다.

ubuntu@ubuntu:~/c_enviroment/sample$ nano Makefile


Make파일에 보면 아래와 같은 모든 OBJS를 리스팅한 섹션을 찾을 수 있습니다.


OBJS = io_test adc_test pwm_test spi_test adxl345_test serial_test liquidcrystal_i2c liquidcrystal_spi interrupt_test tone_test
OBJS += linker_led_test linker_potentiometer_test linker_tilt_test linker_light_sensor_test linker_button_test
OBJS += linker_touch_sensor_test linker_magnetic_sensor_test linker_temperature_sensor_test linker_joystick_test
OBJS += linker_rtc_test linker_sound_sensor_test linker_buzzer_test linker_hall_sensor_test linker_led_bar_test linker_relay_test
OBJS += pn532_readAllMemoryBlocks pn532readMifareMemory pn532readMifareTargetID pn532writeMifareMemory

여기 맨뒤에 방금 만든 스케치 코드를 아래와 같이 입력하여 추가합니다.


OBJS += button_led

button_led뒤에 .c가 붙지 않은 점을 주의 하십시오.

파일을 저장하고 nano를 빠져나옵니다. 다음명령을 입력하면 됩니다. <CTRL>X + y + <enter>

make를 타이핑하여 실행시킵니다.


ubuntu@ubuntu:~/c_enviroment/sample$ make

많은 메세지가 표시되고 맨 마지막에 아래와 같은 메세지를 보게 됩니다.


button_led.c -o ../output/test/button_led ../libarduino.a

모든 컴파일이 잘되면 output/test 폴더로 이동하여 생성된 실행파일을 찾습니다.


ubuntu@ubuntu:~/c_enviroment/sample$ cd ../output/test/
ubuntu@ubuntu:~/c_enviroment/sample$ ll
total 676
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 07:51 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 27 06:49 ../
-rwxrwxr-x 1 ubuntu ubuntu 13868 Apr 27 07:51 adc_test*
-rwxrwxr-x 1 ubuntu ubuntu 28284 Apr 27 07:51 adxl345_test*
-rwxrwxr-x 1 ubuntu ubuntu 13668 Apr 27 07:51 button_led*
…..(not showing rest of listing here)

스케치를 실행하기

먼저 led와 스위치가 pcDuino에 연결되었는지 확인하십시오. 스케치를 실행하기 위해서는 아래와 같이 명령을 입력하십시오.

ubuntu@ubuntu:~/c_enviroment/output/test$ ./button_led

프로그램을 멈추려면 다음을 타이핑 하십시오 <Ctrl>C


Comments