BASIC4MCU | 질문게시판 | 초음파센서를 이용한 모터제어 질문있습니다.
페이지 정보
작성자 뉴비에오 작성일2023-03-24 13:52 조회589회 댓글3건첨부파일
본문
초음파센서로 모터를 제어하려고 하는데 초음파센서 값이 이상하게 나옵니다. 평범하게나오다가 갑자기 거리가 확 줄어듭니다. 초음파센서에는 문제가 없고 연결도 문제없습니다. 모터는 서보모터3개와 스탭모터 1개를 씁니다. 어째서 그런지 알려주실수있나요? 밑은코드고 시리얼모니터 사진도 첨부했습니다.
#include <Servo.h>
#define TRIG 3 // TRIG 핀 설정 (초음파 보내는 핀)
#define ECHO 2
int stepPin[] = {9, 10, 11, 12};
Servo servo1; // 손목
Servo servo2; // 집게
Servo servo3; // 팔
void aStep(int s) {
switch (s) {
case 0:
digitalWrite(stepPin[0], LOW);
digitalWrite(stepPin[1], HIGH);
digitalWrite(stepPin[2], HIGH);
digitalWrite(stepPin[3], LOW);
break;
case 1:
digitalWrite(stepPin[0], LOW);
digitalWrite(stepPin[1], HIGH);
digitalWrite(stepPin[2], LOW);
digitalWrite(stepPin[3], HIGH);
break;
case 2:
digitalWrite(stepPin[0], HIGH);
digitalWrite(stepPin[1], LOW);
digitalWrite(stepPin[2], LOW);
digitalWrite(stepPin[3], HIGH);
break;
case 3:
digitalWrite(stepPin[0], HIGH);
digitalWrite(stepPin[1], LOW);
digitalWrite(stepPin[2], HIGH);
digitalWrite(stepPin[3], LOW);
break;
default:
break;
}
}
void doSteps(bool dir, int nSteps, int del) {
for (int i = 0; i < nSteps; i++) {
aStep((dir ? (nSteps - i - 1) : i) % 4);
delay(del);
}
}
void setup() {
servo1.attach(4);
servo2.attach(5);
servo3.attach(6);
pinMode(stepPin[0], OUTPUT);
pinMode(stepPin[1], OUTPUT);
pinMode(stepPin[2], OUTPUT);
pinMode(stepPin[3], OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
Serial.begin(9600); // 시리얼 모니터 사용
}
void loop() {
long duration, distance;
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
Serial.println(duration);
Serial.print("\nDIstance : ");
Serial.print(distance);
Serial.println(" Cm");
delay(300);
if (distance < 10) // 정면
{
servo1.write(90);
delay(3000);
servo2.write(0);
delay(3000);
servo3.write(90);
delay(3000);
doSteps(2, 5000, 3);
delay(3000);
servo2.write(90);
delay(3000);
doSteps(0, 5000, 3);
delay(3000);
doSteps(2, 5000, 3);
delay(3000);
servo2.write(0);
delay(3000);
doSteps(0, 5000, 3);
delay(3000);
servo1.write(90);
}
}
댓글 3
조회수 589master님의 댓글
master 작성일
마지막에 0이 나온 것은 노이즈에 의한 오류라고 가정하고
위에서 2미터와 34cm가 번갈아 나오는 것은 왜 그렇죠?
30cm 근처에 물체가 약간 걸려있나요?
뉴비에오님의 댓글
뉴비에오
아니요 이유를 모르겠는데 저렇게 번갈아서 나옵니다. 초음파센서는 천장을 향해있고 중간에 물체는 없습니다.
master님의 댓글
master
타이머 쫑(한개의 타이머를 여러 라이브러리에서 사용하면서 충돌)나는지 체크 해보세요
서버모터도, 초음파센서도 타이머를 사용하고 있습니다.
3번핀을 다른 핀으로도 변경 해보세요(2번핀은 타이머(PWM) 출력이 아니므로 상관없습니다.)