Update to work with Grove
Dependencies: DigitDisplay RangeFinder Pulse Grove_temperature FXOS8700Q
main.cpp@1:dddc62cabd99, 2021-02-10 (annotated)
- Committer:
- fitzpatrick
- Date:
- Wed Feb 10 22:58:39 2021 +0000
- Revision:
- 1:dddc62cabd99
- Parent:
- 0:21d86aae6b2a
Update to work with Grove
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MACRUM | 0:21d86aae6b2a | 1 | #include "mbed.h" |
MACRUM | 0:21d86aae6b2a | 2 | #include "Grove_temperature.h" |
fitzpatrick | 1:dddc62cabd99 | 3 | #include "LED_Bar.h" |
fitzpatrick | 1:dddc62cabd99 | 4 | #include "DigitDisplay.h" |
fitzpatrick | 1:dddc62cabd99 | 5 | #include "RangeFinder.h" |
fitzpatrick | 1:dddc62cabd99 | 6 | #include "FXOS8700Q.h" |
MACRUM | 0:21d86aae6b2a | 7 | |
fitzpatrick | 1:dddc62cabd99 | 8 | #define V_SERVO_CENTER 1400 |
fitzpatrick | 1:dddc62cabd99 | 9 | #define V_SERVO_MAX 2200 |
fitzpatrick | 1:dddc62cabd99 | 10 | #define V_SERVO_MIN 800 |
fitzpatrick | 1:dddc62cabd99 | 11 | |
fitzpatrick | 1:dddc62cabd99 | 12 | Serial pc(USBTX, USBRX); // Serial Port 115200 |
fitzpatrick | 1:dddc62cabd99 | 13 | |
fitzpatrick | 1:dddc62cabd99 | 14 | I2C i2c( PTE25, PTE24 ); |
fitzpatrick | 1:dddc62cabd99 | 15 | FXOS8700QAccelerometer acc( i2c, FXOS8700CQ_SLAVE_ADDR1 ); // Accelerometer |
fitzpatrick | 1:dddc62cabd99 | 16 | |
fitzpatrick | 1:dddc62cabd99 | 17 | Grove_temperature temp(A3); // Temperature GPIO |
fitzpatrick | 1:dddc62cabd99 | 18 | DigitalOut myled(LED2); //Red LED |
fitzpatrick | 1:dddc62cabd99 | 19 | DigitDisplay display(D7, D8); // Digital Display GPIO |
fitzpatrick | 1:dddc62cabd99 | 20 | |
fitzpatrick | 1:dddc62cabd99 | 21 | AnalogIn xAxis(A0); // Joystick x GPIO |
fitzpatrick | 1:dddc62cabd99 | 22 | AnalogIn yAxis(A1); // Joystick y GPIO |
fitzpatrick | 1:dddc62cabd99 | 23 | |
fitzpatrick | 1:dddc62cabd99 | 24 | // Servo |
fitzpatrick | 1:dddc62cabd99 | 25 | PwmOut v_servo(D3); // D3 output |
fitzpatrick | 1:dddc62cabd99 | 26 | |
fitzpatrick | 1:dddc62cabd99 | 27 | LED_Bar bar(D6, D5); // LED_Bar GPIO |
fitzpatrick | 1:dddc62cabd99 | 28 | |
fitzpatrick | 1:dddc62cabd99 | 29 | int x,y,button; // global variables to hold values |
fitzpatrick | 1:dddc62cabd99 | 30 | |
fitzpatrick | 1:dddc62cabd99 | 31 | // Seeed ultrasound range finder |
fitzpatrick | 1:dddc62cabd99 | 32 | RangeFinder rf(A2, 10, 5800.0, 100000); |
fitzpatrick | 1:dddc62cabd99 | 33 | DigitalOut led(LED1); |
fitzpatrick | 1:dddc62cabd99 | 34 | |
fitzpatrick | 1:dddc62cabd99 | 35 | |
fitzpatrick | 1:dddc62cabd99 | 36 | Ticker joystick; // recurring interrupt to get joystick data |
fitzpatrick | 1:dddc62cabd99 | 37 | Ticker tick; // Digital display clock |
fitzpatrick | 1:dddc62cabd99 | 38 | |
fitzpatrick | 1:dddc62cabd99 | 39 | // Digital Display variables |
fitzpatrick | 1:dddc62cabd99 | 40 | uint8_t hour = 20; |
fitzpatrick | 1:dddc62cabd99 | 41 | uint8_t minute = 14; |
fitzpatrick | 1:dddc62cabd99 | 42 | uint8_t second = 0; |
fitzpatrick | 1:dddc62cabd99 | 43 | |
fitzpatrick | 1:dddc62cabd99 | 44 | // Digital Display Algorythm Function |
fitzpatrick | 1:dddc62cabd99 | 45 | void beat() |
fitzpatrick | 1:dddc62cabd99 | 46 | { |
fitzpatrick | 1:dddc62cabd99 | 47 | static uint8_t colon = 0; |
fitzpatrick | 1:dddc62cabd99 | 48 | |
fitzpatrick | 1:dddc62cabd99 | 49 | display.setColon(colon); |
fitzpatrick | 1:dddc62cabd99 | 50 | if (colon) { |
fitzpatrick | 1:dddc62cabd99 | 51 | second++; |
fitzpatrick | 1:dddc62cabd99 | 52 | if (second >= 60) { |
fitzpatrick | 1:dddc62cabd99 | 53 | second = 0; |
fitzpatrick | 1:dddc62cabd99 | 54 | minute++; |
fitzpatrick | 1:dddc62cabd99 | 55 | if (minute >= 60) { |
fitzpatrick | 1:dddc62cabd99 | 56 | minute = 0; |
fitzpatrick | 1:dddc62cabd99 | 57 | |
fitzpatrick | 1:dddc62cabd99 | 58 | hour++; |
fitzpatrick | 1:dddc62cabd99 | 59 | if (hour >= 24) { |
fitzpatrick | 1:dddc62cabd99 | 60 | hour = 0; |
fitzpatrick | 1:dddc62cabd99 | 61 | } |
fitzpatrick | 1:dddc62cabd99 | 62 | display.write(0, hour / 10); |
fitzpatrick | 1:dddc62cabd99 | 63 | display.write(1, hour % 10); |
fitzpatrick | 1:dddc62cabd99 | 64 | } |
fitzpatrick | 1:dddc62cabd99 | 65 | display.write(2, minute / 10); |
fitzpatrick | 1:dddc62cabd99 | 66 | display.write(3, minute % 10); |
fitzpatrick | 1:dddc62cabd99 | 67 | } |
fitzpatrick | 1:dddc62cabd99 | 68 | } |
fitzpatrick | 1:dddc62cabd99 | 69 | colon = 1 - colon; |
fitzpatrick | 1:dddc62cabd99 | 70 | } |
fitzpatrick | 1:dddc62cabd99 | 71 | |
fitzpatrick | 1:dddc62cabd99 | 72 | // Joystick Algorythm Function |
fitzpatrick | 1:dddc62cabd99 | 73 | void joystick_Int_Handler() |
fitzpatrick | 1:dddc62cabd99 | 74 | { |
fitzpatrick | 1:dddc62cabd99 | 75 | x = xAxis.read() * 1000; // float (0->1) to int (0-1000) |
fitzpatrick | 1:dddc62cabd99 | 76 | y = yAxis.read() * 1000; |
fitzpatrick | 1:dddc62cabd99 | 77 | if ( (x > 900) || (y > 900) ) |
fitzpatrick | 1:dddc62cabd99 | 78 | button = 1; |
fitzpatrick | 1:dddc62cabd99 | 79 | else |
fitzpatrick | 1:dddc62cabd99 | 80 | button = 0; |
fitzpatrick | 1:dddc62cabd99 | 81 | } |
MACRUM | 0:21d86aae6b2a | 82 | |
MACRUM | 0:21d86aae6b2a | 83 | // main() runs in its own thread in the OS |
MACRUM | 0:21d86aae6b2a | 84 | int main() { |
fitzpatrick | 1:dddc62cabd99 | 85 | int i; |
fitzpatrick | 1:dddc62cabd99 | 86 | pc.baud(115200); // Serial Port 115200 |
fitzpatrick | 1:dddc62cabd99 | 87 | |
fitzpatrick | 1:dddc62cabd99 | 88 | led = 1; //Rangefinder |
fitzpatrick | 1:dddc62cabd99 | 89 | float d; //Rangefinder |
fitzpatrick | 1:dddc62cabd99 | 90 | |
fitzpatrick | 1:dddc62cabd99 | 91 | float acc_x, acc_y, acc_z; //Accelerometer |
fitzpatrick | 1:dddc62cabd99 | 92 | |
fitzpatrick | 1:dddc62cabd99 | 93 | // Servo |
fitzpatrick | 1:dddc62cabd99 | 94 | int v_pulse = V_SERVO_CENTER; |
fitzpatrick | 1:dddc62cabd99 | 95 | v_servo.period_us(20000); // servo requires a 20ms period |
fitzpatrick | 1:dddc62cabd99 | 96 | v_servo.pulsewidth_us(v_pulse); // servo position determined by a pulsewidth between 1-2ms |
fitzpatrick | 1:dddc62cabd99 | 97 | wait(1); |
fitzpatrick | 1:dddc62cabd99 | 98 | |
fitzpatrick | 1:dddc62cabd99 | 99 | // Joystick interrupt, call every .2s |
fitzpatrick | 1:dddc62cabd99 | 100 | joystick.attach(joystick_Int_Handler,0.2); |
fitzpatrick | 1:dddc62cabd99 | 101 | display.write(0, hour / 10); |
fitzpatrick | 1:dddc62cabd99 | 102 | display.write(1, hour % 10); |
fitzpatrick | 1:dddc62cabd99 | 103 | display.write(2, minute / 10); |
fitzpatrick | 1:dddc62cabd99 | 104 | display.write(3, minute % 10); |
fitzpatrick | 1:dddc62cabd99 | 105 | display.setColon(true); |
fitzpatrick | 1:dddc62cabd99 | 106 | |
fitzpatrick | 1:dddc62cabd99 | 107 | // Dig Display interrupt, call every .5s |
fitzpatrick | 1:dddc62cabd99 | 108 | tick.attach(&beat, 0.5); |
fitzpatrick | 1:dddc62cabd99 | 109 | |
fitzpatrick | 1:dddc62cabd99 | 110 | // Enable Accelerometer |
fitzpatrick | 1:dddc62cabd99 | 111 | acc.enable(); |
fitzpatrick | 1:dddc62cabd99 | 112 | |
MACRUM | 0:21d86aae6b2a | 113 | while (true) { |
fitzpatrick | 1:dddc62cabd99 | 114 | printf("\r\nTemperature Measurement\r\n"); |
fitzpatrick | 1:dddc62cabd99 | 115 | pc.printf("\rtemperature = %2.2f\n", temp.getTemperature()); |
fitzpatrick | 1:dddc62cabd99 | 116 | |
fitzpatrick | 1:dddc62cabd99 | 117 | printf("\r\nJoystick Status, Meters\r\n"); |
fitzpatrick | 1:dddc62cabd99 | 118 | pc.printf("\rX=%3d, Y=%3d, Button=%d\n",x,y,button); |
fitzpatrick | 1:dddc62cabd99 | 119 | |
fitzpatrick | 1:dddc62cabd99 | 120 | //for (i=0; i<=10; i++) { |
fitzpatrick | 1:dddc62cabd99 | 121 | //bar.setLevel(i); |
fitzpatrick | 1:dddc62cabd99 | 122 | //wait(0.1); |
fitzpatrick | 1:dddc62cabd99 | 123 | //} |
fitzpatrick | 1:dddc62cabd99 | 124 | bar.setLevel((x-250)/50); |
fitzpatrick | 1:dddc62cabd99 | 125 | |
fitzpatrick | 1:dddc62cabd99 | 126 | |
fitzpatrick | 1:dddc62cabd99 | 127 | //Servo |
fitzpatrick | 1:dddc62cabd99 | 128 | v_pulse = v_pulse - 20; |
fitzpatrick | 1:dddc62cabd99 | 129 | if (v_pulse <= V_SERVO_MIN) v_pulse = V_SERVO_MIN; |
fitzpatrick | 1:dddc62cabd99 | 130 | if (v_pulse >= V_SERVO_MAX) v_pulse = V_SERVO_MAX; |
fitzpatrick | 1:dddc62cabd99 | 131 | v_servo.pulsewidth_us(v_pulse); // servo position determined by a pulsewidth between 1-2ms |
fitzpatrick | 1:dddc62cabd99 | 132 | //wait(3); |
fitzpatrick | 1:dddc62cabd99 | 133 | printf("\n\rPulse = %d\n\r",v_pulse); |
fitzpatrick | 1:dddc62cabd99 | 134 | |
fitzpatrick | 1:dddc62cabd99 | 135 | |
fitzpatrick | 1:dddc62cabd99 | 136 | //Range sensor |
fitzpatrick | 1:dddc62cabd99 | 137 | d = rf.read_m(); |
fitzpatrick | 1:dddc62cabd99 | 138 | if (d == -1.0) { |
fitzpatrick | 1:dddc62cabd99 | 139 | printf("\rTimeout Error.\n"); |
fitzpatrick | 1:dddc62cabd99 | 140 | } else if (d > 5.0) { |
fitzpatrick | 1:dddc62cabd99 | 141 | // Seeed's sensor has a maximum range of 4m, it returns |
fitzpatrick | 1:dddc62cabd99 | 142 | // something like 7m if the ultrasound pulse isn't reflected. |
fitzpatrick | 1:dddc62cabd99 | 143 | printf("\rNo object within detection range.\n"); |
fitzpatrick | 1:dddc62cabd99 | 144 | } else { |
fitzpatrick | 1:dddc62cabd99 | 145 | printf("\r\nUltra Sonic Rangefinder, Meters\r\n"); |
fitzpatrick | 1:dddc62cabd99 | 146 | printf("\rDistance = %f m.\n", d); |
fitzpatrick | 1:dddc62cabd99 | 147 | } |
fitzpatrick | 1:dddc62cabd99 | 148 | |
fitzpatrick | 1:dddc62cabd99 | 149 | // get Accelerometer values |
fitzpatrick | 1:dddc62cabd99 | 150 | acc.getX( acc_x ); |
fitzpatrick | 1:dddc62cabd99 | 151 | acc.getY( acc_y ); |
fitzpatrick | 1:dddc62cabd99 | 152 | acc.getZ( acc_z ); |
fitzpatrick | 1:dddc62cabd99 | 153 | |
fitzpatrick | 1:dddc62cabd99 | 154 | printf("\r\nAccelerometer Values\r\n"); |
fitzpatrick | 1:dddc62cabd99 | 155 | printf("X:%6.1f, Y:%6.1f, Z:%6.1f\r\n\r\n", acc_x * 90.0, acc_y * 90.0, acc_z * 90.0 ); |
fitzpatrick | 1:dddc62cabd99 | 156 | |
fitzpatrick | 1:dddc62cabd99 | 157 | myled = 1; |
fitzpatrick | 1:dddc62cabd99 | 158 | wait(0.5); |
fitzpatrick | 1:dddc62cabd99 | 159 | myled = 0; |
fitzpatrick | 1:dddc62cabd99 | 160 | wait(0.5); |
fitzpatrick | 1:dddc62cabd99 | 161 | |
fitzpatrick | 1:dddc62cabd99 | 162 | led = !led; |
MACRUM | 0:21d86aae6b2a | 163 | } |
MACRUM | 0:21d86aae6b2a | 164 | } |
MACRUM | 0:21d86aae6b2a | 165 | |
fitzpatrick | 1:dddc62cabd99 | 166 |