Matti Borchers / Mbed 2 deprecated mbed_amf_controlsystem_iO_copy

Dependencies:   mbed-rtos mbed

Fork of mbed_amf_controlsystem_iO_copy by Oliver Wenzel

Committer:
OWenzel
Date:
Sun Feb 07 10:41:16 2016 +0000
Revision:
14:48cdd880ca1a
Parent:
13:34f7f783ad24
Child:
15:141de2b5646d
1. COmmit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mborchers 0:8a6003b8bb5b 1 #include <mbed.h>
mborchers 0:8a6003b8bb5b 2 #include "rtos.h"
mborchers 0:8a6003b8bb5b 3 #include "Periphery/SupportSystem.h"
mborchers 0:8a6003b8bb5b 4 #include "Misc/SystemTimer.h"
mborchers 3:391c4639bc7d 5 #include "Controller/QuadratureController.h"
mborchers 13:34f7f783ad24 6 #include "Controller/MachineDirectionController.h"
mborchers 0:8a6003b8bb5b 7
mborchers 0:8a6003b8bb5b 8 #define PI 3.14159265
mborchers 0:8a6003b8bb5b 9
mborchers 13:34f7f783ad24 10 Serial serialXbee(p28,p27), serialMinnow(p13, p14);
mborchers 13:34f7f783ad24 11 PwmOut drivePWM(p22), steerPWM(p21);
mborchers 0:8a6003b8bb5b 12 I2C i2c(p9, p10);
mborchers 0:8a6003b8bb5b 13
mborchers 13:34f7f783ad24 14 DigitalOut serialLED(LED1), ledTwo(LED2), ledThree(LED3), heartbeatLED(LED4);
mborchers 0:8a6003b8bb5b 15
mborchers 13:34f7f783ad24 16 DigitalIn buttonOne(p25), buttonTwo(p26), buttonThree(p29), buttonFour(p30);
mborchers 0:8a6003b8bb5b 17
mborchers 0:8a6003b8bb5b 18 IMU_RegisterDataBuffer_t *IMU_registerDataBuffer;
mborchers 0:8a6003b8bb5b 19 RadioDecoder_RegisterDataBuffer_t *RadioDecoder_registerDataBuffer;
mborchers 0:8a6003b8bb5b 20
mborchers 4:f0be27a5a83a 21 QuadratureController *quadratureController;
mborchers 13:34f7f783ad24 22 MachineDirectionController *machineDirectionController;
mborchers 4:f0be27a5a83a 23
mborchers 0:8a6003b8bb5b 24 // Queues von der Bahnplanung
mborchers 0:8a6003b8bb5b 25 Queue<float, 2> quadrature_queue;
mborchers 0:8a6003b8bb5b 26 Queue<float, 2> machine_direction_queue;
mborchers 0:8a6003b8bb5b 27 float steering_angle_minnow_queue;
mborchers 0:8a6003b8bb5b 28 float velocity_minnow_queue;
mborchers 0:8a6003b8bb5b 29
mborchers 0:8a6003b8bb5b 30
mborchers 0:8a6003b8bb5b 31 // Queues von dem Maussensor
mborchers 0:8a6003b8bb5b 32 Queue<float, 2> imu_queue_velocity;
mborchers 0:8a6003b8bb5b 33 Queue<float, 2> imu_queue_steering_angle;
mborchers 0:8a6003b8bb5b 34 float steering_angle_imu_queue;
mborchers 0:8a6003b8bb5b 35 float velocity_imu_queue;
mborchers 0:8a6003b8bb5b 36
mborchers 10:f92664a22d02 37 void hearbeat_thread(void const *args);
mborchers 10:f92664a22d02 38
mborchers 0:8a6003b8bb5b 39 void serial_thread(void const *args) {
mborchers 10:f92664a22d02 40 size_t length = 20;
mborchers 10:f92664a22d02 41 char receive_buffer[length];
mborchers 10:f92664a22d02 42 char* ptr = (char*) receive_buffer;
mborchers 10:f92664a22d02 43 char* end = ptr + length;
mborchers 10:f92664a22d02 44 char c, x = 22;
mborchers 7:c5940ae7773a 45 float f;
mborchers 0:8a6003b8bb5b 46 while (true) {
mborchers 10:f92664a22d02 47 if (ptr != end) {
mborchers 10:f92664a22d02 48 c = serialMinnow.getc();
mborchers 10:f92664a22d02 49 *ptr++ = c;
mborchers 10:f92664a22d02 50 } else {
mborchers 10:f92664a22d02 51 ptr = (char*)receive_buffer;
mborchers 7:c5940ae7773a 52 }
mborchers 13:34f7f783ad24 53 serialLED = !serialLED;
mborchers 10:f92664a22d02 54
mborchers 12:221c9e02ea96 55 if (c == '\r') {
mborchers 13:34f7f783ad24 56 sscanf(receive_buffer, "[%c]=%f\r", &x, &f);
mborchers 12:221c9e02ea96 57 ptr = (char*)receive_buffer;
mborchers 12:221c9e02ea96 58 }
mborchers 10:f92664a22d02 59
mborchers 10:f92664a22d02 60 if (x == 'v') {
mborchers 12:221c9e02ea96 61 machine_direction_queue.put(&f);
mborchers 12:221c9e02ea96 62
mborchers 13:34f7f783ad24 63 ledTwo = true;
mborchers 10:f92664a22d02 64 // Buffer wieder auf Anfang setzen
mborchers 10:f92664a22d02 65 ptr = (char*)receive_buffer;
mborchers 10:f92664a22d02 66 x = 22;
mborchers 10:f92664a22d02 67 } else if (x == 'g') {
mborchers 13:34f7f783ad24 68 f = -1*f;
mborchers 12:221c9e02ea96 69 quadrature_queue.put(&f);
mborchers 13:34f7f783ad24 70 ledThree = true;
mborchers 10:f92664a22d02 71 // Buffer wieder auf Anfang setzen
mborchers 10:f92664a22d02 72 ptr = (char*)receive_buffer;
mborchers 10:f92664a22d02 73 x = 22;
mborchers 10:f92664a22d02 74 }
OWenzel 14:48cdd880ca1a 75 if(rc_valid != 0)
OWenzel 14:48cdd880ca1a 76 {
OWenzel 14:48cdd880ca1a 77 serialMinnow.putc('a');//Aktiviert
OWenzel 14:48cdd880ca1a 78 }
OWenzel 14:48cdd880ca1a 79 else
OWenzel 14:48cdd880ca1a 80 {
OWenzel 14:48cdd880ca1a 81 serialMinnow.putc('d');//Deaktiviert
OWenzel 14:48cdd880ca1a 82 }
mborchers 10:f92664a22d02 83
mborchers 7:c5940ae7773a 84 //Thread::wait(100);
mborchers 0:8a6003b8bb5b 85 }
mborchers 0:8a6003b8bb5b 86 }
mborchers 0:8a6003b8bb5b 87
mborchers 13:34f7f783ad24 88 void redirect_machine_direction_controller(void const *args) {
mborchers 13:34f7f783ad24 89 machineDirectionController->cylic_control();
mborchers 0:8a6003b8bb5b 90 }
mborchers 0:8a6003b8bb5b 91
mborchers 4:f0be27a5a83a 92 void redirect_quadrature_controller(void const *args) {
mborchers 4:f0be27a5a83a 93 quadratureController->cylic_control();
mborchers 4:f0be27a5a83a 94 }
mborchers 4:f0be27a5a83a 95
mborchers 0:8a6003b8bb5b 96 int main() {
mborchers 0:8a6003b8bb5b 97 serialMinnow.baud(115200);
mborchers 0:8a6003b8bb5b 98
mborchers 0:8a6003b8bb5b 99 drivePWM.period_ms(20);
mborchers 0:8a6003b8bb5b 100 steerPWM.period_ms(20);
mborchers 0:8a6003b8bb5b 101
mborchers 0:8a6003b8bb5b 102 SystemTimer *millis = new SystemTimer();
mborchers 0:8a6003b8bb5b 103
mborchers 0:8a6003b8bb5b 104 SupportSystem *supportSystem = new SupportSystem(0x80, &i2c);
mborchers 3:391c4639bc7d 105
torstenwylegala 6:aa27bc8c58f5 106 quadratureController = new QuadratureController(&steerPWM, &quadrature_queue, &imu_queue_steering_angle);
mborchers 13:34f7f783ad24 107 machineDirectionController = new MachineDirectionController(&drivePWM, &machine_direction_queue, &imu_queue_velocity);
mborchers 0:8a6003b8bb5b 108
mborchers 1:7eddde9fba60 109 Thread machineDirectionControl(serial_thread);
mborchers 10:f92664a22d02 110 Thread hearbeatThread(hearbeat_thread);
mborchers 0:8a6003b8bb5b 111
OWenzel 14:48cdd880ca1a 112 RtosTimer machine_direction_control_timer(redirect_machine_direction_controller);
mborchers 4:f0be27a5a83a 113 RtosTimer quadrature_control_timer(redirect_quadrature_controller);
mborchers 0:8a6003b8bb5b 114
mborchers 0:8a6003b8bb5b 115 // Konfiguration AMF-IMU
mborchers 0:8a6003b8bb5b 116 // [0]: Conversation Factor
mborchers 0:8a6003b8bb5b 117 // [1]: Sensor Position X
mborchers 0:8a6003b8bb5b 118 // [2]: Sensor Position Y
mborchers 0:8a6003b8bb5b 119 // [3]: Sensor Position Angle
torstenwylegala 5:4319a748181a 120 float configData[4] = {0.002751114f, 167.0f, 0.0f, 271.5f};
mborchers 13:34f7f783ad24 121
mborchers 13:34f7f783ad24 122 supportSystem->writeImuConfig(configData);
mborchers 0:8a6003b8bb5b 123
mborchers 0:8a6003b8bb5b 124 bool timer_started = false;
mborchers 0:8a6003b8bb5b 125
mborchers 12:221c9e02ea96 126 steering_angle_minnow_queue = 0;
mborchers 2:bf739d7d9f8f 127 quadrature_queue.put(&steering_angle_minnow_queue);
mborchers 2:bf739d7d9f8f 128
mborchers 12:221c9e02ea96 129 velocity_minnow_queue = 0;
mborchers 2:bf739d7d9f8f 130 machine_direction_queue.put(&velocity_minnow_queue);
mborchers 12:221c9e02ea96 131
mborchers 12:221c9e02ea96 132 machine_direction_control_timer.start(10);
mborchers 12:221c9e02ea96 133 quadrature_control_timer.start(10);
mborchers 0:8a6003b8bb5b 134
mborchers 0:8a6003b8bb5b 135 while(true) {
mborchers 0:8a6003b8bb5b 136 IMU_registerDataBuffer = supportSystem->getImuRegisterDataBuffer();
mborchers 0:8a6003b8bb5b 137 RadioDecoder_registerDataBuffer = supportSystem->getRadioDecoderRegisterDataBuffer();
mborchers 0:8a6003b8bb5b 138
mborchers 0:8a6003b8bb5b 139 uint16_t rc_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[0];
mborchers 0:8a6003b8bb5b 140 uint8_t rc_valid = RadioDecoder_registerDataBuffer->channelValid[0];
mborchers 0:8a6003b8bb5b 141
mborchers 0:8a6003b8bb5b 142 uint16_t drive_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[1];
mborchers 0:8a6003b8bb5b 143 uint8_t drive_valid = RadioDecoder_registerDataBuffer->channelValid[1];
mborchers 0:8a6003b8bb5b 144
mborchers 0:8a6003b8bb5b 145 uint16_t steer_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[2];
mborchers 0:8a6003b8bb5b 146 uint8_t steer_valid = RadioDecoder_registerDataBuffer->channelValid[2];
mborchers 0:8a6003b8bb5b 147
mborchers 0:8a6003b8bb5b 148
mborchers 0:8a6003b8bb5b 149 if (rc_percentage > (uint16_t) 1800 && rc_valid != 0) {
mborchers 0:8a6003b8bb5b 150 // oben => Wettbewerb
mborchers 0:8a6003b8bb5b 151 supportSystem->setLightManagerRemoteLight(false, true);
mborchers 0:8a6003b8bb5b 152 if (!timer_started) {
mborchers 0:8a6003b8bb5b 153 timer_started = true;
mborchers 0:8a6003b8bb5b 154 machine_direction_control_timer.start(10);
mborchers 0:8a6003b8bb5b 155 quadrature_control_timer.start(10);
mborchers 0:8a6003b8bb5b 156 }
mborchers 0:8a6003b8bb5b 157 } else if (rc_percentage > (uint16_t) 1200 && rc_valid != 0) {
mborchers 0:8a6003b8bb5b 158 // unten => RC-Wettbewerb
mborchers 0:8a6003b8bb5b 159 supportSystem->setLightManagerRemoteLight(true, true);
mborchers 0:8a6003b8bb5b 160 if (drive_valid) {
mborchers 0:8a6003b8bb5b 161 drivePWM.pulsewidth_us(drive_percentage);
mborchers 0:8a6003b8bb5b 162 }
mborchers 0:8a6003b8bb5b 163 if (steer_valid) {
mborchers 0:8a6003b8bb5b 164 steerPWM.pulsewidth_us(steer_percentage);
mborchers 0:8a6003b8bb5b 165 }
mborchers 0:8a6003b8bb5b 166 if (timer_started) {
mborchers 0:8a6003b8bb5b 167 timer_started = false;
mborchers 0:8a6003b8bb5b 168 machine_direction_control_timer.stop();
mborchers 0:8a6003b8bb5b 169 quadrature_control_timer.stop();
mborchers 0:8a6003b8bb5b 170 }
mborchers 0:8a6003b8bb5b 171 } else if (rc_percentage > (uint16_t) 800 && rc_valid != 0) {
mborchers 0:8a6003b8bb5b 172 // mitte => RC-Training
mborchers 0:8a6003b8bb5b 173 supportSystem->setLightManagerRemoteLight(true, true);
mborchers 0:8a6003b8bb5b 174 if (drive_valid) {
mborchers 0:8a6003b8bb5b 175 drivePWM.pulsewidth_us(drive_percentage);
mborchers 0:8a6003b8bb5b 176 }
mborchers 0:8a6003b8bb5b 177 if (steer_valid) {
mborchers 0:8a6003b8bb5b 178 steerPWM.pulsewidth_us(steer_percentage);
mborchers 0:8a6003b8bb5b 179 }
mborchers 0:8a6003b8bb5b 180 if (timer_started) {
mborchers 0:8a6003b8bb5b 181 timer_started = false;
mborchers 0:8a6003b8bb5b 182 machine_direction_control_timer.stop();
mborchers 0:8a6003b8bb5b 183 quadrature_control_timer.stop();
mborchers 0:8a6003b8bb5b 184 }
mborchers 0:8a6003b8bb5b 185 }
mborchers 0:8a6003b8bb5b 186
mborchers 0:8a6003b8bb5b 187 velocity_imu_queue = IMU_registerDataBuffer->velocityXFilteredRegister;
mborchers 0:8a6003b8bb5b 188 imu_queue_velocity.put(&velocity_imu_queue);
mborchers 0:8a6003b8bb5b 189
mborchers 0:8a6003b8bb5b 190 float radius = IMU_registerDataBuffer->velocityXFilteredRegister/IMU_registerDataBuffer->velocityAngularFilteredRegister;
mborchers 0:8a6003b8bb5b 191
mborchers 0:8a6003b8bb5b 192 steering_angle_imu_queue = atan(0.205/radius)*180/PI;
mborchers 0:8a6003b8bb5b 193 imu_queue_steering_angle.put(&steering_angle_imu_queue);
mborchers 0:8a6003b8bb5b 194
mborchers 0:8a6003b8bb5b 195
mborchers 2:bf739d7d9f8f 196 //serialMinnow.printf("%ld, ", difference_millis);
mborchers 7:c5940ae7773a 197 //serialMinnow.printf("%f, ", velocity_minnow_queue);
mborchers 7:c5940ae7773a 198 //serialMinnow.printf("%f, ", steering_angle_minnow_queue);
mborchers 7:c5940ae7773a 199 //serialMinnow.printf("%d, ", IMU_registerDataBuffer->curveRadiusRegister);
mborchers 7:c5940ae7773a 200 //serialMinnow.printf("%f, ", IMU_registerDataBuffer->velocityAngularRegister);
mborchers 7:c5940ae7773a 201 //serialMinnow.printf("%f, ", IMU_registerDataBuffer->velocityAngularFilteredRegister);
mborchers 7:c5940ae7773a 202 //serialMinnow.printf("%f, ", IMU_registerDataBuffer->velocityXRegister);
mborchers 7:c5940ae7773a 203 //serialMinnow.printf("%f\r\n", IMU_registerDataBuffer->velocityXFilteredRegister);
mborchers 13:34f7f783ad24 204 Thread::wait(10);
mborchers 0:8a6003b8bb5b 205 }
mborchers 0:8a6003b8bb5b 206 }
mborchers 10:f92664a22d02 207
mborchers 10:f92664a22d02 208 void hearbeat_thread(void const *args) {
mborchers 10:f92664a22d02 209 while(true) {
mborchers 13:34f7f783ad24 210 heartbeatLED = !heartbeatLED;
mborchers 10:f92664a22d02 211 Thread::wait(100);
mborchers 10:f92664a22d02 212 }
mborchers 10:f92664a22d02 213 }