Dependencies: mbed Motor mbed-rtos
Useless Robot
Useless Robot Overview
Project by Austin Bartmess and Jeremy Deremer
This is a robot developed on an ARM Microcontroller (LPC 1768). It uses a servo, two DC motors both powered by an external power source, nine red LEDs, two RBG LEDs, a speaker, a toggle switch and a transistor.
The goal of this robot is to stay off. However, the user can turn it on without harm. It attempts to stay off via turning a toggle switch off with an arm attached to a servo. If the robot is turned on too much, it will progressively get angry. It starts by not smiling and changing eye colors. Following that, the robot will frown and yell at the user. Finally, the robot will drive around randomly while screaming and looking angry via its LEDs.
Required Parts
- mbed Microcontroller x1
- USB to mini USB cable x1
- Servo x1
- H-Bridge Breakout Board x1
- DC Motors x2
- DC Motor Wheels x4
- Red LEDs x9
- RGB LEDs x2
- 0.5W Speaker x1
- Toggle Switch x1
- BJTransistor x1
- Jumper Cables Kit x1
- Breadboard x2
Pinout and Connections
Mbed | H-Bridge | DC Motors | Servo | Transistor | Speaker | LEDs | Barrel Jack | Toggle Switch |
---|---|---|---|---|---|---|---|---|
GND | GND | (-) | Emitter | (-) | GND | (-) | (-) | |
Vu | ||||||||
Vin | Vm | (+) | (+) | |||||
Vout | Vcc, /STBY | (+) | ||||||
p5 | AIN1 | |||||||
p6 | AIN2 | |||||||
p10 | LED+ | |||||||
p11 | LED+ | |||||||
p12 | LED+ | |||||||
p15 | Control | |||||||
p21 | PWMA | |||||||
p22 | Collector | |||||||
p23 | Blue | |||||||
p24 | Green | |||||||
p25 | Red | |||||||
p26 | Control | |||||||
AO1 | (+) | |||||||
AO2 | (-) |
Demo Clip
Source Code
main.cpp@1:0402db7e91f5, 2017-04-26 (annotated)
- Committer:
- arb
- Date:
- Wed Apr 26 21:14:28 2017 +0000
- Revision:
- 1:0402db7e91f5
- Parent:
- 0:4931c25e1cf7
- Child:
- 2:69a3683834c7
Added skeleton code for the threads
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jderemer3 | 0:4931c25e1cf7 | 1 | #include "mbed.h" |
jderemer3 | 0:4931c25e1cf7 | 2 | #include "rtos.h" |
jderemer3 | 0:4931c25e1cf7 | 3 | #include "RGBLed.h" |
jderemer3 | 0:4931c25e1cf7 | 4 | #include "uLCD_4DGL.h" |
jderemer3 | 0:4931c25e1cf7 | 5 | |
jderemer3 | 0:4931c25e1cf7 | 6 | DigitalOut led1(LED1); |
jderemer3 | 0:4931c25e1cf7 | 7 | DigitalOut led2(LED2); |
jderemer3 | 0:4931c25e1cf7 | 8 | DigitalOut led3(LED3); |
jderemer3 | 0:4931c25e1cf7 | 9 | DigitalOut led4(LED4); |
jderemer3 | 0:4931c25e1cf7 | 10 | |
jderemer3 | 0:4931c25e1cf7 | 11 | // RGBLed myRGBled(p21,p22,p23); //RGB PWM pins |
jderemer3 | 0:4931c25e1cf7 | 12 | |
arb | 1:0402db7e91f5 | 13 | InterruptIn Switch(p15); |
arb | 1:0402db7e91f5 | 14 | |
jderemer3 | 0:4931c25e1cf7 | 15 | PwmOut red(p21); |
jderemer3 | 0:4931c25e1cf7 | 16 | PwmOut green(p22); |
jderemer3 | 0:4931c25e1cf7 | 17 | PwmOut blue(p23); |
jderemer3 | 0:4931c25e1cf7 | 18 | |
jderemer3 | 0:4931c25e1cf7 | 19 | uLCD_4DGL uLCD(p9, p10, p11); |
jderemer3 | 0:4931c25e1cf7 | 20 | |
jderemer3 | 0:4931c25e1cf7 | 21 | Thread t1; // Arm Response |
jderemer3 | 0:4931c25e1cf7 | 22 | Thread t2; // LED Color |
jderemer3 | 0:4931c25e1cf7 | 23 | Thread t3; // Speaker Music / Audio |
jderemer3 | 0:4931c25e1cf7 | 24 | Thread t4; // Motor Control |
jderemer3 | 0:4931c25e1cf7 | 25 | |
arb | 1:0402db7e91f5 | 26 | Mutex state; |
arb | 1:0402db7e91f5 | 27 | int angerlevel; |
jderemer3 | 0:4931c25e1cf7 | 28 | |
arb | 1:0402db7e91f5 | 29 | bool pushFlag = false; |
arb | 1:0402db7e91f5 | 30 | |
arb | 1:0402db7e91f5 | 31 | void ArmThread() |
arb | 1:0402db7e91f5 | 32 | { |
arb | 1:0402db7e91f5 | 33 | //basic if switch is toggled then use arm to turn it off |
arb | 1:0402db7e91f5 | 34 | //Want to add delay depedning on anger level |
arb | 1:0402db7e91f5 | 35 | //Potentially need a queue system |
arb | 1:0402db7e91f5 | 36 | if (pushFlag) |
arb | 1:0402db7e91f5 | 37 | { |
arb | 1:0402db7e91f5 | 38 | //start servo |
arb | 1:0402db7e91f5 | 39 | state.lock(); //lock to update the anger level |
arb | 1:0402db7e91f5 | 40 | angerlevel++; |
arb | 1:0402db7e91f5 | 41 | state.unlock(); |
jderemer3 | 0:4931c25e1cf7 | 42 | } |
jderemer3 | 0:4931c25e1cf7 | 43 | } |
jderemer3 | 0:4931c25e1cf7 | 44 | |
arb | 1:0402db7e91f5 | 45 | void LEDThread() { |
arb | 1:0402db7e91f5 | 46 | state.lock(); //lock to read the angerlevel |
arb | 1:0402db7e91f5 | 47 | switch(angerlevel) |
arb | 1:0402db7e91f5 | 48 | case 1: |
arb | 1:0402db7e91f5 | 49 | state.unlock(); |
arb | 1:0402db7e91f5 | 50 | //turn on leds |
arb | 1:0402db7e91f5 | 51 | break; |
arb | 1:0402db7e91f5 | 52 | case 2: |
arb | 1:0402db7e91f5 | 53 | state.unlock(); |
arb | 1:0402db7e91f5 | 54 | //LEDS/AUDIO |
arb | 1:0402db7e91f5 | 55 | break; |
arb | 1:0402db7e91f5 | 56 | case 3: |
arb | 1:0402db7e91f5 | 57 | state.unlock(); |
arb | 1:0402db7e91f5 | 58 | //LEDS/AUDIO/motor |
arb | 1:0402db7e91f5 | 59 | break; |
arb | 1:0402db7e91f5 | 60 | default: |
arb | 1:0402db7e91f5 | 61 | state.unlock(); |
arb | 1:0402db7e91f5 | 62 | //case 0 do nothing |
arb | 1:0402db7e91f5 | 63 | break; |
arb | 1:0402db7e91f5 | 64 | state.unlock(); |
jderemer3 | 0:4931c25e1cf7 | 65 | } |
arb | 1:0402db7e91f5 | 66 | |
arb | 1:0402db7e91f5 | 67 | void AudioThread() { |
arb | 1:0402db7e91f5 | 68 | //PWM/AMP? to play audio? |
arb | 1:0402db7e91f5 | 69 | //need to get sd card & angry sounds for audio |
arb | 1:0402db7e91f5 | 70 | state.lock(); //lock to read the angerlevel |
arb | 1:0402db7e91f5 | 71 | switch(angerlevel) |
arb | 1:0402db7e91f5 | 72 | case 2: |
arb | 1:0402db7e91f5 | 73 | state.unlock(); |
arb | 1:0402db7e91f5 | 74 | //AUDIO |
arb | 1:0402db7e91f5 | 75 | break; |
arb | 1:0402db7e91f5 | 76 | case 3: |
arb | 1:0402db7e91f5 | 77 | state.unlock(); |
arb | 1:0402db7e91f5 | 78 | //AUDIO/MOTOR |
arb | 1:0402db7e91f5 | 79 | break; |
arb | 1:0402db7e91f5 | 80 | default: |
arb | 1:0402db7e91f5 | 81 | state.unlock(); |
arb | 1:0402db7e91f5 | 82 | //Nothing to do here |
arb | 1:0402db7e91f5 | 83 | break; |
arb | 1:0402db7e91f5 | 84 | state.unlock(); |
arb | 1:0402db7e91f5 | 85 | } |
arb | 1:0402db7e91f5 | 86 | |
arb | 1:0402db7e91f5 | 87 | void WheelsThread() { |
arb | 1:0402db7e91f5 | 88 | //Drive around randomly |
arb | 1:0402db7e91f5 | 89 | state.lock(); //lock to read the angerlevel |
arb | 1:0402db7e91f5 | 90 | switch(angerlevel) |
arb | 1:0402db7e91f5 | 91 | case 3: |
arb | 1:0402db7e91f5 | 92 | state.unlock(); |
arb | 1:0402db7e91f5 | 93 | //MOTOR |
arb | 1:0402db7e91f5 | 94 | break; |
arb | 1:0402db7e91f5 | 95 | default: |
arb | 1:0402db7e91f5 | 96 | state.unlock(); |
arb | 1:0402db7e91f5 | 97 | //nothing |
arb | 1:0402db7e91f5 | 98 | break; |
arb | 1:0402db7e91f5 | 99 | state.unlock(); |
arb | 1:0402db7e91f5 | 100 | } |
arb | 1:0402db7e91f5 | 101 | |
jderemer3 | 0:4931c25e1cf7 | 102 | |
arb | 1:0402db7e91f5 | 103 | void fallInterrupt(){ |
arb | 1:0402db7e91f5 | 104 | pushFlag=true; |
arb | 1:0402db7e91f5 | 105 | } |
arb | 1:0402db7e91f5 | 106 | |
arb | 1:0402db7e91f5 | 107 | void init(){ |
arb | 1:0402db7e91f5 | 108 | interrupt.fall(&fallInterrupt); |
arb | 1:0402db7e91f5 | 109 | interrupt.mode(PullUp); |
arb | 1:0402db7e91f5 | 110 | |
arb | 1:0402db7e91f5 | 111 | } |
jderemer3 | 0:4931c25e1cf7 | 112 | |
jderemer3 | 0:4931c25e1cf7 | 113 | int main() { |
arb | 1:0402db7e91f5 | 114 | init(); |
arb | 1:0402db7e91f5 | 115 | |
arb | 1:0402db7e91f5 | 116 | t1.start(ArmThread); |
arb | 1:0402db7e91f5 | 117 | t2.start(LEDThread); |
arb | 1:0402db7e91f5 | 118 | t3.start(AudioThread); |
arb | 1:0402db7e91f5 | 119 | t4.start(WheelsThread); |
jderemer3 | 0:4931c25e1cf7 | 120 | |
jderemer3 | 0:4931c25e1cf7 | 121 | } |