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:
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?

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