March 29, 2017

디바이스마트 미디어:

[32호]조립형 Hybrid Wheel Chair

ict main2-01

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

조립형 Hybrid Wheel Chair

글 | 동양미래대학교 임우람

심사평

펌테크 기존의 전동휠체어 제품과 별다른 차이점이 없어 보인다.

JK전자 횔체어의 종류가 다양하고 일반 횔체어에 견고하게 장착을 해서 실제로 사용하려면 수 많은 시행착오와 연구 과정이 필요하겠지만 저렴한 비용으로 일반 횔체어를 전동 횔체어로 변신시켜 줄 수 있는 훌륭한 아이디어다. 어려운 사람을 위한 편의를 제공하겠다는 이런 아이디어를 생각했다는 것만으로도 박수를 쳐주고 싶고, PCB 개발부터, 소프트웨어, 기구부까지 모두 직접 구현한 노력과 열정이 대단하며 본 작품을 구현하면서 정말 많은 것을 배웠으리라 생각이 된다.

뉴티씨 아이디어 및 기술력은 참신하나 완성되지 못한 점이 마이너스 요소이다. 추후 스마트폰 어플리케이션의 연동으로 나오는 결과물이 기대된다.

칩센 기구 구현을 하기 전 레고로 모형 아이디어 구상을 하여 실수를 줄이려고 한 점이 돋보입니다. 아이디어가 타 학생들에 비해 기구물 구현 난이도가 높은 과제인데 이를 해결하기 위한 과정에 대한 자료가 부족하고 일반 전동 휠체어에 비해 하이브리드 휠체어의 차이점에 대한 부분도 부족한 것 같습니다.

위드로봇 기존 제품의 장단점을 분석하고, 아이디어를 낸 후 이를 확인하기 위해 레고와 같이 큰 비용, 시간 부담없이 자신의 아이디어를 확인한 부분은 매우 훌륭하다. PCB를 직접 아트웍한 부분도 학습 관점에서는 매우 잘 한 부분이라 생각한다. 매번 모든 과제의 PCB 아트워크를 할 수는 없겠지만 한 두번쯤은 직접 해 보는 것이 좋다고 생각한다. 아쉬운 부분은 학생이니만큼 배운다는 측면에서 모터 드라이버를 직접 제작해 봤으면 더 많은 것을 얻을 수 있는 과제가 되지 않았을까 싶다. 상용화 측면에서는 바퀴에 동력을 전달하는 부분은 어떤 형태로든 개선이 되어야 가능할 것 같으며 모터 제어에 있어 저크(jerk)를 제거하여 탑승자가 좀 더 부드럽게 움직인다는 느낌을 받게 구현하는 것이 필요해 보인다.

작품 개요

개발동기

기존의 수동휠체어와 전동휠체어의 장단점은 존재한다. 수동휠체어는 경제적이고, 휴대성이 편리하다는 이점이 있는 반면에, 몸이 불편하다는 정도에 따라 사용할 수 있는 사람의 범위가 한정되어 있고, 오르막길 혹은 내리막길 등의 지형적인 요소에 따라서 사용하기가 어렵다는 단점이 존재한다. 전동휠체어는 수동휠체어와는 반대로 사용할 수 있는 사람의 범위가 크고, 여러 지형에 관계없이 사용이 가능하다는 이점이 있는 반면에 휴대성이 불편하고 금액이 상당히 비싸다는 단점이 존재한다. 따라서 이러한 수/전동 휠체어의 단점을 보완하고 장점만을 나타낼 수 있는 제품을 필요로 함에 따라 수/전동 휠체어의 이점을 모두 가질 수 있는 Hybrid Wheel Chair의 제품이 만들어지게 된다. 하지만 기존의 Hybrid Wheel Chair는 보통 바퀴의 회전부 자체에 디스크형 모터를 같이 주문제작을 통해 위치하게 되면서 여기서 경제적인 부분이 많이 증가하게 된다.
이에 따라 우리는 기존의 수·전동화가 가능한 휠체어에 대한 단점을 보완하기 위해 조립형 Hybrid Wheel Chair를 제작하게 되었다.

기존 제품
디스크형 수/전동 휠체어

32 ict 임우람 (1)
그림1. 야마하 jwx-1

· 수/전동 휠체어의 각 장점을 결합한 휠체어
· 모드 전환을 통해 수동모드, 전동모드 사용가능
· 디스크형 모터를 사용하여 바퀴 탈부착 가능 (편리한 휴대성)

계명대 탈착형 수/전동 휠체어

32 ict 임우람 (2)
그림2. 계명대 탈착형 휠체어

· 전동키트가 자유롭게 탈착이 가능하도록 설계
· 기존 제품의 경제적인 측면을 보완
· 보조바퀴에 동력을 전달하여 전후진 전동화가 가능 (좌/우 방향전환에 동력을 전달하는 식이 아닌 보조적 기능)

개발 작품 설명

Cap 2015-11-25 14-17-52-067

그림3. 레고로 구현한 hybrid wheel chair

기존의 수동휠체어는 박스형 전동키트의 장착을 통해 전동휠체어가 된다. 탈부착이 가능하도록 하여 필요에 따라 수동, 전동 휠체어 각각의 용도로 사용할 수 있다. 이에 따라 전동휠체어의 역할을 하는 동시에 휴대성 또한 좋아지게 되었다. 모터와 배터리, 메인보드 등의 모터 구동관련 회로의 모든 연결부를 박스 형태의 구조물에 배치하여 수동 휠체어에 이를 탈부착이 가능하도록 제작하였다. 기존 제품과의 경제적인 부분에 차별성을 두고, 양쪽 바퀴 모두에 동력을 전달함으로써 조이스틱 시스템을 통해 전동휠체어와 같은 역할을 할 수 있도록 하였다.

개발과제

기존 수, 전동휠체어의 특징 파악

기존 제품들의 장단점을 정확하게 파악하고 있어야 더욱 발전된 제품을 만들 수 있다.

기구적 아이디어 및 시행착오 필요

기구의 회전부와 전동을 위한 구조물이 제대로 연결이 되어야 동력을 전달할 수 있다. 이에 따른 연결방법에 대한 아이디어 및 더 견고한 틀을 만들 수 있도록 경험적 시행착오가 필요하다.

BLDC 모터 제어

전동휠체어를 구동하기 위해선 모터를 제어할 줄 알아야 하는데, 이에 따른 하드웨어, 소프트웨어 지식을 쉽게 습득하기는 어렵다. 모터제어를 위한 공부를 정말 열심히해야 이 과제를 수행할 수 있을 것이라 생각한다.

하드웨어

메인 컨트롤러 보드

32 ict 임우람 (4) 32 ict 임우람 (5) 32 ict 임우람 (6)
그림4. CPU 보드 그림5. BASE 보드 그림6. 메인 컨트롤러 보드

우리는 작년 7월 BLDC 모터제어에 필요한 회로들이 모인 메인 컨트롤러 보드를 제작하였다. 직접 만능기판에 납땜, 브레드보드를 사용 등의 방법도 있지만, 직접 PCB를 제작하는 방법을 택했다. 먼저 PCB 제작을 위한 기본적인 ORCAD 사용법과 layout 등의 실무적인 기술을 익혔고, 다음으로 작업에 들어갔었다. 이 당시 관련 직종 종사자분께 교육을 받는 영광이 있었고, 이에 따라 PCB 기판을 제작해 볼 수 있는 값진 경험을 하게 되었다.

DC-DC(step down)
입력전원 24V를 5V로 다운시켜서 CPU 전원으로 사용할 수 있도록 했다.

32 ict 임우람 (7)

그림7. DC-DC converter (step down)

 

CPU Header
ATmega128

32 ict 임우람 (8)
그림8. CPU
32 ict 임우람 (9)
그림9. CPU LAYOUT
32 ict 임우람 (10)
그림10. 디지털 in & output

DAC circuit (MCP 4822)
BLDC모터 드라이버의 0~5V Analog voltage를 제어하기 위해 dac converter 회로를 사용하였다. spi 통신을 통해 해당 데이터를 전송하여 속도제어를 할 수 있다.

32 ict 임우람 (11)
그림11. DAC

Buffer x2

실제 SPI 통신을 통해 데이터를 0~4096까지 보낼 수 있다. 하지만 이를 환산하였을 때 4.096V까지 제어가 되기 때문에 전압을 2배로 올려주는 회로를 배치하였다, 또한, 우리가 필요한 최대전압은 5V 이기 때문에 5V에서 컷팅하여 5V가 최대전압이 될 수 있는 회로를 배치하게 되었다.

32 ict 임우람 (12)
그림12. BUFFER

 

Circuit For UART

PC interface 및 조이스틱 시스템 구현을 위하여 uart통신이 필요하다. 이에 따라서 uart통신을 위한 회로를 배치하였다.

32 ict 임우람 (13)
그림13. PC interface

 

Bluetooth FB155BC

스마트폰 app을 통해 무선 조이스틱 시스템을 구현하기 위해 배치하였다.

32 ict 임우람 (14)
그림14. bluetooth

전체 시스템 구성

150W 모터 X2, SBDM-25A 모터 드라이버 X2, 배터리와 조이스틱, 그리고 메인 컨트롤러 보드가 합쳐지게 된다.

32 ict 임우람 (15)

그림15. 전체 시스템 구성도

기구부

위에서 레고로 구현한 것과 같이 박스형 전동키트를 수동휠체어에 탈부착 가능하도록 제작하려고 하였다. 가장 힘들었던 부분은 뒤에서도 언급하겠지만, 바퀴인 회전부에 동력을 전달하는 것이 정말 어려웠다. 우선적으로 수동휠체어 바퀴부분에 기어를 장착하여 동력을 전달하고 싶었는데, 실제 수동휠체어 바퀴안쪽 사이즈가 우리가 원하는 사이즈로 나온 것이 없었다. 그래서 많은 고생을 하게 됐는데, 현재까지도 이 부분에 대해 큰 해결을 하지 못했다. 지금은 우선적으로 모터의 샤프트와 바퀴표면을 밀착시켜서 표면장력으로 구동할 수 있도록 하였다. 이는 소프트웨어를 먼저 확인해봐야 했기 때문에 어쩔 수 없는 선택이었다.

32 ict 임우람 (16) 32 ict 임우람 (18)
동력전달부 매미고리&합판을 사용한 탈부착 전동키트

우선적으로 기어로 동력을 전달하는 과제를 해결하기 이전에 표면장력으로 동력을 전달하는 것을 완벽히 하고자 하는 목표가 있었다. 따라서 처음 생각한 박스형 전동키트를 위해 알루미늄을 주문제작하여 박스키트를 만들려고 했다. 하지만 실제로 사이즈가 조금 차이가 있어서 탈부착을 하지 못했는데, 당장의 구동연습을 위해 다시 합판을 통해 제작하게 되었다.

현재 하드웨어의 문제점 및 과제
메인 컨트롤러 보드 문제점
buffer 회로문제
위에 buffer 회로를 보면 하나의 buffer회로가 핀이 두 개가 잘못 연결되었다. 반전과 비반전회로가 뒤바뀐 것이다. 처음에 왼쪽모터가 제대로 속도제어가 안되고, 자꾸 타는 냄새가 나서 뭐가 문제인지 몰랐는데, 회로도를 유심히 보지 못했던 게 너무 아쉬울 정도로 어처구니 없는 실수를 하고 말았다. 쉽게 찾을 수 있었던 문제에 많은 시간을 쓰게 되었는데, 브레드보드에 직접 회로를 여러번 구성해 보다가 문제점을 찾을 수 있게 되었다. 현재는 우선 pcb제작에 금전적인 문제 때문에 다시 제작은 못하고있고, 우선 기판을 긁어내고 점프선을 띄어 납땜한 상태이다.

32 ict 임우람 (19)
그림16. 브레드보드로 회로를 구현, 에러를 찾다.

UART 회로문제

spi 통신을 통해 모터의 속도제어가 되는 것을 확인한 후에 uart통신을 통해 기본적인 pc인터페이스를 연습하게 되었다. 연습이 한 1~2시간 잘되고 있는 와중에 갑자기 탄 냄새가 나더니 uart 통신이 가끔씩 끊기고 하는 현상이 나타나게 되었는데, 시간이 조금 더 지나고는 아예 작동이 되질 않았다. 이 부분을 거의 2개월간 원인을 찾아보았는데 결론을 확실하게 찾지를 못했다. 하나 마음에 걸리는건 pc인터페이스 연습을 하는 와중 모터드라이버와 메인컨트롤러 간에 선 연결이 한 3군데 잘못 연결되었었는데 그때 전원 차단기를 내리지 못해서 전원이 들어갔었던 적이 있었다. 그것 때문에 uart 회로부분이 문제가 생겼는지도 모르겠다고 생각을 했다. 근데 DMM으로 연결부를 다 찍어보고 회로도 구성해보고 했는데 연결은 잘돼있고, 그냥 다른 동작은 다 잘되는 것을 보면 UART 회로부분만 문제가 생긴 것 같았다. 이 부분은 다시 기판을 제작할 때 좀 더 원인을 찾아봐야 될 것 같다. 현재는 UART통신을 쓸 수가 없고, 디지털 포트 제어부분에 냉납이 심해서 우선 급한대로 인터로크 회로를 기반으로한 4방향 버튼제어로 구동을 해보았다.

그림20. 5V 릴레이를 사용한 인터로크회로
그림17. 5V 릴레이를 이용한 인터로크 회로

기구적인 문제점

위에 설명한 것처럼, 모터 회전부에 기어를 장착하여 이를 박스형 전동키트를 통해 동력을 전달하는 것이 목표인데, 아직 완성하지 못했다. 사이즈의 문제와 아이디어가 많이 부족했던 것 같다. 현재는 앞쪽으로 표면에 동력을 전달하는 식인데 기어로 하면 뒤쪽으로 키트를 배치해야 할 것 같다.

소프트웨어

개발환경

ATmega128, AVR STUDIO 4, C언어

소스코드

spi 통신을 통한 속도제어
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int i; // 시간세기 변수
unsigned int blink_cnt1=0; // 10ms로 만들어주는 역할 중요.
unsigned int blink_cnt2=0;// 10ms로 만들어주는 역할 중요.

volatile unsigned char timer_flag=0; // 중요하다. 최적화를 하지마라 라는 것.
// 단점은 고정 메모리가1byte를 갖고잇다.
#define SS PB0
#define SCK PB1
#define MOSI PB2
#define MISO PB3
#define LDAC PB4

uint8_t junk ;

void update1(void)
{
PORTB &= ~(1<<SS); // ss핀을 low로하여 슬레이브의 동작을 허용한다.

for(i=0; i<1; i++){} //2.5us 지연 시간 설정

PORTB |= 1<<LDAC; // LDAC set high
SPDR = 0×98; // DACB select + (속도제어)
while (!(SPSR & (1<<SPIF))); //전송완료 기다림
junk = SPDR;
SPDR = 0xFF; //send final 8 data bits , 4.095V 출력
while (!(SPSR & (1<<SPIF))); //전송완료 기다림
junk = SPDR;
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<SS; // 전송 완료후 ss신호를 high로 만들어서 송신을 끝낸다.
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB &= ~(1<<LDAC); //set LDAC low then high to set DAC output
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<SS | 1<<LDAC;
// 초기화
// add the control values for the chip
// bit 15 ,1 – DACA or DACB Select bit/ DACB Select
// bit 14 ,0 – don’t care
// bit 13 ,0 – Output gain select(x2)
// bit 12 ,1 – Output shutdown control bit(active mode)

}

void update2(void)

{
PORTB &= ~(1<<SS); // ss핀을 low로하여 슬레이브의 동작을 허용한다.
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<LDAC; // LDAC set high

SPDR = 0×18; // DACA select + (속도제어)
while (!(SPSR & (1<<SPIF))); //전송완료 기다림

junk = SPDR;
SPDR = 0xFF; //send final 8 data bits , 4.095V 출력
while (!(SPSR & (1<<SPIF))); //전송완료 기다림

junk = SPDR;
for(i=0; i<1; i++){} //2.5us 지연 시간 설정

PORTB |= 1<<SS; // 전송 완료후 ss신호를 high로 만들어서 송신을 끝낸다.

for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB &= ~(1<<LDAC); //set LDAC low then high to set DAC output
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<SS | 1<<LDAC;
// 초기화
// add the control values for the chip
// bit 15 ,0 – DACA or DACB Select bit/ DACA Select
// bit 14 ,0 – don’t care
// bit 13 ,0 – Output gain select(x2)
// bit 12 ,1 – Output shutdown control bit(active mode)

}
void display10(void)

{
}

ISR(TIMER2_COMP_vect) // 메인 타이머 인터룹트 함수!!! 레지스터 값 지정을 통하여 1msec로 들어온다.
{

timer_flag=1;
// 이 안에는 왠만하면 간단한 것만 넣어야한다!
// flag를 통해 1ms후에 들어오면 1로 표시 해준다. flag는 0,1의 논리값
}

void timer (void)
{
TCCR2 = 0x0B; // timer/counter control register, clk/64 , CTC모드, normal 설정
TCNT2 = 0; // 시작 지정 (실제로 세는것 이것이 카운트된다)
OCR2 = 249; // 0~249로 해서 250번 센다. 1ms 로 만들어 준 것이다.
//즉 tcnt =o cr이되면 딱 1ms이며 이때 인터룹트가 발생되는데 이 모드가 ctc모드이다

TIMSK = 0×80; // T2 OCR2 interrupt 해당지정.
}

void SPI_MasterInit(void) //spi 마스터 레지스터설정

{
//Init Ports

DDRB = 0b00010111;// LDAC,MOSI,SCK,SS 출력 , MISO 입력

PORTB |= 1<<SS;
// SS 비활성화
//Init SPI

SPCR |= 1<<SPE | 1<<MSTR | 1<<SPR1;
// SPI 제어 레지스터이다. SPI활성화, 마스터 설정, 1/64 분주율
// 7bit – spi 인터럽트 활성화 비트 – clear
// 6bit – spi 활성화 비트 – set
// 5bit – 데이터 전송 순서 비트 – msb부터
// 4bit – 마스터/슬레이브 모드 선택 비트 – master set
// 3bit – 클록극성비트 – 데이터가 전송될때 HIGH유지
// 2bit – 클록 위상비트 – 클록의 앞쪽 에지에 데이터를 샘플링한다, cpol비트를 결합하여 결정.
// 송신 데이터 셋업은 하강에지, 수신 데이터 샘플링은 상승에지 이다.
// 1,0bit – 1/64 분주

}

#define forword 0×40
#define stop 0×01
#define Break 0×02

// 드라이버 모드 선택비트

int main (void)

{

// 타이머2 레지스터 설정.;

DDRC = 0xFF;
timer(); // timer2 register set

SPI_MasterInit(); // spi register set

sei(); // global interrupt enable
//set enable interrupt

while(1)
{
PORTC= 0×55;
for(i=0; i<60000; i++){}
for(i=0; i<60000; i++){}
for(i=0; i<60000; i++){}
PORTC= 0xAA;
for(i=0; i<60000; i++){}
for(i=0; i<60000; i++){}
for(i=0; i<60000; i++){}
// LED 확인

if (timer_flag !=0) // 0이 아니라면· { timer_flag=0;// 초기화를 꼭시켜야한다. 이러면 1ms마다 타이머 인터럽트함수가 왓다갓다 실행된다.

cli();// 인터럽트 클리어

update1();
update2();
display10(); sei(); //enable interrupt
}
}
}

 

uart 통신을 통한 pc인터페이스

#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>

unsigned int i; // 시간세기 변수
unsigned int blink_cnt1=0; // 10ms로 만들어주는 역할 중요.
unsigned int blink_cnt2=0; // 10ms로 만들어주는 역할 중요.

volatile unsigned char timer_flag=0; // 최적화를 하지말라는 뜻.
// 단점은 고정 메모리가1byte를 갖고잇다.

#define SS PB0
#define SCK PB1
#define MOSI PB2
#define MISO PB3
#define LDAC PB4

uint8_t junk ;

void update1(void)

{
PORTB &= ~(1<<SS);
// ss핀을 low로하여 슬레이브의 동작을 허용한다.

for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<LDAC; // LDAC set high
SPDR = 0×90; // DACB select + data 속도값
while (!(SPSR & (1<<SPIF))); //전송완료 기다림
junk = SPDR;
SPDR = 0xFF; //send final 8 data bits , 4.095V 출력
while (!(SPSR & (1<<SPIF))); //전송완료 기다림
junk = SPDR;
for(i=0; i<1; i++){} //2.5us 지연 시간 설정

PORTB |= 1<<SS; // 전송 완료후 ss신호를 high로 만들어서 송신을 끝낸다.

for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB &= ~(1<<LDAC); //set LDAC low then high to set DAC output
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<SS | 1<<LDAC;
// 초기화
// add the control values for the chip
// bit 15 ,1 – DACA or DACB Select bit/ DACB Select
// bit 14 ,0 – don’t care
// bit 13 ,0 – Output gain select(x2)
// bit 12 ,1 – Output shutdown control bit(active mode)

}

void update2(void)

{
PORTB &= ~(1<<SS); // ss핀을 low로하여 슬레이브의 동작을 허용한다.
for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<LDAC; // LDAC set high
SPDR = 0×10; // DACA select + data 속도값
while (!(SPSR & (1<<SPIF))); //전송완료 기다림

junk = SPDR;
SPDR = 0xFF; //send final 8 data bits , 4.095V 출력

while (!(SPSR & (1<<SPIF))); //전송완료 기다림

junk = SPDR;
for(i=0; i<1; i++){} //2.5us 지연 시간 설정

PORTB |= 1<<SS; // 전송 완료후 ss신호를 high로 만들어서 송신을 끝낸다.

for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB &= ~(1<<LDAC); //set LDAC low then high to set DAC output

for(i=0; i<1; i++){} //2.5us 지연 시간 설정
PORTB |= 1<<SS | 1<<LDAC;
// 초기화
// add the control values for the chip
// bit 15 ,0 – DACA or DACB Select bit/ DACA Select
// bit 14 ,0 – don’t care
// bit 13 ,0 – Output gain select(x2)
// bit 12 ,1 – Output shutdown control bit(active mode)
}
void display10(void)
{
}

// uart start //
unsigned char get_data(void)
{
while(!(UCSR0A&0×80)); // 수신완료될때까지 대기
return UDR0;
}

void send_data(unsigned char data)
{

while(!(UCSR0A&0×20)); // 송신데이터를 받을 준비가 될때까지 대기
UDR0 = data;
if(data == ‘1’) // 만약 터미널에서 날아온 데이터가 숫자 1 이라면
{
SPDR = 0×90;
}
else if(data == ‘2’) // 만약 터미널에서 날아온 데이터가 숫자 2이라면
{
SPDR = 0×91;
}
else if(data == ‘3’) // 만약 터미널에서 날아온 데이터가 숫자 3이라면
{
SPDR = 0×92;
}
else if(data == ‘4’) // 만약 터미널에서 날아온 데이터가 숫자 4이라면
{
SPDR = 0×93;
}
else if(data == ‘5’) // 만약 터미널에서 날아온 데이터가 숫자 5이라면
{
SPDR = 0×94;
}
else if(data == ‘6’) // 만약 터미널에서 날아온 데이터가 숫자 6이라면
{
SPDR = 0×95;
}
else if(data == ‘7’) // 만약 터미널에서 날아온 데이터가 숫자 7이라면
{
PORTC=0b11001111; //정방향
}
else if(data == ‘8’) // 만약 터미널에서 날아온 데이터가 숫자 8이라면
{
PORTC=0b10001111; //역방향
}
else if(data == ‘9’) // 만약 터미널에서 날아온 데이터가 숫자 9이라면
{
PORTC=0b10011111; //stop
}
else if(data == ‘0’) // 만약 터미널에서 날아온 데이터가 숫자 0 이라면
{
PORTC=0b10001111; //run
}
}

ISR(TIMER2_COMP_vect)
// 메인 타이머 인터룹트 함수!!! 레지스터값지정을 통하여 1msec로 들어온다.
{
timer_flag=1; // 이 안에는 왠만하면 간단한 것만 넣어야한다
// flag를 통해 1ms후에 들어오면 1로 표시 해준다. flag는 0,1의 논리값으로 주로 쓰임
}

void timer (void)
{
TCCR2 = 0x0B; //timer/counter control register, clk/64 , CTC모드, normal 설정

TCNT2 = 0; // 시작 지정 (실제로 세는것 이것이 카운트된다)

OCR2 = 249;
// 0~249로해서 250번 센다. 1ms 로 만들어 준것이다.
// 즉 tcnt =o cr이되면 딱 1ms이며 이때 인터룹트가 발생되는데 이모드가 ctc모드이다

TIMSK = 0×80; // T2 OCR2 interrupt 해당지정.
}

void SPI_MasterInit(void)
//spi 마스터 레지스터설정
{
//Init Ports
DDRB = 0b00010111;// LDAC,MOSI,SCK,SS 출력 , MISO 입력
PORTB |= 1<<SS; // SS 비활성화
//Init SPI

SPCR |= 1<<SPE | 1<<MSTR | 1<<SPR1;
// SPI 제어 레지스터이다. SPI활성화, 마스터 설정, 1/64 분주율
// 7bit – spi 인터럽트 활성화 비트 – clear
// 6bit – spi 활성화 비트 – set
// 5bit – 데이터 전송 순서 비트 – msb부터
// 4bit – 마스터/슬레이브 모드 선택 비트 – master set
// 3bit – 클록극성비트 – 데이터가 전송될때 HIGH유지
// 2bit – 클록 위상비트 – 클록의 앞쪽 에지에 데이터를 샘플링한다, cpol비트를 결합하여 결정.
// 송신 데이터 셋업은 하강에지, 수신 데이터 샘플링은 상승에지 이다.
// 1,0bit – 1/64 분주

}

int main (void)

{ UCSR0A = 0×00; // ready flag clear
UCSR0B = 0×18; // rx, tx enable
UCSR0C = 0×06; // tx data len : 8bit
UBRR0H = 0;
UBRR0L = 51; // boudrate 19200

DDRC = 0xFF;
timer(); // timer2 register set
SPI_MasterInit(); // spi register set
sei();// global interrupt enable
//set enable interrupt

while(1)
{
send_data(get_data());

if (timer_flag !=0) // 0이 아니라면
{

timer_flag=0;
// 초기화를 꼭시켜야한다. 이러면 1ms마다 타이머 인터럽트함수가 왔다갔다 실행된다.

cli();// 인터럽트 클리어
update1();
update2();
display10(); sei();
//enable interrupt

}
}
}

 

앞으로의 과제
하드웨어의 UART 회로 부분의 에러가 해결이 되면, 제일 먼저 무선 조이스틱 시스템을 위한 PID제어 알고리즘과 XY축의 각각의 위치값을 통해 속도와 방향을 제어할 수 있는 프로그램을 작성해야 한다. 또한 이 과제를 수행한 뒤엔, 스마트폰 APP 개발환경을 구축하여 APP을 이용한 모터제어를 해야 한다.

결론
사실 처음 하이브리드형 휠체어를 만들 계획을 할 때에는 작업이 참 순조롭고 어려움없이 해낼 수 있었던 것 같았다. 하지만 전혀 아니었다. 회로 구성부터 pcb제작 그리고 프로그래밍, 기구부 설계 등등 단 하나도 쉬운 것이 없었다. 평소 학점관리 하면서 공부했던 전공지식만으로는 실무에 가까운 이런 작품 제작과정이 너무 어렵기만 한 것이 사실이었다. 지금 생각해보면 정말 하루하루 애타는 마음을 갖고 작업했던 것 같다. 회로관련 서적과 프로그램관련 서적을 수십 권씩 찾아보고 google 등의 포털 사이트를 통해 정보를 수집하면서 정말 수시로 밤을 샜었는데 정말 좋은 경험이 되었다. 안될 것만 같았던 모터구동도 성공해보고 하니 앞으로 해야 할 것도 꼭 할 수 있다는 자신감도 생기곤 한다.
결론적으로 작품 완성도는 많이 부족한 편이다. 솔직히 지금까지 공부를 해서 제작을 진행했다면 완성했을 것도 같지만, 졸업 후의 여러 개인적 사정과 같이 공부했던 인원들의 스케줄 등이 여유롭지 않아서 작품을 진행하지 못했었다. 하지만 아쉬움이 많이 남는 작품이라서 다시 한번 뭉쳐서 해볼 생각이다. 처음 학교에 입학할 때는 많이 부족해서 옴의법칙도 어려워 했던 본인인데, pcb 제작부터 모터구동 그리고 프로그래밍 기본적인 지식 등을 습득한 것 등의 성과를 냈다는 것만으로도 전기 관련 전공자로서의 길을 걷기위한 첫 번째 단계는 넘었다고 생각을 했다. 그래서 더욱 힘이 나고 학업에 대한 열의를 갖게 해준 좋은 경험이라고 생각한다. 앞으로 더 열심히 공부하고 작업해서 꼭 작품을 완성해보고 싶다.

작업사진

32 ict 임우람 (21) 32 ict 임우람 (22) 32 ict 임우람 (24) 32 ict 임우람 (23) 32 ict 임우람 (25) 32 ict 임우람 (26)  32 ict 임우람 (27)

Leave A Comment

*