Electric Longboard
Jose Mendoza, Stephanie Lashley, Olivia Robles, Edward Vear
Description¶
This mbed project utilizes bluetooth to control an electric skateboard with an ESC and motor. A uLCD mounted on top of the board displays battery level and velocity in miles per hour using a hall effect sensor. A sonar on the front of the board prevents collisions. A pushbutton on top of the board is pressed by a rider's foot and the board stops if the rider falls off or steps off of the kill switch.
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 LPC1768
- 1 uLCD
- 1 Push Button
- 1 Hall Effect Sensor
- 1 magnet with four pole pairs
- 1 Sonar Module
Schematic¶
Code¶
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 ultrasonic mu(p6, p7, .1, 1, &dist); //Sonar Thread t1; Thread t2; 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') { myservo = 0.5; // Neutral } } } } }// ends bluetooh void dist(int distance) { //put code here to execute when the distance has changed if(distance<400) { close=true; } } 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 >= 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 }
Photos¶
Top View of the Board Underside of the Board
Demo Videos¶
Overall Demo
Sonar Demo