[라즈베리파이] 모터 제어

HEEJOON MOON·2022년 6월 5일
0

모터 제어 방법

  • PWM을 사용하여 모터 속도 제어 가능
  • 모터에 전달하는 신호는 GPIO를 사용하여 모터와 연결된 특정 핀에 적절한 신호를 전달

PWM을 이용한 모터 제어

  • 모터를 제어하는 방법으로 GPIO 사용
  • 라즈베리파이에는 아날로그 핀이 없기 때문에, Software PWM library에서 제공하는 PWM을 사용
  • PWM을 통해 Duty cycle제어를 이용하여 모터의 회전속도 제어
  • Motor 각 핀에 입력되는 신호에 따른 동작

모터의 속도 및 방향 동시 제어하기

  • 초기 pulse width = 0 / 주기 : 128ms

< motor1.c >

#include <wiringPi.h>
#inlcude <softPwm.h>

// Motor pin 설정
#define MOTOR_MT_N_PIN 17
#define MOTOR_MT_P_PIN 4

// Motor 회전 방향 정의
#define LEFT_ROTATE 1
#define RIGHT_ROTATE 2

// Motor 정지 함수
void MotorStop(){
softPwmWrite(MOTOR_MT_N_PIN, 0);
softPwmWrite(MOTOR_MT_P_PIN, 0);
}

// Motor 속도 및 방향 조절 함수
void MotorControl(int rotate, int speed){
	// Left rotation
    if(rotate==LEFT_ROTATE){
    	digitalWrite(MOTOR_MT_P_PIN, LOW);
        softPwmWrite(MOTOR_MT_N_PIN, speed);
    }
    else{
        softPwmWrite(MOTOR_MT_P_PIN, speed);
        digitalWrite(MOTOR_MT_N_PIN, LOW);
    }
}

int main(void){
  if (wiringPiSetupGpio() == -1)
  		return 1;
  
  // Motor 핀 출력으로 설정
  pinMode(MOTOR_MT_N_PIN, OUTPUT);
  pinMode(MOTOR_MT_P_PIN, OUTPUT);
  
  // Motor 핀 PWM 제어 핀으로 설정, 주기: 128ms
  softPwmCreate(MOTOR_MT_N_PIN, 0, 128);
  softPwmCreate(MOTOR_MT_P_PIN, 0, 128);
  
  while(1){
  	MotorControl(LEFT_ROTATE, 64); // 왼쪽으로 Motor cycle 50% 동작 
    delay(2000);
    MotorStop(); // Motor 정지
    delay(2000);
    
    MotorControl(RIGHT_ROTATE, 64); // 오른쪽으로 Motor cycle 50% 동작 
    delay(2000);
    MotorStop(); // Motor 정지
    delay(2000);
  }
  
  return 0;
}

PWM을 이용한 LED 제어

  • LED 한개를 PWM을 이용하여 다음과 같이 동작
  • 초기 pulse width = 0 / 주기 : 128 ms
  • DutyCycle이 0~100, 100~0 순으로 무한 반복

< motor2.c >

#include <wiringPi.h>
#include <softPwm.h>

// Set LED pin
#define LED_PIN 17
const LedRed[8] = {4, 17, 18, 27, 22, 23, 24, 25};

// LED stop function
void LedStop(){
	softPwmWrite(LED_PIN, 0);
}

// LED intensity control function
void LedControl(int intensity){
	softPwmWrite(LED_PIN, intensity);
}

int main(void){
	
    int i;
    
	if (wiringPiSetupGpio() == -1)
  		return 1;
  
    // LED 핀 출력으로 설정
    for(i=0; i<8; i++){
    	pinMode(LedRed[i], OUTPUT);
        digitalWrite(LedRed[i], 0);
	}
    
    // LED 핀 PWM 제어 핀으로 설정, 주기: 128ms
    softPwmCreate(LED_PIN, 0, 128);
    
    while(1){
    	int duty_cycle, intensity;
        
        // Duty cycle 0부터 100까지 증가시키면서 밝아진다
        for(duty_cycle=0; duty_cycle<=100; duty_cycle++){
        	intensity = (int)(128 * duty_cycle / 100);
            LedControl(intensity);
            delay(10); // 0.01초씩 밝아짐
        }
        
        // Duty cycle 100부터 0까지 감소하면서 어두워진다
        for(duty_cycle=100; duty_cycle>=0; duty_cycle--){
        	intensity = (int)(128 * duty_cycle / 100);
            LedControl(intensity);
            delay(10); // 0.01초씩 밝아짐
        }
       	
        LedStop();
    }
 	return 0;
 }
profile
Robotics, 3D-Vision, Deep-Learning에 관심이 있습니다

0개의 댓글