2014년 11월 17일 월요일

적외선 감지 센서와 zFrog IoT Thing Board(CR-IOT-AT100) 이용한 침입 감지 시스템



l 적외선 감지센서 감지 거리 10M
l Zigbee 통신 거리 최소 20M
l 동작 감지 시 지그비 통신 송신/수신
l AA 건전지 장착



2014년 11월 11일 화요일

(AT100, AIB100) ZigBee 통신 Test Guide

  1. ZigBee firmware Fusing



STM32 Firmware를 굽기 전에 ZigBee Firmware를 먼저 굽는다.


    1. CC Debugger 연결 확인





CC Debugger가 연결된 상태에서 버튼을 누를 경우 LED가 녹색 불이 들어와야 한다.
만약 붉은 색 불이 들어오면 적절한 조치를 취해야 한다.


    1. ZigBee Firmware 다운로드



SmartRF Flash Programmer를 이용해서 펌웨어를 굽는다.


at100_coordinator_115200.hex
at100_device_115200.hex


at100_coordinator_115200.hex는 AIB100에 장착된 AT100에 다운로드 한다.
at100_device_115200.hex는 다른 AT100에 다운로드 한다.


  1. STM32 firmware Fusing



m32l1_iotk_at100_141106_1611_image.zip


위 압축 파일을 풀면 Project.hex 파일이 생성된다.
이 바이너리 파일을 STM32에 다운로드 한다.


  1. CC Debugger 인식 오류 시 방법



STM32 Firmware를 굽기 전에 ZigBee Firmware를 먼저 다운로드 한 후에 STM32를 다운로드 하면 크게 문제가 없지만, 만약 STM32 Firmware가 이미 다운로드 된 상태에서 ZigBee Firmware를 다운로드 하기 위해서 CC Debugger를 연결된 상태에서 버튼을 누를 경우 LED가 붉은 색 불이 들어오면서 연결이 되지 않게 된다.


AT100 부팅 시 화면에 나타나는 것은 아래와 같다.




Z를 입력하면 ZigBee Reset 핀을 Open하게 되고, 이 경우 CC Debugger 연결에 문제가 없게 된다.


  1. 시험 시료 전원 Off/On



모든 Firmware 다운로드를 마친 후에는 전원을 Off한 후 다시 전원을 인가한다.


  1. LED Bar 시험





AIB100 부분에서는 7> Actuator Test - ZigBee Comm RX 를 선택한다.


7> Actuator Test - ZigBee Comm RX


다른 AT100 부분에서는 6> Actuator Test - ZigBee Comm TX 를 선택한다.


6> Actuator Test - ZigBee Comm TX


다른 AT100 부분에서 아래 명령을 수행한다.


0> Read port State
1> Output port 0 On
2> Output port 0 Off
3> Output port 0 Blink

1번을 누르면 LED Bar가 켜지고, 2번은 꺼지고, 3번은 깜빡이게 된다.

[Mango-M32,9-Axis ]NT-ARS 센서의 온도계수(Temperature Coefficient) 찾기

[출처] http://m.blog.daum.net/pg365/290


MEMS 기반의 가속도 센서와 자이로 센서는 온도 변화에 따라 출력 값이 변화합니다. 자이로 센서와 가속도 센서를 고정한 상태로 온도를 변화시키면서 AD 변환된 raw 데이터를 받아보면 다음에서와 같이 센서의 출력 데이터가 온도에 영향을 받아 변하는 현상을 볼 수 있습니다.

//  temp   accl_x accl_y accl_z  gyro_x  gyro_y gyro_z temp  
      53        8      437    -3733      -68       -2        0      612
      51        5      420    -3730      -68       -2        0      596
      52       -1      422    -3739      -68       -5        0      581
      51       -6      400    -3730      -69       -3        0      566
      50       -2      404    -3734      -70       -1        0      553
      50      -13      394    -3739      -70       -6        0      542
      49      -13      383    -3739      -71       -7        0      529
      49      -15      385    -3742      -72       -5        0      518
      48      -22      376    -3742      -72       -7        0      506
      48      -35      379    -3750      -72       -4        0      494
      47      -34      375    -3756      -73       -4        0      484
      47      -36      367    -3743      -72       -6        0      475
      46      -38      358    -3751      -74       -7        0      465
      45      -56      359    -3753      -74       -6        0      456
      46      -49      359    -3749      -74       -7        0      446
      45      -49      360    -3762      -75       -7        0      438
      43      -43      349    -3759      -75       -8        0      429
      43      -54      340    -3759      -77       -8        0      421
      43      -54      335    -3756      -77       -7        0      413
      43      -68      330    -3761      -77       -8        0      406
      42      -66      335    -3764      -77       -7        0      398
      42      -59      330    -3761      -77       -8        0      391
      43      -69      320    -3766      -76      -10        0      385
      42      -70      320    -3770      -78       -8        0      378
      41      -65      313    -3761      -76       -6        0      372

이러한 온도 변화에 따른 가속도 센서와 자이로 센서의 바이어스는 Kalman filter로 두 센서의 출력을 융합하여 Euler 각도를 계산하는데 에러를 발생시킵니다. 만일 온도 변화에 따른 센서의 출력 데이터 변화가 선형에 가깝다면 1차 방정식으로 쉽게 보상 가능할 것입니다.

NT-ARS 센서에 온도를 올리고 내리는 실험을 통해 온도 변화에 따른 출력 데이터를 모으고 이를 엑셀의 그래프로 그려 보았습니다. 데이터가 원점 근처에 모여있는것은, 온도에서 25도를 빼고 센서 출력 데이터에서도 평균을 빼서 그래프를 그렸기 때문입니다. 가속도 센서의 데이터(accl_x_c, accl_y_c, accl_z_c)가 각속도 센서의 데이터(gyro_x_c, gyro_y_c)보다 온도 변화에 영향을 더 크게 받는 것을 볼 수 있고 그래프의 모양도 대략 선형을 띄고 있습니다. 일이 아주 쉬워질 것 같습니다. ^^


온도에 의한 바이어스를 보정하기 위해서는 수집된 데이터들로부터 각 축에 대한 1차 함수의 기울기만 구하면 됩니다. 기울기를 안다면 온도에 따른 변위를 계산하여 실측에서 빼줌으로 온도가 변하더라도 값을 일정하게 유지할 수가 있습니다. 수집한 데이터로부터 1차함수의 계수를 구하는 방법은 LMS(Least Mean Square) 방법을 사용합니다. 다음 첨부 문서를 참고하기 바랍니다.


C 코드로는 다음과 같이 간단하게 구현할 수 있습니다.
 double a = 0;
 double b = 0;
 double c = 0;
 double d = 0;
 double e = 0;
 double f = 0;


 while (반복 조건) {
    double x = ReadTemperature();
    double y = ReadSensorRawData();
 
    a += x*x;
    b += x;
    c += x;
    d += 1;
    e += x*y;
    f += y;
 }

 float s = 1.f/(a*d - b*c);
 temp_coef = s*(d*e - b*f);

첨부 문서에서와 같은 방법으로 1차 함수의 기울기를 구하면, 기울기를 온도계수(Temperature Coefficient)로 사용하여 다음과 같이 보정하게 됩니다.

       보정된 값 = raw 값 - 온도계수 x 온도

이렇게 센서의 온도 변화에 따른 바이어스를 보정하게 되면 ARS센서가 계산한 Euler 각도가 온도 변화에 따라 틀어지는 현상을 막을 수 있으며, 또한 센서의 온도가 충분히 안정될 때까지 기다리는 워밍업 시간을 따로 둘 필요도 없어집니다.

다음에는 온도 변화를 실험한 장치를 간단히 소개드리겠습니다.

MangoM32 LED 제어

[출처]http://kjung.tistory.com/entry/719-ARM-LED-%EC%A0%9C%EC%96%B4

기본적으로  STM32T103 RBT6 칩이 달린 MANGO - M32 보드를 이용하여프로그램을 짠다.

일단 기본적으로 보드를 연결하기위해서는 

보드(당연히..) USB(전원용) 3pin포트(데이터를 다운로드하기위한..)
프로그램은 
보드에 프로그램을 쓰기위한
와 코드를짜기위한 EWARM-KS-WEB-5505.exe 프로그램 (www.iar.com여기서 받을수있다.)

이 필요하다.

위 두가지 프로그램이 준비되면 프로그램을 짜고 구동할수있다.

소스는 기본적으로 아트메가와 비슷하다.

 LED 제어
int main(void)
{
    // RCC APBPheri - GPIOB Enable
    (*(volatile unsigned *)0x40021018|= 0x8;
    
    (*(volatile unsigned *)0x40010C00|= 0x3<<20;
    (*(volatile unsigned *)0x40010C04|= 0x33;
    
}





일단 LED를 제어하려면, PORTB에 연결된 5,8,9번 핀을 제어해야한다는것을 위 회로도를 보면 알수있다.

우선  ARM은 아트메가와는 달리 항상 포트를사용할땐 클럭주어 포트를 열어줘야한다.


위 그림을 보면 IOPBEN, 즉 POTB를 ENABLE 한다는 것이다.
이것을 1로 주게하려면, 4번째 자리. 즉,
    (*(volatile unsigned *)0x40021018) |= 0x8;
이렇게 주게되는것이다.
이렇게하여 포트를 열어준 뒤,
또 이번에는 PIN제어를 하겠다고 선언해 주어야한다. 즉,

위그림의 5번,8번,9번 이다.

즉 CRL의 20번쨰, CRH의 1~4번쨰 이다.

    (*(volatile unsigned *)0x40010C00|= 0x3<<20;
    (*(volatile unsigned *)0x40010C04|= 0x33;

왜 0x3일까..? 16진수는 2진수 4자리다. 즉, 0x3은 2진수로 0011 이다.
그렇다면 b0011은 왜넣는것일까?
그에 해답은 아래그림과 같다.


0011은 CNF 를 00, MODE 를 11로 한다는것이다.
이렇게하여 각핀마다 출력설정을 해주게되면 LED가 작동하게된다.
그렇다면 끄고 키는건 어떻게 해야할까?
PORTB를 살펴보자.

위 그림을 보게되면 BSRR과 BRR이 있다.
그런데 잘보면 BSRR에 BR도 있고 BSR도 있으며,
BRR에도 BR이 있다.

이것은 왜 그런것이냐면, 예전에는 BSRR 하나로 BR과 BSR을 동시에 작동시켯으며, 지금은 두개로 나눠저서 그렇다.

이말은 무슨말이냐고 하면, 아트메가와는 달리 0이면 켜지고 1이면 꺼지는 것이 아니라,

BSS의 PIN 1 에 1을 넣으면 1번 핀이 작동하고, BSRR의 PIN 1에 1을 넣으면 1번핀이 꺼지게된다.

즉, 내부적으로 BSS가 0을, BSRR이 1을 넣어준다고 생각하면 된다.

이렇게 값을 넣어 작동을 시키면 R G Y 색들을 순서대로 점등시키기 등을 할수 있을 것이다.

저작자 표시

'--------------------- > ARM' 카테고리의 다른 글

7/21 ARM FND 제어  (0)2010/07/21
7/19 ARM LED 제어  (0)2010/07/19
Posted by 김진웅
0 | 0
  12  

Quick Start Guide zFrog IoT Thing Board (CR-IOT-AT100)

2014년 11월 10일 월요일

Mango520 SPI 테스트



  1. 커널 수정



$ ./build_kernel config



    1. build_kernel 수정하기


$ vi build_kernel

make -j$CPU_JOB_NUM 2>&1 | tee build.out
수정합니다.
그리고, { 과 #} 2>&1 | tee build.out 부분은 막습니다.
그래야 ./build_kernel config 가 됩니다.

#{
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+2}')
START_TIME=`date +%s`
#sudo apt-get install libncurses5-dev

case "$1" in
clean)
   echo make -j$CPU_JOB_NUM mrproper
#    cp .config arch/arm/configs/$KERNEL_CONFIG
#    cp .config config.sav
   rm -f build.out
   make -j$CPU_JOB_NUM mrproper
   ;;
config)
   echo make -j$CPU_JOB_NUM menuconfig
   sudo apt-get install libncurses5-dev
   make menuconfig
   ;;
defconfig)
   if [ "$2" ] ; then
       KERNEL_CONFIG=$2
   fi
   echo make -j$CPU_JOB_NUM $KERNEL_CONFIG
   make -j$CPU_JOB_NUM $KERNEL_CONFIG
   ;;
all|*)
   echo make -j$CPU_JOB_NUM
   make -j$CPU_JOB_NUM 2>&1 | tee build.out
   if [ $? != 0 ] ; then
           exit 1
   fi
   if [ "$2" ] ; then
       INSTALL_BINDIR=$2
   fi
   if [ $INSTALL_BINDIR ] ; then
       echo cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR/$KERNEL_IMAGE
       cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR/$KERNEL_IMAGE
   fi
   if [ $INSTALL_BINDIR2 ] ; then
       echo cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR2/$KERNEL_IMAGE
       cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR2/$KERNEL_IMAGE
   fi

   ;;
esac

END_TIME=`date +%s`
echo "Total compile time is $((($END_TIME-$START_TIME)/60)) minutes $((($END_TIME-$START_TIME)%60)) seconds"
#} 2>&1 | tee build.out


    1. 커널 spi config 하기



$  ./build_kernel defconfig
$ ./build_kernel config





Device Drivers  --->
[*] SPI support  --->
<*>   User mode SPI device driver support

Config를 하고 커널을 컴파일 합니다.

$ ./build_kernel


    1. How to write kernel image



이미지를 Write를 합니다.

보드에 3Pin Serial Cable, Mini USB cable, 어댑터를 연결합니다.
전원 스위치를 ON합니다.
터미널 프로그램을 실행을 합니다.

u-boot가 실행이 되면, Anykey를 누른 후 u-boot 프롬프트 창으로 이동합니다.

U-Boot 2012.07 (Nov 05 2014 - 19:17:27) for SMDK5250

CPU:    Exynos5250@1000MHz

Board: SMDK5250
DRAM:  2 GiB
WARNING: Caches not enabled

Checking Boot Mode ... SDMMC
MMC:
READ MMC4 CON REG = 0x2222222
READ MMC4 PUD REG = 0x3ff0
READ MMC4 DRV REG = 0x3fff
S5P_MSHC2: 0, S5P_MSHC0: 1
MMC Device 0: EEEEEEEEEEEEEEEEEEEEEXT write OK!! : 0
7.4 GiB
MMC Device 1: [ERROR] response timeout error : 00000104 cmd 1
Card did not respond to voltage select!
In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0
SMDK5250 #
SMDK5250 #
SMDK5250 # fast
Error: No MBR is found at SD/MMC.
Hint: use fdisk command to make partitions.
SMDK5250 # dnw 41000000;movi write kernel 0 41000000


dnw 41000000;movi write kernel 0 41000000

명령을 실행합니다.

리눅스 PC에서 linux sdtool download

$ cd image
$ sudo smdk-usbdl -f zImage -a 41000000

수행 결과

$ sudo smdk-usbdl -f zImage -a 41000000
SMDK42XX,S3C64XX USB Download Tool
Version 0.20 (c) 2004,2005,2006 Ben Dooks <ben-linux@fluff.org>

S3C64XX Detected!
=> found device: bus 002, dev 005
=> loaded 5048984 bytes from zImage
=> Downloading 5048994 bytes to 0x41000000
=> Data checksum 39e1
=> usb_bulk_write() returned 5048994

망고 보드에 kernel 이미지가 Write가 됩니다.


SMDK5250 # dnw 41000000;movi write kernel 0 41000000
CRZ readl(USB_PHY_CONTROL)=0x1
CRZ readl(USB_PHY_CONTROL-0x04)=0x0
OTG cable Connected!
       [CRZ]: ucMode = 0x0
Now, Waiting for DNW to transmit data
Checksum is being calculated.....
Checksum O.K.
Download Done!! Download Address: 0x41000000, Download Filesize:0x4d0a98
fwbl1: 1
bl2: 17
u-boot: 49
TrustZone S/W: 1073
env: 1073
knl: 4096
rfs: 14336
writing kernel..device 0 Start 4096, Count 10240
MMC write: dev # 0, block # 4096, count 10240 ... 10240 blocks write: OK
completed



  1. SPI Test 어플 실행하기  

부팅 후

~]# ls -al /dev/spidev*
crw------- 1 root root 153, 0 Jan  1 00:42 /dev/spidev0.0
crw------- 1 root root 153, 1 Jan  1 00:42 /dev/spidev2.0

확인이 됩니다.  소스를 살펴보면, MAJOR 번호는 동일합니다.

drivers/spi/spidev.c:#define SPIDEV_MAJOR                       153     /* assigned */

간단하게 살펴 보면, "drivers/spi/spidev.c" 파일에서

dev = device_create(spidev_class, &spi->dev, spidev->devt,
                                   spidev, "spidev%d.%d",
                                   spi->master->bus_num, spi->chip_select);

위 코드에서 device node에 “spidev2.0” 의 의미는 2는 bus number이고, 0은 chip select 입니다.


    1. Test 어플 컴파일 하기


Toolchain은
을 사용합니다.

테스트 어플 소스는 커널 소스에 포함이 되어 있습니다.



$ cd Documentation/spi/
spidev_test.c

컴파일 방법

Cross-compile with cross-gcc -I/path/to/cross-kernel/include


$ /opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc -o spidev_test spidev_test.c -I../../include -I../../arch/arm/include
In file included from ../../arch/arm/include/asm/types.h:4,
                from ../../include/linux/types.h:4,
                from spidev_test.c:21:
../../include/asm-generic/int-ll64.h:11: fatal error: asm/bitsperlong.h: No such file or directory
compilation terminated.

위와 같이 에러가 발생하는 경우
아래와 같이 수정합니다.

$ cd include/
$nclude]$ ln -s asm-generic asm

컴파일은

$ cd ../Documentation/spi/
$ /opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc -o spidev_test spidev_test.c -I../../include

“spidev_test.c 파일에서

수정을 합니다.

static const char *device = "/dev/spidev0.0";


    1. Spidev_test 어플 실행하기



컴파일 된 spidev_test 파일을 파일 시스템에 복사를 합니다.
mSD 카드를 PC에 삽입합니다.

$ mkdir rootfs
$ sudo mount /dev/sdh2 ./rootfs
$ sudo cp spidev_test ./rootfs/root/
$ sync
$ sudo umount ./rootfs



mSD 카드를 보드에 삽입합니다.

부팅을 하면,

# ls
nfs_mount/  nfs_mount.sh*  nfs_umount.sh*  spidev_test*

Spidev_test파일이 있습니다.
실행결과("/dev/spidev0.0

# ./spidev_test
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00

실행결과("/dev/spidev2.0”



# ./spidev_test
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF