질문게시판 > 답변 : LCD상으로 주행거리와 장애물과의 거리를 출력하고싶습니다

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

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


BASIC4MCU | 질문게시판 | 답변 : LCD상으로 주행거리와 장애물과의 거리를 출력하고싶습니다

페이지 정보

작성자 master 작성일2018-06-08 23:58 조회6,716회 댓글1건

본문

	

 

// DateTime : 2018-06-08 오후 11:57:59
// by Ok-Hyun Park
//
#include <Time.h>
//
#include <IRremote.h>
int RECV_PIN=14// 적외선 수신센서 모듈과 A0 연결
IRrecv irrecv(RECV_PIN); // 적외선 수신 핀 지정
decode_results results;
//
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
//
int echo=6,trig=7;
int EA=3,EB=11,M_IN1=4,M_IN2=5,M_IN3=13,M_IN4=12;
int motorA_vector=1,motorB_vector=1,motor_speed=255;
//
float radius=3.3;                 // 바퀴당 이동 거리를 확인 하기 위해 자전거 바퀴의 반지름을 입력해 줍니다.(Cm 단위)
float circle=(2*radius*3.14)/100// 자전거 바퀴의 둘레를 계산(단위를 m로 바꿔주기 위해 100을 나눕니다.)
float distance=0;                 // 자전거의 누적 이동 거리
long  lcdDis=0;                   // 자전거의 이동 거리를 LCD출력에 맞게 바꿔즌 값.(단위 수정 or 소숫점 제거)
int count=0;                      // 리드스위치의 노이즈를 제거하기 위해 카운트를 넣어줍니다.
boolean temp=0;                   // 리드 스위치가 닫혔는지 확인하는 변수
//
void setup(){
  pinMode(trig,OUTPUT);  pinMode(echo,INPUT); // trig 핀 출력 설정 // echo 핀 입력 설정
  pinMode(EA,OUTPUT);    pinMode(EB,OUTPUT);
  pinMode(M_IN1,OUTPUT); pinMode(M_IN2,OUTPUT); pinMode(M_IN3,OUTPUT); pinMode(M_IN4,OUTPUT);
  irrecv.enableIRIn();   // 적외선 수신센서 활성화
  Serial.begin(9600);
  lcd.init(); lcd.backlight(); lcd.begin(16,2); lcd.clear();
}
//
void loop(){
  digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW);
  long distance=pulseIn(echo,HIGH)*0.017;
  Serial.print("distance: "); Serial.println(distance);
  lcd.clear(); lcd.setCursor(0,0); lcd.print("distance: "); lcd.print(distance); lcd.print("cm");
  delay(50);
  if(irrecv.decode(&results)){
    switch(results.value){
      case 0x00FF18E7motorA_conmotor_speed); motorB_conmotor_speed); break// Key 2-전진
      case 0x00FF10EFmotorA_conmotor_speed); motorB_con(0);            break// Key 4-좌회전
      case 0x00FF38C7motorA_con(0);            motorB_con(0);            break// Key 5-정지
      case 0x00FF5AA5motorA_con(0);            motorB_conmotor_speed); break// Key 6-우회전
      case 0x00FF4AB5motorA_con(-motor_speed); motorB_con(-motor_speed); break// Key 8-후진
    }
    irrecv.resume();
  }
  //
  boolean check=digitalRead(A0); // 리드스위치
  if     (check==1&&temp==0         ){ temp=1; }
  else if(check==0&&temp==1&&count>2){ temp=0count=0distance+=circle; }
  if(check==1){ count++; }
  lcdDis=distancelcd.setCursor(0,1); lcd.print("Distance: "); lcd.print(lcdDis); lcd.print("M ");
}
//
void motorA_con(int M1){
  if     (M1>0){ digitalWrite(M_IN1motorA_vector); digitalWrite(M_IN2,!motorA_vector); } // 정회전
  else if(M1<0){ digitalWrite(M_IN1,!motorA_vector); digitalWrite(M_IN2motorA_vector); } // 역회전
  else         { digitalWrite(M_IN1,LOW);            digitalWrite(M_IN2,LOW);            } // 정지
  analogWrite(EA,abs(M1));
}
//
void motorB_con(int M2){
  if     (M2>0){ digitalWrite(M_IN3motorB_vector); digitalWrite(M_IN4,!motorB_vector); } // 정회전
  else if(M2<0){ digitalWrite(M_IN3,!motorB_vector); digitalWrite(M_IN4motorB_vector); } // 역회전
  else         { digitalWrite(M_IN3,LOW);            digitalWrite(M_IN4,LOW);            } // 정지
  analogWrite(EB,abs(M2));
}

 

루프 타임이 길어서 리드스위치 검출에 문제가 생기면

  delay(50);

루프문의 딜레이를 제거해보고
그래도 안되면 count 변수에 관련된 코드를 삭제합니다.

 

// DateTime : 2018-06-09 오전 12:01:07
// by Ok-Hyun Park
//
#include <Time.h>
//
#include <IRremote.h>
int RECV_PIN=14// 적외선 수신센서 모듈과 A0 연결
IRrecv irrecv(RECV_PIN); // 적외선 수신 핀 지정
decode_results results;
//
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
//
int echo=6,trig=7;
int EA=3,EB=11,M_IN1=4,M_IN2=5,M_IN3=13,M_IN4=12;
int motorA_vector=1,motorB_vector=1,motor_speed=255;
//
float radius=3.3;                 // 바퀴당 이동 거리를 확인 하기 위해 자전거 바퀴의 반지름을 입력해 줍니다.(Cm 단위)
float circle=(2*radius*3.14)/100// 자전거 바퀴의 둘레를 계산(단위를 m로 바꿔주기 위해 100을 나눕니다.)
float distance=0;                 // 자전거의 누적 이동 거리
long  lcdDis=0;                   // 자전거의 이동 거리를 LCD출력에 맞게 바꿔즌 값.(단위 수정 or 소숫점 제거)
boolean temp=0;                   // 리드 스위치가 닫혔는지 확인하는 변수
//
void setup(){
  pinMode(trig,OUTPUT);  pinMode(echo,INPUT); // trig 핀 출력 설정 // echo 핀 입력 설정
  pinMode(EA,OUTPUT);    pinMode(EB,OUTPUT);
  pinMode(M_IN1,OUTPUT); pinMode(M_IN2,OUTPUT); pinMode(M_IN3,OUTPUT); pinMode(M_IN4,OUTPUT);
  irrecv.enableIRIn();   // 적외선 수신센서 활성화
  Serial.begin(9600);
  lcd.init(); lcd.backlight(); lcd.begin(16,2); lcd.clear();
}
//
void loop(){
  digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW);
  long distance=pulseIn(echo,HIGH)*0.017;
  Serial.print("distance: "); Serial.println(distance);
  lcd.clear(); lcd.setCursor(0,0); lcd.print("distance: "); lcd.print(distance); lcd.print("cm");
  if(irrecv.decode(&results)){
    switch(results.value){
      case 0x00FF18E7motorA_conmotor_speed); motorB_conmotor_speed); break// Key 2-전진
      case 0x00FF10EFmotorA_conmotor_speed); motorB_con(0);            break// Key 4-좌회전
      case 0x00FF38C7motorA_con(0);            motorB_con(0);            break// Key 5-정지
      case 0x00FF5AA5motorA_con(0);            motorB_conmotor_speed); break// Key 6-우회전
      case 0x00FF4AB5motorA_con(-motor_speed); motorB_con(-motor_speed); break// Key 8-후진
    }
    irrecv.resume();
  }
  //
  boolean check=digitalRead(A0); // 리드스위치
  if     (check==1&&temp==0){ temp=1; }
  else if(check==0&&temp==1){ temp=0count=0distance+=circle; }
  lcdDis=distancelcd.setCursor(0,1); lcd.print("Distance: "); lcd.print(lcdDis); lcd.print("M ");
}
//
void motorA_con(int M1){
  if     (M1>0){ digitalWrite(M_IN1motorA_vector); digitalWrite(M_IN2,!motorA_vector); } // 정회전
  else if(M1<0){ digitalWrite(M_IN1,!motorA_vector); digitalWrite(M_IN2motorA_vector); } // 역회전
  else         { digitalWrite(M_IN1,LOW);            digitalWrite(M_IN2,LOW);            } // 정지
  analogWrite(EA,abs(M1));
}
//
void motorB_con(int M2){
  if     (M2>0){ digitalWrite(M_IN3motorB_vector); digitalWrite(M_IN4,!motorB_vector); } // 정회전
  else if(M2<0){ digitalWrite(M_IN3,!motorB_vector); digitalWrite(M_IN4motorB_vector); } // 역회전
  else         { digitalWrite(M_IN3,LOW);            digitalWrite(M_IN4,LOW);            } // 정지
  analogWrite(EB,abs(M2));
}

이런식이 되겠지요

그래도 안되면 외부 인터럽트로 리드스위치를 검출해야합니다.



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

댓글 1

조회수 6,716

동그라미버스님의 댓글

동그라미버스 작성일

매번 감사합니다.
도움주신 코드로 여러번 돌려보았는데, 리드스위치가 자석을 인식은 매우 잘하는데
LCD상으로 누적 주행거리를 측정함에 있어서 제대로 검출이 안되는거 같습니다.
예를들어 바퀴가 10번돌았는데 4~5번정도만 회전한걸로 출력되고...

어떻게하면 바퀴회전수를 제대로 인식해서 주행거리를 출력할수 있을까요 ?
한 1초에 1.5바퀴 정도는 회전하는거 같습니다

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

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 10596
공지 사이트 이용 안내댓글[25] master 17-10-29 30531
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의 (2)댓글[3] 이미지새글 cansad 13:06 19
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의댓글[3] 새글 cansad 11:32 18
질문 빵판없이 디스플레이 넣을 수 있을까요?댓글[2] 이미지새글첨부파일 오소로롯 22-06-29 20
질문 라즈베리파이4 신형 선택문제댓글[1] maximum 22-06-26 87
질문 음전압 ADC댓글[2] 412904 22-06-26 89
질문 아두이노 센서값 출력 질문입니다!댓글[1] 아궁2 22-06-24 150
질문 ATmega128, ATmega28 RS232통신 이미지첨부파일 Moon4201 22-06-24 160
답변 답변글 답변 : ATmega128, ATmega28 RS232통신댓글[1] master 22-06-25 157
질문 서보모터, 온습도센서 코드 질문댓글[2] 첨부파일 kshdlfaldfh 22-06-22 136
답변 답변글 답변 : 서보모터, 온습도센서 코드 질문댓글[15] master 22-06-22 374
질문 steppermulti5 질문 응애 22-06-21 106
답변 답변글 답변 : steppermulti5 질문댓글[1] master 22-06-22 97
질문 atmega128 avr usart 질문 snoflak 22-06-21 164
답변 답변글 답변 : atmega128 avr usart 질문댓글[5] master 22-06-21 303
질문 사용자 정의 함수 변환 하는 방법댓글[2] 이미지첨부파일 da0800 22-06-21 133
질문 atmega128댓글[1] 이미지 양의노래 22-06-20 189
질문 아두이노 동시동작 재질문댓글[9] 이미지첨부파일 죠르디 22-06-20 314
질문 초음파센서로 dc모터 제어하기댓글[1] 첨부파일 난쟁2 22-06-20 184
질문 아두이노 동시동작댓글[7] 죠르디 22-06-19 201
질문 ATMEGA128 UART,FND 연동 질문 JMOD 22-06-19 199
답변 답변글 답변 : ATMEGA128 UART,FND 연동 질문댓글[1] master 22-06-20 111
질문 atmeg128 질문이요댓글[1] 이미지첨부파일 공대생er 22-06-18 161
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨 22-06-18 160
답변 답변글 답변 : atmega128 초음파 센서로 신호등 시간초 늘리기댓글[1] master 22-06-18 201
질문 atmega128댓글[2] 망경이 22-06-18 219
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 )댓글[1] 따랑해영 22-06-18 206
답변 답변글 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 )댓글[1] 이미지첨부파일 따랑해영 22-06-19 125
답변 답변글 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다. (온도에따른 자동 수동 선풍기 ) 앱인벤… 이미지첨부파일 따랑해영 22-06-19 912
게시물 검색

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