/* ___ ___ ___ _ _ ___ ___ ____ ___ ____ * / _ \ /___)/ _ \| | | |/ _ \ / _ \ / ___) _ \| \ *| |_| |___ | |_| | |_| | |_| | |_| ( (__| |_| | | | | * \___/(___/ \___/ \__ |\___/ \___(_)____)___/|_|_|_| * (____/ * www.osoyoo.com IR remote control smart car * program tutorial : http://osoyoo.com/2017/04/16/control-smart-car-with-ir/ * Copyright John Yu */ #include #include "configuration.h" IRrecv IR(IR_PIN); // IRrecv object IR get code from IR remoter decode_results IRresults; /***************motor control***************/ void go_Advance(void) //Forward { digitalWrite(dir1PinL, HIGH); digitalWrite(dir2PinL,LOW); digitalWrite(dir1PinR,HIGH); digitalWrite(dir2PinR,LOW); analogWrite(speedPinL,255); analogWrite(speedPinR,255); } void go_Left(int t=0) //Turn left { digitalWrite(dir1PinL, HIGH); digitalWrite(dir2PinL,LOW); digitalWrite(dir1PinR,LOW); digitalWrite(dir2PinR,HIGH); analogWrite(speedPinL,200); analogWrite(speedPinR,200); delay(t); } void go_Right(int t=0) //Turn right { digitalWrite(dir1PinL, LOW); digitalWrite(dir2PinL,HIGH); digitalWrite(dir1PinR,HIGH); digitalWrite(dir2PinR,LOW); analogWrite(speedPinL,200); analogWrite(speedPinR,200); delay(t); } void go_Back(int t=0) //Reverse { digitalWrite(dir1PinL, LOW); digitalWrite(dir2PinL,HIGH); digitalWrite(dir1PinR,LOW); digitalWrite(dir2PinR,HIGH); analogWrite(speedPinL,255); analogWrite(speedPinR,255); delay(t); } void stop_Stop() //Stop { digitalWrite(dir1PinL, LOW); digitalWrite(dir2PinL,LOW); digitalWrite(dir1PinR,LOW); digitalWrite(dir2PinR,LOW); } /**************detect IR code***************/ void do_IR_Tick() { if(IR.decode(&IRresults)) { if(IRresults.value==IR_ADVANCE) { Drive_Num=GO_ADVANCE; } else if(IRresults.value==IR_RIGHT) { Drive_Num=GO_RIGHT; } else if(IRresults.value==IR_LEFT) { Drive_Num=GO_LEFT; } else if(IRresults.value==IR_BACK) { Drive_Num=GO_BACK; } else if(IRresults.value==IR_STOP) { Drive_Num=STOP_STOP; } IRresults.value = 0; IR.resume(); } } /**************car control**************/ void do_Drive_Tick() { switch (Drive_Num) { case GO_ADVANCE:go_Advance();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_ADVANCE code is detected, then go advance case GO_LEFT: go_Left();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_LEFT code is detected, then turn left case GO_RIGHT: go_Right();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_RIGHT code is detected, then turn right case GO_BACK: go_Back();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//if GO_BACK code is detected, then backward case STOP_STOP: stop_Stop();JogTime = 0;break;//stop default:break; } Drive_Num=DEF; //keep current moving mode for 200 millis seconds if(millis()-JogTime>=200) { JogTime=millis(); if(JogFlag == true) { stopFlag = false; if(JogTimeCnt <= 0) { JogFlag = false; stopFlag = true; } JogTimeCnt--; } if(stopFlag == true) { JogTimeCnt=0; stop_Stop(); } } } void setup() { pinMode(dir1PinL, OUTPUT); pinMode(dir2PinL, OUTPUT); pinMode(speedPinL, OUTPUT); pinMode(dir1PinR, OUTPUT); pinMode(dir2PinR, OUTPUT); pinMode(speedPinR, OUTPUT); stop_Stop(); pinMode(IR_PIN, INPUT); digitalWrite(IR_PIN, HIGH); IR.enableIRIn(); } void loop() { do_IR_Tick(); do_Drive_Tick(); }