모터의 속도 및 방향 동시 제어하기
- 초기 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;
}