도,분,초 -> 도 변환

2019. 9. 7. 23:44

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

NMEA GGA, RMC parsing C code

2019. 9. 6. 20:37

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

GPS의 NMEA 데이터를 115200 bps로 uart로 통신하도록 했지만 주기적으로 data drop이 발생

 

버퍼링의 문제거나 packet 단위로 전송하지 않고 한글자씩 따로따로 전송하는 듯함.

Posted by hyunsungkim
,

BOB-12009 Bi-directional Level Converter

BOB-12009 Bi-directional Level Shifter

로직레벨컨버터

Sparkfun BOB-120009

사용처

로직 레벨은 0과 1을 인식하는 전압을 의미한다. 아두이노를 사용할 때 보통 1 (High)는 5V를 의미하고 0 (Low)는 0V를 의미한다. 하지만, 4.8V를 입력하면 아두이노는 1로 인식하지 못한다는 것은 아니다.

 

아두이노에 사용되는 ATmega328의 datasheet을 보면 다음과 같다.

- voltage lower than 0.3*VCC = LOW
- voltage higher than 0.6*VCC = HIGH

아두이노는 보통 5V 이상에서 구동되므로 3V 이상이면 1, 1.5V이하이면 0으로 인식한다. 1.5V~3V 전압은 0일지 1일지 장담할 수 없다.

 

문제는 3.3V 로직 레벨을 가진 장치가 5V의 신호를 받게 되면 터져버릴 수도 있다는 것이다. 예를 들어, 5V 로직 레벨을 사용하는 아두이노의 GPIO를 3.3V 로직 레벨을 사용하는 ESP8266의 GPIO에 직접 연결하면 ESP8266의 GPIO가 손상될 수 있다.

 

혹은 1.8V 로직 레벨을 가진 장치의 High 신호를 아두이노는 High로 인식하지 못할 수도 있다. 1.8V는 확실히 1이라고 할 수도 없고 확실히 0이라고 할 수도 없는 애매한 영역에 속하기 때문이다.

 

이와 같은 경우에 로직 레벨을 바꿔주는 변환기가 필요하다. 저항으로 전압분배기를 만들어 로직 레벨을 바꿔주는 방법도 있지만 0과 1 사이에서 신호가 빠르게 바뀌는 통신에서는 저항으로 인해 transient time이 길어지며 문제가 생길 수 있다. 그래서 안정적인 작동을 위해서라면 logic converter를 사용하는 것이 좋다.

 

사용법

HV --- 5V의 고정 전압

LV --- 3.3V의 고정전압

GND --- 양쪽 디바이스의 GND

HVx --- 아두이노의 GPIO

LVx --- ESP8266의 GPIO

 

원리

원리는 한 채널 당 한 개의 NMOS를 통해 구현한 것으로 매우 간단하다.

LV1 ---> HV1 로직 레벨 승압

3.3V를 가하면 NMOS의 VGS = 0V 이므로 cutoff되어 HV1은 풀업 전압인 5V를 띈다.

0V를 가하면 NMOS의 VGS = 3.3V > VTH 이므로 saturation mode. HV1은 LV1과 같은 전압인 0V를 띈다.

 

HV1 ---> LV1 로직 레벨 감압

5V를 가하면 LV1이 3.3V인 상태가 평형상태가 된다. 

0V를 가하면 HV1 쪽 핀이 NMOS source가 되면서 saturation mode. LV1은 HV1과 같은 전압인 0V를 띈다.

 

 

회로에 사용된 BSS138의 특성을 보면 HV > LV > 1.5V 이면 작동할 듯. 12V, 5V, 3.3V, 2.8V, 1.8V 레벨에 대해 두루 쓰일 수 있을 것이다.

 

 

주의점

  • 모듈의 크기는 5mm x 6mm 이다. 보이는 것보다 훨씬 작다.
  • 실험 결과 LV1에 3.3V를 인가하면 HV1에서는 정확히 5V가 아닌 4.7V 정도가 출력된다.
  • BSS138의 최대 정격전류가 220mA이므로 로직 수준에서만 사용이 가능하고 전원 공급용으로는 무리가 따른다.

 

참고

BSS138 datasheet : https://www.onsemi.cn/pub/Collateral/BSS138-D.PDF

 

Posted by hyunsungkim
,

이전 글과 같이 SWD 핀으로 보드를 연결한 후 TrueStudio로 디버깅을 하려고 하는데 다음의 오류창과 함께 콘솔 창에 아래의 오류가 뜬다. 아마 TrueStudio를 D: 드라이브에 설치해서 문제가 생기는 것 같은데 간단히 해결이 가능하다.

 

ERROR: Couldn't locate STM32CubeProgrammer in 'C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\Servers\STM32CubeProgrammer\bin', use -cp

 

 

 

해결방법

 

TrueStudio 설치 경로의 "Server" 폴더를 복사한다.

 

 

오류 내용에 따라서 C:\Program Files (x86)\Atollic\TrueSTUDIO for STM32 9.3.0\ 폴더 안에(없으면 새 폴더로 만든다.) "Server" 폴더를 붙여넣는다.

 

 

해결 완료.

 

 

 

Posted by hyunsungkim
,

BLE 개발을 위한 NRF52 DK 개발 보드 기본 사용법을 설명한다. Adafruit 등의 다양한 DK가 있지만 가장 범용성이 큰 PCA10056기반의 DK를 구매했다. 해외 구매를 해야 하고 현재는 eleparts를 통해 구매하는 게 가장 간단해 보인다.

 

NRF52 DK PCA10056

개발을 위해 필요한 툴은 다음과 같다.

 

  • GNU Tools ARM Embedded
  • nRF Command Line Tools
  • NRF5 SDK
  • GNU Make

다음 글은 Windows 10 기준이다.

 

GNU Tools ARM Embedded 설치

소스코드 컴파일을 위해서 필요한 툴이다. 다운로드 링크에 들어가서 개발환경에 맞는 파일을 다운받는다. 나는 최신 버전을 받았을 때 컴파일 작업에서 오류가 나서 7 2018-q2-update로 설치했다. 설치 마지막 단계에서 환경 변수 추가 옵션을 체크해준다. 체크를 하지 않은 경우는 사진을 참고해서 (INSTALL_DIR)\(VERSION)\bin 을 "Path" 환경 변수에 추가해준다.

 

잘 모르겠으면 exe 파일 다운로드 후 실행

 

마지막 단계에서 환경변수 추가(세 번째) 옵션을 체크

설치가 됐는지 확인하기 위해 PowerShell이나 cmd 등의 shell에서 다음을 입력한다.

arm-none-eabi-gcc --version

버전 정보를 나중에 입력해야하니 기억하자. 여기서는 7.3.1 이다.

PS C:\Users\HyunsungKim> arm-none-eabi-gcc --version
arm-none-eabi-gcc.exe (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

nRF Command Line Tools 설치

커맨드라인에서 컴파일 작업, 펌웨어 업로드 등의 작업을 하기 위한 툴이다. 다운로드 링크에 들어가서 아래쪽의 Download 탭에서 설치 파일을 다운로드하여 설치한다. 중간에 뜨는 Segger J-Link USB Driver도 설치한다.

 

 

설치 완료 후 확인을 위해 shell 에서 다음을 입력한다.

nrfjprog --version
PS C:\Users\HyunsungKim> nrfjprog --version
nrfjprog version: 10.3.0
JLinkARM.dll version: 6.44e

오류가 뜰 경우 시스템 환경 변수 "Path"에 다음이 추가돼있는지 확인한다.

C:\Program Files (x86)\Nordic Semiconductor\nrf-command-line-tools\bin\

 

NRF5 SDK 다운로드

개발을 위한 소스파일과 예제 파일을 담고 있다. 다운로드 링크에 들어가서 원하는 버전의 zip 파일을 받은 후 압축해제 하면 된다. 나는 현재 최신 버전인 nRF5_SDK_15.3.0_59ac345.zip 을 받았다.

 

GNU Make 설치

다음을 shell에 입력한다.

make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

버전 정보가 뜬다면 이미 설치가 돼있는 것이며, 오류가 뜬다면 링크를 참고해서 설치를 하고 환경 변수 C:\Program Files (x86)\GnuWin32\bin 추가까지 완료한다.

(위의 링크가 터질 경우 직접 다운로드 링크1, 링크2)

 

 

NRF5 SDK 기본 설정

(NRF5 SDK 설치 경로)\components\toolchain\gcc 접속

 

Makefile.windows의 내용을 편집한다. GNU_INSTALL_ROOT는 GNU Tools ARM Embedded 설치 경로, GNU_VERSION은 쉘에서 확인했던 버전 정보를 넣는다. 아래는 나의 개발 환경에서의 예시이며 잘못 기입할 경우 이후에 컴파일이 되지 않는다.

GNU_INSTALL_ROOT := D:/Util/GNU Tools ARM Embedded/7 2018-q2-update/bin/
GNU_VERSION := 7.3.1
GNU_PREFIX := arm-none-eabi

Makefile.common은 건드릴 것이 없고 리눅스 사용자는 Makefile.posix를 같은 방식으로 편집해준다. 

 

 

예제 컴파일 및 펌웨어 업로드

예제 파일을 업로드해서 스마트폰과 DK 사이의 BLE 통신을 해보자. DK 보드가 peripheral, 스마트폰이 central이 된다. 예제 파일 디렉토리 (NRF SDK 설치 경로)\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc 으로 이동한 후 위쪽 창에 powershell을 입력하여 shell 창을 띄운다.

 

make

정상적으로 진행될 경우 아래와 같이 보여지며 _build 폴더 안에 컴파일된 hex 파일이 생성된다.

PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make
mkdir _build
cd _build && mkdir nrf52840_xxaa
Assembling file: gcc_startup_nrf52840.S
Compiling file: nrf_log_backend_rtt.c
Compiling file: nrf_log_backend_serial.c
Compiling file: nrf_log_default_backends.c

( . . . )

Compiling file: nrf_sdh_ble.c
Compiling file: nrf_sdh_soc.c
Linking target: _build/nrf52840_xxaa.out
   text    data     bss     dec     hex filename
  38172     548    4604   43324    a93c _build/nrf52840_xxaa.out
Preparing: _build/nrf52840_xxaa.hex
Preparing: _build/nrf52840_xxaa.bin
DONE nrf52840_xxaa

DK 보드가 USB로 연결된 상태에서 다음 명령어를 차례로 입력한다. 각각, 기존의 펌웨어를 지우고, softdevice라는 protocol stack을 업로드하고, 마지막으로 위의 make로 컴파일 된 hex파일을 업로드 하는 것이다.

make erase
make flash_softdevice
make flash

정상적으로 진행될 경우 아래와 같이 보여진다.

PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make erase
nrfjprog -f nrf52 --eraseall
Erasing user available code and UICR flash areas.
Applying system reset.
PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make flash_softdevice
Flashing: s140_nrf52_6.1.1_softdevice.hex
nrfjprog -f nrf52 --program ../../../../../../components/softdevice/s140/hex/s140_nrf52_6.1.1_softdevice.hex --sectorerase
Parsing hex file.
Erasing page at address 0x0.
Erasing page at address 0x1000.

( . . . )

Erasing page at address 0x23000.
Erasing page at address 0x24000.
Erasing page at address 0x25000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
nrfjprog -f nrf52 --reset
Applying system reset.
Run.
PS D:\Downloads\nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc> make flash
DONE nrf52840_xxaa
Flashing: _build/nrf52840_xxaa.hex
nrfjprog -f nrf52 --program _build/nrf52840_xxaa.hex --sectorerase
Parsing hex file.
Erasing page at address 0x26000.

( . . . )

Erasing page at address 0x2F000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
nrfjprog -f nrf52 --reset

 

DK 보드를 관찰하면 LED1이 2초 주기로 점멸하는 것을 알 수 있다. 아래의 표에 따르면 advertising 상태라는 의미이며 스마트폰의 연결을 기다리고 있다는 뜻이다.

 

https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.2.0/lib_bsp.html

 

스마트폰과 페어링

구글 플레이스토어에서 nRF Toolbox를 설치한다. 앱을 실행한 후 UART 버튼을 누른 후 "NORDIC_UART"와 페어링한다. 페어링이 되면 DK보드의 LED1이 켜진 상태로 유지된다. 페어링이 된 후 앱 상에서 오른쪽으로 swipe하면 로그 창이 뜬다.

 

DK 보드를 수 분 방치하면 절전 모드(BSP_INDICATE_USER_STATE_OFF)에 들어가서 블루투스 목록에 뜨지 않는다. 보드 상의 Button1이나 reset 버튼을 누르면 절전모드에서 벗어난다.

 

 

아직은 로그만 주고받는 것을 알 수 있다. 메시지를 주고받거나 그 외의 동작을 하기 위해서는 기본 예제를 바탕으로 소스 코드를 편집해야한다. 소스코드와 makefile을 편집한 후 다시 make 부터 시작하면 된다.

 

소스코드: (NRF SDK 설치 경로)\examples\ble_peripheral\ble_app_uart\main.c

Makefile: (NRF SDK 설치 경로)\examples\ble_peripheral\ble_app_uart\pca10056\s140\armgcc

 

노르딕 SDK의 소스코드를 편집하는 것은 훨씬 더 넓은 영역이고 나도 잘 알지는 못한다. 공부를 더 한 후 기회가 되면 포스팅을 시도해보겠다.

 

참고

NRF52 DK 구매 링크: http://eleparts.co.kr/goods/view?no=6756803

GCC 컴파일러 연동: https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/development-with-gcc-and-eclipse

Posted by hyunsungkim
,

STM32F4DISCOVERY나 mbed 계열 개발보드는 ST-Link를 내장하고 있지만 커스텀 보드를 제작할 경우 아래 사진과 같은 ST-Link 를 이용해 프로세서를 프로그래밍 해줘야한다. 하지만 이것이 없어도 개발보드가 있다면 보드에 내장된 ST-Link를 이용하면 아래의 장치 없이 프로그램이 가능하다.

 

ST-Link/V2 디바이스. 가격은 3만원 이상.

 

보드에 내장된 on-board ST-Link 회로는 기본적으로 아래쪽의 프로세서와 연결돼있다. 그리고 동시에 CN2 점퍼 (SWD connector)와 연결돼 있기 때문에 외부 STM32 프로세서를 프로그래밍 할 수 있다.

 

보드의 상부가 ST-Link이며 CN3를 통해 하부의 STM32 프로세서와 연결돼있다.

 

CN3 점퍼 2개를 모두 제거하고, CN2 (SWD) 커넥터를 Table 3.에 따라서 외부 STM32의 핀과 연결해주면 된다. 커스텀 보드에 전원이 공급돼있다면 2번 핀(SWCLK), 3번 핀(GND), 4번 핀(SWDIO) 만 연결해도 프로그래밍과 디버깅이 모두 가능하다.

 

 

사진 상에서 위쪽부터 1번 핀

 

인식이 안될 경우 체크해봐야할 것들

  • 이유는 모르겠지만 커스텀보드의 GND를 SWD GND에 직접 연결하지 않고 아래쪽의 GND에 연결하면 인식이 안되는 경우가 많다.
  • 커스텀 보드 전원을 USB로 공급할 경우 순간적으로 전력이 부족하여 인식이 안될 수 있다.

 

 

참고

Posted by hyunsungkim
,