Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Motor Servo mbed
Revision 0:8eae572f6d20, committed 2016-03-11
- Comitter:
- raj1995
- Date:
- Fri Mar 11 18:59:21 2016 +0000
- Commit message:
- Final version of lab4.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Motor.lib Fri Mar 11 18:59:21 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/simon/code/Motor/#f265e441bcd9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Servo.lib Fri Mar 11 18:59:21 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/simon/code/Servo/#36b69a7ced07
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Mar 11 18:59:21 2016 +0000
@@ -0,0 +1,264 @@
+/*
+
+@Authors: Raj Patel, David Ehrlich
+@Project: Bluetooth Controlled Robot with Dual Servo Sensor Actuated by Mobile Phone Accelerometer
+@Date: 03/09/2016
+
+*/
+
+//include necessary header files for functionality. Specifically, need servo handlers.
+
+#include "mbed.h"
+#include "Servo.h"
+
+Serial bluemod(p9,p10); // Serial hookup for Bluetooth module
+PwmOut left_led(LED3); // PWM output for left robot direction signal
+PwmOut right_led(LED4); // PWM output for right robot direction signal
+PwmOut forward_led(LED1); // PWM output for forward robot direction signal
+PwmOut reverse_led(LED2); // PWM output for reverse robot direction signal
+Servo myservolr(p21); // Signal for left/right servo
+Servo myservoud(p22); // Signal for up/down servo
+AnalogIn sensor(p15); // Signal for Sharp IR Sensor
+
+ PwmOut speedA(p23); // PWM Speed pin for Motor A
+ DigitalOut fwdA(p17); // Digital out signal for forward direction for Motor A
+ DigitalOut revA(p18); // Digital out signal for reverse direction for Motor A
+
+ PwmOut speedB(p24); // PWM Speed pin for Motor B
+ DigitalOut fwdB(p20); // Digital out signal for forward direction for Motor B
+ DigitalOut revB(p19); // Digital out signal for reverse direction for Motor B
+
+
+ volatile char exc; // Variable to keep track of ! when seen in BT stream
+ volatile char letter; // Varibale to keep track of character after ! in BT stream (A for accelerometer, B for buttons)
+
+//C union can convert 4 chars to a float - puts them in same location in memory
+//trick to pack the 4 bytes from Bluetooth serial port back into a 32-bit float
+union f_or_char {
+ float f;
+ char c[4];
+};
+
+int main()
+{
+ char bchecksum=0; // Checksum variable
+ char temp=0; // Temporary variable to hold BT stream data
+ union f_or_char x,y,z; // Templatized containers for x, y, and z accelerometer readings
+ float adjlr = 0; // Servo position variable for left/right servo
+ float adjud = 0; // Servo position variable for up/down servo
+ while(1) {
+ float sensorValue = sensor.read();
+ //printf("Sensor: %2.2f\n\r", sensorValue);
+ bchecksum=0;
+ exc = bluemod.getc(); // Get the first character in the bluetooth packet
+ if (exc=='!'){ // First character was ! meaning it could be !A or !B
+ letter = bluemod.getc(); // Get the next character in the bluetooth packet after the !
+ switch (letter) {
+ case 'A':{ // If the next character is A, it is an Accelerometer data packet
+ for (int i=0; i<4; i++) {
+ temp = bluemod.getc();
+ x.c[i] = temp; // Get x direction Accelerometer data
+ bchecksum = bchecksum + temp;
+ }
+ for (int i=0; i<4; i++) {
+ temp = bluemod.getc();
+ y.c[i] = temp; // Get y direction Accelerometer data
+ bchecksum = bchecksum + temp;
+ }
+ for (int i=0; i<4; i++) {
+ temp = bluemod.getc();
+ z.c[i] = temp; // Get z direction Accelerometer data
+ bchecksum = bchecksum + temp;
+ }
+ if (bluemod.getc()==char(~('!' + 'A' + bchecksum))) { //checksum OK? Then proceed.
+
+ // Both segments of the below code in this 'if' statement handle actuating the dual servo setup
+
+ // Below code segment handles left/right movement
+ if (y.f < -0.05 && y.f >= -0.10){
+ adjlr += 0.01; // If the y direction shows a small negative value, move left slowly
+ }
+ if (y.f < -0.10 && y.f >= -0.25){
+ adjlr += 0.05; // If the y direction shows a medium negative value, move left faster
+ }
+ if (y.f < -0.25){
+ adjlr += 0.09; // If the y direction shows a large negative value, move left fastest
+ }
+ if (y.f > 0.05 && y.f <= 0.10){
+ adjlr += -0.01; // If the y direction shows a small positive value, move right slowly
+ }
+ if (y.f > 0.10 && y.f <= 0.25){
+ adjlr += -0.05; // If the y direction shows a medium positive value, move right faster
+ }
+ if (y.f > 0.25){
+ adjlr += -0.09; // If the y direction shows a large positive value, move right fastest
+ }
+ if (adjlr < 0){
+ adjlr = 0; // If the value becomes less than 0, cap at 0
+ }else{
+ if (adjlr > 1){
+ adjlr = 1; // If the value becomes greater than 1, cap at 1
+ }
+ }
+
+ // Below code handles up/down movement
+ if (x.f < -0.05 && x.f >= -0.2){
+ adjud += -0.01; // If the x direction shows a small negative value, move up slowly
+ }
+ if (x.f < -0.2 && x.f >= -0.40){
+ adjud += -0.05; // If the x direction shows a medium negative value, move up faster
+ }
+ if (x.f < -0.4){
+ adjud += -0.09; // If the x direction shows a large negative value, move up fastest
+ }
+ if (x.f > 0.05 && x.f <= 0.2){
+ adjud += 0.01; // If the x direction shows a small positive value, move down slowly
+ }
+ if (x.f > 0.2 && x.f <= 0.40){
+ adjud += 0.05; // If the x direction shows a medium positive value, move down faster
+ }
+ if (x.f > 0.40){
+ adjud += 0.09; // If the x direction shows a large positive value, move down fastest
+ }
+ if (adjud < 0){
+ adjud = 0; // If the value becomes less than 0, cap at 0
+ }else{
+ if (adjud > 1){
+ adjud = 1; // If the value becomes greater than 1, cap at 1
+ }
+ }
+
+ myservolr = adjlr; // Send adjusted left/right signal to left/right servo
+ myservoud = adjud; // Send adjusted up/down signal to up/down servo
+
+
+ }
+ break;
+ }
+ char bnum; //Initialize variables to use below
+ char bhit; //Initialize variables to use below
+
+ case 'B':{ // If the next character is B, it is a Button data packet
+
+ bnum = bluemod.getc(); //button number
+ bhit = bluemod.getc(); //1=hit, 0=release
+ if (bluemod.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
+ //myled = bnum - '0'; //current button number will appear on LEDs
+ switch (bnum) {
+ case '1': //number button 1
+ if (bhit=='1') {
+ // nop
+ } else {
+ // nop
+ }
+ break;
+ case '2': //number button 2
+ if (bhit=='1') {
+ // nop
+ } else {
+ // nop
+ }
+ break;
+ case '3': //number button 3
+ if (bhit=='1') {
+ // nop
+ } else {
+ // nop
+ }
+ break;
+ case '4': //number button 4
+ if (bhit=='1') {
+ // nop
+ } else {
+ // nop
+ }
+ break;
+ case '5': //button 5 up arrow
+ if (bhit=='1' && sensorValue <= 0.6) {
+ //forward
+ //hit button
+ forward_led=1; //Set forward LED on MBED
+ fwdA = 1; //Assert MotorA forward
+ revA = 0; //Deassert MotorA reverse
+ speedA = 1; //Set SpeedA to full
+ fwdB = 1; //Assert MotorB forward
+ revB = 0; //Deassert MotorB reverse
+ speedB = 1; //Set SpeedB to full
+ } else {
+ //Let go of button
+ forward_led = 0; //Turn off forward LED
+ speedA = 0; // Turn off MotorA
+ speedB = 0; // Turn off MotorB
+ }
+ break;
+ case '6': //button 6 down arrow
+ if (bhit=='1') {
+ //reverse
+ //hit button
+ reverse_led=1; //Turn reverse LED on
+ fwdA = 0; //Deassert MotorA forward
+ revA = 1; //Assert MotorA reverse
+ speedA = 1; //MotorA full speed
+ fwdB = 0; //Deassert MotorB forward
+ revB = 1; //Assert MotorB reverse
+ speedB = 1; //MotorB full speed
+
+
+ } else {
+ //let go of button
+ reverse_led=0; //Turn reverse LED off
+ speedA = 0; //Turn off MotorA
+ speedB = 0; //Turn off MotorB
+ }
+ break;
+ case '7': //button 7 left arrow
+ if (bhit=='1') {
+ //ccw
+ //hit button
+ left_led=1; //Turn left LED on
+ fwdA = 1; //Assert MotorA forward
+ revA = 0; //Deassert MotorA reverse
+ speedA = 1; //MotorA full speed
+ fwdB = 0; //Deassert MotorB forward
+ revB = 1; //Assert MotorB reverse
+ speedB = 1; //MotorB full speed
+
+
+ } else {
+ //let go of button
+ left_led=0; //Turn left LED off
+ speedA = 0; // Turn MotorA off
+ speedB = 0; // Turn MotorB off
+ }
+ break;
+ case '8': //button 8 right arrow
+ if (bhit=='1') {
+ //cw
+ //hit button
+ right_led=1; //Turn right LED on
+ fwdA = 0; //Deassert MotorA forward
+ revA = 1; //Assert MotorA reverse
+ speedA = 1; //MotorA full speed
+ fwdB = 1; //Assert MotorB forward
+ revB = 0; //Deassert MotorB reverse
+ speedB = 1; //MotorB full speed
+
+ } else {
+ //let go of button
+ right_led=0; //Turn right LED off
+ speedA = 0; //Turn MotorA off
+ speedB = 0; //Turn MotorB off
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ }
+
+ }
+
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Mar 11 18:59:21 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/87f2f5183dfb \ No newline at end of file