Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.

Dependencies:   TextLCD mbed

Committer:
Schreeker
Date:
Sun Jul 03 12:00:47 2016 +0000
Revision:
15:462c8c89fe35
Parent:
12:7c9c5a541380
Child:
16:9b20d24aae18
Lagesensor abgeschlossen. Kalibrierung +- 80 Grad sehr ungenau, evtl ab 80 Ueberkopflage einstellen? setLED hinzugefuegt komplett. setLCD erweitert mit bStateLCD zum Anzeigen der Ueberkopflage oder der Winkel im Normalfall. Simon Rutzen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Schreeker 8:0270c3e374f7 1 /**********************************************************************************
Schreeker 11:5861bc23022a 2 * File name: LED.cpp
Schreeker 8:0270c3e374f7 3 * Zweck: Beinhaltet alle Funktionen zur Einstellung der LED-Helligkeit
Schreeker 8:0270c3e374f7 4 in Abhängigkeit von den berechneten Winkeln.
Schreeker 8:0270c3e374f7 5 * Author: Simon Rutzen, Nils Kemmer
Schreeker 8:0270c3e374f7 6 * Changes: keine
Schreeker 8:0270c3e374f7 7 ***********************************************************************************/
Schreeker 8:0270c3e374f7 8
Schreeker 8:0270c3e374f7 9 /* Zu benutzende Pins */
Schreeker 8:0270c3e374f7 10 // PWM1 - Channel 1N (PB_15), 2N (PB_14), 3N (PB_13) und 4 (PA_11)
Schreeker 8:0270c3e374f7 11
Schreeker 10:d566927efac6 12 /* Include */
Schreeker 10:d566927efac6 13 #include "mbed.h"
Schreeker 10:d566927efac6 14 #include "Sensor.h"
Schreeker 10:d566927efac6 15
Schreeker 10:d566927efac6 16 /* Externe Variablen */
Schreeker 10:d566927efac6 17 extern struct WinkelData stWinkelData;
Schreeker 10:d566927efac6 18
Schreeker 15:462c8c89fe35 19 /* Variabeln */
Schreeker 15:462c8c89fe35 20 /* Erzeugen eines Hystereseverhaltens bei Überkopflage und Normallage aufgrund der Schwankungen
Schreeker 15:462c8c89fe35 21 bei den Werten des Accelometers */
Schreeker 15:462c8c89fe35 22
Schreeker 15:462c8c89fe35 23 #define UGrenzZUeberkopf 16954
Schreeker 15:462c8c89fe35 24 #define UGrenzZNormal 17100
Schreeker 15:462c8c89fe35 25
Schreeker 10:d566927efac6 26 /*Konfiguriert die angegebenen Pins als pulsweitenmodulierte Ausgänge*/
Schreeker 11:5861bc23022a 27 PwmOut oLEDXN(PB_15);
Schreeker 11:5861bc23022a 28 PwmOut oLEDXP(PB_14);
Schreeker 11:5861bc23022a 29 PwmOut oLEDYN(PB_13);
Schreeker 11:5861bc23022a 30 PwmOut oLEDYP(PA_11);
Schreeker 10:d566927efac6 31
Schreeker 10:d566927efac6 32 /************************************************************************************
Schreeker 10:d566927efac6 33 * void setLED(struct WinkelData stWinkelData)
Schreeker 10:d566927efac6 34 * Zweck: Steuerung der vier LED's auf Basis der berechneten Winkel in stWinkelData.
Schreeker 10:d566927efac6 35 1. Auswerten der Z-Achse, ob Überkopflage oder nicht
Schreeker 10:d566927efac6 36 2. Ansteurung der LED's auf Basis der berechneten Winkel in stWinkelData
Schreeker 10:d566927efac6 37 und Schritt 1.
Schreeker 10:d566927efac6 38 * Parameter:
Schreeker 15:462c8c89fe35 39 wWinkelX: aktueller Winkel bezogen auf die X-Achse des Beschleunigungssensores
Schreeker 15:462c8c89fe35 40 wWinkelY: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores
Schreeker 15:462c8c89fe35 41 wWinkelZ: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores
Schreeker 10:d566927efac6 42 * return Parameter:
Schreeker 15:462c8c89fe35 43 bStateLCD: LCD zeigt Winkel an (0) oder Textnachricht Überkopflage (1)
Schreeker 10:d566927efac6 44 *************************************************************************************/
Schreeker 15:462c8c89fe35 45 byte setLED(signed short int wWinkelX, signed short int wWinkelY, signed short int wWinkelZ){
Schreeker 10:d566927efac6 46 /* Variabeln */
Schreeker 15:462c8c89fe35 47 byte bStateLED = 0; // Zustand des Lagesensors ( 0: Normallage 1: Überkopflage)
Schreeker 15:462c8c89fe35 48 byte bStateLCD = 0; // Zustand der LCD-Anzeige ( 0: Winkelausgabe 1: Textnachricht Überkopflage)
Schreeker 15:462c8c89fe35 49
Schreeker 10:d566927efac6 50 /* Auswertung der Z-Achsendaten */
Schreeker 15:462c8c89fe35 51 if (wWinkelZ < UGrenzZUeberkopf){ // Überkopflage
Schreeker 15:462c8c89fe35 52 bStateLED = 1;
Schreeker 15:462c8c89fe35 53 bStateLCD = 1;
Schreeker 15:462c8c89fe35 54 }
Schreeker 15:462c8c89fe35 55 if (wWinkelZ > UGrenzZNormal){ // Normallage
Schreeker 15:462c8c89fe35 56 bStateLED = 0;
Schreeker 15:462c8c89fe35 57 bStateLCD = 0;
Schreeker 15:462c8c89fe35 58 }
Schreeker 15:462c8c89fe35 59
Schreeker 10:d566927efac6 60 /* Einstellen der LED's */
Schreeker 15:462c8c89fe35 61 switch(bStateLED){
Schreeker 15:462c8c89fe35 62 case 0:{ // Normallage, einstellen der LED-Helligkeit abhängig vom Winkel
Schreeker 15:462c8c89fe35 63 if(wWinkelX <= 0){
Schreeker 15:462c8c89fe35 64 oLEDXN = abs(wWinkelX/90.0);
Schreeker 15:462c8c89fe35 65 oLEDXP = 0;
Schreeker 15:462c8c89fe35 66 } else {
Schreeker 15:462c8c89fe35 67 oLEDXP = abs(wWinkelX/90.0);
Schreeker 15:462c8c89fe35 68 oLEDXN = 0;
Schreeker 15:462c8c89fe35 69 }
Schreeker 15:462c8c89fe35 70 if(wWinkelY <= 0){
Schreeker 15:462c8c89fe35 71 oLEDYN = abs(wWinkelY/90.0);
Schreeker 15:462c8c89fe35 72 oLEDYP = 0;
Schreeker 15:462c8c89fe35 73 } else {
Schreeker 15:462c8c89fe35 74 oLEDYP = abs(wWinkelY/90.0);
Schreeker 15:462c8c89fe35 75 oLEDYN = 0;
Schreeker 15:462c8c89fe35 76 }
Schreeker 15:462c8c89fe35 77 break;
Schreeker 15:462c8c89fe35 78 }
Schreeker 15:462c8c89fe35 79 case 1:{ // Überkopflage, LED's blinken
Schreeker 15:462c8c89fe35 80 if(oLEDXN.read()> 0){
Schreeker 15:462c8c89fe35 81 oLEDXN = 0;
Schreeker 15:462c8c89fe35 82 oLEDXP = 0;
Schreeker 15:462c8c89fe35 83 oLEDYN = 0;
Schreeker 15:462c8c89fe35 84 oLEDYP = 0;
Schreeker 15:462c8c89fe35 85 }
Schreeker 15:462c8c89fe35 86 else{
Schreeker 15:462c8c89fe35 87 oLEDXN = 1;
Schreeker 15:462c8c89fe35 88 oLEDXP = 1;
Schreeker 15:462c8c89fe35 89 oLEDYN = 1;
Schreeker 15:462c8c89fe35 90 oLEDYP = 1;
Schreeker 15:462c8c89fe35 91 }
Schreeker 15:462c8c89fe35 92 break;
Schreeker 15:462c8c89fe35 93 }
Schreeker 15:462c8c89fe35 94 default: break;
Schreeker 15:462c8c89fe35 95 }
Schreeker 15:462c8c89fe35 96
Schreeker 15:462c8c89fe35 97 /* Return */
Schreeker 15:462c8c89fe35 98 return bStateLCD;
Schreeker 12:7c9c5a541380 99 }
Schreeker 12:7c9c5a541380 100
Schreeker 12:7c9c5a541380 101 /************************************************************************************
Schreeker 12:7c9c5a541380 102 * void void initLED()
Schreeker 12:7c9c5a541380 103 * Zweck: Blinken der LED's beim Anschalten des Boards. 4x Blinken im 250ms Abstand
Schreeker 12:7c9c5a541380 104 * Parameter:
Schreeker 12:7c9c5a541380 105 keine
Schreeker 12:7c9c5a541380 106 * return Parameter:
Schreeker 12:7c9c5a541380 107 keine
Schreeker 12:7c9c5a541380 108 *************************************************************************************/
Schreeker 12:7c9c5a541380 109 void initLED(){
Schreeker 12:7c9c5a541380 110 /* Variabeln */
Schreeker 12:7c9c5a541380 111 int i = 0;
Schreeker 12:7c9c5a541380 112
Schreeker 12:7c9c5a541380 113 /* Setzen der PWM-Periode auf 20ms */
Schreeker 12:7c9c5a541380 114 oLEDXN.period_ms(20);
Schreeker 12:7c9c5a541380 115 oLEDXP.period_ms(20);
Schreeker 12:7c9c5a541380 116 oLEDYN.period_ms(20);
Schreeker 12:7c9c5a541380 117 oLEDYP.period_ms(20);
Schreeker 12:7c9c5a541380 118
Schreeker 12:7c9c5a541380 119 /* 4x Blinken der LED's mit 250ms Pause dazwischen*/
Schreeker 12:7c9c5a541380 120 while(i<8){
Schreeker 12:7c9c5a541380 121 /* Toggeln der LED's */
Schreeker 12:7c9c5a541380 122 oLEDXN = ((int)oLEDXN.read()+1) % 2;
Schreeker 12:7c9c5a541380 123 oLEDXP = ((int)oLEDXP.read()+1) % 2;
Schreeker 12:7c9c5a541380 124 oLEDYN = ((int)oLEDYN.read()+1) % 2;
Schreeker 12:7c9c5a541380 125 oLEDYP = ((int)oLEDYP.read()+1) % 2;
Schreeker 12:7c9c5a541380 126
Schreeker 12:7c9c5a541380 127 /* Warten */
Schreeker 12:7c9c5a541380 128 wait_ms(250);
Schreeker 12:7c9c5a541380 129
Schreeker 12:7c9c5a541380 130 /* Zählvariabel erhöhen */
Schreeker 12:7c9c5a541380 131 ++i;
Schreeker 12:7c9c5a541380 132 }
Schreeker 12:7c9c5a541380 133 }