BASIC4MCU | 질문게시판 | 초음파센서로 dc모터 제어하기
페이지 정보
작성자 난쟁2 작성일2022-06-20 06:44 조회526회 댓글1건첨부파일
본문
초음파센서를 이용해 자동으로 창문을 닫아주는 장치를 만들어보고 있습니다. 제가 짠 코드에서 loop문 안에 초음파센서따로 모터따로 해서 각각 구동시켰을때는 잘 작동되는데 이것을 하나로 합치려고 하니까 문제가 발생하네요. 하나로 합쳤을때 문제점이 다음입니다. led만 작동되는 상태입니다. esp32를 이용하고 있고 바쁘시겠지만 한번만 훑어봐 주시면 감사하겠습니다!!
1. 시리얼모니터에 초음파센서로 측정한 거리가 뜨지를 않음
2. 모터가 작동이 안됨.
int ledPin = LED_BUILTIN;
int ledState = LOW;
int STBY = 27;
int AIN1 = 26;
int AIN2 = 25;
int trigPin = 32;
int echoPin = 35;
int i;
void move_motor(int motor, int speed, int direction);
void stop_motor(int motor);
void led_on(int ledState);
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(STBY, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
led_on(LOW); // led킴 = 에어컨 켜짐
if (ledPin == HIGH) {
float duration, distance;
digitalWrite(trigPin, LOW);
delay(10);
digitalWrite(trigPin, HIGH);
//10ms마다 거리 측정
duration = pulseIn(echoPin, HIGH);
distance = ((float)(340 * duration) / 10000) / 2;
Serial.print("Distance:");
Serial.print(distance);
Serial.println("mm\n");
delay(500);
// 초음파 센서 거리 출력
while (distance >= 80) { //거리가 4cm까지는 일정속도로 닫음
move_motor(0, 128, 0);
delay(50);
}
while ((distance < 80) && (distance > 40)) {
for (i = 128; i >= 0; i--) {
move_motor(0, i, 0); //거리가 4cm~0까지는 속도 선형적 감소
delay(50);
}
}
delay(5000); //5초간 닫은 상태 유지
while (distance <= 90) {
for (i = 0; i >=1238; i++) {
move_motor(0, i, 1); //환기시키기 위해서 모터 반대 방향으로 구동
delay(50);
}
}
stop_motor(1);
delay(2000); //2초간 환기 상태 유지
while (distance > 40) { //거리가 0이 될때까지 반복
for (i = 128; i = 0; i--) {
move_motor(0, i, 0); //거리가 4cm~0까지는 속도 선형적 감소
delay(50);
}
}
stop_motor(1);
led_on(HIGH);
}
}
void led_on(int ledState) {
if (ledState == LOW) {
ledPin == HIGH;
}
else {
ledPin == LOW;
}
digitalWrite(ledPin, ledState);
}
//led 켰다 껐다.
void move_motor(int motor, int speed, int direction) {
digitalWrite(STBY, HIGH);
boolean IN1 = LOW;
boolean IN2 = LOW;
if (direction == 0) { //시계방향 모터 회전
IN1 = HIGH;
IN2 = LOW;
}
else if (direction == 1) { //반시계방향 모터 회전
IN1 = LOW;
IN2 = HIGH;
}
digitalWrite(AIN1, IN1);
digitalWrite(AIN2, IN2);
}
void stop_motor(int motor) { //모터 멈추기
digitalWrite(STBY, HIGH);
if (motor == 1) {
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
}
}
댓글 1
조회수 526master님의 댓글
master 작성일
초음파거리측정
while (distance >= 80) { move_motor(0, 128, 0); delay(50); } //거리가 4cm까지는 일정속도로 닫음
와일문 위에서 거리측정을 한 후
와일문 안에서는 거리 측정을 하지 않기 때문에 distance 가 변하질 않습니다.
while (distance >= 80) { move_motor(0, 128, 0); delay(50); 초음파거리측정 } //거리가 4cm까지는 일정속도로 닫음
거리측정 코드를 와일문 안에도 추가해야 합니다.
다른 비슷한 코드들도 수정하세요