호타리 2025. 5. 28. 17:51

2025.05.28

 

초음파센서 동작

#include <stdio.h>
#include <wiringPi.h>

#define TRIG 27
#define ECHO 28

void setup() {
    wiringPiSetup();
    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
    digitalWrite(TRIG, LOW);
    delay(30);  // 센서 안정화 대기
}

double getDistance() {
    // Trigger pulse
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    // Echo 신호가 HIGH가 될 때까지 대기
    while (digitalRead(ECHO) == LOW);

    int startTime = micros();

    // Echo 신호가 LOW가 될 때까지 대기
    while (digitalRead(ECHO) == HIGH);

    int endTime = micros();

    // 거리 계산: 왕복 시간 x 음속(0.017 cm/us)
    double distance = (endTime - startTime) * 0.017;
    return distance;
}

int main() {
    setup();

    while (1) {
        double distance = getDistance();
        printf("Distance: %.2f cm\n", distance);
        delay(500);  // 0.5초 간격
    }

    return 0;
}

 

서보모터와 초음파센서 연동

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

#define TRIG 27
#define ECHO 28
#define SERVO_PIN 29
#define PWM_RANGE 200

// 각도를 소프트 PWM duty로 변환 (0도:5 ~ 180도:25)
int angleToDuty(int angle) {
    return (5 * (180 - angle) + 25 * angle) / 180;
}

// 거리 측정 함수
double getDistance() {
    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    while (digitalRead(ECHO) == LOW);
    int startTime = micros();

    while (digitalRead(ECHO) == HIGH);
    int endTime = micros();

    return (endTime - startTime) * 0.017;  // cm
}

// 초기화
int setup() {
    if (wiringPiSetup() == -1) return 1;

    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
    digitalWrite(TRIG, LOW);
    delay(30);

    if (softPwmCreate(SERVO_PIN, 0, PWM_RANGE) != 0) {
        fprintf(stderr, "softPwmCreate failed\n");
        return 1;
    }

    return 0;
}

int main() {
    if (setup() != 0) return 1;

    while (1) {
        double distance = getDistance();
        printf("Distance: %.2f cm\n", distance);

        if (distance < 10.0) {
            // 역회전: 180° → 0°
            for (int ang = 180; ang >= 0; ang -= 5) {
                softPwmWrite(SERVO_PIN, angleToDuty(ang));
                delay(20);
            }
        } else {
            // 정회전: 0° → 180°
            for (int ang = 0; ang <= 180; ang += 5) {
                softPwmWrite(SERVO_PIN, angleToDuty(ang));
                delay(20);
            }
        }

        delay(500);  // 다음 측정까지 대기
    }

    return 0;
}

 

스텝모터와 초음파센서 연동

#include <stdio.h>
#include <wiringPi.h>

// 초음파 센서 핀 (wiringPi 번호)
#define TRIG    27
#define ECHO    28

// 스텝모터 핀 (wiringPi 번호)
#define ORANGE  21
#define YELLOW  22
#define PINK    23
#define BLUE    24
#define RED     25  // 모터 전원용

// 초음파 거리 측정 함수 (cm)
double get_distance() {
    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    // Echo 신호 시작 대기
    while (digitalRead(ECHO) == LOW);
    long start_time = micros();
    // Echo 신호 끝 대기
    while (digitalRead(ECHO) == HIGH);
    long end_time = micros();

    // 거리 계산: 왕복 시간(us) × 음속(cm/us) / 2
    return (end_time - start_time) * 0.017;
}

// Full-step 모드 한 스텝 구동
void step_full(int step) {
    switch(step) {
        case 0:
            digitalWrite(ORANGE, HIGH);
            digitalWrite(YELLOW, HIGH);
            digitalWrite(PINK,   LOW);
            digitalWrite(BLUE,   LOW);
            break;
        case 1:
            digitalWrite(ORANGE, LOW);
            digitalWrite(YELLOW, HIGH);
            digitalWrite(PINK,   HIGH);
            digitalWrite(BLUE,   LOW);
            break;
        case 2:
            digitalWrite(ORANGE, LOW);
            digitalWrite(YELLOW, LOW);
            digitalWrite(PINK,   HIGH);
            digitalWrite(BLUE,   HIGH);
            break;
        case 3:
            digitalWrite(ORANGE, HIGH);
            digitalWrite(YELLOW, LOW);
            digitalWrite(PINK,   LOW);
            digitalWrite(BLUE,   HIGH);
            break;
        default:
            break;
    }
}

int main() {
    // wiringPi 초기화
    if (wiringPiSetup() == -1) {
        fprintf(stderr, "wiringPi setup failed\n");
        return 1;
    }

    // 핀 모드 설정
    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
    pinMode(ORANGE, OUTPUT);
    pinMode(YELLOW, OUTPUT);
    pinMode(PINK, OUTPUT);
    pinMode(BLUE, OUTPUT);
    pinMode(RED, OUTPUT);

    // 모터 전원 공급
    digitalWrite(RED, HIGH);

    while (1) {
        double distance = get_distance();
        printf("Distance: %.2f cm\n", distance);

        if (distance < 10.0) {
            // 역회전: 역방향 인덱스 보정 적용
            for (int i = 0; i < 512; i++) {
                int idx = (3 - (i % 4) + 4) % 4;
                step_full(idx);
                delay(5);
            }
        } else {
            // 정회전
            for (int i = 0; i < 512; i++) {
                step_full(i % 4);
                delay(5);
            }
        }

        delay(1000);  // 1초 대기 후 다음 측정
    }

    return 0;
}