4180


Jose Mendoza, Stephanie Lashley, Olivia Robles, Edward Vear

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
    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();
                    // Up Arrow
    
                    if ((bnum == '5') && (myservo <= 1.0)) {
                        myservo = myservo + 0.05;
      
                    }
    
                    // Down Arrow
                    else if ((bnum == '6') && (myservo >= 0.54)) {
                        myservo = myservo - 0.05;
                    }
    
                    // Left Arrow
    
                    else if (bnum == '7') {
    
                        while (myservo > 0.0) {
                             if (myservo < 0.05)
                                 myservo = 0.0;
                             else
                                 myservo = myservo - 0.005; // Brake
                               
                         }  
    
                    }
    
                    // Right Arrow
    
                    else if (bnum == '8') {
                        //servo.lock();
                        myservo = 0.5; // 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
                         }  
    
    }//ends stop
    
    int main()
    {
        pb.mode(PullUp);
        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
    
        t1.start(bluetooth);
        mu.startUpdates();
    
        while (true) {
    
            if(close) {
                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"
     
    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;   // Copy count
        count = 0;                 // Reset the count for next second
        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);   // Refresh after one second
        }
    
    }
     
    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