Control a robot with two motors and two servos to pick up ping pong balls via bluetooth
Dependencies: mbed Servo 4DGL-uLCD-SE Motor
Ping Pong Scorer
This project's purpose is to create the machinery and controls necessary to make a robot pick up and deposit ping pong balls as part of the Ping Pong Collection Game.
Project Members
This project was a product of the following members:
- Christina Lee
- Boyan Mirov
- Sai A. Narray
- Alex Rao
For ECE 4180 at Georgia Tech
Linked Project
This project was created in tandem with the Object Counter. While it is certainly viable on its own, it's primary purpose is only served when using both programs on separate MBEDs.
Demonstration
Here is a video of the robot interacting with the Object Counter
Installation
To create this, you'll need the following parts:
- LPC1768 MBED
- 2x Motor
- Servo
- Sub-Micro Servo
- Robot Construction Set
- 2x Power Adapters
- Dual H Bridge Inverter
- Bluetooth LE UART friend
Power Coupling
Because of the way servos and motors interact with the power received, connecting them both to the same circuit can cause undefined (and often unexpected) behavior. As such, it is recommended to ensure that they are always on separate systems. In other words, we recommend connecting the servos to a secondary power supply, different from the supply for the motors.
This guide follows this recommendation
Motors
MBED | H Bridge | Left Motor | Right Motor |
---|---|---|---|
Gnd | Gnd | Gnd | Gnd |
+5V | VMOT | ||
+3.3V | VCC | ||
+3.3V | STBY | ||
p21 | PWMA | ||
p15 | AIN1 | ||
p19 | AIN2 | ||
p22 | PWMB | ||
p18 | BIN1 | ||
p16 | BIN2 | ||
A01 | + | ||
A02 | - | ||
B01 | + | ||
B02 | - |
Servos
MBED | Servo (Arm) | Servo (Handle) |
---|---|---|
Gnd | Gnd (black) | Gnd (black) |
+5V | + (red) | + (red) |
p23 | CTRL (yellow) | |
p24 | CTRL (yellow) |
Bluetooth
MBED | Bluetooth UART LE |
---|---|
Gnd | Gnd |
+5V | +5V |
Gnd | CTS |
p27 | TXO |
p28 | RXI |
main.cpp@0:57bba5ff2155, 2019-04-15 (annotated)
- Committer:
- boyanmirov
- Date:
- Mon Apr 15 03:25:34 2019 +0000
- Revision:
- 0:57bba5ff2155
Completed Robot Controls code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
boyanmirov | 0:57bba5ff2155 | 1 | // Sweep the motor speed from full-speed reverse (-1.0) to full speed forwards (1.0) |
boyanmirov | 0:57bba5ff2155 | 2 | |
boyanmirov | 0:57bba5ff2155 | 3 | #include "mbed.h" |
boyanmirov | 0:57bba5ff2155 | 4 | #include "Motor.h" |
boyanmirov | 0:57bba5ff2155 | 5 | #include "uLCD_4DGL.h" |
boyanmirov | 0:57bba5ff2155 | 6 | #include "Servo.h" |
boyanmirov | 0:57bba5ff2155 | 7 | |
boyanmirov | 0:57bba5ff2155 | 8 | Serial blue(p28,p27); |
boyanmirov | 0:57bba5ff2155 | 9 | BusOut myled(LED1,LED2,LED3,LED4); |
boyanmirov | 0:57bba5ff2155 | 10 | |
boyanmirov | 0:57bba5ff2155 | 11 | Motor left(p21, p15, p19); // pwm, fwd, rev |
boyanmirov | 0:57bba5ff2155 | 12 | Motor right(p22, p18, p16); |
boyanmirov | 0:57bba5ff2155 | 13 | Servo arm(p23); |
boyanmirov | 0:57bba5ff2155 | 14 | Servo handle(p24); |
boyanmirov | 0:57bba5ff2155 | 15 | |
boyanmirov | 0:57bba5ff2155 | 16 | union f_or_char { |
boyanmirov | 0:57bba5ff2155 | 17 | float f; |
boyanmirov | 0:57bba5ff2155 | 18 | char c[4]; |
boyanmirov | 0:57bba5ff2155 | 19 | }; |
boyanmirov | 0:57bba5ff2155 | 20 | |
boyanmirov | 0:57bba5ff2155 | 21 | int main() |
boyanmirov | 0:57bba5ff2155 | 22 | { |
boyanmirov | 0:57bba5ff2155 | 23 | char bchecksum=0; |
boyanmirov | 0:57bba5ff2155 | 24 | char temp=0; |
boyanmirov | 0:57bba5ff2155 | 25 | union f_or_char x,y,z; |
boyanmirov | 0:57bba5ff2155 | 26 | char bnum=0; |
boyanmirov | 0:57bba5ff2155 | 27 | char bhit=0; |
boyanmirov | 0:57bba5ff2155 | 28 | arm = 0.9; |
boyanmirov | 0:57bba5ff2155 | 29 | handle = 0.9; |
boyanmirov | 0:57bba5ff2155 | 30 | |
boyanmirov | 0:57bba5ff2155 | 31 | while(1) { |
boyanmirov | 0:57bba5ff2155 | 32 | if (blue.readable()) { |
boyanmirov | 0:57bba5ff2155 | 33 | if (blue.getc()=='!') { |
boyanmirov | 0:57bba5ff2155 | 34 | if (blue.getc()=='B') { //button data packet |
boyanmirov | 0:57bba5ff2155 | 35 | bnum = blue.getc(); //button number |
boyanmirov | 0:57bba5ff2155 | 36 | bhit = blue.getc(); //1=hit, 0=release |
boyanmirov | 0:57bba5ff2155 | 37 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
boyanmirov | 0:57bba5ff2155 | 38 | switch (bnum) { |
boyanmirov | 0:57bba5ff2155 | 39 | case '1': //number button 1: |
boyanmirov | 0:57bba5ff2155 | 40 | if (bhit=='1') |
boyanmirov | 0:57bba5ff2155 | 41 | arm = arm + 0.05; |
boyanmirov | 0:57bba5ff2155 | 42 | break; |
boyanmirov | 0:57bba5ff2155 | 43 | case '2': //number button 2 |
boyanmirov | 0:57bba5ff2155 | 44 | if (bhit=='1') |
boyanmirov | 0:57bba5ff2155 | 45 | handle = handle + 0.1; |
boyanmirov | 0:57bba5ff2155 | 46 | break; |
boyanmirov | 0:57bba5ff2155 | 47 | case '3': //number button 3 |
boyanmirov | 0:57bba5ff2155 | 48 | if (bhit=='1') |
boyanmirov | 0:57bba5ff2155 | 49 | { |
boyanmirov | 0:57bba5ff2155 | 50 | if (arm.read() <= 0.5) |
boyanmirov | 0:57bba5ff2155 | 51 | arm = arm; |
boyanmirov | 0:57bba5ff2155 | 52 | else |
boyanmirov | 0:57bba5ff2155 | 53 | arm = arm - 0.05; |
boyanmirov | 0:57bba5ff2155 | 54 | } |
boyanmirov | 0:57bba5ff2155 | 55 | break; |
boyanmirov | 0:57bba5ff2155 | 56 | case '4': //number button 4 |
boyanmirov | 0:57bba5ff2155 | 57 | if (bhit=='1') |
boyanmirov | 0:57bba5ff2155 | 58 | { |
boyanmirov | 0:57bba5ff2155 | 59 | if (handle.read() <= 0.5 & arm.read() <= 0.5) |
boyanmirov | 0:57bba5ff2155 | 60 | handle = handle; |
boyanmirov | 0:57bba5ff2155 | 61 | else |
boyanmirov | 0:57bba5ff2155 | 62 | handle = handle - 0.1; |
boyanmirov | 0:57bba5ff2155 | 63 | //printf("position = %.1f\n", handle.read()); |
boyanmirov | 0:57bba5ff2155 | 64 | } |
boyanmirov | 0:57bba5ff2155 | 65 | break; |
boyanmirov | 0:57bba5ff2155 | 66 | case '5': //button 5 up arrow |
boyanmirov | 0:57bba5ff2155 | 67 | if (bhit=='1') { |
boyanmirov | 0:57bba5ff2155 | 68 | left.speed(-1.0); |
boyanmirov | 0:57bba5ff2155 | 69 | right.speed(-1.0); |
boyanmirov | 0:57bba5ff2155 | 70 | } else { |
boyanmirov | 0:57bba5ff2155 | 71 | left.speed(0); |
boyanmirov | 0:57bba5ff2155 | 72 | right.speed(0); |
boyanmirov | 0:57bba5ff2155 | 73 | } |
boyanmirov | 0:57bba5ff2155 | 74 | break; |
boyanmirov | 0:57bba5ff2155 | 75 | case '6': //button 6 down arrow |
boyanmirov | 0:57bba5ff2155 | 76 | if (bhit=='1') { |
boyanmirov | 0:57bba5ff2155 | 77 | left.speed(1.0); |
boyanmirov | 0:57bba5ff2155 | 78 | right.speed(1.0); |
boyanmirov | 0:57bba5ff2155 | 79 | } |
boyanmirov | 0:57bba5ff2155 | 80 | else { |
boyanmirov | 0:57bba5ff2155 | 81 | left.speed(0); |
boyanmirov | 0:57bba5ff2155 | 82 | right.speed(0); |
boyanmirov | 0:57bba5ff2155 | 83 | } |
boyanmirov | 0:57bba5ff2155 | 84 | break; |
boyanmirov | 0:57bba5ff2155 | 85 | case '7': //button 7 left arrow |
boyanmirov | 0:57bba5ff2155 | 86 | if (bhit=='1') { |
boyanmirov | 0:57bba5ff2155 | 87 | left.speed(-1.0); |
boyanmirov | 0:57bba5ff2155 | 88 | right.speed(1.0); |
boyanmirov | 0:57bba5ff2155 | 89 | } |
boyanmirov | 0:57bba5ff2155 | 90 | else { |
boyanmirov | 0:57bba5ff2155 | 91 | left.speed(0); |
boyanmirov | 0:57bba5ff2155 | 92 | right.speed(0); |
boyanmirov | 0:57bba5ff2155 | 93 | } |
boyanmirov | 0:57bba5ff2155 | 94 | break; |
boyanmirov | 0:57bba5ff2155 | 95 | case '8': //button 8 right arrow |
boyanmirov | 0:57bba5ff2155 | 96 | if (bhit=='1') { |
boyanmirov | 0:57bba5ff2155 | 97 | left.speed(1.0); |
boyanmirov | 0:57bba5ff2155 | 98 | right.speed(-1.0); |
boyanmirov | 0:57bba5ff2155 | 99 | } |
boyanmirov | 0:57bba5ff2155 | 100 | else { |
boyanmirov | 0:57bba5ff2155 | 101 | left.speed(0); |
boyanmirov | 0:57bba5ff2155 | 102 | right.speed(0); |
boyanmirov | 0:57bba5ff2155 | 103 | } |
boyanmirov | 0:57bba5ff2155 | 104 | break; |
boyanmirov | 0:57bba5ff2155 | 105 | } |
boyanmirov | 0:57bba5ff2155 | 106 | } |
boyanmirov | 0:57bba5ff2155 | 107 | } |
boyanmirov | 0:57bba5ff2155 | 108 | } |
boyanmirov | 0:57bba5ff2155 | 109 | } // end readable |
boyanmirov | 0:57bba5ff2155 | 110 | } |
boyanmirov | 0:57bba5ff2155 | 111 | } |