/* * This code created by David Schroeder on April 29th 2019 * For instructable Bluetooth RC Car * https://www.instructables.com/id/Bluetooth-RC-Car-2/ */ int enablePin = 11; //goes to pin 1 on L293D int in1Pin = 10; //goes to pin 2 on L293D int in2Pin = 9; //goes to pin 7 on L293D int enablePin2 = 6; //goes to pin 16 on L293D int in3Pin = 5; //goes to pin 15 on L293D int in4Pin = 3; //goes to pin 10 on L293D int speed = 0; int speed2 = 0; int state = 0; boolean reverse = true; //////////// For Keuwl App int update_interval=100; // time interval in ms for updating panel indicators unsigned long last_time=0; // time of last update char data_in; // data received from serial link void setup() { pinMode(in1Pin, OUTPUT); // setting all L293D pins as outputs pinMode(in2Pin, OUTPUT); pinMode(in3Pin, OUTPUT); pinMode(in4Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(enablePin2, OUTPUT); Serial.begin(9600); ///////////// Build panel in app Serial.println("*.kwl"); Serial.println("clear_panel()"); Serial.println("set_grid_size(15,9)"); Serial.println("add_text(11,2,xlarge,C,Left/Right,245,240,245,)"); Serial.println("add_text(12,8,xlarge,L,Full Stop,245,240,245,)"); Serial.println("add_text(2,2,xlarge,L,Forward,245,240,245,)"); Serial.println("add_text(2,8,xlarge,L,Reverse,245,240,245,)"); Serial.println("add_button(2,3,29,1,0)"); Serial.println("add_button(12,6,27,2,)"); Serial.println("add_button(9,3,25,7,4)"); Serial.println("add_button(12,3,25,6,3)"); Serial.println("add_button(2,6,30,9,8)"); Serial.println("set_panel_notes(,,,)"); Serial.println("run()"); Serial.println("*"); } void loop() { if(Serial.available() > 0){ // microcontroller looking for messages from bluetooth int state = 0; // erasing any previous message state = Serial.read(); // Saving new message Serial.println(state); if (state == 48) { speed = 0; setMotor(speed, reverse); // When forward button released, both motors turn off setMotor2(speed, reverse); } if (state == 49) { speed = 255; setMotor(speed, reverse); // When forward button pressed, both motors turned on setMotor2(speed, reverse); } if (state == 50) { speed = 0; setMotor(speed, reverse); // For Full Stop button in case a stop command is not read setMotor2(speed, reverse); } if (state == 54) { setMotor(255, reverse); // For turning right, turns off right motor and turns on left motor setMotor2(0, reverse); } if (state == 51) { setMotor(speed, reverse); // Resets motor speeds to any previous value once turn button is released setMotor2(speed, reverse); } if (state == 55) { setMotor(0, reverse); // For turning left, turns off left motor and turns on right motor setMotor2(255, reverse); } if (state == 52) { setMotor(speed, reverse); // Resets motor speeds to any previous value once turn button is released setMotor2(speed, reverse); } if (state == 56) { reverse = true; // Once reverse is released, motors turn off and switched back to forward direction setMotor(0, reverse); setMotor2(0, reverse); } if (state == 57) { reverse = false; // If reverse button pressed, motors turn on and switch direction setMotor(255, reverse); setMotor2(255, reverse); } if (state == '-1') { // Used to eliminate erroneous charasters } ///////////// Send Data to Android device unsigned long t=millis(); if ((t-last_time)>update_interval){ last_time=t; } } } void setMotor(int speed, boolean reverse) // Left Motor commands { analogWrite(enablePin, speed); // sets enable pin to desired PWM digitalWrite(in1Pin, ! reverse); // Used for direction by setting to low digitalWrite(in2Pin, reverse); // Used for direction by setting to high } void setMotor2(int speed, boolean reverse) // Right Motor commands { analogWrite(enablePin2, speed); // sets enable pin to desired PWM digitalWrite(in3Pin, ! reverse); // Used for direction by setting to low digitalWrite(in4Pin, reverse); // Used for direction by setting to high }