A bluetooth controlled RC car with automatic braking and automatic headlights

Dependencies:   HC_SR04_Ultrasonic_Library Motor mbed-rtos mbed

main.cpp

Committer:
pmarathe25
Date:
2017-12-13
Revision:
0:f1fab1a647f6

File content as of revision 0:f1fab1a647f6:

#include "mbed.h"
#include "rtos.h"
#include "Motor.h"
#include "ultrasonic.h"

Thread distance, headlightT;
Mutex motorSpeeds;

// DEBUG
Serial pc(USBTX, USBRX);
PwmOut led(LED1);
PwmOut led3(LED2);

PwmOut headlights(p24);

// Light sensor
AnalogIn photocell(p15);

// Bluetooth
Serial blue(p28, p27);
// Motors
Motor leftMotor(p22, p8, p9); // pwm, fwd, rev
Motor rightMotor(p21, p10, p11); // pwm, fwd, rev
 
// Motor controls
float leftMotorForwardMax = 1.0f, rightMotorForwardMax = 1.0f, 
    leftMotorBackwardMax = 1.0f, rightMotorBackwardMax = 1.0f,
    leftMotorCurrentSpeed = 0.0f, rightMotorCurrentSpeed = 0.0f,
    leftCompensationScale = 0.85f, rightCompensationScale = 1.0f;
const float MAX_BRAKING_DISTANCE = 800.0f;

void setMotorSpeeds(float leftScale = 1.0, float rightScale = 1.0) {
    leftScale *= leftCompensationScale;
    rightScale *= rightCompensationScale;
    leftMotorCurrentSpeed = (leftScale > 0.0) ? leftScale * leftMotorForwardMax : leftScale * leftMotorBackwardMax;
    rightMotorCurrentSpeed = (rightScale > 0.0) ? rightScale * rightMotorForwardMax : rightScale * rightMotorBackwardMax;
    //pc.printf("Setting left motor to %d\n", leftMotorCurrentSpeed);
}

void updateMotors() {
    // Set motors
    leftMotor.speed((leftMotorCurrentSpeed > leftMotorForwardMax) ? leftMotorForwardMax : leftMotorCurrentSpeed);
    rightMotor.speed((rightMotorCurrentSpeed > rightMotorForwardMax) ? rightMotorForwardMax : rightMotorCurrentSpeed);
    //pc.printf("Pushing %d to left motor\n", leftMotorCurrentSpeed);
}

void setForwardMaxSpeed(float left = 1.0, float right = 1.0) {
    leftMotorForwardMax = left;
    rightMotorForwardMax = right;
}  

void onDistanceChanged(int distance) {
    // Lock speeds before updating.
    motorSpeeds.lock();
    if (distance > MAX_BRAKING_DISTANCE) {
        // Reset motor max speeds
        setForwardMaxSpeed(1.0f, 1.0f);
        led = 1;
    } else if (distance > MAX_BRAKING_DISTANCE * 0.5){
        setForwardMaxSpeed(0.5f, 0.5f);
        led = 0.5;
    } else {
        setForwardMaxSpeed(0.0f, 0.0f);
        led = 0;
    }
    updateMotors();  
    // Unlock
    motorSpeeds.unlock();
}

ultrasonic mu(p6, p7, .1, 1, &onDistanceChanged);

void distanceThread() {
    mu.startUpdates(); // start measuring the distance
    while (true) {
        // Update sonar
        mu.checkDistance(); 
    }
}

void headlightThread() {
    while (true) {
        // Automatic Headlights
        headlights = 0.8f - photocell;
    }
}

int main() {
    distance.start(distanceThread);
    headlightT.start(headlightThread);
     // Read data
    char bnum = 0;
    while (true) {
         // Read controller input
        if (blue.getc()=='!') {
            pc.printf("Seeing bluetooth input");
            if (blue.getc()=='B') { //button data
                bnum = blue.getc(); //button number
                // Locks motor speeds
                motorSpeeds.lock();
                led3 = 0.0f;
                setMotorSpeeds(0.0f, 0.0f);
                if (bnum == '5') {
                    // Up arrow, go forward
                    setMotorSpeeds(1.0, 1.0);
                    pc.printf("Forward Arrow");
                    led3 = 1.0f;
                } 
                if (bnum == '6') {
                    // Down arrow, go backwards
                    setMotorSpeeds(-1.0, -1.0);
                    led3 = 1.0f;
                } 
                if (bnum == '7') {
                    // Left arrow, turn left
                    setMotorSpeeds(-1.0, 1.0);
                    led3 = 1.0f;
                } 
                if (bnum == '8') {
                    // Right arrow, turn right
                    setMotorSpeeds(1.0, -1.0);
                    led3 = 1.0f;
                }
                // Unlock
                motorSpeeds.unlock();
            } 
        }
        // Locks speeds before pushing to motors
        motorSpeeds.lock();
        updateMotors();
        motorSpeeds.unlock();
    }

}