호타리
2025. 5. 27. 16:56
2025.05.27
스텝 모터 동작
#include <stdio.h>
#include <wiringPi.h>
#define ORANGE 21
#define YELLOW 22
#define PINK 23
#define BLUE 24
#define RED 25
void step_wave(int step)
{
switch(step)
{
case 0:
digitalWrite(ORANGE,1);
digitalWrite(YELLOW,0);
digitalWrite(PINK,0);
digitalWrite(BLUE,0);
break;
case 1:
digitalWrite(ORANGE,0);
digitalWrite(YELLOW,1);
digitalWrite(PINK,0);
digitalWrite(BLUE,0);
break;
case 2:
digitalWrite(ORANGE,0);
digitalWrite(YELLOW,0);
digitalWrite(PINK,1);
digitalWrite(BLUE,0);
break;
case 3:
digitalWrite(ORANGE,0);
digitalWrite(YELLOW,0);
digitalWrite(PINK,0);
digitalWrite(BLUE,1);
break;
default:
break;
}
}
int main()
{
wiringPiSetup();
pinMode(ORANGE,OUTPUT);
pinMode(YELLOW,OUTPUT);
pinMode(PINK,OUTPUT);
pinMode(BLUE,OUTPUT);
pinMode(RED ,OUTPUT); //power line
digitalWrite(7,1);
for(int i=0;i<2048;i++) //half or full(wave)
{
step_wave(i%4); //0 1 2 3 0 1 2 3
delay(5);
}
return(1);
}
#include <stdio.h>
#include <wiringPi.h>
#define ORANGE 21 // 29 (물리적 pin 번호)
#define YELLOW 22 // 31
#define PINK 23 // 33
#define BLUE 24 // 35
#define RED 25 // 37 임시 전원용 : 사용 불가가
#define GND 39 // 39 참고용
void step_wave(int step)
{
switch(step)
{
case 0:
digitalWrite(ORANGE, 1);
digitalWrite(YELLOW, 0);
digitalWrite(PINK, 0);
digitalWrite(BLUE, 0);
break;
case 1:
digitalWrite(ORANGE, 0);
digitalWrite(YELLOW, 1);
digitalWrite(PINK, 0);
digitalWrite(BLUE, 0);
break;
case 2:
digitalWrite(ORANGE, 0);
digitalWrite(YELLOW, 0);
digitalWrite(PINK, 1);
digitalWrite(BLUE, 0);
break;
case 3:
digitalWrite(ORANGE, 0);
digitalWrite(YELLOW, 0);
digitalWrite(PINK, 0);
digitalWrite(BLUE, 1);
break;
default:
break;
}
}
void step_full(int step)
{
switch(step)
{
case 0: // Coil 1 + Coil 2
digitalWrite(ORANGE, HIGH);
digitalWrite(YELLOW, HIGH);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, LOW);
break;
case 1: // Coil 2 + Coil 3
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(PINK, HIGH);
digitalWrite(BLUE, LOW);
break;
case 2: // Coil 3 + Coil 4
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, HIGH);
digitalWrite(BLUE, HIGH);
break;
case 3: // Coil 4 + Coil 1
digitalWrite(ORANGE, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, HIGH);
break;
default:
break;
}
}
void step_half(int step)
{
switch(step)
{
case 0: // Coil 1 only
digitalWrite(ORANGE, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, LOW);
break;
case 1: // Coil 1 + Coil 2
digitalWrite(ORANGE, HIGH);
digitalWrite(YELLOW, HIGH);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, LOW);
break;
case 2: // Coil 2 only
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, LOW);
break;
case 3: // Coil 2 + Coil 3
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(PINK, HIGH);
digitalWrite(BLUE, LOW);
break;
case 4: // Coil 3 only
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, HIGH);
digitalWrite(BLUE, LOW);
break;
case 5: // Coil 3 + Coil 4
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, HIGH);
digitalWrite(BLUE, HIGH);
break;
case 6: // Coil 4 only
digitalWrite(ORANGE, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, HIGH);
break;
case 7: // Coil 4 + Coil 1
digitalWrite(ORANGE, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(PINK, LOW);
digitalWrite(BLUE, HIGH);
break;
default:
break;
}
}
int main()
{
wiringPiSetup();
pinMode(ORANGE, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(PINK, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(RED , OUTPUT); //power line
digitalWrite(RED,HIGH);
for(int i=0; i < 4096; i++) //half or full(wave)
{
// Wave drive
//step_wave(i % 4);
//delay(5);
// Full drive
step_full(i % 4);
delay(5);
// Half-drive
//step_half(i % 8);
//delay(5);
}
return(1);
}
서보 모터 동작
#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>
#define SERVO_PIN 29 // wiringPi 번호 21 → 물리적 핀 29 (BCM 5)
#define PWM_RANGE 200 // 소프트 PWM 분해능 (0–200)
// 서보 펄스 폭(duty)을 각도로 변환: 0° → 5, 90° → 15, 180° → 25 정도
int angleToDuty(int angle) {
return (5 * (180 - angle) + 25 * angle) / 180;
}
int main(void) {
// wiringPi 초기화
if (wiringPiSetup() == -1) {
fprintf(stderr, "wiringPi setup failed\n");
return 1;
}
// SERVO_PIN에 소프트 PWM 설정 (초기값 0, 범위 PWM_RANGE)
if (softPwmCreate(SERVO_PIN, 0, PWM_RANGE) != 0) {
fprintf(stderr, "softPwmCreate failed\n");
return 1;
}
// 서보를 좌우로 왕복시키며 테스트
while (1) {
// 0° → 180°
for (int ang = 0; ang <= 180; ang += 5) {
int duty = angleToDuty(ang);
softPwmWrite(SERVO_PIN, duty);
delay(20); // 펄스 간격 유지 (20 ms 주기)
}
// 180° → 0°
for (int ang = 180; ang >= 0; ang -= 5) {
int duty = angleToDuty(ang);
softPwmWrite(SERVO_PIN, duty);
delay(20);
}
}
return 0;
}