ZEO 모듈을 사용하시는 분은 http://whiteat.com/57501 를 참조하여 드라이버를 설치하시고, 프로그래밍 가이드를 따라해 보시기 바랍니다.

 

 

 

C#으로 HumanDetectApp 라는 응용프로그램을 만들어 보겠습니다.

여기서는 Visual Studio 2008 의 C#을 사용하게 됩니다.

 

먼저 Windows Forms Application Template 으로 HumanDetectApp 라는 프로젝트를 생성합니다.

C#을 처음 접하시는 분은 http://whiteat.com/31559 를 한번만 해보셔도 금방 따라 하실 수 있습니다.

 

 

 

 

기본 폼이 완성 되면 LABEL 2개를 추가합니다.

각각의 이름을 lblModel, lblAlarm로 하겠습니다.

lblModel에는 현재 사용중인 ZEO 의 모델명과 버전을 표시할 것이고,

lblAlarm 에는 "침입자 발견" 메시지를 보여줄 것입니다.

 

 

그리고 일정시간마다 센서 값을 읽어 올 수 있게 Timer 를 추가하고 타이머의 이름을 tmrMain 이라고 하겠습니다.

 

 

 

이제 각 기능을 구현하면 됩니다.

 

 

 

센서가 감지되었을 경우 경고 표시

 

 

 

 

평상시 화면

 

 

 

 

 

 

아래는 인체감지 센서를 읽어 알람을 화면에 표시하는 전체 코드입니다.

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using ZeoDotNetLib;

 

 

namespace HumanDetectApp

{

public partial class Form1 : Form

{

ZeoLib ZEO = new ZeoLib();

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

// ZEO 모듈 열기

this.ZEO.Open();

 

// ZEO 모듈 초기화

this.ZEO.InitZeo(0);

 

// 모델명 버전 표시

this.lblModel.Text = "MODEL: ZEO-" + this.ZEO.GetZeroType().ToString();

this.lblModel.Text += " VERSION: " + this.ZEO.GetBoardVersion();

 

// PA16을 입력으로 설정 (센서 값 읽기)

this.ZEO.PORT_DirInput(PIN_NAME.PA16);

 

}

 

private void tmrMain_Tick(object sender, EventArgs e)

{

// 만약 ZEO와 연결되지 않았다면 아무것도 안하겠다.

if (!this.ZEO.IsOpened) return;

 

// 모든 포트의 값을 읽어

UInt32[] uiData = this.ZEO.ReadPortAll();

 

// PA16의 값이 HIGH 이면

if ((uiData[0] & 0x10000) == 0x10000)

{

// 알람 표시

lblAlarm.Visible = true;

}

else

{

lblAlarm.Visible = false;

}

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

// 프로그램 종료시에는 반드시 Close 를 해줘야 한다.

this.ZEO.Close();

}

}

}

 

 

 

 

Posted by WhiteAT
,

 

ZEO 모듈과 인체감지 센서 모듈로 침입자를 감시하는 예제를 만들어 보겠습니다.

 

침입자 감시 시스템

 

 

 

 

회로 꾸미기

 

아래처럼 ZEO-S 모듈과 인체감지모듈을 브레드보드에 연결합니다.

 

 

 

 

센서에는 VCC, GND, OUT 핀 명이 표기되어 있으며

VCC 에는 3.3V(양극)

GND 에는 그라운드(음극)

OUT 에는 ZEO-S 의 PA16번에 연결합니다.

 

GND 옆의 신호가 OUT 이라서 별도의 점퍼선 없이 기판에 바로 연결할 수 있습니다.

센서의 VCC는 ZEO-S의 우측 1번 핀에 연결해 줘야겠죠?

 

 

 

 

 

이제 USB 케이블을 PC에 연결하면

하드웨어 준비는 끝입니다.^^

 

Posted by WhiteAT
,

 

ARM 용 라이터프로그램인 SAMBA 는 너무 사용하기에 너무 불편하고, 라이팅 하는데 오랜 시간이 걸립니다.

라이팅 속도가 빠르고 사용하기에 편한 H-JTAG 를 알아보겠습니다.

   

 

준비물

  • 보드(AT91SAM7S64 보드) -  TMS, TDI, TDO, TCK 핀이 사용됩니다.
  • JTAG 프로그램 케이블
  • 라이팅용 프로그램(H-JTAG)

   

   

   

   

프로그램 설치

http://www.hjtag.com/download.html(무료) 에서 다운로드하여 PC에 설치합니다.

   

 

 

 

프로그램 라이팅

 

바탕화면의 [H-JTAG] 을 실행한 후 [Detect target]로 연결된 디바이스를 검색합니다.

에러 메세지가 발생하지 않고, 글씨가 파란색으로 변하면 ARM 모듈과 연결이 정상적으로 된 것입니다.

 

여기서는 0x3F0F0F0F0F 라는 글씨가 표시되어 정상입니다.

 

 

 

 

   

연결이 성공하면, [F]모양의 아이콘(Start H-Flasher)을 클릭하여 H-Flasher 프로그램을 실행합니다.

   

[1. Flash Selection]에서 사용할 디바이스를 선택

 


 

 

 

2,3 번은 default 값으로 두고, [Programming] 에서 

  • [Flash]와[Target]을 체크해주고
  • 파일 [Type]를 선택하고,
  • Src File을 선택
  • Dst Addr 을 설정 [잘 모르면 0]
  • [Program]을 눌러 다운로드를 시작

만약 다운로드가 되지 않는다면, 케이블, 보드, 전원을 확인해보고 처음부터 다시 시도합니다.

 

 

 

 

   

 

 

 

다운로드가 진행됩니다.

 

 

 

   

보드를 리셋하여 동작을 확인합니다.

   

 

 

 

참고사항

 

SAMBA 프로그램으로 라이팅을 하게 되면,

보드를 초기화(플래시 삭제)해야 하고, 전원 ON/OFF해야 하고,

보드 라이팅(클릭을 5번이상 해야 함)을 해야 하고 리셋해야 하는 번거로움이 있는 반면

 H-JTAG는 설정을 한번만 해주면, 1초에 라이팅을 완료할 수 있어 편리합니다.

 

 

Posted by WhiteAT
,

 

윈도우 드라이버: 

WhiteAT_drive01.zip


펌웨어 파일:


main.bin



(첨부파일에는 기본적인 USB 통신기능만 있다.)

 

 

 

드라이버 설치를 완료하면 아래와 같은 장치가 추가된다.

(아래 쪽에 WAT302 Board-WhiteAT 이라고 있다.)

   

Posted by WhiteAT
,

   

예제코드:

at91sam7s64_Atmel_interrupt_3LED.zip

 

여러 개의 I/O 를 제어할 때,

main 에서 모두 처리하게 되면 복잡해지고
하나의 I/O 에서 딜레이가 필요할 때, 다른 I/O 에 영향을 줄 수 있다.

이런 것을 간단하게 처리할 수 있는 예입니다.

 


예제소스는
 - 1mS 마다 깜박이는 LED
 - 1S    마다 깜박이는 LED
 - 0.7S 마다 깜박이는 LED
=> 3개의 LED 의 깜박이는 시간을 간단하게 변경해서 LED를 제어하는 내용이다.

14초가 되면 동시에 ON되는 것을 알 수 있다.

Posted by WhiteAT
,

 

AT91SAM7S64 의 타이머/카운터

 

예제 소스: 

at91sam7s64_Atmel_interrupt.zip


- 3개의 16비트 타이머/카운터
- 각각 독립적이며
- 주파수 측정, 이벤트 횟수, 시간 간격 측정, 펄스 발생, 지연시간, PWM 을 만들 수 있음
- 클럭소스를 8 가지 중 1개를 선택 가능
                       

첨부한 소스는 타이머0의 C 채널을 이용하였습니다.

   

 

Posted by WhiteAT
,

 

간단히 LED 제어 예제로 SAMBA 프로그램 라이팅 방법을 사용해 보겠습니다.

예제: 

wat_at91sam_io.zip



SAMBA 라는 프로그램으로 보드에 라이팅 할 수 있습니다.

[PC에 SAMBA 를 설치한 후에는 반드시 리부팅을 해야 합니다.]

 

 

플래시 내용 지우기(MCU 데이터 지우기)

 

- 점퍼를 연결한 후 usb전원을 연결합니다.
- 약 10초(길게는 15초) 후에는 플래시가 초기화 됩니다.

 

 

 

 

 

플래시 초기화 확인


- USB의 전원을 끊고,
- 점퍼의 연결을 끊고(점퍼를 빼고)
- USB 전원을 다시 연결합니다.
- 새로운 USB 장치[Atm6124.xxxxxxxxx어쩌구저쩌구]가 추가될 것입니다.
=> 여기까지 MPU의 ROM 초기화를 완료한 것입니다.

 

 

 

 


플래시에 프로그래밍(라이팅 하기)


- SAMBA 프로그램 실행
- 라이팅할 파일을 선택한 후 다운로드 버튼 클릭으로 다운로딩 시작
- YES, NO 선택하는 메세지 박스가 2번 뜨는데 모두 YES 선택
- 프로그램 완료 후 보드 리셋(즉, USB 케이블을 다시 연결)

=> 새롭게 라이팅한 프로그램이 실행됩니다.

LED ON/OFF 하는 예제를 첨부하였으니, main.bin 파일을 직접 다운로드 해 보면 됩니다.

약 1초마다 LED가 깜박이는 것을 확인 할 수 있습니다.

Posted by WhiteAT
,

 

AT91SAM7S64 회로 구현 시 몇 가지 주의사항이 있습니다.

1. TST, JTAGSEL, ERASE 핀을 사용하지 않을 때에는 GND 에 연결해야 합니다.

- 외부 노이즈에 의해 순간적으로 HIGH가 될 수 있는데,

  이럴 경우에 동작 중에 프로그램이 지워지거나(TST, EARSE) 프로그램에 정지(JTAGSEL) 될 수 있습니다.

 

Posted by WhiteAT
,

  

UART0 제어 코드:


wat_at91sam_uart0.zip







UART1 제어 코드:

wat_at91sam_uart1.zip






UART0 <-> UART1 중계 코드:


wat_at91sam_uart0_1.zip




Posted by WhiteAT
,

 

다운로드

매뉴얼:WAT-IO_ADC매뉴얼.pdf  

펌웨어 소스코드:EX_09_03.zip

   

 

 

 

 

제품 소개

   

WAT-IO&ADC 모듈은 AVR, Cortex-M3, PIC 등의 MCU와 10P Flat 케이블을 연결하여 Input/Output을 실험할 수 있는 모듈입니다. FND, LED, BUZZER 을 제어할 수 있으며 가변저항, CDS(빛의 밝기), 딥 스위치, 로터리 스위치의 값을 읽을 수 있는 제품입니다.

 

 

특징

 

항목

내용

FND

4 digit

LED

8 port

BUZZER

1 port (5V)

가변저항

5K

CDS

CDS

딥 스위치

8 channel

로터리 스위치

10R

크기

85 mm x 85 mm

인터페이스

Digital Input/Output

 

 

구조

    

   

 

 

외형

 

 

 

 

 

 

 

 

회로도

 

 

 

외부 인터페이스

 

 

커넥터

 

 

 

 

번호

핀명

설명

1

D0

DATA (bit 0)

2

D1

DATA (bit 1)

3

D2

DATA (bit 2)

4

D3

DATA (bit 3)

5

D4

DATA (bit 4)

6

D5

DATA (bit 5)

7

D6

DATA (bit 6)

8

D7

DATA (bit 7)

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< FND DATA >

 

번호

핀명

설명

1

RO0

로터리 스위치 핀 0

2

RO1

로터리 스위치 핀 1

3

RO2

로터리 스위치 핀 2

4

RO3

로터리 스위치 핀 3

5

FND0

FND 0 선택 핀

6

FND1

FND 1 선택 핀

7

FND2

FND 2 선택 핀

8

FND3

FND 3 선택 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< FND SELECT, ROTARY SWITCH >

 

번호

핀명

설명

1

LED0

LED 0 제어 핀

2

LED1

LED 1 제어 핀

3

LED2

LED 2 제어 핀

4

LED3

LED 3 제어 핀

5

LED4

LED 4 제어 핀

6

LED5

LED 5 제어 핀

7

LED6

LED 6 제어 핀

8

LED7

LED 7 제어 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< LED >

 

 

 

번호

핀명

설명

1

AVCC

ADC 컨버터용 전압

2

AREF

ADC 컨버터용 기준 전압

3

CDS

CDS 센서 연결 핀

4

VR

가변저항 연결 핀

5

   

6

   

7

   

8

BUZ

부저 연결 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< ADC >

 

번호

핀명

설명

1

DIP0

딥스위치 1번 핀

2

DIP1

딥스위치 2번 핀

3

DIP2

딥스위치 3번 핀

4

DIP3

딥스위치 4번 핀

5

DIP4

딥스위치 5번 핀

6

DIP5

딥스위치 6번 핀

7

DIP6

딥스위치 7번 핀

8

DIP7

딥스위치 8번 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< DIP SWITCH >

 

 

ATMEGA128 모듈에 연결

 

WAT-AVR128 모듈의 PORTA는 LED, PORTB는 DIP SWITCH, PORTC는 FND SELECT, PORTE는 FND DATA, PORTE는 ADC 에 연결하여 PC 프로그램에서 제어 및 상태를 실시간으로 모니터링 하는 예제입니다.

 

 

 

WAT-AVR128 모듈

WAT-IO&ADC 모듈

PORTA

FND DATA

PORTB

 

PORTC

FND SELECT, ROTARY SWITCH

PORTD

DIP SWITCH

PORTE

LED

PORTF

ADC

 

 

ATEMGA128 펌웨어 코드

  /*

    EX_09_03.c

 

    USART0 로보드의상태PC로전송

    PC에서LED, BUZZER, FND 제어

    AVRStudio 4.18

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

BYTE g_FNDData[4]={1,2,3,4};

BYTE g_BUZZER = 0;

BYTE g_LED = 0;

 

UINT16 g_adcCDS;    // CDS 값보관

UINT16 g_adcVR;    // 가변저항값보관

 

void OperDisplayFND()

{

    DisplayFND4(g_FNDData[0],g_FNDData[1],g_FNDData[2],g_FNDData[3]);

}

 

INT16 g_byteOperPCTXTimer = 0;

void OperPCTX()

{

    if(--g_byteOperPCTXTimer>0)

        return;

 

    PutChar0(0x02);                        // 0 시작신호

    PutChar0(PIND);                        // 1 DIP SWITCH

    PutChar0(GetRotaryInt());             // 2 ROTARY

    PutChar0(g_adcCDS>>8);                // 3 CDS 상위값

    PutChar0(g_adcCDS);                // 4 CDS 하위값

    PutChar0((g_adcVR)>>8 &0xFF); // 5 가변저항상위값

    PutChar0(g_adcVR&0xFF);                // 6 가변저항하위값

    PutChar0(0x03); // 7

    PutChar0(0xCC);                        // 8 체크섬

    PutChar0(0x03);                        // 9 끝신호

 

    g_byteOperPCTXTimer = 20;

 

}

 

// 가변저항, CDS 값을ADC로읽기

void OperReadADC()

{

    INT16 uiTemp; // 임시변수

 

    g_adcCDS = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x00;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcCDS += ADCL + (ADCH*256);

    }

 

    g_adcCDS>>=4;

 

    g_adcVR = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x01;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcVR += ADCL + (ADCH*256);

    }

 

    g_adcVR>>=4;

}

 

int main()

{

 

    BUZZER_INIT; // BUZZER 초기화

    OpenSCI0(115200);    // USART 0 열기

 

    InitFND4(); // FND 초기화

 

    InitADC();    // ADC 초기화

 

    DisplayFND4(3,4,5,6);

    InitRotary();

    

    DDRD = 0x00; // 딥스위치를입력으로설정

    DDRE = 0xFE; // LED

 

 

    while(1)

    {

        BUZZER_OFF;

        OperDisplayFND();

        OperReadADC();

        

        OperPCTX();

 

        if(0x02 ==GetByte0())

        {

            UINT16 uiData = 0;

            uiData = GetByte0(); //1

            uiData<<=8;

            uiData += GetByte0(); //2

 

            //buzzer

            g_BUZZER = GetByte0();

 

                

            g_LED =    GetByte0(); //4

            GetByte0(); //5

            GetByte0(); //6

            GetByte0(); //7

            if(0xCC == GetByte0() && 0x03 == GetByte0() )

            {

                if( g_BUZZER)

                {

                    BUZZER_ON;

                    DelayMS(2);

                }

 

                // PC에서받은LED 값을출력

                PORTE =~((g_LED)&0xFC);

 

                // FND 표시

                g_FNDData[0]=((uiData/1000)%10);

                g_FNDData[1]=((uiData/100)%10);

                g_FNDData[2]=((uiData/10)%10);

                g_FNDData[3]=(uiData%10);

            }

        }    

    }

} 

 

윈도우 코드(통신 처리 부분)

private void tmrRxData_Tick(object sender, EventArgs e)

{

btnRxSignal.BackColor = Color.White;

 

 

if (null == m_serialPort) return;

if (!m_serialPort.IsOpen) return;

 

int iRecSize = m_serialPort.BytesToRead; // 수신된 데이터 갯수

 

 

// AVR에서 10바이트식 보내는데 10바이트 이상이 들어 왔는지 체크

if (iRecSize >= 10)

{

byte[] buff = new byte[iRecSize]; // 임시 변수

 

// 시리얼 포트에서 데이터를 가져오자.

m_serialPort.Read(buff, 0, iRecSize);

 

// 맨앞의 값이 0x02 인지 체크

if (buff[0] !=0x02 )

{

for(int i=0;i<iRecSize-1;i++)

{

buff[i] = buff[i+1];

}

}

 

 

if (buff[0] == 0x02 && buff[8] == 0xCC && buff[9] == 0x03)

{

this.txbRotaryValue.Text = buff[2].ToString();

 

this.btnDIP1.BackColor = ((buff[1] & 0x01) == 0x01) ? Color.White : Color.Green;

this.btnDIP2.BackColor = ((buff[1] & 0x02) == 0x02) ? Color.White : Color.Green;

this.btnDIP3.BackColor = ((buff[1] & 0x04) == 0x04) ? Color.White : Color.Green;

this.btnDIP4.BackColor = ((buff[1] & 0x08) == 0x08) ? Color.White : Color.Green;

this.btnDIP5.BackColor = ((buff[1] & 0x10) == 0x10) ? Color.White : Color.Green;

this.btnDIP6.BackColor = ((buff[1] & 0x20) == 0x20) ? Color.White : Color.Green;

this.btnDIP7.BackColor = ((buff[1] & 0x40) == 0x40) ? Color.White : Color.Green;

this.btnDIP8.BackColor = ((buff[1] & 0x80) == 0x80) ? Color.White : Color.Green;

 

 

this.trbCDS.Value = (Convert.ToInt32(buff[3]) << 8) + (Convert.ToInt32(buff[4]) << 0);

this.trbCDS.BackColor = Color.FromArgb((1024-this.trbCDS.Value) / 4, (1024-this.trbCDS.Value) / 4, (1024-this.trbCDS.Value) / 4);

this.trbVR.Value = (Convert.ToInt32(buff[5]) << 8) + (Convert.ToInt32(buff[6]) << 0);

 

 

 

btnRxSignal.BackColor = Color.Green;

}

}

 

// AVR 모드로 명령 전송

this.SendToBoard();

 

}

 

 

윈도우 프로그램에서 FND에 5634, LED 모두 OFF 값을 전송하며 ATMEGA128 보드에서 딥 스위치4번 OFF, CDS값 최대, 가변저항 값 최소, 로터리 스위치 값 3을 전송되면 아래와 같이 됩니다.

< WAT-IO&ADC에 연결한 윈도우 프로그램 >

윈도우 프로그램에서 FND에 5667, LED 3,5,7번 ON 값을 전송하며 ATMEGA128 보드에서 딥 스위치1,3,5,7,번 ON, CDS값 최대, 가변저항 값 최대, 로터리 스위치 값 9을 전송되면 아래와 같이 됩니다.


원문: http://whiteat.com/57035


 

Posted by WhiteAT
,