April 28, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[15호]PCI 타입의 디지털 입/출력 보드 출시

웨어테크 코퍼레이션

웨어테크 코퍼레이션

㈜웨어테크 코퍼레이션에서 일반 PC에 장착하여 사용할 수 있는 PCI 타입의 디지털 입/출력 보드를 출시했다.

센서에 의해 감지된 빛, 온도, 압력, 소리, 속도 등의 물리적 현상을 계측하고 수집하여 PC나 기계 장치들이 인식할 수 있도록 디지털 데이터로 변환하는 장치이다.

근접센서, 포토센서, 온도센서 등의 사용자가 원하는 센서나 스위치를 연결하여 사용 가능하며, 디지털 입력과 출력 채널은 제품에 따라 각각 8, 16, 32, 64 채널로 구성되어 있다. 동영상 및 교육 자료를 제공하며, 방문 기술 지원도 가능하다.

제품 설명 더보기

 


제품 구입하러 가기

 

TEL. 042-867-5505
FAX. 042-367-0754
www.ware-tech.com

[15호] 6자유도 관성 측정 장치 RTxQ 출시

루바테크

 루바테크

 루바테크(www.ruva.kr)에서 짐벌락이 없으며, 9축센서를 내장한 6자유도 관성 측정 장치인 RTxQ를 출시했다.

전원 인가 후 80ms 이내에 안정된 데이터를 다양한 출력 모드로 제공하며, 최대 256Hz까지 지원한다.
다중모드 칼만 필터, 오일러/쿼터니언 복합 알고리즘 등 정밀한 알고리즘을 통해 높은 신뢰성의 Roll, Pitch, Yaw 각도를 제공하며, 중력성분이 소거된 항법좌표계에서의 X, Y, Z 가속도 성분의 출력을 지원한다.
온도에 대한 영점 및 감도 보상 알고리즘이 내장되어 넓은 운용 온도 범위에서 안정된 출력을 제공하고, 높은 내열/내구성의 테프론(내선)-실리콘(외선) 재질의 케이블(2M)과 MOLEX 5264-04 커넥터가 적용되었다. 윈도우 환경에서 제공되는 Uni-Matrix 소프트웨어로 설정 및 모니터링이 간편하다.

제품 설명 더보기

제품소개
  • RTxQ는 짐벌락이 없는 6자유도 관성 측정 장치로서 9축 센서를 내장하고 있습니다.
  • 전원 인가 후 80ms 이내에 안정된 데이터를 출력합니다.
  • 다양한 출력모드를 제공하며 최대 256Hz까지의 출력을 지원합니다.
  • 다중모드 칼만 필터, 오일러/쿼터니언 복합 알고리즘 등 정밀한 알고리즘을 통해 높은 신뢰성의 Roll, Pitch, Yaw 각도를 제공하며 중력성분이 소거된 항법좌표계에서의 X,Y,Z 가속도 성분의 출력 을 지원합니다.
  • 온도에 대한 영점 및 감도 보상 알고리즘이 내장되어 넓은 운용 온도 범위에서 안정된 출력을 제공 합니다.
  • 높은 내열/내구성의 테프론(내선)-실리콘(외선) 재질의 케이블(2M)과 MOLEX 5264-04 커넥터가 적 용되었습니다.
  • 윈도우 환경에서 제공되는 Uni-Matrix 소프트웨어로 설정 및 모니터링이 간편합니다.

 

주요 특징
  • 외형
    • 케이스 포함 23x33x8mm의 초소형 사이즈
    • 대전방지 ABS 케이스(방진 처리)
    • MOLEX 5264-04 커넥터 적용
    • 테프론(내선), 실리콘(외선) 내열 케이블(2m) 적용
    • 우레탄 코팅 PCB / 실리콘 충진(방진, 방적)
  • 측정
    • 전원 인가 후 80ms 이내 자세 출력
    • 9축 센서 : 자이로/가속도/지자기 각 3축
    • 16Bit 해상도 ADC
    • 빠른 초기정렬 및 전방위 초기 정렬 기능
  • 출력
    • 1Hz~256Hz의 선택 가능한 출력 주기
    • 전방위 출력 ±180°(Roll/Yaw), ±90°(Pitch)
    • RS-232 시리얼 인터페이스
    • 9600~460800bps 선택 가능한 Baudrate
    • Binary / ASCII 출력
    • RTxQ 사용을 위한 전체 예제 코드 제공
    • 오일러 / 쿼터니언 복합 알고리즘
    • 쿼터니언 출력 지원
    • 환경
      • 4.0V ~ 9.0V 공급전압 범위
      • -40도 ~ +85도의 동작 온도 범위

 

Application
  • 초소형 무인 항공기, 쿼드콥터, 트라이콥터 등의 자세 / 항법 제어
  • 무인잠수정, 무인자동차, 무인비행선 등
  • 인체 동작 감지, 게임 입력장치
  • 각종 로봇 시스템
  • Gimbal 시스템
  • 기타 전반적인 산업 및 연구개발 분야

일반적인 특성
최소 표준 최대 단위 비고
공급 전압 4.0 5.0 9.0 VDC
소모 전류(¹) 21 30 35 mA Vsuply= 5.0V
사용 온도 범위(²) -40 25 85
축가속도 측정 범위 ±2 G
비선형성(²) 0.2 %FS
최대 측정 각속도(²) 250 500 2000 °/sec 설정 변경 지원
자세 연산 대역폭(5) 256 Hz
출력 안정화 시간 30 80 150 ms
중 량 15 17 19 g
  1. 공급전압 5.0v에서 시험되었습니다.
  2. 설계상의 값이며 시험되지 않았습니다.
  3. 상온(25℃)에서 시험되었습니다.
  4. 초기(Default) 설정 상태에서의 수치입니다
  5. PC 환경이나 저사양 시스템에서는 62.5Hz 이상의 출력주기를 사용할 경우 과부하가 발생할 수 있습니다.
주의사항

  • RTxQ로 공급되는 전원은 가능한 안정된 전원을 사용해 주십시오.
    공급 전압은 4.0v ~ 9.0v 의 범위이며, 이 범위를 벗어난 전압을 공급할 경우 RTxQ가 동작하지 않거나 영구적인 손상을 입을 수 있습니다.
  • RTxQ로의 강한 충격이나 압력은 가능한 피해 주십시오.
  • 자기장 왜곡을 발생시키는 원인(금속, 고전류, 자석, 모터 등)으로부터 최대한 멀리 배치하여 주십시오. 강한 자기장은 지자기 센서의 감도를 영구적으로 감소시키거나 파손시킬 수 있습니다.
  • 지하나 콘크리트 건물 내부와 같이 지구자기장이 미약하게 관측되는 장소에서는 정확한 방위(Yaw angle) 측정이 어려울 수 있습니다. Roll/Pitch 축에는 영향이 거의 없습니다. 이 경우 간섭요인을 최대한 제거한 후 calibration을 다시 수행함으로서 약간의 개선이 가능하나, 지구자기장이 매우 약한 경우 정확한 Heading 값을 얻을 수 없습니다.
  • Tilt시 Heading(yaw) 값이 발산하는 경우, 주로 바닥 또는 천정(Z축)으로부터의 자기 간섭으로 인한 현상이므로, calibration이나 간섭원인 제거, 위치 이동 등의 방법으로 개선할 수 있습니다.
  • RTxQ의 회로는 EMC 최적 설계가 되어 있으나, 주변의 전자기기로 인한 EMI는 지자기 센서의 측정에 직접적인 영향을 미치므로 Heading 정밀도에 악영향을 미칠 수 있습니다.
  • RTxQ는 TTL레벨의 UART 출력이 아닌, 12v 레벨의 RS-232 신호를 출력합니다. 따라서 커넥터 변경 및 전원연결 만으로 일반적인 PC의 시리얼 포트에 바로 연결하여 사용할 수 있습니다.

 

제품의 고정

  • 양면 테이프 제품류를 사용한 RTxQ의 고정을 권장합니다.
  • RTxQ의 윗면(로고가 붙어있는 면)이 위로 향하도록 고정해 주십시오.
  • Y축 화살표(Magenta 색상)가 전방을 향하도록 고정해 주십시오.
  • 고정 방향이 올바르지 않을 경우 마운팅 바이어스 발생의 원인이 됩니다.
  • 방진 패드 등을 사용하여 RTxQ를 고정하면 진동이 많은 환경에서도 보다 정확한 출력을 얻을 수 있습니다.
  • 금속 재질의 구동되는 기구부에서는 전자기 노이즈가 발생됩니다. RTxQ가 이러한 노이즈 원인 으로부터 일정 거리 이상을 확보할 수 있도록 배치하여 주십시오.
  • 안테나, RF회로, 고속 클럭을 사용하는 전자회로, 고전압 또는 많은 전류가 흐르는 회로 등으로부터 발생하는 노이즈에 영향을 받지 않도록 충분한 거리를 이격하여 주십시오.
  • 자석, 금속, 배터리 등의 자성 물질은 지구 자기장을 왜곡하여 Yaw각도 출력에 영향을 미칠 수 있으므로, 해당 물질이 RTxQ와 충분한 거리를 두도록 배치해 주십시오.
  • 보다 정밀한 출력을 위해서, 마운팅 이후 또는 환경에 변화가 발생한 이후에는 초기정렬을 수행하여 주십시오.

제품 구입하러 가기

TEL. 031-866-9900
www.ruva.kr

 

[15호] Piccolo 개발키트 (Delfino 개발보드+F28069모듈) 출시

싱크웍스

싱크웍스

싱크웍스에서에서 Low Cost MCU 계열인 TMS32028069 프로세서(90MHz/90MMACS)를 이용한 Piccolo 개발키트를 출시하였다.
이번에 출시된 Piccolo 개발보드는 고성능 오디오 코텍회로를 이용하여 음성 처리가 가능하며, PWM을 DAC로 변환하는 회로를 활용하여 고정밀 DAC를 구현할 수 있다. 또한 개발에 용이하도록 가변저항/범용스위치/로터리엔코더 등 주요 입력 장치를 탑재하였고, CAP/QEP/PWM /ADC/SCI/CAN/I2C/외부메모리 등을 커넥터 처리하여 쉽게 외부로 인출할 수 있도록 하였습니다. 현재 통신모듈을 이용하여 블루투스/USB 통신 개발이 가능하며, 모터모듈을 사용하여 DC 엔코더 모터/마이크로 스테핑 모터의 개발이 가능하다.

제품 설명 더보기

Piccolo 개발 키트의 소개

1. Low Cost MCU 계열인 TMS320F28069 프로세서(90MHz/90MMACS)를 이용한 개발 가능TMS320F28069 칩은 Texas Instruments사의 Low-Cost MCU 계열인 Piccolo 계열에 속해 있으며, 최대 90MHz/90MMACS의 Core 연산능력을 가지고 있으며, 전용 명령어를 통해 최대 180MFLOPS의 소수형 데이터 처리가 가능합니다. 또한 16채널의 12Bit ADC(약 3.46MSPS, 289nsec)와 진보된 주변회로들(Enhanced Peripherals, EPWM / ECAP / EQEP), SCI / SPI / I2C / McBSP / CAN 통신포트들을 갖추고 있습니다.

2. FPU/DMA/CLA/VCU 등의 연산 장치 탑재

소수형 데이터를 하드웨어적으로 고속 처리할 수 있는 FPU(Floating-Point Unit)와 데이터 처리에서 CPU의 부담을 줄여줄 수 있는 DMA(Direct Memory Access)를 내장하고 있습니다. 이 외에도 CPU와 독립적으로 각종 제어연산의 처리가 가능한CLA(Control Law accelerator)와 전력선 통신 등의 어플리케이션에서 유용한 VCU(Viterbi, Complex Math, CRC Unit)까지 갖추고 있어서, 사실상 현존하는 TMS320F28X 관련 주변회로들을 모두 가지고 있다고 할 수 있습니다.

3. 개발 및 테스트는 개발보드로~, 사용자 보드 적용은 간편하게~

새로운 MCU를 사용하실 때, 개발 방법이나 테스트용 소프트웨어/하드웨어가 없어서 고민이셨나요? 싱크웍스가 이 고민을 해결해 드립니다. 싱크웍스의 레퍼런스 회로 디자인과 다양한 예제를 통해 쉽게 학습/평가가 가능하시며 이를 통해 사용자 보드에도 쉽게 적용이 가능합니다.

4. 개발보드의 다양한 기능을 확인해 보세요.

개발보드는 고성능 오디오 코텍회로를 이용하여 음성 처리가 가능하며, PWM을 DAC로 변환하는 회로를 활용하여 고정밀 DAC를 구현할 수 있습니다. 또한 개발에 용이하도록 가변저항/범용스위치/로터리엔코더 등 주요 입력 장치를 탑재하였고, CAP/QEP/PWM /ADC/SCI/CAN/I2C/외부메모리 등을 커넥터 처리하여 쉽게 외부로 인출할 수 있도록 하였습니다. 현재 통신모듈을 이용하여 블루투스/USB 통신 개발이 가능하며, 모터모듈을 사용하여 DC 엔코더 모터/마이크로 스테핑 모터의 개발이 가능합니다. 또한, 앞으로 LCD, TCP/IP, Boost/Buck 등 다양한 어플리케이션 확장 보드가 지속적으로 출시될 예정입니다.

* Delfino 개발보드는 TMS320F28069 보급형 모듈을 장착하여 개발할 수 있습니다.

보다 자세한 제품 특징은 Delfino 개발보드(Piccolo개발 겸용) 상품페이지(링크) / TMS320F28069 보급형 모듈 상품페이지(링크)에서 확인하세요.

 

구성 품목
  1. Delfino 개발보드 1개(Piccolo 개발 겸용)
  2. TMS320F28069 보급형 모듈 1개
  3. TMS320F28069 보급형 모듈 어댑터 1개
예제자료/기술지원

 

 

제품 구입하러 가기

TEL. 031-781-2812
FAX. 031-706-2834
www.tms320.co.kr

[15호] RFID USN KOREA 2012

2012RFID01

2012RFID01

2012년 9월 25일부터 27일까지 3일간 서울COEX에서 RFID/USN KOREA 2012 국제 전시회가 진행되었다.

이번 전시회는 2005년부터 8년동안 매년 진행중이며, RFID/USN, M2M, NFC 관련 제품 및 솔루션 IT융합 서비스등을 소개하였다.

2012RFID02

전기자동차 교통안전 융합체계 연구단의 Smart E-Bus system

배터리 교체하는데 걸리는 시간은 25초에서 1분 이내이며 1회 충전으로 20Km 운행 가능하다. 또한 통합관리운영시스템을 통해 배터리 상태를 모니터링할 수 있다.

2012RFID04

SK텔레콤에서 소개한 Smart LED(횡단보도 보행안전시스템)

보행자를 감지하고 안전시스템이 작동하며 차량통행량 분석 후 실시간으로 제공한다.

2012RFID03

한미IT에서 소개하는 PRISMA

설치되어 있는 구동 레일을 이동하며 각 위치에 있는 모든 제품을 인식하고 위치정보를 확인한다.

2012RFID05

KT에서 소개하는 BlueLink

최근에는 현대자동차에서 시판되고 있으며 스마트폰을 이용해 차량의 간단한 원격조작, 도난방지와 안전장치 확인 등을 실시간으로 확인할 수 있다.

2012RFID06

RFID Reading tag 시스템을 통해 타이어의 부속품까지 제조년월을 확인할 수 있으며 등급과 재고 현황까지 알아볼 수 있다.

 

2012RFID08

RFID의 가격 하락과 수요 증가 그래프

RFID란?
IC칩과 무선을 통해 식품, 동물, 사물 등 다양한 개체의 정보를 관리할 수 있는 차세대 인식 기술 [Naver 지식 백과 출처]

 

2012RFID10 2012RFID11 2012RFID09

 

생활 및 환경에 관한 제품들이 많이 출시되었고, 꾸준히 개발되고 있었다. 매년 점점 진화되는 RFID/USN 기술들을 보니 미래가 밝아 보였고 우리의 생활 수준도 끌어 올려 줄 수 있다는 기대감에 내년 전시회도 기대해 본다.

[14호] 2011 캡스톤 디자인 공모전 우수상- 보행보조기구 2부

조립완성한 사진 2

1부 보러 가기

 

4. 제어부

4.1 작동 프로세스
4.1.1 작동 프로세스 개요

2011capstonef02

RF MODEM A3007B는 UART 통신 방식을 지원하므로 목발의 MCU와 UART 방식의 통신을 한다. 목발의 MCU는 목발 밑에 부착된 스위치가 ON이 되거나 일어서기/앉기 스위치가 ON이 될 경우에 RF Modem이 해당 모드에 맞는 신호를 보내도록 한다. RF Modem 간의 통신을 통해 메인 MCU가 신호를 받아들이면 RS485 통신 방식을 사용하여 2개의 모터컨트롤러가 작동될 수 있도록 한다. RS485는 1:n의 통신방식을 지원하기 때문에 2개의 통신포트를 가지고도 여러 개의 통신을 할 수 있다. 메인 MCU의 UART0 포트는 RF Modem의 수신부와, UART1의 포트는 2개의 컨트롤러와 각각 연결된다.

2011capstonef03

기존목발에 스위치를 부착하여 양 목발이 순차적으로 ON 상태가 되면 모터가 작동하여 걸음이 가능하도록 설계한다. 스위치와 모터의 연결은 RF Modem을 사용한 무선통신으로, 보행에 방해가 되지 않게 한다.

4.1.2 걷기

양 목발이 동시에 땅을 짚을 경우, 4점 보행법으로 작동한다. 고관절부의 엉치뼈에 장착된 모터가 1차로 구동이 되어 허벅지 부분을 들어 올려주며, 순차적으로 무릎 부분의 모터가 구동을 시작하여 무릎을 일정한 각도까지 굽혀준다. 허벅지 부분의 모터 구동이 잠시 멈추면 무릎 부분의 모터가 작동하여 보행이 가능한 일정각도까지 무릎을 펴줌과 동시에 장애인은 목발에 하중을 싣고 몸을 앞으로 숙여 발바닥이 땅에 닿도록 한다. 한쪽 발바닥이 발바닥에 고정되고 목발에 일정한 압력이 다시 가해지면 반대쪽 발이 같은 원리로 구동을 시작한다.

4.1.3 앉기/일어나기

의자에 앉거나 일어나는 경우는 목발에 부착된 별도의 스위치를 사용하여 구동하도록 한다. 스위치를 사용하여 앉는 경우엔 무릎부의 모터가 중심이 되기 때문에 걸을 때에 비해 큰 각도로 회전하며, 엉치뼈 부분의 모터가 추가적으로 회전하여 허리를 숙이게 함으로써 의자에 앉는 것이 가능하게끔 한다.

일어나는 경우, 모터가 앉는 경우와 반대로 회전하여 일어서는 것을 도와준다. 이 때, 사용자는 최대한 목발에 의지해 몸의 무게중심을 앞으로 쏠리게 하여 무릎부분 관절에 가해지는 힘을 분산시키도록 한다.

4.2 회로도

4.2.1 전원부

2011capstonef54

4.2.2 스위치 및 LED

스위치 및 LED회로

스위치 및 LED회로

외부 스위치 회로

외부 스위치 회로

4.2.3 RF Modem 회로

RF 송수신 회로

RF 송수신 회로

4.3 작동 소스

사용 프로그램 | ATMEL사에서 제공하는 AVR Studio프로그램을 사용.
4.3.1 RF Modem(송신부)

RF Modem 송신부(앉기/일어나기) 소스보기

#include <avr/io.h>
#include <util/delay.h>

// RF로 송신 할 값을 캐릭터 함수로 설정
//HEAD(0xAA,0xBB, OP code(주파수 311/송신 12 + 송신할 문자)
char RF_FREQ_SET[5]={0xAA,0xBB,3,1,1}; //주파수 세팅
char RF_TX0_STAND[6]={0xAA,0xBB,1,2,1,1}; //일어서기 모드
char RF_TX0_SIT[6]={0xAA,0xBB,1,2,7,7}; //앉기 모드
char RF_TX0_WALK[6]={0xAA,0xBB,1,2,5,5}; //걷기 모드
void TX0_CH(char ch){ while(!(UCSR0A&0×20)); UDR0=ch; }
int main(void) //메인 함수 구문
{
char i; //캐릭터함수 i 설정
DDRA=0xFF; DDRF=0×00; DDRE=2;
//PORTA 출력, PORTF 출력 TXD0 PORTE.1
UCSR0A=0; UCSR0B=0×18; UCSR0C=6; UBRR0H=0;
UBRR0L=103;
// UART0 통신관련 레지스터 설정 , BAUD RATE 9600bps
_delay_ms(100);
// RF 주파수 세팅
for(i=0;i<5;i++)TX0_CH(RF_FREQ_SET[i]);
_delay_ms(1000);
while(1)
{
//delay();
if((PINF&0×04)==0×00) // PORTF에 연결된 2번 스위치를 누르면
{
for(i=0;i<6;i++)TX0_CH(RF_TX0_STAND[i]); //STAND값 송신
_delay_ms(1000);
}
if((PINF&0×10)==0×00) // PORTF에 연결된 4번 스위치를 누르면
{
for(i=0;i<6;i++)TX0_CH(RF_TX0_SIT[i]); //SIT 값 송신
_delay_ms(1000);
}
if((PINF&0×01)!=0×00) // PORTF에 연결된 1번 스위치를 누르면
{
for(i=0;i<6;i++)TX0_CH(RF_TX0_WALK[i]); //WALK 값 송신(left_on)
_delay_ms(1000); }
while(PINF&1); // 누르고 있는 동안은 한 번만 함수 호출
}
}

RF Modem 송신부 소스보기

#include <avr/io.h>
#include <util/delay.h>

// RF로 송신 할 값을 캐릭터 함수로 설정
//HEAD(0xAA,0xBB, OP code + (주파수 311/송신 12 + 송신할 문자)
char RF_FREQ_SET[5]={0xAA,0xBB,3,1,1}; //주파수 세팅
char RF_TX0_WALK[6]={0xAA,0xBB,1,2,4,4}; //걷기 모드
void TX0_CH(char ch){ while(!(UCSR0A&0×20)); UDR0=ch; }
int main(void) //메인 함수 구문
{
char i; //캐릭터함수 i 설정
DDRA=0xFF; DDRF=0×00; DDRE=2;
//PORTA 출력, PORTF 출력 TXD0 PORTE.1
UCSR0A=0; UCSR0B=0×18; UCSR0C=6; UBRR0H=0; UBRR0L=103;
// UART0 레지스터 설정 , BAUD RATE 9600bps
_delay_ms(100); //딜레이 1초
for(i=0;i<5;i++)TX0_CH(RF_FREQ_SET[i]);
// i의 숫자가 0에서 4까지 커지는 동안 RF는 주파수 세팅
_delay_ms(1000);
while(1)
{

if((PINF&0×01)!=0×00) // PORTF에 연결된 1번 스위치를 누르면
{
for(i=0;i<6;i++)TX0_CH(RF_TX0_WALK[i]); //WALK 값 송신(right_on)
_delay_ms(1000); }
while(PINF&1); // 누르고 있는 동안은 한 번만 함수 호출
}
}

4.3.2 RF modem(수신부) :main MCU

RF Modem 수신부 소스보기

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
typedef unsigned char BYTE;
#define BAUD_HIGH 00 //baudrate가 high일때 설정
#define BAUD_LOW_M 8 // 모터의 bps는 115200으로 설정
#define BAUD_LOW_RF 103 // RF모뎀의 bps는 9600으로 설정
#define ALL_FLAG_CLEAR 0×00
#define USATR_RECEIVER_ENABLE 0×10
#define USATR_TRANSMITTER_ENABLE 0×08
#define USATR_CHARACTER_SIZE 0×06
//TXD, RXD 설정
#define RXC_FLAG 0×80
#define TXC_FLAG 0×20
#define COM1 1
//
static int uart_putchar(char c, FILE *stream);
static FILE mystdout=FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
volatile BYTE movement;
volatile char RF_FREQ_SET[5]={0xAA,0xBB,3,1,1}; //RF 주파수 세팅
volatile int MODE, right_on=0, left_on=0, standing=0, sitting=0;
//
void TX0_CH(char ch){ while(!(UCSR0A&0×20)); UDR0=ch; } // UART0 송신 함수
//
ISR(USART0_RX_vect){ // Interrupt Service Routine
char ch;
ch=UDR0; //UDR0의 값을 ch에 저장
if(ch==7)sitting=1; // 만약 ch가 7이면 sitting ==1
else if(ch==1)standing=1; // ch가 1이면 standing ==1
else if(ch==4)right_on=1; // ch가 4이면 right_on ==1
else if(ch==5)left_on=1; //ch가 5이면 left_on ==1
}
//
void initialize_serial(void){ // initialize_serial 함수 정의
UBRR1H=BAUD_HIGH; UBRR1L=BAUD_LOW_M; // UDR1 레지스터 설정
UCSR1A=ALL_FLAG_CLEAR; //
UCSR1B=USATR_RECEIVER_ENABLE | USATR_TRANSMITTER_ENABLE;
UCSR1C=USATR_CHARACTER_SIZE;
}
//
static int uart_putchar(char c, FILE *stream){
if(c==’\n’) uart_putchar(‘\r’, stream);
if(MODE==COM1){ loop_until_bit_is_set(UCSR1A, UDRE); UDR1=c; }
return 0;
}
//
void TX1_CH(char ch){ while(!(UCSR1A&0×20)); UDR1=ch; }
// UART1의 송신함수
//
void setting(){ // 모터 세팅 함수
unsigned volatile char i;
BYTE SendBuff[256]={0};
PORTA=0xff;
MODE=COM1;
// 컨트롤러 세팅값 (SS2000,2000, Ss200,200, SM0202, PE0001 .. ) 전송
// 모터 컨트롤러에 각각 채널 1,2로 값을 전송함
// 0×01 :1번 컨트롤러ID 0×02 : 2번 컨트롤러 ID
memset(SendBuff,0,sizeof(BYTE)*256); //초기화
SendBuff[0]=0×01; sprintf(&SendBuff[1],”SS2000,2000!”); _delay_ms(1); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”Ss200,200!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”SM0202!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PE0001!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”SS2000,2000!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”Ss200,200!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”SM0202!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PE0002!”); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1000);

_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
}
//
void standing_M(){ // 모터의 일어나기 동작을 정의
unsigned volatile char i;
BYTE SendBuff[256]={0};
MODE=COM1;
//위치 제어 PA 명령어를 사용하여 위치값 전송
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5200000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA4800000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1000);

_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(10000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5200000,5500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA4800000,4500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);
memset(SendBuff,0,sizeof(BYTE)*256);

_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(1000000);
_delay_ms(100000);
_delay_ms(10000);
_delay_ms(100000);
_delay_ms(10000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);

SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA4800000,5500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(1);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA5200000,4500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(100);

}
//
void walking_M(){ // 모터의 걷기 동작을 정의
unsigned volatile char i; // 캐릭터 함수 i 설정
BYTE SendBuff[256]={0};
PORTA=0×00; // PORTA의 LED가 꺼짐
MODE=COM1;
_delay_ms(100);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5200000,5500000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(1000);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5200000,5100000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5200000,5500000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA4800000,5500000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(100);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA4700000,4500000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(100);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA4700000,5000000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA5200000,4500000!”); _delay_ms(100); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]);

_delay_ms(10);
}

//
void sit_M(){ // 앉기 동작 정의
unsigned volatile char i;
BYTE SendBuff[256]={0};
PORTA=0×00;
MODE=COM1;
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA4800000,5500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA5200000,4500000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);

_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(10000);
_delay_ms(10000);
_delay_ms(10000);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA4800000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA5200000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);

_delay_ms(100000); _delay_ms(100000); _delay_ms(100000); _delay_ms(100000);
_delay_ms(100000); delay_ms(100000); _delay_ms(100000); _delay_ms(10000);
_delay_ms(100000); _delay_ms(100000); _delay_ms(100000); _delay_ms(1000);
_delay_ms(1000); _delay_ms(10000);

memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×01; sprintf(&SendBuff[1],”PA5000000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);
memset(SendBuff,0,sizeof(BYTE)*256);
SendBuff[0]=0×02; sprintf(&SendBuff[1],”PA5000000,5000000!”); _delay_ms(10); i=0; while(SendBuff[i])TX1_CH(SendBuff[i++]); _delay_ms(10);
}
//
int main(void){
char i;
left_on=right_on=sitting=standing=0;
DDRA=0xff;
DDRE=2;
DDRG=0b11000000;
UCSR0A=0; UCSR0B=0×98; UCSR0C=6; UBRR0H=0; UBRR0L=103;
//UART0 레지스터 설정, BAUD RATE 9600bps
PORTA=0xff;
initialize_serial(); //초기화
_delay_ms(1);
stdout=&mystdout;
_delay_ms(1000);
for(i=0;i<5;i++)TX0_CH(RF_FREQ_SET[i]); //RF 주파수 세팅
_delay_ms(1000);
sei(); //인터럽트 허용
while(standing==0); //standing==1이 될 때 까지 대기
while(left_on==0); //right_on 과 left_on 둘다 1이 될 때까지 대기
PORTA=0×00;
setting(); // 모터 세팅 호출
_delay_ms(10000);
_delay_ms(10000);
standing_M(); //딜레이 후 일어서는 동작 호출
while(1){
//left_on과 right_on이 둘다 1이라면 걷기 동작 호출
left_on==0;
if((left_on&right_on)==1){
walking_M(); left_on=0; right_on=0; } //함수 호출 후 left_on=0으로 초기화
//sitting==1이 되면 앉기 동작 호출
if(sitting==1){
sit_M(); sitting=0;
}
}
return 0;
}

5. 제작 과정

5.1 부품 사진

5.1.1 설계부

135 브라켓

135 브라켓

허벅지 관절부와 무릎 관절부 발목을 잇고, 지탱해주면서 몸에 최대한 밀접하게 붙게 하는 뼈대 브라켓이다.

베벨기어박스

베벨기어박스

Base plate(고 관절부)

Base plate(고 관절부)

모터 크라켓

모터 크라켓

허리 관절면

허리 관절면

Base plate(무릎 관절부)

Base plate(무릎 관절부)

모터 브라켓

모터 브라켓

무릎 관절면

무릎 관절면

기어

기어

Gear Box(하단 기어 중심 고정부)

Gear Box(하단 기어 중심 고정부)

Gear Box(측면 기어 중심 고정부)

Gear Box(측면 기어 중심 고정부)

Gear Box(옆면 고정부)

Gear Box(옆면 고정부)

Shaft(하단 기어)

Shaft(하단 기어)

Shaft(측면기어)

Shaft(측면기어)

로터 플랜지

로터 플랜지

렉 플레이트

렉 플레이트

풋 플레이트

풋 플레이트

2011capstonef76

힌지 핀

5.1.2 제어부

90W

90W

150W

150W

모터 컨트롤러

모터 컨트롤러

MOXA 232 to 485 컨버터

MOXA 232 to 485 컨버터

RF 모뎀을 부착시킨 AVR 보드

RF 모뎀을 부착시킨 AVR 보드

5.2 조립 사진

직접 제어한 기어 박스 내부

직접 제어한 기어 박스 내부

목발 바닥에 부착한 스위치

목발 바닥에 부착한 스위치

모터와 컨트롤러 연결 사진

모터와 컨트롤러 연결 사진

고관절부 착용 사진

고관절부 착용 사진

발목부분 착용 사진

발목부분 착용 사진

보드를 부착한 목발

보드를 부착한 목발

조립완성한 사진 1

조립완성한 사진 1

조립완성한 사진 2

조립완성한 사진 2

5.3 제작 과정

브래드보드 시험 중인 Atmega128

브래드보드 시험 중인 Atmega128

송신 테스트 중인 A3007B과 직접 만들었던 회로의 실험 모습

송신 테스트 중인 A3007B과 직접 만들었던 회로의 실험 모습

착용 후 모습

착용 후 모습

착용 후 일어나는 과정

착용 후 일어나는 과정

6. 결론

6.1 설계 쪽 실패과정 & 해결방안

전체적인 기구부가 커지는 것을 막기 위해 모듈1의 베벨기어박스를 사용하였으나, 소형 베벨기어였기 때문에 큰 토크에서 견디는 힘이 부족했다. 기구부만 작동시키는 데에는 큰 무리가 가해지지 않았으나 사람이 착용하고 구동한 경우, 앉기 동작에서 문제가 발생하였다. 사람이 의자에 앉는 경우 하중이 뒤로 자연스레 쏠리는 것을 미처 계산하지 못한 바람에 기어 이빨이 손상된 일이 있었다.

따라서 무릎에 가해지는 토크를 보다 잘 견딜 수 있도록 기존보다 큰 2.5 모듈의 베벨기어로 바꾸었다. 결과적으로 이빨의 크기가 커져서 전체적인 기어박스 및 기구부의 크기도 덩달아 커졌지만 상대적으로 견딜 수 있는 토크의 크기도 커졌다.

6.2 제어 쪽 실패과정 & 해결방안

ATmega128 보드를 직접 만들기 위해 브래드 보드에 꽂아 실험할 수 있는 UST-MPB-ATmega128 제품을 이용하여 기본적인 회로들을 확인하였다. 납땜을 하기 전 RF 모뎀 회로를 체크하기 위해 브래드 보드로 전원 회로 및 기본적인 송수신 회로를 작성한 후, PCB에 납땜을 하였다. 기본적인 RF 회로 및 스위치 회로는 납땜을 하여 확인을 하였으나, max232 회로 등이 제대로 작동을 하지 않았으며 잦은 브래드 보드 실험 및 전원 회로부에서 꼬인 회로들로 인해 대부분이 쇼트가 나서 max232의 회로를 확인할 수가 없었다. 보드를 다시 제작하려 했으나, 시간상의 문제로 보드를 다시 만들 수 없다고 판단하여 보드 옆에 회로 판이 부착된 개발보드 기능의 AVR 모듈을 이용하였다. 이 AVR 보드에 RF modem 회로 및 필요한 스위치 회로만 추가로 납땜을 해서 필요한 보드를 완성하였다.

기존의 통신방식은 RS232통신을 이용하는 것이어서 추가의 회로가 필요하지 않았지만 후에 RS485로 통신방식을 바꾸면서 RS485와 관련된 회로가 필요하게 되었다. SN75176이란 IC를 사용하여 통신을 할 생각이었으나, 추가적인 회로를 납땜하는 것보다 컨버터를 이용하는 편이 효율적이라 판단하여 MOXA사의 TCC-80 이라는 RS232 to RS485 컨버터를 사용하였다.

구동 프로세스가 목발에 연결된 스위치에 힘을 가하면 목발 쪽 RF가 메인보드에 신호를 송신하고 이러한 RF신호 2개가 메인보드에 수신되어야만 모터가 작동하는 것이라서 컨트롤러 2개, RF modem까지 총 3개의 통신포트가 필요했다. 모터 제어부와 RF 제어부를 따로 작업하다보니 UART방식과 RS232 통신 방식이 충돌이 날거라는 것을 고려하지 못하였다. 그 문제점을 해결하기 위해 메인 MCU를 2개 사용하는 것으로 진행하였었다. MCU를 2개 사용하여 연동하는 것보다 1:n의 통신이 가능한 RS485방식을 택하는 게 효율적이라 판단하였고, 이를 통해 포트 2개로 2개의 컨트롤러 RF modem까지 3개의 통신을 해결할 수 있게 되었다.

6.3. 결론

무릎 부분에 힘이 많이 걸리는 것을 고려하여 무릎부 기어를 2.5 베벨 기어로 선정하였고 통신방식은 RS485방식을 선택하여 보드의 개수를 줄일 수 있었다. 실제적인 작동의 경우 기구부만으로 앉고 일어서기 및 걷기 동작은 구현이 가능하며, 현재 사람이 착용한 채 동작을 구현하는 것은 부분적으로 가능하다. 앉기 및 일어서기 동작의 경우 사람이 착용한 채 동작을 구현할 수 있었으나, 걷기 동작의 경우 기구부를 착용하는 팀원이 아직 목발 사용에 익숙치 않아 걷기 움직임이 조금 부자연스러운 관계로 일반적인 걸음걸이의 형태로 각도를 제어하였다. 사람마다 걸음걸이 방식이 조금씩 다르기 때문에 팀원의 목발사용 연습과 함께 차후에 구현할 팀원의 걸음걸이에 맞춰 시연할 예정이다.

7. 팀원 소개 및 역할 분담

이수영 : 해석 및 RF 통신

홍준호 : 가공 및 조립

정그림 : 해석 및 3D Modeling

한솔 : 모터 제어