호타리 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;
}