September 25, 2018

디바이스마트 미디어:

[47호]Auxiliary Device For Shooting(ADFS)

Cap 2017-10-18 13-15-49-260

2017 ICT 융합 프로젝트 공모전 참가상

Auxiliary Device For Shooting(ADFS)

글 | 광운대학교 이상하, 이상훈

 

1. 심사평
칩센 경험을 통해 불편한 점을 개선하기 위한 노력이 보이는 작품입니다. 다만 경험을 통해 덧붙이자면, 군대에서 사격 훈련의 2인 1조를 운용하는 것은 단순히 바둑돌을 올리기 위함으로 보기는 힘들어 보입니다. 간단한 시스템 구성을 통해 작품의 의도인 군 훈련의 효율성을 높일수도 있지만, 기술적으로 높은 아이디어라 보기는 힘들고 부착된 센서들의 기능이 너무 단순화되어 있는데 이것을 또 다른 부가 기능으로 사용하는 방법은 없었을지에 대한 아쉬움도 남습니다.
뉴티씨 군에 보급하게 된다면 군대 전체의 사격 명중률을 책임지는 장비가 될 가능성이 있습니다. 걸리적 거리는 선 없이 장비를 일체화시키면 간단한 부착을 통한 동작에 충분히 실용성이 있어 보입니다.
위드로봇 MEMS 센서를 활용해 사격 훈련에 활용하는 아이디어가 돋보입니다. 아쉬운 점은 “진동”을 판단하는 부분은 is_safe() 부분인데, 단순한 thresholding으로 처리한 부분입니다. 이 부분에 대한 고민이 더 있으면 좋겠습니다.

2. 작품개요

47 feature adfs (1)
소총 사격 시 가장 중요한 것은 손 떨림 없이 사격하는 것이다
PRI(Preliminary Rifle Instruction) 훈련은 표적을 정확히 명중시키기 위하여 조준, 자세, 호흡, 격발의 사격술을 숙달하고 사격 연습과 가늠자 조정을 숙달하기 위한 훈련이다. 소총사격 시 가장 중요한 것은 손 떨림 없이 사격하는 것이다. 그래서 우리는 PRI(Preliminary Rifle Instruction) 훈련을 했었던 기억이 있다. 특히, 대한민국 육군에선 바둑돌을 K2 맨 앞에 올려 2인 1조로 사격 연습을 한다. 바둑돌 대신 조그만 한 센서(sensor)를 소총에 부착시키면, 2인 1조의 수고를 덜어줄 수 있고 실제 사격에도 훌륭한 사격 보조 장치가 될 것이다.

47 feature adfs (1)

물체의 방위 변화를 인지하는 자이로 센서(Gyro-sensor)를 이용하여 가속도(진동)를 인지하고, ATmega8A-PU와의 I2C(TWI)통신을 기반으로 한다. 일정 값 이상으로 진동할 경우, LED에 불이 꺼지도록 하여 적절한 사격 준비가 되지 않았음을 사용자에게 알린다. 또한, 야간 사격의 경우 LED의 불이 밝다면 적군에게 위치를 알려주는 셈이다.
이를 보완하고자 조도센서를 이용하여, 빛에 따라 LED의 밝기를 제어할 수 있도록 하였다.
이러한 작품을 군에서 활용한다면, 실제 사격에서 유용한 사격 보조 장치가 될 것이다. 또한, 기존의 사격술 예비 훈련(Preliminary Rifle Instruction)의 단점을 보완하여, 혼자서도 객관적이고 확실한 사격 훈련을 할 수 있을 것이다.

3. 작품 설명
3.1. 주요 동작 및 특징
군대에서의 사격 훈련을 좀 더 보완할 수 있는 장치로서 고안하게 된 작품이다. 흔히, 군대에서의 사격 훈련을 생각해보면 PRI(Preliminary Rifle Instruction) 훈련을 떠올릴 수 있는데, 정확한 훈련 방법이 아니라고 생각한다. 대표적인 PRI(Preliminary Rifle Instruction)훈련은 총구위의 바둑알을 올려놓고 방아쇠를 당길 때 바둑알이 총구에서 떨어지는지 여부에 따라 사격 자세를 판단하는 훈련이다. 이는 여러 가지 외부적 요인으로 인하여 정확성이 떨어질 수밖에 없고 또한, 대체로 2인 1조를 이루어 훈련을 하게 되기 때문에 비효율적이다. 이러한 점을 보완하기 위해 만든 이번 작품은 기존의 아날로그적 훈련 방식을 탈피할 수 있게 한다. 먼저 작품의 특징이다.

소형화
3(cm)*3(cm) 정도의 소형 작품이다. 소형화는 작품의 활용성을 높이는 중요한 요인이다.

47 feature adfs (2)

탈부착
총기에 작품을 탈부착 할 수 있다. 새로운 제작 과정 없이 기존의 총기에 바로 적용이 가능하도록 설계를 하였다.
크기, 디자인 등과 관계없이 사격 훈련을 위해 다양한 총기에 탈부착을 할 수 있게 하여 자원의 효율성을 높였다.

47 feature adfs (8)

저전력
ATmega8A-PU, 코인전지를 사용하여, 저전력방식을 택하였는데 이는 군대에서의 활용성을 높이는 중요한 요인이다.
ATmega8A-PU는 AVR RISC(Reduced Instruction Set Computer)구조로 제조된 대표적 고성능, 저전력 소모용 CMOS 8bit MCU이다.
작품의 주요 동작은 다음과 같다.
첫째, 전원을 켜게 되면 LED가 점등하게 되고, 총기 옆에 부착된 MPU6050이 포함된 회로에서 가속도(진동)를 수시로 측정한다. 측정된 값을 Sampling 과정을 거쳐 진동이 있다고 판단될 경우 LED가 소등되면서 정확한 사격 준비 자세를 갖추지 않았음을 알린다. 반대로, 진동이 없다고 판단될 경우 LED는 점등하게 된다.
즉, 사용자는 LED가 깜빡거리거나, 소등될 때 자신의 사격 자세가 부정확하다는 것을 깨닫고 자세를 고칠 수 있다.

47 feature adfs (4)

47 feature adfs (5)
둘째, LED 밝기를 주위 환경에 따라 자동으로 제어할 수 있다.
군에서의 야간 사격의 경우와 사격 준비가 되었음을 알리는 LED의 밝기가 너무 밝을 경우에, 적군에게 나의 위치를 알릴 수 있어서 큰 문제가 될 수 있다. 또한, 낮에는 빛의 양이 많기 때문에, LED가 점등이 되어도 잘 보이지 않는다.
이를 해결하고자 Cds(조도) 센서를 통한 빛 감지, ADC 기능을 이용하여 듀티비를 조정하여 빛의 양에 따라 LED의 밝기를 자동으로 조절할 수 있게 하였다. 밤에는 LED 밝기를 낮추어 적군에게 눈에 띄지 않도록 하였고, 낮에는 LED 밝기를 높여 LED가 잘 보이도록 설계하였다.
마지막으로, 하드웨어적으로 나사나 드라이버를 이용하여 수동으로 가변 저항을 조정, ADC를 이용하여 움직임(진동)의 민감도를 조정할 수 있다. 즉, 허용할 수 있는 진동의 민감도를 사용자가 조정할 수 있도록 하여편의를 도모하였다.
예를 들어 설명해보면, 어떠한 진동에 깜빡거리거나 소등되었던 LED를 가변저항을 시계 방향으로 나사나 드라이버를 이용하여 돌릴 경우, 진동의 민감도는 낮아져 둔감해진다. 따라서 앞서와 똑같은 진동에는 더 이상 깜빡거리지 않고 켜져 있게 된다.
반대로, 반시계 방향으로 가변 저항을 돌릴 시 진동의 민감도는 높아지게 되어 더 향상된 고도의 사격 훈련을 할 수 있을 것이다.

3.2. 전체 시스템 구성
전체 시스템 구성을 보기 쉽게 표현하여 보았다.

47 feature adfs (2)
시스템을 크게 총 4가지로 구성으로 나누었다.

· MPU6050(자이로 센서)를 통하여 가속도(진동) 인지하여 IC2 통신을 기반으로 값을 전달한다.
· 전달된 값이 사용자가 설정한 진동 값 기준보다 클 경우 LED는 소등되며, 작을 경우 LED는 점등된다. 여기서 LED가 점등된다는 것은 진동이나 움직임이 거의 없으므로, 적절한 사격 준비 상태라는 의미이다. 반대로, LED가 소등된다는 것은 손 떨림이나 움직임이 많으므로, 사격 준비가 되지 않았다는 의미이다.
· 조도 센서를 이용하여 빛을 감지하고, 풀 다운 저항을 통과한 아날로그 전압 신호는 ADC 과정을 거쳐 디지털 신호로 변화하고, 듀티비를 조정하여 LED를 제어한다.
· 가변 저항과 풀 다운 저항, ADC를 이용하여, 진동의 민감도를 조정한다. 가변 저항을 시계방향으로 돌릴 시, 진동의 민감도는 낮아지게 된다. 반대로, 반시계 방향으로 돌릴 경우, 진동의 민감도는 높아져 똑같은 진동을 가하더라도, 가변저항의 조정으로 LED 점등 여부는 달라질 수 있다.

이러한 시스템 구성도와 각각의 기능을 이해하기 위해서는 몇 가지 알아야 될 배경지식이 있다.

첫째, IC2(TWI)통신이다. ATmega8A-PU와 MPU6050모듈을 사용하여 IC2(TWI)통신을 기반으로 가속도(진동)를 측정할 수 있다.

47 feature adfs (6)
IC2통신의 특징은 다음과 같다.

· 단지 두 개의 버스 선을 사용하는 간단하고 효율적인 통신 방식
· 마스터(Master)와 슬레이브(Slave) 동작을 모두 지원
· 디바이스에서 송수신 모두 가능
· 7비트 주소를 사용하여 128개의 다른 슬레이브 주소 가능
· 400kHz 데이터 속도까지 지원

둘째, 빛을 감지하기 위한 조도 센서와 ADC이다. 또한, Cds sensor에서의 아날로그 신호를 ATmega8A-PU 시스템에서 처리하기 위해서는 ADC과정을 거쳐서 디지털 신호로 변환을 해야한다.

47 feature adfs (7)

빛의 양에 따라, LED를 제어하기 위해 Cds sensor를 이용한다.
Cds sensor는 광센서의 가장 기본적인 sensor로서, 빛의 밝기에 대하여 전기적인 성질로 변환시켜주는 sensor이다.
Cds sensor의 특징은 빛이 많을수록 광자 양은 많아져 저항값이 작아지고, 빛이 적을 경우에는 저항값은 커지게 된다. 빛의 양에 대한 저항값의 변화를 이용하여 주위의 밝기를 알아낼 수 있다.
Cds sensor를 이용하여 주위 환경의 밝기에 따라 아날로그 전압의 값은 바뀐다. 이러한 아날로그 전압은 ADC(Analog-to-digital converter)를 통하여 디지털 값으로 변환되고, ATmega8A-PU모듈에서 그 값을 처리할 수 있게 된다.
기준 전압을 AVCC핀으로 연결하고 풀 다운 저항을 사용하여 ADC0 핀으로 아날로그 신호가 입력되고 ADC 변환이 이루어지도록 하였다.
또한, Date sheet에서는 AREF핀을 사용하지 않을 경우 GND와 0.1uF의 커패시터를 연결할 것을 권한다. 하지만 이 역시 A/D변환 회로부에 들어가게 될지도 모르는 전원 잡음을 조금이라도 줄이기 위한 방편이며, 연결하지 않아도 크게 영향을 미치지 않는다.

셋째, 풀 다운 저항의 이해이다.
ADC0 핀에 들어가는 전압을 조정할 수 있도록 풀 다운 저항을 사용하였다. 풀 다운 저항은 전압 분배의 원리를 적용한 것인데, Ground로 연결된 저항의 값을 올리게 되면 핀에 들어가는 전압의 크기는 증가하게 된다. 즉, 각각의 저항의 값을 조정하여 핀에 입력되는 전압 기준을 원하는 대로 조정할 수 있다.

3.3. 개발 환경
교차 개발

47 feature adfs (3)

교차 개발은 어떤 컴퓨터 시스템에서 운영하는 소프트웨어를 해당 시스템이 아닌 다른 시스템 상에서 개발하는 것을 말한다.
Windows10 시스템에서 운영되는 AVR studio 4.19 tool을 사용하여, ATmega8A-PU 시스템 상에서 교차 개발하였다.
개발 언어로는 C언어를 사용하였다.

4. 단계별 제작과정
기획
군 생활 시절 불편한 점을 생각하였고, 이 점을 전공 지식을 활용하여 해결할 수 있는 부분을 생각하였다. 그 중에서 사격 훈련에 여러 전자 장치를 가미하여 좀 더 효율적으로 훈련을 받을 수 있도록 하고자 이번 작품을 고안하게 되었다.

설계
4가지 경우로 나누고 각각에 대해서 설계하였다.
· 밝은 날 햇빛에 의한 조도센서 값
· 밤에 햇빛이 없을 때 조도센서 값
· 진동 없을 때 gyro센서 값
· 진동 있을 때 gyro센서 값

검증
tera term 프로그램을 이용하여 디버깅을 위한 소스 코드를 짜서, 각각의 경우에 대해서 sensor 값을 얻을 수 있었다.

제작
브레드보드를 이용하여 시스템 구성도를 바탕으로 제작을 해보았다.

적용

47 feature adfs (8)

5. 기타
회로도
세 가지로 나누어 구현하였다.

47 feature adfs (4) 47 feature adfs (5) 47 feature adfs (6)
소스코드

#include<avr/io.h>
#include<compat/ina90.h> // 헤더 선언
#include<util/delay.h>
#include<stdio.h>
#define CDS_VALUE 800

static int putchar0(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(putchar0, NULL, _FDEV_SETUP_WRITE);

void write(unsigned char add,unsigned char dat); // 쓰기
unsigned short read(char addr); // 읽기
int is_safe(unsigned short GxLow); //진동 측정, 민감도 조절가능
void init_adc();
unsigned short read_adc();
void show_adc(unsigned short value);
void my_delay(int value);
int sensitivity;

int main()
{
unsigned short GxLow; // x축 센서값 변수
unsigned short value;
int i;

DDRB=0×01; //LED 포트 출력설정
UBRRH = 0; //UART 초기설정
UBRRL = 51;
UCSRB=(1<<RXEN)|(1<<TXEN);
UCSRC=(3<<UCSZ0)|(1<<URSEL);
stdout = &mystdout;
init_adc();

PORTC=0×30; //풀업저항 활성화
SFIOR &= ~(1<<PUD);//풀업저항 활성화

// I2C INIT
TWCR=0×04; // TWI 활성화
TWSR=TWSR & 0xfc; // Prescaler : 1, 상태 초기화
TWBR=92; // 00001100, Fscl = 400KHz(Fcpu/(16+2*TWBR*Prescaler) = Fscl)

_SEI(); //SREG IBit SET (_CLI() : CLEAR)

write(0x6B, 0×00); //센서 ON
write(0x6C, 0×00);
write(0x1B, 0×08); // gyro set – 500/s로 설정
write(0x1A, 0×05); // DLPF 10Hz로 설정

sensitivity = read_adc(); //하드웨어적으로 저장된 진동 조절값 가져옴
while(1)
{
_delay_us(100);
GxLow=read(0×44); //자이로 x L값 읽어오기
//printf(“gyro-value\n”);
//printf(“%d\n”,GxLow);
//printf(“**********************\n”);
if(is_safe(GxLow))
{
ADMUX=0×40; //ADC0로 스위칭
value=read_adc(); //조도센서값 가져옴

PORTB=0×01;
my_delay(value/3); //숫자값 조정하면 빛의양 조정 가능 (범위 1 ~ 500)
PORTB=0×00;
}
}
}

void write(unsigned char add,unsigned char dat) //자이로 센서 설정
{
_delay_us(50); // 50us
TWCR=0xA4; // S
while((TWCR&0×80)==0×00); // 전송 대기
while((TWSR&0xF8)!=0×08); //신호 대기

TWDR=0xD0; // AD+W저장
TWCR=0×84; // 전송

while((TWCR&0×80)==0×00); //전송대기
while((TWSR&0xF8)!=0×18); //ACK대기
TWDR=add; // RA
TWCR=0×84; // 전송

while((TWCR&0×80)==0×00);
while((TWSR&0xF8)!=0×28); // ACK
TWDR=dat; // DATA
TWCR=0×84; // 전송

while((TWCR&0×80)==0×00);
while((TWSR&0xF8)!=0×28); // ACK
TWCR|=0×94; // P
_delay_us(50); // 50us
}

unsigned short read(char addr) //자이로 센서 값 읽어오기
{
unsigned short data; // data넣을 변수

TWCR=0xA4; // S
while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×08); //신호대기
TWDR=0xD0; // AD+W
TWCR=0×84; // 전송

while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×18); //ACK
TWDR=addr; // RA
TWCR=0×84; //전송

while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×28); //ACK
TWCR=0xA4; // RS

while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×10); //ACK
TWDR=0xD1; // AD+R
TWCR=0×84; //전송

while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×40); // ACK
TWCR=0×84;//전송

while((TWCR&0×80)==0×00); //통신대기
while((TWSR&0xF8)!=0×58); //ACK
data=TWDR;
TWCR=0×94;
_delay_us(50); // 50us
return data;
}

void init_adc()
{
ADMUX=0×41; //ADC0 입력, 싱글엔드입력,
ADCSRA=0×87;
}

unsigned short read_adc()
{
unsigned char adc_low, adc_high;
unsigned short value;
ADCSRA|=0×40; //ADC start conversion, ADSC=’1′
while((ADCSRA&0×10)!=0×10); //ADC 변환 완료 검사
adc_low=ADCL;
adc_high=ADCH;
value=(adc_high<<8)|adc_low; // 16비트 만들기
return value;
}

void my_delay(int value)
{
int i;
for(i=0;i<value;i++)
_delay_us(100);
}

int putchar0(char c, FILE *stream)
{
if(c==’\n’)
putchar0(‘\r’,stream);
while(!(UCSRA & 0×20));
UDR = c;
return 0;
}

int is_safe(unsigned short GxLow)
{
int temp=1;
if(GxLow>sensitivity) //숫자를 크게하면 둔감해지고, 작게하면 민감해진다.
{ // ㄴ50~200 사이 조정가능
temp=0;
}

return temp;
}

참고 문헌
· http://studymake.tistory.com/383
· USP-ISP와 AVR-Studio로 시작하는 AVR ATmega9 프로그래밍

Leave A Comment

*