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

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

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


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

페이지 정보

작성자 뉴비에오 작성일2022-07-16 11:04 조회678회 댓글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

조회수 678

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 11911
공지 사이트 이용 안내댓글[25] master 17-10-29 31175
질문 해석좀 해주세요 새글 bubu 22-08-14 15
질문 lcd 1602에 특수문자를 출력하는 방법을 알고싶습니다.댓글[3] dndktn 22-08-12 30
질문 stm32 wifi 파일전송댓글[3] 하리 22-08-11 31
질문 회로 구성 수정댓글[2] 첨부파일 픽공부 22-08-11 34
질문 아두이노 와이파이통신 질문 있습니다댓글[1] 학생 22-08-11 31
질문 포토다이오드와의 연결 질문합니다.댓글[7] 이미지첨부파일 박윤모 22-08-10 49
질문 회로 구성댓글[4] 픽공부 22-08-10 41
질문 아두이노 센서, 와이파이, 블루투스 연결댓글[1] pattern 22-08-10 53
질문 PIC 블루투스 연결댓글[19] 픽공부 22-08-09 61
질문 PIC18F452 블루투스 연결댓글[4] 마이컴 22-08-08 67
질문 아두이노 코드 해석을 못하겠습니다...댓글[2] 김가헌 22-08-08 69
질문 아두이노 코드를 avr로 변환해 주세요 ...ㅠ댓글[3] 옹냥냥 22-08-08 62
질문 아두이노 녹음-스피커모듈 관련 질문있습니다 ㅠㅠ댓글[2] 방귀뿡뿡 22-08-08 46
질문 Serial EEPROM 실수값 저장..댓글[2] 이미지첨부파일 광이 22-08-07 40
질문 STM32 Live Expression 값들이 깜빡이는 현상댓글[3] 둠둠 22-08-05 114
질문 아두이노 ESP32 wifi module댓글[1] Yoon 22-08-03 179
질문 atmega128과 dht11, lcd를 연결했는데 0도라고 뜹니다.댓글[1] 고양이33 22-08-02 426
질문 ATMEGA 128 코드를 합치려고 하는데 어렵네요댓글[2] 고양이33 22-08-02 233
질문 서보모터 제어에 대해 질문있습니다.댓글[2] 첨부파일 뉴비에오 22-07-30 158
질문 적외선 통신 알려주실분있나요 ㅠㅠ댓글[1] hkjsj10 22-07-30 148
질문 아두이노 관련 궁금합니다.댓글[1] 뱝뱝 22-07-28 138
질문 아두이노 우노 MCP4725댓글[3] 이미지 opqr 22-07-27 293
질문 레오나르도 인체감지센서 알림 안옴 면지지 22-07-24 226
답변 답변글 답변 : 레오나르도 인체감지센서 알림 안옴 master 22-07-25 161
질문 Uno에서 엔코더값 놓치는 이유가 뭘까요...댓글[3] MAKTUB 22-07-24 166
질문 아두이노 압력센서 연동 질문댓글[4] dbice 22-07-23 273
질문 아두이노 버튼 누르기 문의댓글[1] 김형근 22-07-23 197
질문 HM10 다중페어링댓글[1] ㅎㅋㅎㅋㅎ 22-07-22 209
게시물 검색

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
모바일버전으로보기