
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
LED.cpp@15:462c8c89fe35, 2016-07-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |