BASIC4MCU | 질문게시판 | delay를 millis함수로 바꾸는데 질문있습니다.
페이지 정보
작성자 뉴비에오 작성일2022-07-16 11:04 조회27,006회 댓글12건첨부파일
본문
delay를 사용할때 중간에 대기하는 텀이 생겨서 대신 millis함수를 사용하려고 합니다. 코드에서 delay를 millis함수로 바꾸는 법을 알려주시면 감사하겠습니다. 코드는 전에 질문 드렸던 코드 입니다.
int trig=8
int echo=9;
int motor_1=5;
int motor_2=4;
//
float Lenght;
float new_dist;
int old_dist,n,d;
//
void setup(){
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
Serial.begin(9600);
pinMode(motor_1,OUTPUT);
pinMode(motor_2,OUTPUT);
}
//
void loop(){
digitalWrite(trig,1);
delayMicroseconds(10);
digitalWrite(trig,0);
Lenght=pulseIn(echo,HIGH);
new_dist=((float)(340*Lenght)/10000)/2;
Serial.print(new_dist); Serial.println("Cm");
//
if((old_dist+1)<=new_dist){ // 1cm 이상 멀어지면
n=new_dist-old_dist;
old_dist+=n;
d=n*1000;
Serial.print(old_dist);
Serial.print("Cm,cnt=");
Serial.println(n);
digitalWrite(motor_1,1);
digitalWrite(motor_2,0);
delay(d); // cm당 1초
digitalWrite(motor_1,0);
digitalWrite(motor_2,0);
}
//
if((old_dist-1)>=new_dist){ // 1cm 이상 가까워지면
n=old_dist-new_dist;
old_dist-=n;
d=n*1000;
Serial.print(old_dist); Serial.print("Cm,cnt="); Serial.println(n);
digitalWrite(motor_1,0);
digitalWrite(motor_2,1);
delay(d); // cm당 1초
digitalWrite(motor_1,0);
digitalWrite(motor_2,0);
}
delay(100);
}
delay대신 millis함수로 모터를 움직이게 하는 방법을 알려주시면 감사하겠습니다.
댓글 12
조회수 27,006master님의 댓글
master 작성일
cm당 1초씩 예를들어서 10cm 움직이면 정회전 혹은 역회전 10초 모터가 회전한다.
//
딜레이(모터회전) 중에 초음파를 계측하거나 하면
위 제어가 다 깨져버립니다.
다른 처리를 하는 것도 없어서 할랑한데 무슨 이유로 모터 회전이 길어서 답답하다는 것일까요?
뉴비에오님의 댓글
뉴비에오 작성일초음파센서에 측정되는 값에따라 모터를 따라가게 하고싶었고 모터가 완전정지하지 않게 하고싶었습니다. 그래서 방법을 찾아봤는데 딜레이가 아닌 밀리스함수로 만들면 가능할것 같다는 생각이 들어서 질문드렸습니다.
master님의 댓글
master
cm당 1초 회전하는 것은 중요치 않고
거리가 1cm이상 변하면 잠깐 회전만 시키면 된다는 것인가요?
master님의 댓글
master 작성일
따라오는 로봇을 만들 계획이라면
일정거리(예를들면 20cm)를 정해두고
그 거리보다 길면 정회전, 짧으면 역회전 시키면 됩니다.
millis() 함수와는 아무런 상관이 없습니다.
//
int trig=8,echo=9;
int motor_1=5,motor_2=4;
//
long Lenght,dist;
//
void setup(){
pinMode(trig,OUTPUT); pinMode(echo,INPUT);
pinMode(motor_1,OUTPUT); pinMode(motor_2,OUTPUT);
Serial.begin(9600);
}
//
void loop(){
digitalWrite(trig,1); delayMicroseconds(10); digitalWrite(trig,0);
Lenght=pulseIn(echo,HIGH);
dist=(float)Lenght*0.017;
Serial.print(dist); Serial.println("Cm");
//
if(dist<19){ // 19cm 보다 가까우면
digitalWrite(motor_1,0); digitalWrite(motor_2,1); // 역회전
}
else if(dist<21){ // 19~21cm 사이면
digitalWrite(motor_1,0); digitalWrite(motor_2,0); // 정지
}
else{ // 21cm 보다 멀면
digitalWrite(motor_1,1); digitalWrite(motor_2,0); // 정회전
}
delay(100);
}
뉴비에오님의 댓글
뉴비에오 작성일모터가 움직이는중이어도 거리값이 바뀌면 모터도 움직임이 바뀌도록 하고싶었습니다. 그래서 모터회전 중에 초음파를 측정하고 싶었습니다. 말을 이상하게 해서 햇갈리게해 죄송합니다.
master님의 댓글
master
뭔 말인지는 알겠는데요
10cm가 이동해서 모터가 10초 회전하는 동안에
5초 정도 회전하는 시점에서 거리가 반대로 7cm 반대로 이동 했다고 가정해보죠
1. 이전 측정에 의해서 회전하다가 남은 5초는 마저 회전하고, 반대방향으로 7초를 회전한다
2. 남은 5초는 제거하고 반대방향으로 2초를 회전한다.
3. 이전 회전(5초)은 무시하고 반대방향으로 7초 회전한다.
4. 거리측정값이 변경되었다는 것을 표시하기만 하면 되므로 cm당 1초는 무시하고 거리 변경 시마다 1초 정도 모터가 정/역하면 됨
단, 모터회전 중 거리값이 변경되면 마지막 변경된 시점부터 1초 후 모터 정지
어떤 방식이 원하는 것인가요?
아니면 다른 제어방식이 있을까요?
구체적으로 알고리즘을 만들지 않으면 원하는대로 제어하지 못합니다.
남에게 제대로 설명도 못하게 되죠
//
추가로, 모터 소음이 초음파 측정에 영향을 주기도 합니다.
모터가 동작하는 도중에는 거리 측정에 문제가 발생 할 수도 있다는 것이죠
뉴비에오님의 댓글
뉴비에오 작성일2번 입니다! 설명을 어떻게 해야할지 막막했는데 이렇게 친절하게 설명해주셔서 감사합니다!
master님의 댓글
master
int trig=8,echo=9;
int motor_1=5,motor_2=4;
//
long Lenght,target_dist,curr_dist=0;
//
void setup(){
pinMode(trig,OUTPUT); pinMode(echo,INPUT);
pinMode(motor_1,OUTPUT); pinMode(motor_2,OUTPUT);
Serial.begin(9600);
}
//
void loop(){
digitalWrite(trig,1); delayMicroseconds(10); digitalWrite(trig,0);
Lenght=pulseIn(echo,HIGH);
target_dist=(float)Lenght*0.17;
Serial.print(target_dist); Serial.println("mm");
//
if(curr_dist<target_dist){ // 멀어지면
digitalWrite(motor_1,1); digitalWrite(motor_2,0); // 정
curr_dist++;
}
else if(curr_dist>target_dist){ // 멀어지면
digitalWrite(motor_1,0); digitalWrite(motor_2,1); // 역
curr_dist--;
}
else{
digitalWrite(motor_1,0); digitalWrite(motor_2,0); // 정지
}
//
delay(100);
}
엘리베이터와 유사한 제어입니다.
10층을 눌렀는데 이동 중간에 다른 층을 눌러서 이동해야 할 층을 변경하는 것과 유사하죠
뉴비에오님의 댓글
뉴비에오
감사합니다!
뉴비에오님의 댓글
뉴비에오 작성일정말 죄송합니다만 혹시 1cm변화당 모터를 1초 움직이는 코드와 위의 코드를 합치는게 가능한가요? 예를들어 10cm변화를 감지하고 10초를 움직이던 중 3초 시점에서 5cm로 거리가 줄어들면 2cm만 가고 모터가 정지하게 만드는게 가능한가요? 자꾸 질문드려서 죄송합니다.
master님의 댓글
master
기본 예제 만들어드렸으니 남은 문제는 스스로 공부해서 완성시켜보세요
뉴비에오님의 댓글
뉴비에오 작성일알겠습니다!