BASIC4MCU | 질문게시판 | 답변 2: LCD상으로 주행거리와 장애물과의 거리를 출력하고싶습니다
페이지 정보
작성자 master 작성일2018-06-09 15:13 조회15,463회 댓글4건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-06-09 오후 3:14:44// 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;int cnt=0;//float radius=3.3; // 바퀴당 이동 거리를 확인 하기 위해 자전거 바퀴의 반지름을 입력해 줍니다.(Cm 단위)float circle=(2*radius*3.14)/100; // 자전거 바퀴의 둘레를 계산(단위를 m로 바꿔주기 위해 100을 나눕니다.)float distance1=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(115200);lcd.init(); lcd.backlight(); lcd.begin(16,2); lcd.clear();}//void loop(){if(++cnt>10){ cnt=0; // 10회에 1번씩만 초음파 동작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 0x00FF18E7: motorA_con( motor_speed); motorB_con( motor_speed); break; // Key 2-전진case 0x00FF10EF: motorA_con( motor_speed); motorB_con(0); break; // Key 4-좌회전case 0x00FF38C7: motorA_con(0); motorB_con(0); break; // Key 5-정지case 0x00FF5AA5: motorA_con(0); motorB_con( motor_speed); break; // Key 6-우회전case 0x00FF4AB5: motorA_con(-motor_speed); motorB_con(-motor_speed); break; // Key 8-후진}irrecv.resume();}//if(!digitalRead(A0)){ // 리드스위치if(temp){ temp=0;distance1+=circle; lcdDis=distance1;lcd.setCursor(0,1); lcd.print("Distance: "); lcd.print(lcdDis); lcd.print("M ");}}else{ temp=1; }delay(2);}//void motorA_con(int M1){if (M1>0){ digitalWrite(M_IN1, motorA_vector); digitalWrite(M_IN2,!motorA_vector); } // 정회전else if(M1<0){ digitalWrite(M_IN1,!motorA_vector); digitalWrite(M_IN2, motorA_vector); } // 역회전else { digitalWrite(M_IN1,LOW); digitalWrite(M_IN2,LOW); } // 정지analogWrite(EA,abs(M1));}//void motorB_con(int M2){if (M2>0){ digitalWrite(M_IN3, motorB_vector); digitalWrite(M_IN4,!motorB_vector); } // 정회전else if(M2<0){ digitalWrite(M_IN3,!motorB_vector); digitalWrite(M_IN4, motorB_vector); } // 역회전else { digitalWrite(M_IN3,LOW); digitalWrite(M_IN4,LOW); } // 정지analogWrite(EB,abs(M2));}
통신 보레이트를 높였고
초음파센서를 10회마다 하도록 변경했습니다.
가장 시간이 많이 걸릴 것으로 예상되는 것은 초음파 에코펄스 측정인데
거리가 멀 수록 오래걸립니다.
리드스위치 인식하는 시간이 짧아서
초음파센서의 에코 측정이라든가 시간이 많이 걸리는 부분에서 리드스위치를 놓치는 것으로 생각됩니다.
이 소스로도 측정이 안되면
외부 인터럽트로 리드스위치를 읽으세요
댓글 4
조회수 15,463동그라미버스님의 댓글
동그라미버스 작성일
정말 감사합니다 소스대로 하니까 리드스위치가 놓치는거 없이 잘실행됩니다.
문제점이 두개 있긴한데
1. LCD에 주행거리가 모터가 회전할때만 표시되고 모터회전을 멈추면 아예 빈칸으로 뜹니다.
(장애물과의거리는 표시가 잘됩니다.)
2. IR리모컨을 누를때마다 리드스위치의 값이 1씩 올라서 버튼을 누를때마다 주행거리가 21cm(1회전)씩 올라갑니다
master님의 댓글
master
lcd.setCursor(0,1); lcd.print("Distance: "); lcd.print(lcdDis); lcd.print("M ");
delay(2);
}
주행거리 표시를 딜레이 바로 위로 이동시키세요
master님의 댓글
master
analogRead(0)과 analogRead(A0) 그리고 analogRead(14)는 모두 같은 핀입니다.
현재 리모콘과 리드 스위치 핀이 같은 상태인거죠
연결을 어떻게 했을까요?
if(!digitalRead(A1)){ // 리드스위치
A1으로 바꾸고 리드스위치 입력을 A1에 연결하세요
동그라미버스님의 댓글
동그라미버스
저도 같은핀을 쓰고있다고 생각해서 A1~A3까지 다끼워 봤는데,
이상하게 딴건 다되는데, 저렇게 끼우면 IR리모컨 동작이 안먹히네요
화면문제는 깨끗하게 해결되었습니다! 감사합니다