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:

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

MBEDH BridgeLeft MotorRight Motor
GndGndGndGnd
+5VVMOT
+3.3VVCC
+3.3VSTBY
p21PWMA
p15AIN1
p19AIN2
p22PWMB
p18BIN1
p16BIN2
A01+
A02-
B01+
B02-

Servos

MBEDServo (Arm)Servo (Handle)
GndGnd (black)Gnd (black)
+5V+ (red)+ (red)
p23CTRL (yellow)
p24CTRL (yellow)

Bluetooth

MBEDBluetooth UART LE
GndGnd
+5V+5V
GndCTS
p27TXO
p28RXI
Committer:
boyanmirov
Date:
Mon Apr 15 03:25:34 2019 +0000
Revision:
0:57bba5ff2155
Completed Robot Controls code

Who changed what in which revision?

UserRevisionLine numberNew 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 }