BASIC4MCU | 질문게시판 | 리드스위치 핀번호를 바꾸니 RC카가 동작을 안합니다.
페이지 정보
작성자 동그라미버스 작성일2018-06-10 14:23 조회10,420회 댓글1건본문
#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; // 자전거의 누적 이동 거리
float 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("Obstacle: "); lcd.print(distance); lcd.print("cm");
}
if(!digitalRead(A1)){ // 리드스위치if(temp){ temp=0;
distance1+=circle; lcdDis=distance1;
}
//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();
}
//
}else{ temp=1; }
lcd.setCursor(0,1); lcd.print("Distance: "); lcd.print(lcdDis); lcd.print("M ");
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));
}
적외선수신센서와 리드스위치가 A0핀일때는 전체적으로 동작은 잘하지만
IR리모컨의 버튼을 누를때마다 리드스위치가 그값을 읽어서 문제였습니다.
그래서 리드스위치를 A1핀으로 옮겨봤는데, 이번에는 RC카 자체가 동작이 안됩니다
(나머지는 정상적으로 동작)
이것저것 바꿔봤는데 무슨 문제가 있는걸까요 ?
댓글 1
조회수 10,420master님의 댓글
master 작성일
void setup(){
pinMode(A1,INPUT_PULLUP); // 리드스위치 내부 풀업저항 사용으로 설정
셋업함수에 위 설정 추가해보세요