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

MbedH-BridgeDC MotorsServoTransistorSpeakerLEDsBarrel JackToggle Switch
GNDGND(-)Emitter(-)GND(-)(-)
Vu
VinVm(+)(+)
VoutVcc, /STBY(+)
p5AIN1
p6AIN2
p10LED+
p11LED+
p12LED+
p15Control
p21PWMA
p22Collector
p23Blue
p24Green
p25Red
p26Control
AO1(+)
AO2(-)

/media/uploads/jderemer3/capture.png

Demo Clip

Source Code

Import program4180_FinaProject

Committer:
arb
Date:
Mon May 01 10:56:10 2017 +0000
Revision:
3:a7bd2f5946ed
Parent:
2:69a3683834c7
Submit Verison

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jderemer3 0:4931c25e1cf7 1 #include "mbed.h"
jderemer3 0:4931c25e1cf7 2 #include "rtos.h"
arb 2:69a3683834c7 3 #include "Motor.h"
arb 3:a7bd2f5946ed 4
arb 3:a7bd2f5946ed 5 Serial pc(USBTX, USBRX);
jderemer3 0:4931c25e1cf7 6
jderemer3 0:4931c25e1cf7 7 DigitalOut led1(LED1);
jderemer3 0:4931c25e1cf7 8 DigitalOut led2(LED2);
jderemer3 0:4931c25e1cf7 9 DigitalOut led3(LED3);
jderemer3 0:4931c25e1cf7 10 DigitalOut led4(LED4);
jderemer3 0:4931c25e1cf7 11
arb 3:a7bd2f5946ed 12 DigitalIn Switch(p15);
arb 1:0402db7e91f5 13
arb 2:69a3683834c7 14 //SERVO for arm
arb 3:a7bd2f5946ed 15 PwmOut arm(p26);
arb 2:69a3683834c7 16
arb 2:69a3683834c7 17 //LEDS
arb 3:a7bd2f5946ed 18 PwmOut red(p25);
arb 3:a7bd2f5946ed 19 PwmOut green(p24);
jderemer3 0:4931c25e1cf7 20 PwmOut blue(p23);
jderemer3 0:4931c25e1cf7 21
arb 3:a7bd2f5946ed 22 DigitalOut MouthUp(p11);
arb 3:a7bd2f5946ed 23 DigitalOut MouthDown(p12);
arb 3:a7bd2f5946ed 24 DigitalOut MouthCenter(p10);
arb 3:a7bd2f5946ed 25
arb 2:69a3683834c7 26 //SD card/audio
arb 3:a7bd2f5946ed 27 PwmOut Speaker(p22);
arb 3:a7bd2f5946ed 28 /* //For SD custom songs
arb 2:69a3683834c7 29 AnalogOut DACout(p18);
arb 2:69a3683834c7 30 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
arb 3:a7bd2f5946ed 31 wave_player waver(&DACout,&Speaker);
arb 2:69a3683834c7 32 char buffer[20];
arb 2:69a3683834c7 33 FILE *wave_file;
arb 3:a7bd2f5946ed 34 */
arb 2:69a3683834c7 35 //motor for wheels
jderemer3 0:4931c25e1cf7 36
arb 3:a7bd2f5946ed 37 Motor wheel(p21, p6, p5); // pwm, fwd, rev
arb 3:a7bd2f5946ed 38
jderemer3 0:4931c25e1cf7 39 Thread t2; // LED Color
jderemer3 0:4931c25e1cf7 40 Thread t3; // Speaker Music / Audio
jderemer3 0:4931c25e1cf7 41 Thread t4; // Motor Control
jderemer3 0:4931c25e1cf7 42
arb 1:0402db7e91f5 43 Mutex state;
arb 1:0402db7e91f5 44 int angerlevel;
arb 3:a7bd2f5946ed 45 int priority=1;
arb 1:0402db7e91f5 46 bool pushFlag = false;
arb 1:0402db7e91f5 47
jderemer3 0:4931c25e1cf7 48
arb 1:0402db7e91f5 49 void LEDThread() {
arb 2:69a3683834c7 50 //TODO: Add colors according to angerlevel
arb 3:a7bd2f5946ed 51 while(1){
arb 3:a7bd2f5946ed 52 if (pushFlag&&priority==1)
arb 3:a7bd2f5946ed 53 {
arb 3:a7bd2f5946ed 54 state.lock(); //lock to read the angerlevel
arb 3:a7bd2f5946ed 55 switch(angerlevel){
arb 3:a7bd2f5946ed 56 case 1:
arb 3:a7bd2f5946ed 57 //turn on leds
arb 3:a7bd2f5946ed 58 MouthCenter=1;
arb 3:a7bd2f5946ed 59 MouthUp=1;
arb 3:a7bd2f5946ed 60 red=1.0;
arb 3:a7bd2f5946ed 61 green=1.0;
arb 3:a7bd2f5946ed 62 blue=1.0;
arb 3:a7bd2f5946ed 63 break;
arb 3:a7bd2f5946ed 64 case 2:
arb 3:a7bd2f5946ed 65 //LEDS/AUDIO
arb 3:a7bd2f5946ed 66 red=1.0;
arb 3:a7bd2f5946ed 67 green=0.0;
arb 3:a7bd2f5946ed 68 blue=1.0;
arb 3:a7bd2f5946ed 69 MouthUp=0;
arb 3:a7bd2f5946ed 70 break;
arb 3:a7bd2f5946ed 71 case 3:
arb 3:a7bd2f5946ed 72 MouthDown=1;
arb 3:a7bd2f5946ed 73 red=1.0;
arb 3:a7bd2f5946ed 74 green=0.0;
arb 3:a7bd2f5946ed 75 blue=0.0;
arb 3:a7bd2f5946ed 76 break;
arb 3:a7bd2f5946ed 77 default:
arb 3:a7bd2f5946ed 78 //case 0 do nothing
arb 3:a7bd2f5946ed 79 break;
arb 3:a7bd2f5946ed 80 }
arb 3:a7bd2f5946ed 81 priority=2;
arb 1:0402db7e91f5 82 state.unlock();
arb 3:a7bd2f5946ed 83 }
arb 2:69a3683834c7 84 }
jderemer3 0:4931c25e1cf7 85 }
arb 1:0402db7e91f5 86
arb 1:0402db7e91f5 87 void AudioThread() {
arb 1:0402db7e91f5 88 //PWM/AMP? to play audio?
arb 2:69a3683834c7 89 //TODO: get sound on SD card and confirm this will work
arb 2:69a3683834c7 90 //mabye multiple sounds according to what angerlevel
arb 3:a7bd2f5946ed 91 while(1){
arb 3:a7bd2f5946ed 92 if (pushFlag&&priority==2)
arb 3:a7bd2f5946ed 93 {
arb 3:a7bd2f5946ed 94 state.lock(); //lock to read the angerlevel
arb 3:a7bd2f5946ed 95 switch(angerlevel){
arb 3:a7bd2f5946ed 96 case 2:
arb 3:a7bd2f5946ed 97 //AUDIO
arb 3:a7bd2f5946ed 98 /*for SD custom sound
arb 3:a7bd2f5946ed 99 for (int a=1;a<40; a++){
arb 3:a7bd2f5946ed 100 sprintf(buffer,"/sd//voice%d.wav",a);
arb 3:a7bd2f5946ed 101 wave_file=fopen(buffer,"r");
arb 3:a7bd2f5946ed 102 waver.play(wave_file);
arb 3:a7bd2f5946ed 103 fclose(wave_file);
arb 3:a7bd2f5946ed 104 }*/
arb 3:a7bd2f5946ed 105 //siren affect
arb 3:a7bd2f5946ed 106 arm.period(1.0/800.0);
arb 3:a7bd2f5946ed 107 Speaker = float(48)/50.0;
arb 3:a7bd2f5946ed 108 wait(2.5);
arb 3:a7bd2f5946ed 109 Speaker=0;
arb 3:a7bd2f5946ed 110 break;
arb 3:a7bd2f5946ed 111 case 3:
arb 3:a7bd2f5946ed 112 break;
arb 3:a7bd2f5946ed 113 default:
arb 3:a7bd2f5946ed 114 //Nothing to do here
arb 3:a7bd2f5946ed 115 break;
arb 3:a7bd2f5946ed 116 }
arb 3:a7bd2f5946ed 117 priority=3;
arb 1:0402db7e91f5 118 state.unlock();
arb 3:a7bd2f5946ed 119 }
arb 2:69a3683834c7 120 }
arb 1:0402db7e91f5 121 }
arb 1:0402db7e91f5 122
arb 1:0402db7e91f5 123 void WheelsThread() {
arb 1:0402db7e91f5 124 //Drive around randomly
arb 2:69a3683834c7 125 //TODO: add random driving for both motors(current:example for 1 motor)
arb 3:a7bd2f5946ed 126 while(1){
arb 3:a7bd2f5946ed 127 if (pushFlag&&priority==3)
arb 3:a7bd2f5946ed 128 {
arb 3:a7bd2f5946ed 129
arb 3:a7bd2f5946ed 130 state.lock(); //lock to read the angerlevel
arb 3:a7bd2f5946ed 131 switch(angerlevel){
arb 3:a7bd2f5946ed 132 case 3:
arb 3:a7bd2f5946ed 133 arm.period(0.001);
arb 3:a7bd2f5946ed 134 wheel.speed(1.0);
arb 3:a7bd2f5946ed 135 wait(2.5);
arb 3:a7bd2f5946ed 136
arb 3:a7bd2f5946ed 137 arm.period(1.0/969.0);
arb 3:a7bd2f5946ed 138 Speaker = float(46)/50.0;
arb 3:a7bd2f5946ed 139 wait(.5);
arb 3:a7bd2f5946ed 140 arm.period(1.0/800.0);
arb 3:a7bd2f5946ed 141 wait(.5);
arb 3:a7bd2f5946ed 142
arb 3:a7bd2f5946ed 143 arm.period(0.001);
arb 3:a7bd2f5946ed 144 wheel.speed(-1.0);
arb 3:a7bd2f5946ed 145 wait(2.5);
arb 3:a7bd2f5946ed 146
arb 3:a7bd2f5946ed 147 arm.period(1.0/969.0);
arb 3:a7bd2f5946ed 148 Speaker = float(48)/50.0;
arb 3:a7bd2f5946ed 149 wait(.5);
arb 3:a7bd2f5946ed 150 arm.period(1.0/800.0);
arb 3:a7bd2f5946ed 151 wait(.5);
arb 3:a7bd2f5946ed 152 Speaker=0;
arb 3:a7bd2f5946ed 153
arb 3:a7bd2f5946ed 154 arm.period(0.001);
arb 3:a7bd2f5946ed 155 wheel.speed(0.0);
arb 3:a7bd2f5946ed 156 wait(0.04);
arb 3:a7bd2f5946ed 157 break;
arb 3:a7bd2f5946ed 158 default:
arb 3:a7bd2f5946ed 159 //nothing
arb 3:a7bd2f5946ed 160 break;
arb 3:a7bd2f5946ed 161 }
arb 3:a7bd2f5946ed 162 priority=1;
arb 1:0402db7e91f5 163 state.unlock();
arb 3:a7bd2f5946ed 164 }
arb 2:69a3683834c7 165 }
arb 1:0402db7e91f5 166 }
arb 1:0402db7e91f5 167
jderemer3 0:4931c25e1cf7 168
arb 1:0402db7e91f5 169 void fallInterrupt(){
arb 3:a7bd2f5946ed 170 priority=1;
arb 1:0402db7e91f5 171 pushFlag=true;
arb 1:0402db7e91f5 172 }
arb 1:0402db7e91f5 173
arb 1:0402db7e91f5 174 void init(){
arb 2:69a3683834c7 175
arb 3:a7bd2f5946ed 176 //start threads
arb 3:a7bd2f5946ed 177 t2.start(LEDThread);
arb 3:a7bd2f5946ed 178 t3.start(AudioThread);
arb 3:a7bd2f5946ed 179 t4.start(WheelsThread);
arb 1:0402db7e91f5 180
arb 1:0402db7e91f5 181 }
jderemer3 0:4931c25e1cf7 182
jderemer3 0:4931c25e1cf7 183 int main() {
arb 1:0402db7e91f5 184 init();
arb 3:a7bd2f5946ed 185
arb 3:a7bd2f5946ed 186 while(1) {
arb 3:a7bd2f5946ed 187 while(Switch) {
arb 3:a7bd2f5946ed 188 //* code
arb 3:a7bd2f5946ed 189 }
arb 3:a7bd2f5946ed 190 fallInterrupt();
arb 3:a7bd2f5946ed 191 //start servo
arb 3:a7bd2f5946ed 192 state.lock(); //lock for period + angerlevel
arb 3:a7bd2f5946ed 193 arm.period(0.020); // servo requires a 20ms period
arb 3:a7bd2f5946ed 194 arm.pulsewidth(0.002);
arb 3:a7bd2f5946ed 195 wait(0.5);
arb 3:a7bd2f5946ed 196 arm.pulsewidth(0.0013);
arb 3:a7bd2f5946ed 197 wait(0.5);
arb 3:a7bd2f5946ed 198
arb 3:a7bd2f5946ed 199 angerlevel++;
arb 3:a7bd2f5946ed 200 state.unlock();
arb 3:a7bd2f5946ed 201 wait(1);
arb 3:a7bd2f5946ed 202 pushFlag=false;
arb 3:a7bd2f5946ed 203 }
arb 3:a7bd2f5946ed 204 pc.printf("exited");
jderemer3 0:4931c25e1cf7 205 }