본문 바로가기

공부

mbed os - 간단한 프로젝트

mbed -cli를 설치하기 위해서는?? 메뉴얼을 따라하면 된다. 그 와중에서 생기는 문제들에 대해서는 전에 포스트를 하였는데, 


기복적으로 지금 포스트를 하는 상황에서 나의 개발환경은 다음과 같다.


윈도우 10

mbed 1.8.3

GNU Embedded Toolchain for Arm 2018-q4-major

파이썬 3.6.6

TARGET=DISCO_L475VG_IOT01A


따라서 나의 예제를 그대로 누군가 따라하고 싶다고 하면, 일단 mbed-cli가 설치되어 있고, 컴파일러가 설치되어 있어야 하며, 것이지만 컴파일을 하는 데에 문제가 없어야 한다. 그런데 어떤 예제가 있어야 컴파일에 문제가 있는지 알 수 있을 것이다. 간단하게 보드 안에 내장된 led를 키고 끄는 작업을 하는 예제를 돌려볼 것이다. 


작업을 원하는 폴더에 가서 다음의 커맨드를 입력했을 때, 툴체인 옵션이 적용되어 있어야 한다. 


1
mbed config --list
cs

적용되어 있지 않다면 다음의 커맨드로 툴체인 옵션을 적용할 수 있다. - GCC_ARM 컴파일러를 사용한다는 가정 하

1
2
mbed config -G GCC_ARM_PATH "본인 PC에서 GNU Tools ARM Embedded안의 내부경로\bin"
mbed config -G TOOLCHAIN "GCC_ARM"
cs

이 옵션은 한 번만 적용하면 두고두고 쓸 수 있다. 


그럼 이제 예제를 돌려볼 것인데, 이미 존재하는 예제를 git clone과 같이 가져올 수 있게 제공한다. 


1
mbed import http://github.com/ARMmbed/mbed-os-example-blinky
cs


이 폴더만 생겼다고 해서 모두 되는 것이 아니라, target을 설정해 주어야 한다. 내가 사용하는 보드에 맞추어서 설정하였다. 


1
2
cd mbed-os-example-blinky
mbed config TARGET "DISCO_L475VG_IOT01A"
cs


이제 컴파일을 해서 보드에 바이너리 파일을 올리면 된다. 처음 import 했다면 mbed-os까지 통째로 가져오는데, 그래서 전체를 컴파일해야 한다.


1
mbed compile –S 
cs


상당한 시간이 걸린다. 그리고 컴파일하는 과정에서 문제가 생길 수도 있다. 이는 상황에 따라 다르기 때문에 일단 구글링을 하라는 정도밖에 말할 수 없겠다. 아니면 나의 이전 포스트를 참고하길 바란다. 


컴파일을 마치고 빌드 과정까지 끝이 나면 폴더 안에 build라는 폴더가 생기는데 그 안에 들어가 보면 프로젝트 이름.bin 이런 식으로 바이너리 파일이 만들어져 있을 것이다. 이를 그냥 끌어다가 usb로 연결된 보드 폴더에 집어넣기만 하면 알아서 업로드가 된다. 


참고로 나는 노트북 환경에서 작업을 하였는데, 상당한 시간이 걸렸고 노트북 전체가 느려졌었다. 여하튼, 이렇게 컴파일을 마치면 앞으로는 바뀐 부분만 다시 컴파일을 할 것이다. 


이제 새로운 프로젝트를 시작하려고 한다. 그러기 위해서 보드 내에 내장되어 있는 다양한 센서들을 활용하려고 하는데 내가 사용하려고 하는 부분은 wifi 그리고 온습도 센서이다. 보드 페이지에 가보면 우측에 줄줄이 예제들이 위치하고 있는 것이 보인다. 이들 중에서 우리가 사용하고자 하는 부분의 예제를 찾아서 사용하면 된다. 첫 번째로 wifi를 사용해 보겠다. 이 보드에서 사용하는 모듈 이름은 ism43362이라고 한다. 이를 사용하기 위한 라이브러리를 추가해주어야 하는데 mbed에서는 아주 편리하게 할 수 있다.


예제에 표기되어 있는 라이브러리 소스 링크를 따라서 들어가면 github주소를 알 수 있다. 이를 복사해서 mbed add ~~ 이 뒤에 붙이기만 하면 된다.


1
mbed add https://github.com/ARMmbed/wifi-ism43362
cs


그러면 알아서 필요한 파일들을 복사해 오고 자리도 알아서 잡아 준다. 그럼, 온습도 센서까지 add해 보자.


참고로 mbed add를 사용하는 자체가 mercurial을 사용하는 것이기 때문에 알아서 hg라는 폴더가 생성된다. 

 

 자 그럼 예제 소스를 보면서 우리가 필요한 부분만 취합해 보자~!!! 라고 생각하면서 예제를 보았는데... 왠걸?? wifi를 연결할 AP의 이름, 비밀번호를 설정하는 부분이 소스에서 보이질 않는다~! ㅠㅠ 이게 어떻게 된 일이냐 하면, 이와 관련된 부분은 cpp소스에 있는 것이 아니라. mbed_app.json에서 설정해 주는 것이다!! 그래서 예제를 그냥 가져다 쓰는 것이 아니라. 예제에 json파일이 추가되어 있다면 의심을 해 보아야 한다. 참고로 json파일은 설정에 관한 부분이기 때문에 작은 변화라도 있으면 풀 빌드를 하게 된다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    "config": {
        "wifi-shield": {
            "help": "Options are internal, WIFI_IDW0XX1",
            "value": "internal"
        },
        "wifi-ssid": {
            "help": "WiFi SSID",
            "value": "\"kkkk1402\""
        },
        "wifi-password": {
            "help": "WiFi Password",
            "value": "\"tgkace1375\""
        },
        "wifi-tx": {
            "help": "TX pin for serial connection to external device",
            "value": "D1"
        },
        "wifi-rx": {
            "help": "RX pin for serial connection to external device",
            "value": "D0"
        },
        "wifi-spi_miso": {
            "help": "SPI-MISO connection to external device",
            "value": "PC_11"
        },
        "wifi-spi_mosi": {
            "help": "SPI-MOSI connection to external device",
            "value": "PC_12"
        },
        "wifi-spi_sclk": {
            "help": "SPI-CLOCK connection to external device",
            "value": "PC_10"
        },
        "wifi-spi_nss": {
            "help": "SPI chip select of external device",
            "value": "PE_0"
        },
        "wifi-reset": {
            "help": "WIFI module reset pin",
            "value": "PE_8"
        },
        "wifi-dataready": {
            "help": "WIFI module data ready pin",
            "value": "PE_1"
        },
        "wifi-wakeup": {
            "help": "WIFI module wakeup pin",
            "value": "PB_12"
        }
    },
cs


예제에서 와이파이 설정, 온습도 센서 설정을 하였다면 이제는 이 온습도 정보를 같은 AP에 연결된 다른 기기에 전송할 수 있다는 것이 된다. 가장 만만한 기기가 바로 핸드폰! 안드로이드폰을 사용하고 있다면 tcp server하는 앱을 다운하면 서버를 구축할 수 있다. 이 서버와 연결하는 소켓을 열어서 온습도 정보를 보내볼 것이다!!


추가 준비물 : AP(비밀번호를 알고 있는 와이파이), tcp 서버 어플리케이션(안드로이드용 tcp server)


만들고자 하는 기능은 다음과 같다.

1. mbed는 온도와 습도를 주기적으로 측정하고 있다.

2. mbed는 AP에 접속해 있고, 이를 통해 핸드폰 서버와 통신을 할 수 있다.

3. mbed에서 측정한 온도와 습도 정보를 주기적으로 핸드폰으로 보내게 된다.


그런데, 여기에서 문제가 생긴다! mbed에서 온습도를 측정하는 주기가 0.5초, 핸드폰 서버로 정보를 보내는 주기가 3초라고 가정해 보자. 

main문은 무한 반복을 하고 있을 것이고, 이 main안에서는  


 측정 -> wait(0.5)

 전송 -> wait(3)


이 두가지 일이 반복되고 있을 것인데... 결과부터 말하자면 전송 후 3초의 대기 시간이 낭비가 된다. 무슨 말이냐 하면 우리가 원했던 것은


전송을 하고 -> 3초간 기다리는 시간이 있는데 -> 이 시간동안 측정은 계속됨


그런데 실제로는


전송을 하고 -> 3초간 기다리는 시간이 있는데 -> 측정도 안하고 그냥 기다리기만 함


결국 우리가 원하는 것은 측정과 전송이 별개로 동작하도록 하는 것이다!!

우리는 mbed os를 사용하고 있다. 그래서 각 기능들에 대해서 thread 함수를 지정해 줄 수가 있다!! 분리를 하기 전과 하고 난 뒤의 예제 모두 작성해 보았는데 혹시나 원한다면 나의 깃허브에서 보길 바란다. 딱히 큰 내용은 없다. 


https://github.com/kimsooyoung/mbed-wifi-hts221