질문게시판 > delay를 millis함수로 바꾸는데 질문있습니다.

TODAY821 TOTAL2,918,712
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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함수로 모터를 움직이게 하는 방법을 알려주시면 감사하겠습니다. 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 12

조회수 27,006

master님의 댓글

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 댓글의 댓글 작성일

기본 예제 만들어드렸으니 남은 문제는 스스로 공부해서 완성시켜보세요

뉴비에오님의 댓글

뉴비에오 작성일

알겠습니다!

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 21007
공지 사이트 이용 안내댓글[29] master 17-10-29 34882
질문 stm32 보드에서 시간설정과 불러오기를 하는데 새글 라칸 10:09 7
질문 아두이노 인터럽트 질문입니다.댓글[1] 새글 Tell 23-09-21 12
답변 답변글 답변 : 아두이노 인터럽트 질문입니다. 새글 master 05:47 15
질문 아두이노와 거리 감지 센서의 전류 관련댓글[1] 새글 hmkim 23-09-21 27
질문 아두이노 코딩 질문있습니다. 도와주세요....댓글[1] 이미지새글첨부파일 vnpaz 23-09-20 36
질문 아두이노를 사용한 dc모터 위치제어댓글[2] 새글 모터위치 23-09-20 41
질문 stm32 디버깅이나 rst버튼 없이 하는 방법좀댓글[1] 라칸 23-09-20 37
질문 LCD에 숫자 표기법을 바꾸고 싶습니댓글[2] Bs드리프터 23-09-19 88
질문 알코올 측정기(MQ-3) 관련 질문 이미지 소오금 23-09-18 50
답변 답변글 답변 : 알코올 측정기(MQ-3) 관련 질문 master 23-09-19 44
질문 스텝모터 제어하는 소스파일 수정방법 질문드립니다. Bs드리프터 23-09-15 60
답변 답변글 답변 : 스텝모터 제어하는 소스파일 수정방법 질문드립니다.댓글[1] master 23-09-15 92
질문 atmega 128을 이용한 악기 튜너기댓글[1] 아두이노짱 23-09-15 221
질문 stm32 보드 ip주소 찾는법댓글[1] 라칸 23-09-13 58
질문 마이컴 종류 질문댓글[2] stevie8 23-09-12 105
질문 주파수 실수배 체배 관련문의댓글[6] 스쳐두임신 23-09-11 142
질문 스마트 창문 제작 중에 질문 있습니다!댓글[1] 이미지첨부파일 N8008 23-09-09 100
질문 아두이노와 파이어베이스 연결이 안되는데 도와주실수 있을까요댓글[1] 아카링고 23-09-08 353
질문 노르딕 타이머댓글[1] stevie8 23-09-08 253
질문 아두이노우노 엔코더모터 서보모터 코드댓글[1] 팔쟁이 23-09-07 191
질문 rs485 모드버스 통신 질문댓글[2] 킹초보 23-08-28 388
질문 데이터 타입 질문댓글[1] stevie8 23-08-22 206
질문 아두이노 서보모터 연결 작동안함댓글[1] 이미지 토뭉이 23-08-19 531
질문 아두이노 외부전원 인가 문제 해결방안...댓글[3] 나도할수있어아두 23-08-17 314
질문 Arduino nano 33 iot 모듈 블루투스 통신댓글[5] 이미지첨부파일 senior 23-08-16 599
질문 아두이노로 전달받은 값을 실시간으로 웹페이지와 연동댓글[1] 스냥 23-08-16 285
질문 atmega128 여러개 RFID 연결댓글[1] 강민준 23-08-15 251
질문 ATmega128A UCSR1A Register 질문 mustbe 23-08-14 228
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기