적외선센서의 수광부와 발광부를 사용하여 반사되서 들어오는 값을  ADC를 사용하여 읽어들인다.

그후 특정 값 이상의 밝기가 들어왔을때 세븐 세그먼트를 카운팅..

비교적 간단함.. 이런 적외선센서의 사용은 보통 자동문에 사용한다고 한다.

비교적 재미있고 간단하게 구현하였다.
,



예전에 있었던 컨트롤러를 다 뜯어 고친 컨트롤러

일단 부피를 줄이고 모바일 케이스 안에 들어갈수 있도록 제작 하였음 앞에 적외선 센서 배치치도 변형

아직 적외선센서와 모터 동작은 테스트 해보지 않았음.

외관은 좀 더 보기 좋게 하기 위해 다시 수정.. 계획..


,

햅틱Car

from Project/Haptic Controller 2009. 9. 17. 02:10





 



피에죠 엑츄에어터, 블루투스, 진동모터

ForeceReactor





피에죠 엑츄에이터와 진동모터 ,가속도센서 LM3S8962보드 블루투스를 사용해서

가속도센서의 기울기에 따라서 자동차가 앞으로 가고 뒤로 가고 하는 어플리케이션

판다3D를 사용하여 제작하였으며.. 자동차는 인터넷에 굴러다니는거 주어다 쓴거. 그거 빼고 전체적인 모델링은

3Dmax를 사용해서 제작하였다.

예전에 만들었지만 지금 지금에서야 블로그에 동영상을 올린다...


 


 

,


전체적인 Cave 시스템(MFC기반)과 그에 따른 컨트롤러(LM3S8962) 제작.



컨트롤러는 아래 게시물과 같이 제작하였다.. 컨트롤러의 가속도센서에 값에 따라 오브젝트가 움직이는 모습이다.

,


블루투스 모듈과 LM3S8962 보드를 서로 연결 시켜 무선으로 스텝모터를 제어를 했다.

블루투스 모듈 myBluetooth-EX 보드느 LM3S8962이다.

일단 회로 연결 방법


이런식으로 연결을 하면된다. 송신은 수신으로 수신은 송신으로 각가 연결하면 간단하게 통신이 끝난다.

myBluetooth-EX 핀맵




(모듈에 보면 RTS CTS라고 있는데 이건 흐름제어가 필요할경우 연결한다고 한다.  구지 연결할 필요는 없다.)
연결한 선은 5V, GND, RX, TX 요렇게 연결해주면 된다.  N.C 는 연결해줄 필요가 없다.


통신방법은  시리얼 통신 하는 방식과 같다. 

각각의 그 후 펄스를 넣어주면 제어가 끝나게 된다.  지금 동영상은  해당되는 패킷을 넣어줬을때 회전하다가

반대방향 회전 패킷을 넣어줬을때 다시 반대로 회전하는 것을 제어를 해보았다. 생각보다 많이 어렵지는 않으니

해보면 무척 쉬운것을 느낄수 있다.

어떻게보면 저번에 제작했던 키보드로 조작한 RC카처럼 마이크로 마우스도 이와 같이 만들수 있을꺼 같다.

부가적인 재료가 많이 들긴 하지만 말이다.

,
C

RF 자동차를 키보드를 사용해서 동작시키는중..

LM3S8962 Cortex-m3와  RF자동차 한대를 사용해서 제어를 해보았습니다.

제작 방법

1. 일단 주파수를 송신하는 모듈이 없어서.. RF자동차에 있는 리모컨을 분해


2. 엉성하게 빨간색 박스로 표시 되어 있는부분이 자동차의 좌우 전진 후진을 하는 기능을 해주는 부분이다.
  결국 긴 은색 부분이 그라운드 부분.  결국  보드를 사용해서 저기 그라운드 부분과 윗부분 단자를 제어를
  해줘야한다.

3. 결국 스위칭 하는 역활을 하는 부분이 필요한데 TR를 사용하면 스위칭 역활이 가능해진다.

4. 연결 방법

은색 단자 부분에서 초록색으로 조금 밝게 되어있는 부분을 따라가면 납땜되어있는 부분이 있는데  그 단자와 연결.

5. 보드를 사용하여 각각의 GPIO선을 연결후 간단하게 패킷을 정의.

6. 시리얼 통신후 키보드 명령에 따라 패킷 전송 (파이썬을 사용)


각각 사용된 재료들





,

이번 대회 제출한 PPT 입니다 후..............lm3s8962를사용해서 제작을 했습니다.  좋은 결과가 나왔으면합니다..
,

Timer 와 PWM

from HardWare 2008. 7. 10. 23:18


이번에 작성한 소스는 Timer 와 PWM을 이용하여 이용한 두개의 모터를 각각 하나는 점점 약했다가 강하게 .

다른 하는 반대로 점점 강했다가 약하게 진동을 준 실험이다.

이번 실험해서 주의점은.. 저번 램프와 같이 딜레이를 줘서 PWM과 같은 효과 만든다면 시스템 전체가

그 loop에 걸리기때문에  매우 비효율적이다. 그래서 PWM을 사용하면 그때 실행시키는 명령어도

실행하면서 다른 일도 수행가능하다.

PWMGenConfigure(PWM_BASE,PWM_GEN_1,PWM_GEN_MODE_DOWN);  함수의 모드가

UP_DOWN모드 일때 카운터의 zero 값과 Load 값과 Comporator가 일치할경우 그 값을 무시한다.

실험결과 UP_DOWN 모드에서. 주기 400과 폭 397~400까지의 값을 설정할 경우 그 부분에서 모터가 동작하지 않

는 경우가 생겼다.



-_- 주절이 주절이 본인만 알아볼수 있게 ㅡㅡ; 적었는데.. 으흠.. 보는사람이 있을라나?

#include "../../../hw_memmap.h"
#include "../../../hw_types.h"
#include "../../../src/debug.h"
#include "../../../src/interrupt.h"
#include "../../../src/sysctl.h"
#include "../../../src/timer.h"
#include "../../../src/gpio.h"
#include "../rit128x96x4.h"
#include "../../../src/gpio.h"
#include "../../../src/pwm.h"
#include "../../../utils/diag.h"

unsigned long g_ulFlags;
volatile unsigned long ulLoop=0;
volatile unsigned long width=100;
volatile unsigned long width2=100;
volatile unsigned long width3=400;
volatile unsigned long width4=400;

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif


void
Timer0IntHandler(void)
{


  if(width>51)
   {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_0,width);
  
    width = width - 50;
   }
   else
   {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_0,width2);
    width2 = width2 +50;
    if(width2==400)
    {
     width=width2;
     width2 = 100;
    }
   }
 
  if(width3<400)
  {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_1,width3);
    width3=width3+50;
  }
 
  else
  {
     PWMPulseWidthSet(PWM_BASE,PWM_OUT_1,width4);
    
     width4 = width4 -50;
       
  }
  if(width4==100)
  {
   width3 = width4;
   width4= 400;
  }
   
 
 

 TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
}


int
main(void)
{
 

 extern void Timer0IntHandler(void);
 
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
      SYSCTL_XTAL_8MHZ);

   
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_0);
   

   
    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
   
    TimerLoadSet(TIMER0_BASE, TIMER_A, 0x007a1200);
   

    // J4 output
      SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);    //PWM 장치 사용가능
      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);   //GPIO port F 사용가능
      GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);   // GPIO port F를 PWM 으로 변경
      SysCtlPWMClockSet(SYSCTL_PWMDIV_1);    // PWM의 클럭을 세팅
    
       PWMGenConfigure(PWM_BASE,PWM_GEN_0,PWM_GEN_MODE_DOWN);  //PWM 구성
       PWMGenPeriodSet(PWM_BASE,PWM_GEN_0,400);  // PWM 주기 설정
     
       PWMGenEnable(PWM_BASE,PWM_GEN_0); // PWM generator 사용 가능.
       PWMOutputState(PWM_BASE,PWM_OUT_0_BIT,true); // PWM 출력 상태 활성화
   
      
      
       SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);    
       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);  
       GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_1);  
       SysCtlPWMClockSet(SYSCTL_PWMDIV_1);          
        PWMGenConfigure(PWM_BASE,PWM_GEN_1,PWM_GEN_MODE_DOWN);
        PWMGenPeriodSet(PWM_BASE,PWM_GEN_1,400);  
       
        PWMGenEnable(PWM_BASE,PWM_GEN_1);
        PWMOutputState(PWM_BASE,PWM_OUT_1_BIT,true);
       
   
    TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
   

   
   
   
 
    TimerEnable(TIMER0_BASE, TIMER_A);

  
    while(1)
    {
    }
}



 
,