BASIC4MCU | 질문게시판 | 답변 : 아두이노 delay함수를 millis함수로 대체하는방법
페이지 정보
작성자 master 작성일2023-06-09 17:29 조회469회 댓글0건본문
#define MOTOR_A_a 3
#define MOTOR_A_b 11
#define MOTOR_B_a 5
#define MOTOR_B_b 6
#define MOTOR_SPEED 150
#define ULTRASENS_T 13
#define ULTRASENS_E 12
//
unsigned char m_a_spd=0,m_b_spd=0;
bool m_a_dir=0,m_b_dir=0;
long duration=0,distance=0,t,t1=0;
//
void setup(){
pinMode(MOTOR_A_a,OUTPUT); pinMode(MOTOR_A_b,OUTPUT);
pinMode(MOTOR_B_a,OUTPUT); pinMode(MOTOR_B_b,OUTPUT);
pinMode(ULTRASENS_T,OUTPUT); pinMode(ULTRASENS_E,INPUT);
digitalWrite(ULTRASENS_T,0);
Serial.begin(9600);
}
//
void howclose(){
t=millis(); if(t-t1<100)delay(t-t1); t1=t; // 마지막 트리거 후 100ms 이내면 100ms만큼 딜레이
digitalWrite(ULTRASENS_T,1); delayMicroseconds(10); digitalWrite(ULTRASENS_T,0);
duration=pulseIn(ULTRASENS_E,1);
distance=duration/58;
}
//
void motor_drive(){
if(m_a_dir==0){ digitalWrite(MOTOR_A_a,0); analogWrite(MOTOR_A_b,m_a_spd); }
else { digitalWrite(MOTOR_A_b,0); analogWrite(MOTOR_A_a,m_a_spd); }
//
if(m_b_dir==1){ digitalWrite(MOTOR_B_a,0); analogWrite(MOTOR_B_b,m_b_spd); }
else { digitalWrite(MOTOR_B_b,0); analogWrite(MOTOR_B_a,m_b_spd); }
}
//
void motor_stop() { m_a_dir=0; m_b_dir=0; m_a_spd=0; m_b_spd=0; motor_drive(); }
void motor_fwd() { m_a_dir=0; m_b_dir=0; m_a_spd=MOTOR_SPEED; m_b_spd=MOTOR_SPEED; motor_drive(); }
void motor_left() { m_a_dir=1; m_b_dir=0; m_a_spd=MOTOR_SPEED; m_b_spd=MOTOR_SPEED; motor_drive(); }
void motor_right() { m_a_dir=0; m_b_dir=1; m_a_spd=MOTOR_SPEED; m_b_spd=MOTOR_SPEED; motor_drive(); }
void motor_back() { m_a_dir=1; m_b_dir=1; m_a_spd=MOTOR_SPEED; m_b_spd=MOTOR_SPEED; motor_drive(); }
void motor_circle(){ m_a_dir=0; m_b_dir=0; m_a_spd=150; m_b_spd=250; motor_drive(); }
//
void loop(){
if(Serial.available()){
char r=Serial.read();
if(r=='w'){ motor_fwd(); } //전진
if(r=='a'){ motor_left(); } //제자리 좌회전
if(r=='d'){ motor_right(); } //제자리 우회전
if(r=='s'){ motor_back(); } //후진
if(r=='x'){ motor_stop(); } //모터 정지
if(r=='q'){ motor_circle(); } // 원운동
if(r=='e'){
motor_fwd(); for(int i=0;i<10;i++){ howclose(); if(distance<=20){ motor_stop(); return; } if(Serial.available())return; }
motor_stop(); delay(3000);
motor_right(); for(int i=0;i<10;i++){ howclose(); if(distance<=20){ motor_stop(); return; } if(Serial.available())return; }
motor_stop(); delay( 800);
}
}
//--------------------------------------------------
howclose(); if(distance<=20)motor_stop();
}
댓글 0
조회수 469등록된 댓글이 없습니다.