1. 설계 개요
학부 수업에서 '간단한 감시시스템'을 주제로 프로젝트를 수행하였다. 시스템은 수업에서 사용했던 DE1-SoC 플랫폼을 기반으로 수행한다. 보드의 Nios II processor를 중심으로 여러 peripheral들을 결합하여 시스템을 구성한다. 시스템은 bare-metal 방식으로 C언어를 통해 하드웨어를 직접 제어한다.
'간단한 감시시스템'은 박물관이나 귀금속상처럼, 특정 위치로부터 사람 또는 외부 물체의 접근을 감시 및 방지해야 할 필요가 있는 상황을 가정하였다. 관리자는 이러한 경보시스템을 상황에 따라 자동 혹은 수동으로 제어할 수 있어야 하고, system의 상태를 monitoring할 수 있어야 한다.
Bare-metal 방식으로 시스템을 register단부터 직접적으로 제어하는 것이 프로젝트의 목적이었다. DE1-SoC는 실무보다는 교육용으로 자주 사용되는 보드여서, 레퍼런스나 참고할만한 자료들도 많이 없었고, 상위 레이어의 라이브러리도 사용하지 않았다. 그래서 아주 복잡한 로직이나 화려한 인터페이스 구현에 욕심을 내기보다는, 임베디드 시스템을 로우레벨에서 제어하는 방식을 실습한다고 생각하고 하나씩 접근하였다. 그래서 실제 '감시시스템'을 만든다고 하면 좀 이상한 구성이지만, 어쨌든 최대한 다양한 I/O를 사용하도록 계획했고, 나름대로의 BSP 형식으로 layer별로 코드를 짜며 프로젝트를 수행했다.
2. 설계 내용
설계 목표
시스템의 설계 목표를 구체화하면 다음과 같다.
1) VGA로 관제 system의 status를 표현
관리자가 IR센서가 부착된 step motor의 물리적 상태(현재 각도, 속도)와 현재의 물체 접근(감지) 현황을 파악할 수 있도록, 관련 정보들을 VGA를 통해 monitor로 출력한다.
2) Step motor를 auto 또는 manual로 제어
Step Motor 위에 IR 거리센서를 부착한다. 이 step motor의 각도와 속도를 자동 혹은 수동으로 변경하며, IR센서가 주변에서 접근하는 물체의 존재를 감지할 수 있도록 한다. Step motor의 각도·속도 제어를 위해서는 pulse의 주기를 조절해야 하므로 timer를 이용한다.
Potentiometer를 이용해 step motor의 속도를 수동으로 조작하고, push button으로 step motor의 좌우 각도를 수동 변경할 수 있도록 한다.
3) IR sensor를 통한 물체감지 logic 설계
ADC로 읽은 IR 거리센서의 analog-digital value를 바탕으로 물체 접근 인식 logic을 설계한다.
물체 감지 시 buzzer로 이를 알리고, monitor에 detection status를 표시 수 있도록 한다.
4) FSM을 활용해 System을 구성하여 각 요소들이 하나의 system으로 유기적으로 동작하도록 설계

상황에 따라 VGA로 표시할 화면을 변경하고, 현재 step motor의 제어 상태(manual, auto)를 결정하기 위해 FSM을 구성한다.
System에서는 step motor제어, sensor reading, display 등 여러 routine이 수행되고 있어야 하므로, state간 전환과 제어 flag들의 조정을 pushbutton의 interrupt를 통해 제어한다.
Block Diagram

구현
① Pushbutton / Interrupt
관제상황 display, step motor의 manual/auto 조정, step motor 수동조작 등, 관리자가 다양한 제어상태 사이를 전환할 수 있도록 FSM을 구성하였다. 각 state는 pushbutton을 통해 전환한다. 다양한 logic들이 수행되어야 하기 때문에, pushbutton의 입력을 interrupt handling으로 처리하여 state간 이동과 제어 flag 변화를 구현하였다.
② Interval Timer / Interrupt
Step motor의 속도를 제어하기 위해서는 GPIO를 통해 step motor로 내보내는 pulse 의 주기를 조절해야 한다. 따라서 DE1-SoC의 내부 timer를 이용해 timeout시의 interrupt routine에서 pulse를 내보내는 delay를 조절한다. 본 설계에서는 timer를 millisecond 단위로 분주하여 사용하였다.
③ GPIO / Step Motor
IR 거리센서를 회전시키기 위해 step Motor를 사용한다. Step Motor의 효율적인 제어와 안정적인 전원공급을 위해 step motor driver를 사용하였다. GPIO pin 2개를 output으로 사용하여, step motor의 방향(DIR)과 동작 pulse를 제어한다(PULSE). 마찬가지로 timer를 이용해 PULSE pin의 신호 주기를 바꾸면서 속도를 조절한다.
④ ADC / IR Sensor
물체의 유무를 감지할 IR 거리센서를 step Motor에 물리적으로 연결한다. GPIO port를 이용해 step motor의 속도와 각도(방향)를 제어하여, IR 거리센서로 광각을 감시할 수 있도록 한다.

ADC port로 읽어들인 12bit voltage 값을 실제 거리로 변환해야 했다. GP2Y0A02YK0F 센서의 데이터시트를 보면 거리특성은 위 그림과 같다. 이에 맞게 변환을 해야 센서가 보증하는 거리값을 구할 수 있다. 근데 아주 정밀한 값을 구하는 것이 목적이 아니고, 물체 유무만 판단하면 됐기에 그냥 대충 linearization해서 거리값으로 변환했다. 이 값을 바탕으로 물체의 존재 여부를 파악한다.
사실 이러한 목적에는 PIR센서를 사용하는 것이 더 적합하겠으나, 그냥 IR 거리센서를 사용해봤다는 것에 의의를 두었다...
⑤ ADC / Potentiometer
Step motor의 속도를 manual로 제어하려면, 기준 값이 있어야 한다. DE1-SoC의 ADC channel을 이용해 potentiometer의 analog 값을 받아, 이 값을 바탕으로 step motor의 속도를 바꾸는 logic을 구현하였다.
⑥ Video output port
관리자가 물체 접근 유무를 관제하고, 현재 상태를 파악하기 위해서는 정보들을 monitor를 통해 graphical하게 표현하는 것이 효과적이다. Auto Surveillance mode에서는 pixel buffer로 bar graph를 구현해 감시 상태를 표시한다. 또한 character buffer를 이용해 상태 메시지들을 표시한다.
⑦ GPIO / Buzzer
물체 감지 시 효과적인 인지를 위하여, VGA를 통해 감지 메시지를 표시할 뿐만 아니라, buzzer로 경보가 울리도록 구현하였다. Buzzer는 GPIO output을 이용해 제어한다.
소감
학기중에 촉박한 일정하에 혼자 진행한 프로젝트여서 여러모로 아쉬운 점이 많았다. 나름대로 HAL처럼 라이브러리 계층을 구분해서 BSP 코드를 짜보려고 했는데 지금 코드를 보면 상당히 뒤죽박죽인것 같다. 그래도 짧은 시간에 굉장히 다양한 I/O, 그래픽구현, exception handling을 register레벨부터 시작해서 전체적인 시스템 구색을 갖추도록 구현했다는 것에 의의를 둔다... 차후에는 실무에 사용되는 프로세서와 상황에 좀더 적합한 peripheral을 가지고 좀 더 구조적인 코드를 짜서 제어할 수 있을 것 같다...
'Projects > Undergraduate' 카테고리의 다른 글
RealTime Clock with Dot Matrix (0) | 2022.08.12 |
---|---|
Digital System Design tp (0) | 2022.06.10 |
Microprocessor Termproject (0) | 2022.06.03 |
공유 gallery modeling (0) | 2022.05.13 |
댓글