You are viewing an older revision! See the latest version

Electric Longboard

Table of Contents

    Jose Mendoza, Stephanie Lashley, Olivia Robles, Edward Vear

    /media/uploads/OliviaR/bttf.gif

    /media/uploads/edwardvear/top.jpg

    /media/uploads/edwardvear/bottom.jpg

    Parts List

    • 1 FVT 120A ESC
    • 1 Turnigy Aerodrive SK3 Brushless Motor
    • 1 11.1V LiPo Battery
    • 4 AAA Batteries
    • 1 Adafruit Bluetooth Module
    • 1 Mbed
    • 1 Ulcd
    • 1 Push Button
    • 1 Hall Effect Sensor
    • 1 Sonar Module

    Import programElectric-Longboard

    Code for Longboard

    Bluetooth Motor Control Code

    #include "mbed.h"
    #include "Servo.h"
    #include "rtos.h"
    #include "ultrasonic.h"
    
    /// Objects
    DigitalIn pb(p22);
    Serial blue(p28,p27); // Bluetooh
    Servo myservo(p21); // Motor
    Serial pc(USBTX,USBRX); // PC
    Thread t1;
    Thread t2;
    Thread t3;
    
    Mutex off;
    bool close=false;
    
    void bluetooth()
    {
        char bnum = 0;
        myservo=0.5;
        Thread::wait(2000);
        while(1) {
    
            Thread::wait(50);
            if (blue.getc() == '!') {
                if (blue.getc()=='B') {
                    bnum = blue.getc();
                    pc.printf("%s",bnum);
                    // Up Arrow
    
                    if ((bnum == '5') && (myservo <= 1.0)) {
                        myservo = myservo + 0.05;
                        pc.printf("\n Servo up\n ");
    
                    }
    
                    // Down Arrow
                    else if ((bnum == '6') && (myservo >= 0.54)) {
                        myservo = myservo - 0.05;
                        pc.printf("\n Servo down\n ");
                    }
    
                    // Left Arrow
    
                    else if (bnum == '7') {
                        pc.printf("\n brake \n ");
    
                        while (myservo > 0.0) {
                             if (myservo < 0.05)
                                 myservo = 0.0;
                             else
                                 myservo = myservo - 0.005; // Brake
                                  pc.printf("brekae");
                         }  
    
                    }
    
                    // Right Arrow
    
                    else if (bnum == '8') {
                        //servo.lock();
                        myservo = 0.5; // Neutral
                        pc.printf("\n neutral");
    
    
                    }
                }
            }
        }
    
    
    }// ends bluetooh
    
    
    
    void dist(int distance)
    {
        //put code here to execute when the distance has changed
        pc.printf("Distance %d mm\r\n", distance);
        if(distance<400) {
            close=true;
    
        }
    }
    
    ultrasonic mu(p6, p7, .1, 1, &dist);
    
    void stop()
    {
    
    
     while (myservo > 0.0) {
                             if (myservo < 0.05)
                                 myservo = 0.0;
                             else
                                 myservo = myservo - 0.008; // Brake
                                  pc.printf("brake");
                         }  
    
    
    
    
    
    }//ends stop
    
    int main()
    {
        pb.mode(PullUp);
        pc.printf("Program Begins ");
        myservo = 0.0;
        wait(0.5); //detects signal
    //Required ESC Calibration/Arming sequence
    //sends longest and shortest PWM pulse to learn and arm at power on
        myservo = 1.0; //send longest PWM
        wait(8);
        myservo = 0.0; //send shortest PWM
        wait(8);
    //ESC now operational using standard servo PWM signals
        pc.printf("Before");
    
    
        pc.printf("\n SETUP \n ");
    
        t1.start(bluetooth);
    
        mu.startUpdates();
    
        while (true) {
    
            if(close) {
                pc.printf("\n Thread released \n ");
                t2.start(stop);
                Thread::wait(1000);
                close=false;
            }
    
            mu.checkDistance();
    
        }//ends While
    
    }// ends Main
    

    Display Code

    #include "mbed.h"
    #include "uLCD_4DGL.h"
    #include "rtos.h"
     
    Serial pc(USBTX, USBRX); 
    Ticker t;
    InterruptIn risingEdge(p8); //halleffect sensor
    uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
    AnalogIn batt(p19);
    
     
    volatile int count = 0.0;
    volatile float vel = 0.0;
    float pbatt = 0.0;
     
    void pulses() //hall effect triggers
    {
        count++;
    }
    void halleffect() //calculates velocity
    {
        float temp = count;
        count = 0;
        temp = temp/4; // four magnets in trigger - gives rps
        vel = temp * 3.14159 * 0.035 * 2 *60 * 60 * 0.000621371 ; // radius of .035m  
    }
    
    void display(void const *argument) //update battery voltage display and velocity
    {
        while(1)
        {
        float battAdj = float(batt * 3.3 * 3.968);
        uLCD.color(WHITE);
        uLCD.locate(2,2);
        uLCD.printf("%3.1f", vel*0.67);
        uLCD.locate(2,3);
        uLCD.printf("MPH");
        //if (battAdj == pbatt) break;
        if (battAdj >= 11) {
            uLCD.filled_rectangle(6,99,29,16,GREEN);
            pbatt = battAdj;
        }
        else if ((battAdj >= 9)&&(battAdj < 11)) {
            uLCD.filled_rectangle(6,99,29,16,WHITE);
            uLCD.filled_rectangle(6,99,29,45,(GREEN+RED));
            pbatt = battAdj;
        }
        else if (battAdj < 9) {
            uLCD.filled_rectangle(6,99,29,16,WHITE);
            uLCD.filled_rectangle(6,99,29,70,RED);
            pbatt = battAdj;
        }    
        Thread::wait(1000);
        }
    
    }
     
    int main() 
    {
        uLCD.cls();
        uLCD.baudrate(3000000); //jack up baud rate to max
        uLCD.background_color(BLACK);
        uLCD.cls();
        uLCD.text_width(3.5); 
        uLCD.text_height(3.5);
        uLCD.filled_rectangle(5,100,30,15,WHITE);
        uLCD.filled_rectangle(12,15,22,10,WHITE);
        risingEdge.rise(&pulses); //interrupt routine
        t.attach(&halleffect, 1.0); //calculate velocity every second
        Thread displaythread(display); //update display
        while(1) {
        
        }
    }
    

    All wikipages