'진동모터'에 해당되는 글 4건

  1. 햅틱Car 2009.09.17
  2. 모바일 진동모터 2009.09.16
  3. Block Breaking~ 2 2009.06.20
  4. Timer 와 PWM 2 2008.07.10

햅틱Car

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





 



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

ForeceReactor





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

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

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

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

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


 


 

,

모바일 진동모터

from HardWare/Actuator 2009. 9. 16. 21:44


모바일에 사용가능한 진동모터 위에는 일반적인 전압을 주면 동작하는 진동모터 이고

아래 는 클럭을 주면 클럭에 따라 진동이 되는 force Reactor라고 하는 진동 모터이다..
 
하나는 PWM으로 동작하며 ForeceReactor은 클럭으로 동작
,




MFC 텀프로젝트로 제작한 게임
    : 기존의 벽돌깨기 게임과 다르게 가속도 센서를 사용하여 가속도 센서의 모션에 따라 좌우로 막대를 움직일수있
       있고 공이 벽이나 아래 막대 또는 블록과 충돌했을때 진동을 생성해줘서 사람들에게 몰입감을 제공해준다.


     구현내용
        1. 완전충돌을 가정하고 블록이나 벽에 충돌했을때 충돌 각도는 입사각과 반사각이 같은 값으로 제공해주었다
            그래서 벽에 충돌시 y축에 충돌하면 cos의 방향을 -1을 곱해주고 x축에 충돌하면 sin방향을 -1곱해주어
            공의 방향을 변형시켜주었다.



  2.  배열과 화면 맵핑을 통한 맵제작
         -아래의 그림과 같이 저런 배열이 들어갔을경우 화면에는 저런 모양의 블록들이 생긴다.
           그리고 배열에 따른 화면과 맵핑을 시켜주기 위해서 공의 위치와 배열의 위치를 정확하게 알아야
           된다.  (배열의 숫자가 높아지면 그만큼 더 충돌을 해야된다 배열이 0이될때까지 블록은 안사라짐)
           예를 들어   공의좌표가 (23,32)이고 10픽셀의 단위로 블록을 만들어줬을때
                           공의 좌표를 10으로 나눠주게 된다면 (2,3)  (나머지는 제거)
                           그러므로 공의 위치는 화면상에는 (23,32) 있겠지만 배열에서는 (2,3)의 위치에 있게 된다.

3.보드의 가속도센서와 가속도센서의 패킷값을 받기 위해서 시분할 처리를 사용하여 번갈아가면서 패킷을 전송받
   을  수 있도록 제작.

4.더블버퍼링을 사용하여 메모리상에서 후면버퍼에서 그려주고 전면버퍼에 뿌려주는 형식으로 제작하여 화면 떨림이 없다.
,

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)
    {
    }
}



 
,