레이블이 TI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 TI인 게시물을 표시합니다. 모든 게시물 표시

2015년 3월 11일 수요일

Ti SensorTag UUIDs

TMP006 IR Temperature Sensor

Type
UUID
Handle
Read/Write
Format
<Data>
AA01 *
0x25
Read/Notify
ObjLSB ObjMSB AmbLSB AmbMSB (4 bytes) 
<DataNotification>

0x26
R/W
2 bytes
<Configuration>
AA02 *
0x29
R/W
1 byte
<Period>
AA03 *

R/W
1 byte

Kionix KXTJ9 Accelerometer

Type
UUID
Handle
Read/Write
Format
<Data>
F000 AA11 *
0x2D
Read/Notify
X : Y : Z (3 bytes)
<DataNotification>

0x2E
R/W
2 bytes
<Configuration>
F000 AA12 *
0x31
R/W
1 byte
<Period>
F000 AA13 *
0x34
R/W
1 byte


Sensirion SHT 21 Humidity Sensor

Type
UUID
Handle
Read/Write
Format
<Data>
AA21 *
0x38
Read/Notify
TempLSB TempMSB HumLSB HumMSB (4 bytes) 
<DataNotification>

0x39
R/W
2 bytes
<Configuration>
AA22 *
0x3B
R/W
1 byte
<Period>
AA23 *

R/W
1 byte


Freescale MAG3100 Magnetometer

Type
UUID
Handle
Read/Write
Format
<Data>
AA31 *
0x40
Read/Notify
XLSB XMSB YLSB YMSB ZLSB ZMSB (6 bytes)
<DataNotification>

0x41
R/W
2 bytes
<Configuration>
AA32 *
0x44
R/W
1 byte
<Period>
AA33 *
0x47
R/W
1 byte


Epcos T5400-C953 Barometric Pressure Sensor

Type
UUID
Handle
Read/Write
Format
<Data>
AA41 *
0x4B
Read/Notify
TempLSB TempMSB PressLSB PressMSB (4 bytes)
<DataNotification>

0x4C
R/W
2 bytes
<Configuration>
AA42 *
0x4F
R/W
1 byte
<Calibration>
AA43 *
0x52
Read only
C1LSB C1MSB .. C8LSB C8MSB (16 bytes)
<Period>
AA44 *

R/W
1 byte


Invensense IMU-3000 Gyroscope

Type
UUID
Handle
Read/Write
Format
<Data>
AA51 *
0x57
Read/Notify
XLSB XMSB YLSB YMSB ZLSB ZMSB (6 bytes)
<DataNotification>

0x58
R/W
2 bytes
<Configuration>
AA52 *
0x5B
R/W
1 byte
<Period>
AA53 *

R/W
1 byte

Simple Key Service

Type
UUID
Handle
Read/Write
Format
<Data>
FFE1
0x5F
Notification only
Bit2: side key, Bit1: right key, Bit0: left key


















TI SensorTag

Bluetooth Low Energy(BLE)를 테스트 하기에 가장 좋은 장비중에 하나가 TI에서 나온 SensorTag이다.


저렴한 가격($29)에도 불구하고 믿을수 없을만큼 다양한 센서가 장착되어 있어 여러가지 테스트를 해 볼 수 있다. 그리고 CR2032 배터리 하나로도 몇달 이상 동작할만큼 저전력으로 동작한다.

TI의 CC2541을 사용하고 있고 총 6종류의 센서와 2개의 푸쉬버튼 스위치를 가지고 있다. 장착되어 있는 센서의 종류는 다음과 같다.
  • TMP006 - IR Temperature sensor (비접촉으로 물체의 온도를 측정)
  • C953H - Barometric Pressure sensor (기압 측정)
  • MAG3110 - Magnetometer (3축 디지털 컴파스)
  • IMU3000 - MEMS Gyroscope (3축 자이로스코프)
  • KXTJ9-1007 - Accelerometer (3축 가속도 측정)
  • SHT21 - Humidity sensor (온습도 측정)




쉽게 사용해 볼 수 있도록 iOS, Android용 앱도 나와있고, SensorTag를 사용하는 프로그램을 쉽게 만들 수 있도록 스마트폰 앱에서 접속에 필요한 소스코드 부분을 자동으로 생성해주는 기능까지 가지고 있다.





 그리고 앱에서 SensorTag에 설치된 펌웨어를 OTA로 업데이트 하는것도 가능하다.

좀 더 상세한 내용은 TI의 SensorTag User Guide 를 참고하면 된다.

다음번 포스트에서는 인텔 에디슨에서 SensorTag에 연결해 센서의 값을 읽거나 푸쉬버튼을 누른것을 통보받는등의 기능을 실험해 보도록 하겠다.

에디슨에서 SensorTag 사용하기



2015년 2월 5일 목요일

Blue Basic...CC2540/2541을 쉽게 사용하기

Bluetooth Low Energy (BLE)에서 가장 많이 사용되는 칩들중에 하나가 TI의 CC2540/2541이다. 이 SoC에는 BLE관련 회로 뿐 아니고 8051 코어도 같이 들어있어 단순히 BLE 통신용 모듈로서만 사용하는게 아니고 추가로 자신의 어플리케이션 코드를 집어넣어 별도의 추가 프로세서 없이 standalone으로 사용할수도 있다. 


개발을 위한 툴들도 거의 다 무료로 구할 수 있지만 문제는 개발을 위해 공부해야 하는 것이 상당히 많다는 것이다. 



그래서 이 CC2540/2541 환경에서 개발을 쉽게 할 수 있도록 나온것이 Blue Basic이다. Blue Basic은 CC2540/2541에서 실행되는 BASIC 인터프리터로 별도의 추가 툴 없이 쉽게 프로그램을 만들 수가 있다. 

기본적으로 BASIC 언어를 사용하지만 실제 프로그램을 만들려면 블루투스 스택 뿐 아니고 CC254x 칩의 하드웨어들(UART, SPI, I2C, 타이머 등)을 쉽게 사용할 수 있는게 필수적이다. 그래서 이 목적을 위해 BASIC언어를 약간 확장했고, 가능한 최대로 아두이노의 표기를 따르려고 노력했다. 예를들어 P0(0)을 입력으로 사용하려고 하면 아두이노에서 'pinMode(A0, INPUT)' 을 사용하는것 처럼 BASIC 명령 'PINMODE P(0) INPUT' 을 사용하면 된다. 블루투스 키워드는 쉽게 서비스를 만들어 다른 하드웨어에 쉽게 연결할 수 있게 되어 있다. 

간단한 서비스는 다음과 같이 만들 수 있다.

10 ADVERT GENERAL
20 ADVERT "25FB9E91-1616-448D-B5A3-F70A64BDA73A"
30 ADVERT END
40 GATT SERVICE "25FB9E91-1616-448D-B5A3-F70A64BDA73A"
50 GATT CHARACTERISTIC "D8ABBBE7-F10B-4EC3-B781-DBCBD2334400" "On/Off"
60 GATT READ WRITE A ONWRITE GOSUB 200
70 GATT END
80 PINMODE P0(0) OUTPUT
90 GOSUB 200
100 END
200 P0(0) = A
210 RETURN
BASIC을 처음 보는 사람이라고 해도 대강의 내용은 이해가 될 것이다. 물론 설명해야 할 부분은 많이 있지만 기본적으로 한개의 컨트롤을 on/off하는 서비스를 advertise하고, 이 서비스 값을 출력해 외부 장치를 제어한다. 예제 보드에서는 이 출력이 LED에 연결되어 있다.

Blue Basic을 사용하려면 CC254x를 사용한 BLE 모듈의 펌웨어를 교체해야 한다. 모듈은 aliexpress에서 $5~7정도에 구할 수 있고, 펌웨어를 업데이트 하기 위해서는 TI CC Debugger가 필요하다. 


일단 Blue Basic 펌웨어가 올라가면 그 이후는 PC/Mac/iPhone/Android용 콘솔 프로그램을 사용해 코드를 입력하면서 바로 실행시켜 볼 수가 있다.



Blue Basic을 이용해 iBeacon을 만드는 코드 예제이다.

10 // "A Simple iBeacon service"
20 DIM M(5)
30 // "Major (0-65535)"
40 M(0) = 0
41 M(1) = 2
50 // "Minor (0-65535)"
60 M(2) = 0
61 M(3) = 4
70 // "Power"
80 M(4) = 0xC8
90 ADVERT GENERAL
100 ADVERT CUSTOM "FF 4C 00 02 15" "74 27 8B DA B6 44 45 20 8F 0C 72 0E AF 05 99 35" M "00"
110 ADVERT END
120 // SET A NAME IN THE SCAN RESPONSE
130 SCAN NAME "iBeacon"
140 SCAN END
AUTORUN ON

좀 더 상세한 설명은 github를 참조하면 된다.


2013년 6월 7일 금요일

Stellaris Launchpad SysTick Interrupt 사용하기

SysTick 인터럽트를 사용하여 LED를 점멸시켜 보도록 하겠다.


  1. #include "inc/hw_types.h"
  2. #include "inc/hw_memmap.h"
  3. #include "driverlib/systick.h"
  4. #include "driverlib/interrupt.h"
  5. #include "driverlib/sysctl.h"
  6. #include "driverlib/gpio.h"
  7. #include "driverlib/rom.h"
  8. #include "driverlib/pin_map.h"

  9. #define LED_RED GPIO_PIN_1
  10. #define LED_BLUE GPIO_PIN_2
  11. #define LED_GREEN GPIO_PIN_3

  12. const unsigned char color[] = {0x2, 0x6, 0x4, 0xc, 0x8, 0xa};
  13. unsigned char color_sz;

  14. void SysTickIntHandler(void);

  15. int main(void)
  16. {
  17. color_sz = sizeof(color);

  18. ROM_SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
  19. ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
  20. ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN);
  21. ROM_GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_GREEN|LED_BLUE, color[5]);

  22. ROM_SysTickPeriodSet(8000000-1);  // 0.5 sec
  23. ROM_SysTickEnable();
  24. ROM_SysTickIntEnable();
  25. ROM_IntMasterEnable();      // CPSIE instruction

  26. while (1) {
  27. }
  28.  }

  29. void SysTickIntHandler(void)
  30. {
  31. static unsigned char idx = 0;

  32. ROM_GPIOPinWrite(GPIO_PORTF_BASE, LED_RED | LED_GREEN | LED_BLUE, color[idx]);
  33. idx = (idx+1)%color_sz;
  34. }


코드는 위와 같다. 위의 코드에서 일정 시간마다 SysTick 인터럽트가 발생하면 37~43 라인의 SysTickIntHandler 함수가 호출되게 된다. 그러므로 main() 함수에서는 초기 설정을 제외하면 메인 루프(33~34라인)에서는 아무 것도 하지 않고 단순히 무한루프를 돌고 있게 된다.

28~31에서 SysTick 인터럽트를 사용하기 위한 설정을 하고 인터럽트를 활성화 시켜주게 되는데 실제 SysTick 인터럽트가 발생했을 때 SysTickIntHandler()를 호출하게 해 주기 위해서는 startup_gcc.c에 있는 인터럽트 벡터 테이블을 수정해 줘야만 한다.

startup_gcc.c는 이전 포스트(Stellaris Launchpad #1)에서 사용했던것과 동일한 startup_gcc.c (~/stellarisware/boards/ek-lm4f120xl/blinky/startup_gcc.c) 를 약간 수정해서 사용한다.


...
//*****************************************************************************
//
// The entry point for the application.
//
//*****************************************************************************
extern int main(void);

// External Interrupt handler declaration

void SysTickIntHandler(void);

//*****************************************************************************
//
// Reserve space for the system stack.
//
//*****************************************************************************
static unsigned long pulStack[64];
...
    IntDefaultHandler,                      // The PendSV handler
    SysTickIntHandler,                      // The SysTick handler
    IntDefaultHandler,                      // GPIO Port A
...


빨간색 라인을 추가하고 파란색 라인 부분은 원래 IntDefaultHandler,      // the SysTick handler 로 되어 있는데 IntDefaultHandler 대신 파란색 부분 같이 SysTick 인터럽트가 발생했을 때 실제 호출될 인터럽트 핸들러 함수 이름으로 바꿔주면 된다.

링커 스트립트 파일과 Makefile은 이전에 사용한것을 그대로 사용해 주면 된다.

정상적으로 바이너리 파일을 만들어 보드로 다운로드 하면 LED D1의 색깔이 주기적으로 바뀌는 걸 볼 수 있다.

Stellaris Launchpad #1

Stellaris Launchpad 환경설정이 끝났으면 실제 프로그램을 플래쉬로 옮겨 실행시켜 보겠다.

TI stellaris launchpad에 들어 있는 LM4F 프로세서에는 칩의 ROM에 stellarisware peripheral access library 가 이미 들어있기 때문에 그 함수들을 사용하면 되고 그런 함수들은 함수 이름이 'ROM_'으로 시작한다.

일단 간단한 프로그램을 만들어 보자. 파일 이름은 ledtest1.c로 하겠다.



  1. #include "inc/hw_gpio.h"
  2. #include "inc/hw_memmap.h"
  3. #include "inc/hw_sysctl.h"
  4. #include "inc/hw_types.h"
  5. #include "driverlib/gpio.h"
  6. #include "driverlib/rom.h"
  7. #include "driverlib/sysctl.h"
  8.  
  9. #define LED_RED GPIO_PIN_1
  10. #define LED_BLUE GPIO_PIN_2
  11. #define LED_GREEN GPIO_PIN_3
  12.  
  13. int main()
  14. {
  15.   ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
  16.   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
  17.   ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN);
  18.   for (;;) {
  19.     // set the red LED pin high, others low
  20.     ROM_GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_GREEN|LED_BLUE, LED_RED);
  21.     ROM_SysCtlDelay(5000000);
  22.     ROM_GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_GREEN|LED_BLUE, 0);
  23.     ROM_SysCtlDelay(5000000);
  24.   }
  25. }



    위의 프로그램을 컴파일해서 stellaris launchpad에 다운로드 할 수 있는 바이너리 파일을 만들기 위해서는 startup 파일과 linker script 파일이 필요하다.

    컴파일러에 따라 다른 파일이 필요한데 맥에서 cross-gcc(arm-none-eabi-gcc)를 사용하는 경우 stellarisware에 들어있는 startup_gcc.c (~/stellarisware/boards/ek-lm4f120xl/blinky/startup_gcc.c)와 blinky.ld (~/stellarisware/boards/ek-lm4f120xl/blinky/blinky.ld) 파일을 사용하면 된다.

    startup_gcc.c 파일을 위의 소스코드와 같은 디렉토리에 복사 해 넣은 다음 아래와 같은 Makefile을 만들어 준다.


    1. #
    2. # Makefile for Stellaris Launchpad
    3. #

    4. STELLARISDIR=/Users/nautes/stellarisware
    5. PROCESSOR=LM4F120H5QR
    6. LOADER_SCRIPT=blinky.ld

    7. CC=arm-none-eabi-gcc
    8. CFLAGS=-g \
    9. -mthumb \
    10. -mcpu=cortex-m4 \
    11. -mfpu=fpv4-sp-d16 \
    12. -mfloat-abi=softfp \
    13. -Os \
    14. -ffunction-sections \
    15. -fdata-sections \
    16. -MD \
    17. -std=c99 \
    18. -Wall \
    19. -pedantic \
    20. -DPART_${PROCESSOR} \
    21. -c \
    22. -I${STELLARISDIR} \
    23. -DTARGET_IS_BLIZZARD_RA1

    24. TARGET:=ledtest1
    25. BOOTSTRAP:=startup_gcc.o

    26. SRCS:=ledtest1.c
    27. OBJS:=$(SRCS:.c=.o) $(BOOTSTRAP)

    28. .c.o:
    29. ${CC} ${CFLAGS} $<
    30. $(TARGET): $(OBJS)
    31. # arm-none-eabi-ld -T ${LOADER_SCRIPT} --entry ResetISR -o $@ ${BOOTSTRAP} ${TARGET}.o --gc-sections
    32. arm-none-eabi-ld -T ${LOADER_SCRIPT} --entry ResetISR -o $@ $(OBJS) --gc-sections
    33. arm-none-eabi-size ${TARGET}
    34. arm-none-eabi-objcopy -O binary ${TARGET} ${TARGET}.bin

    35. clean:
    36. rm ${TARGET} *.d *.o *.bin
    5번 라인에서 빨간색 부분은 자신이 stellarisware를 설치한 디렉토리 이름으로 바꿔줘야만 한다.

    디렉토리에 ledtest1.c, blinky.ld, startup_gcc.c, Makefile이 다 있으면 프로그램을 make하면 된다.

    $ ls
    Makefile blinky.ld ledtest1.c startup_gcc.c
    $ make
    arm-none-eabi-gcc -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall -pedantic -DPART_LM4F120H5QR -c -I/Users/nautes/stellarisware -DTARGET_IS_BLIZZARD_RA1 ledtest1.c
    arm-none-eabi-gcc -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall -pedantic -DPART_LM4F120H5QR -c -I/Users/nautes/stellarisware -DTARGET_IS_BLIZZARD_RA1 startup_gcc.c
    arm-none-eabi-ld -T blinky.ld --entry ResetISR -o ledtest1 ledtest1.o startup_gcc.o --gc-sections
    arm-none-eabi-size ledtest1
       text   data    bss    dec    hex filename
        902      0    261   1163    48b ledtest1
    arm-none-eabi-objcopy -O binary ledtest1 ledtest1.bin
    $ lm4flash ledtest1.bin
    ICDI version: 9270
    $

    lm4flash 명령이 정상적으로 실행되면 빌드 된 바이너리 파일이 보드로 다운로드 되고 바로 실행이 시작되기 때문에 보드의 리셋스위치 바로 아래 있는 D1 LED(아래 사진의 파란색 원 부분)가 빨간색으로 반짝이는걸 볼 수 있다.