complete

Dependencies:   4DGL-uLCD-SE PinDetect mbed

Fork of my2036lab2robotLCD by jim hamblen

Committer:
jboettcher
Date:
Sun Nov 06 22:25:24 2016 +0000
Revision:
1:5a1311f0ea06
Parent:
0:343fbeea672c
complete;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:343fbeea672c 1
4180_1 0:343fbeea672c 2 #include "mbed.h"
4180_1 0:343fbeea672c 3 #include "Speaker.h"
4180_1 0:343fbeea672c 4 #include "PinDetect.h"
4180_1 0:343fbeea672c 5 #include "uLCD_4DGL.h"
4180_1 0:343fbeea672c 6 // setup builtin LEDs
4180_1 0:343fbeea672c 7 DigitalOut myLed1(LED1);
4180_1 0:343fbeea672c 8 DigitalOut myLed2(LED2);
4180_1 0:343fbeea672c 9 DigitalOut myLed3(LED3);
4180_1 0:343fbeea672c 10 DigitalOut myLed4(LED4);
4180_1 0:343fbeea672c 11 // setup pushbuttons for debounced interrupt use
4180_1 0:343fbeea672c 12 PinDetect pb1(p23);
4180_1 0:343fbeea672c 13 PinDetect pb2(p24);
4180_1 0:343fbeea672c 14 PinDetect pb3(p25);
4180_1 0:343fbeea672c 15 PinDetect pb4(p26);
4180_1 0:343fbeea672c 16
4180_1 0:343fbeea672c 17 // setup LCD
4180_1 0:343fbeea672c 18 uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
4180_1 0:343fbeea672c 19
4180_1 0:343fbeea672c 20 //moving include down here allows use in uLCD in Robot class draw and erase member functions
4180_1 0:343fbeea672c 21 //easier for now than passing a new uLCD_4DGL object argument to the class
4180_1 0:343fbeea672c 22 #include "Robot.h"
4180_1 0:343fbeea672c 23
4180_1 0:343fbeea672c 24 // setup instance of new Speaker class, mySpeaker using pin 21
4180_1 0:343fbeea672c 25 // the pin must be a PWM output pin
4180_1 0:343fbeea672c 26 Speaker mySpeaker(p21);
4180_1 0:343fbeea672c 27
4180_1 0:343fbeea672c 28 // pushbutton status - need volatile for safe interrupt R/W
4180_1 0:343fbeea672c 29 volatile int pbStatus = 0;
4180_1 0:343fbeea672c 30
4180_1 0:343fbeea672c 31 // Callback routine is interrupt activated by a debounced pb1 hit
4180_1 0:343fbeea672c 32 void pb1_hit_callback (void)
4180_1 0:343fbeea672c 33 {
4180_1 0:343fbeea672c 34 // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED
4180_1 0:343fbeea672c 35 pbStatus = pbStatus | 0x01;
4180_1 0:343fbeea672c 36
4180_1 0:343fbeea672c 37 }
4180_1 0:343fbeea672c 38 // Callback routine is interrupt activated by a debounced pb2 hit
4180_1 0:343fbeea672c 39 void pb2_hit_callback (void)
4180_1 0:343fbeea672c 40 {
4180_1 0:343fbeea672c 41 // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED
4180_1 0:343fbeea672c 42 pbStatus = pbStatus | 0x02;
4180_1 0:343fbeea672c 43 }
4180_1 0:343fbeea672c 44 // Callback routine is interrupt activated by a debounced pb3 hit
4180_1 0:343fbeea672c 45 void pb3_hit_callback (void)
4180_1 0:343fbeea672c 46 {
4180_1 0:343fbeea672c 47 // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED
4180_1 0:343fbeea672c 48 pbStatus = pbStatus | 0x04;
4180_1 0:343fbeea672c 49 }
4180_1 0:343fbeea672c 50 // Callback routine is interrupt activated by a debounced pb4 hit
4180_1 0:343fbeea672c 51 void pb4_hit_callback (void)
4180_1 0:343fbeea672c 52 {
4180_1 0:343fbeea672c 53 // CODE HERE WILL RUN WHEN INTERUPT IS GENERATED
4180_1 0:343fbeea672c 54 pbStatus = pbStatus | 0x08;
4180_1 0:343fbeea672c 55 }
4180_1 0:343fbeea672c 56
4180_1 0:343fbeea672c 57 // main program
4180_1 0:343fbeea672c 58 int main()
4180_1 0:343fbeea672c 59 {
jboettcher 1:5a1311f0ea06 60 uLCD.printf("\nmyRobot!\nJoseph Boettcher");
4180_1 0:343fbeea672c 61 //setup four SPST push buttons
4180_1 0:343fbeea672c 62 pb1.mode(PullUp); //add internal pullup resistor
4180_1 0:343fbeea672c 63 pb2.mode(PullUp);
4180_1 0:343fbeea672c 64 pb3.mode(PullUp);
4180_1 0:343fbeea672c 65 pb4.mode(PullUp);
4180_1 0:343fbeea672c 66 // need a small delay for initial pullup to take effect due to capacitance
4180_1 0:343fbeea672c 67 wait(.01);
4180_1 0:343fbeea672c 68 // Setup Interrupt callback functions for each pb hit
4180_1 0:343fbeea672c 69 pb1.attach_deasserted(&pb1_hit_callback);
4180_1 0:343fbeea672c 70 pb2.attach_deasserted(&pb2_hit_callback);
4180_1 0:343fbeea672c 71 pb3.attach_deasserted(&pb3_hit_callback);
4180_1 0:343fbeea672c 72 pb4.attach_deasserted(&pb4_hit_callback);
4180_1 0:343fbeea672c 73 // Start sampling the pb inputs using interrupts
4180_1 0:343fbeea672c 74 pb1.setSampleFrequency();
4180_1 0:343fbeea672c 75 pb2.setSampleFrequency();
4180_1 0:343fbeea672c 76 pb3.setSampleFrequency();
4180_1 0:343fbeea672c 77 pb4.setSampleFrequency();
4180_1 0:343fbeea672c 78 // pushbuttons are all now setup with pullups and running with a software decounce filter
4180_1 0:343fbeea672c 79
4180_1 0:343fbeea672c 80 // use your modified robot class to move and display robot's new location on LCD
4180_1 0:343fbeea672c 81 Robot myRobot;
4180_1 0:343fbeea672c 82
4180_1 0:343fbeea672c 83 myRobot.draw(); //initial robot display in center of LCD
4180_1 0:343fbeea672c 84 //main loop to control and display robot
4180_1 0:343fbeea672c 85 while(1) {
4180_1 0:343fbeea672c 86 //check pushbutton status for new input
4180_1 0:343fbeea672c 87 switch (pbStatus) {
4180_1 0:343fbeea672c 88 //move forward
4180_1 0:343fbeea672c 89 case 0x01 :
4180_1 0:343fbeea672c 90 myLed1 = 1;
4180_1 0:343fbeea672c 91 pbStatus = 0;
4180_1 0:343fbeea672c 92 mySpeaker.PlayNote(200.0,0.1,0.8);
4180_1 0:343fbeea672c 93 myRobot.erase();
4180_1 0:343fbeea672c 94 myRobot.moveForward(1);
4180_1 0:343fbeea672c 95 myRobot.draw();
4180_1 0:343fbeea672c 96 break;
4180_1 0:343fbeea672c 97 //move backwards
4180_1 0:343fbeea672c 98 case 0x02 :
4180_1 0:343fbeea672c 99 myLed2 = 1;
4180_1 0:343fbeea672c 100 pbStatus = 0;
4180_1 0:343fbeea672c 101 mySpeaker.PlayNote(400.0,0.1,0.8);
4180_1 0:343fbeea672c 102 myRobot.erase();
4180_1 0:343fbeea672c 103 myRobot.moveBackward(1);
4180_1 0:343fbeea672c 104 myRobot.draw();
4180_1 0:343fbeea672c 105 break;
4180_1 0:343fbeea672c 106 //move left
4180_1 0:343fbeea672c 107 case 0x04 :
4180_1 0:343fbeea672c 108 myLed3 = 1;
4180_1 0:343fbeea672c 109 pbStatus = 0;
4180_1 0:343fbeea672c 110 mySpeaker.PlayNote(600.0,0.1,0.8);
4180_1 0:343fbeea672c 111 myRobot.erase();
4180_1 0:343fbeea672c 112 myRobot.moveLeft(1);
4180_1 0:343fbeea672c 113 myRobot.draw();
4180_1 0:343fbeea672c 114 break;
4180_1 0:343fbeea672c 115 //move right
4180_1 0:343fbeea672c 116 case 0x08 :
4180_1 0:343fbeea672c 117 myLed4 = 1;
4180_1 0:343fbeea672c 118 pbStatus = 0;
4180_1 0:343fbeea672c 119 mySpeaker.PlayNote(800.0,0.1,0.8);
4180_1 0:343fbeea672c 120 myRobot.erase();
4180_1 0:343fbeea672c 121 myRobot.moveRight(1);
4180_1 0:343fbeea672c 122 myRobot.draw();
4180_1 0:343fbeea672c 123 break;
4180_1 0:343fbeea672c 124 //no pb or multiple pbs hit
4180_1 0:343fbeea672c 125 default :
jboettcher 1:5a1311f0ea06 126 // myLed1 = 0;
4180_1 0:343fbeea672c 127 myLed2 = 0;
4180_1 0:343fbeea672c 128 myLed3 = 0;
4180_1 0:343fbeea672c 129 myLed4 = 0;
4180_1 0:343fbeea672c 130 pbStatus = 0;
4180_1 0:343fbeea672c 131 } //end switch
4180_1 0:343fbeea672c 132 myLed1 = !myLed1; //blink to show loop is still running
4180_1 0:343fbeea672c 133 wait(.05);
4180_1 0:343fbeea672c 134 } //end while
4180_1 0:343fbeea672c 135 } //end main
4180_1 0:343fbeea672c 136