
Programm zur Darstellung der Lage eines Objektes im Raum mit Hilfe eines Beschleunigungssensores, 4 LED's und einem LCD-Display.
LED.cpp@19:51747c0ab062, 2016-07-12 (annotated)
- Committer:
- Schreeker
- Date:
- Tue Jul 12 14:49:28 2016 +0000
- Revision:
- 19:51747c0ab062
- Parent:
- 18:b26d88b7b370
- Child:
- 20:094cdb790dcb
if-Bedingung der Ueberkopflage erweitert mit X und Y Winkel, damit bei >80 Grad Ueberkopflage eintritt. ZDaten weiterhin notwendig fuer Ueberkopflagedetektion. Periode PWM auf 10 ms verringert wegen flimmern. 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 | 15:462c8c89fe35 | 16 | /* Variabeln */ |
Schreeker | 15:462c8c89fe35 | 17 | /* Erzeugen eines Hystereseverhaltens bei Überkopflage und Normallage aufgrund der Schwankungen |
Schreeker | 15:462c8c89fe35 | 18 | bei den Werten des Accelometers */ |
Schreeker | 15:462c8c89fe35 | 19 | |
Schreeker | 19:51747c0ab062 | 20 | #define UGrenzZUeberkopf 17350 // X oder Y größer 81° |
Schreeker | 19:51747c0ab062 | 21 | #define UGrenzZNormal 17600 // X oder Y kleiner ungefähr 80° |
Schreeker | 15:462c8c89fe35 | 22 | |
Schreeker | 10:d566927efac6 | 23 | /*Konfiguriert die angegebenen Pins als pulsweitenmodulierte Ausgänge*/ |
Schreeker | 11:5861bc23022a | 24 | PwmOut oLEDXN(PB_15); |
Schreeker | 11:5861bc23022a | 25 | PwmOut oLEDXP(PB_14); |
Schreeker | 11:5861bc23022a | 26 | PwmOut oLEDYN(PB_13); |
Schreeker | 11:5861bc23022a | 27 | PwmOut oLEDYP(PA_11); |
Schreeker | 10:d566927efac6 | 28 | |
Schreeker | 10:d566927efac6 | 29 | /************************************************************************************ |
Schreeker | 10:d566927efac6 | 30 | * void setLED(struct WinkelData stWinkelData) |
Schreeker | 10:d566927efac6 | 31 | * Zweck: Steuerung der vier LED's auf Basis der berechneten Winkel in stWinkelData. |
Schreeker | 10:d566927efac6 | 32 | 1. Auswerten der Z-Achse, ob Überkopflage oder nicht |
Schreeker | 10:d566927efac6 | 33 | 2. Ansteurung der LED's auf Basis der berechneten Winkel in stWinkelData |
Schreeker | 10:d566927efac6 | 34 | und Schritt 1. |
Schreeker | 10:d566927efac6 | 35 | * Parameter: |
Schreeker | 15:462c8c89fe35 | 36 | wWinkelX: aktueller Winkel bezogen auf die X-Achse des Beschleunigungssensores |
Schreeker | 15:462c8c89fe35 | 37 | wWinkelY: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores |
Schreeker | 19:51747c0ab062 | 38 | wSpannungZ: aktueller Winkel bezogen auf die Y-Achse des Beschleunigungssensores |
Schreeker | 10:d566927efac6 | 39 | * return Parameter: |
Schreeker | 15:462c8c89fe35 | 40 | bStateLCD: LCD zeigt Winkel an (0) oder Textnachricht Überkopflage (1) |
Schreeker | 10:d566927efac6 | 41 | *************************************************************************************/ |
Schreeker | 19:51747c0ab062 | 42 | byte setLED(int16 wWinkelX, int16 wWinkelY, int16 wSpannungZ){ |
Schreeker | 10:d566927efac6 | 43 | /* Variabeln */ |
Schreeker | 15:462c8c89fe35 | 44 | byte bStateLED = 0; // Zustand des Lagesensors ( 0: Normallage 1: Überkopflage) |
Schreeker | 15:462c8c89fe35 | 45 | byte bStateLCD = 0; // Zustand der LCD-Anzeige ( 0: Winkelausgabe 1: Textnachricht Überkopflage) |
Schreeker | 15:462c8c89fe35 | 46 | |
Schreeker | 10:d566927efac6 | 47 | /* Auswertung der Z-Achsendaten */ |
Schreeker | 19:51747c0ab062 | 48 | if (abs(wWinkelX) > 80 || abs(wWinkelY) > 80 || wSpannungZ < UGrenzZUeberkopf){ // Überkopflage |
Schreeker | 15:462c8c89fe35 | 49 | bStateLED = 1; |
Schreeker | 15:462c8c89fe35 | 50 | bStateLCD = 1; |
Schreeker | 15:462c8c89fe35 | 51 | } |
Schreeker | 19:51747c0ab062 | 52 | if (abs(wWinkelX) < 80 && abs(wWinkelY) < 80 && wSpannungZ > UGrenzZNormal){ // Normallage |
Schreeker | 15:462c8c89fe35 | 53 | bStateLED = 0; |
Schreeker | 15:462c8c89fe35 | 54 | bStateLCD = 0; |
Schreeker | 15:462c8c89fe35 | 55 | } |
Schreeker | 15:462c8c89fe35 | 56 | |
Schreeker | 10:d566927efac6 | 57 | /* Einstellen der LED's */ |
Schreeker | 15:462c8c89fe35 | 58 | switch(bStateLED){ |
Schreeker | 15:462c8c89fe35 | 59 | case 0:{ // Normallage, einstellen der LED-Helligkeit abhängig vom Winkel |
Schreeker | 15:462c8c89fe35 | 60 | if(wWinkelX <= 0){ |
Schreeker | 18:b26d88b7b370 | 61 | oLEDXN = abs(wWinkelX/80.0); |
Schreeker | 15:462c8c89fe35 | 62 | oLEDXP = 0; |
Schreeker | 15:462c8c89fe35 | 63 | } else { |
Schreeker | 18:b26d88b7b370 | 64 | oLEDXP = abs(wWinkelX/80.0); |
Schreeker | 15:462c8c89fe35 | 65 | oLEDXN = 0; |
Schreeker | 15:462c8c89fe35 | 66 | } |
Schreeker | 15:462c8c89fe35 | 67 | if(wWinkelY <= 0){ |
Schreeker | 18:b26d88b7b370 | 68 | oLEDYN = abs(wWinkelY/80.0); |
Schreeker | 15:462c8c89fe35 | 69 | oLEDYP = 0; |
Schreeker | 15:462c8c89fe35 | 70 | } else { |
Schreeker | 18:b26d88b7b370 | 71 | oLEDYP = abs(wWinkelY/80.0); |
Schreeker | 15:462c8c89fe35 | 72 | oLEDYN = 0; |
Schreeker | 15:462c8c89fe35 | 73 | } |
Schreeker | 15:462c8c89fe35 | 74 | break; |
Schreeker | 15:462c8c89fe35 | 75 | } |
Schreeker | 15:462c8c89fe35 | 76 | case 1:{ // Überkopflage, LED's blinken |
Schreeker | 15:462c8c89fe35 | 77 | if(oLEDXN.read()> 0){ |
Schreeker | 15:462c8c89fe35 | 78 | oLEDXN = 0; |
Schreeker | 15:462c8c89fe35 | 79 | oLEDXP = 0; |
Schreeker | 15:462c8c89fe35 | 80 | oLEDYN = 0; |
Schreeker | 15:462c8c89fe35 | 81 | oLEDYP = 0; |
Schreeker | 15:462c8c89fe35 | 82 | } |
Schreeker | 15:462c8c89fe35 | 83 | else{ |
Schreeker | 15:462c8c89fe35 | 84 | oLEDXN = 1; |
Schreeker | 15:462c8c89fe35 | 85 | oLEDXP = 1; |
Schreeker | 15:462c8c89fe35 | 86 | oLEDYN = 1; |
Schreeker | 15:462c8c89fe35 | 87 | oLEDYP = 1; |
Schreeker | 15:462c8c89fe35 | 88 | } |
Schreeker | 15:462c8c89fe35 | 89 | break; |
Schreeker | 15:462c8c89fe35 | 90 | } |
Schreeker | 15:462c8c89fe35 | 91 | default: break; |
Schreeker | 15:462c8c89fe35 | 92 | } |
Schreeker | 15:462c8c89fe35 | 93 | |
Schreeker | 15:462c8c89fe35 | 94 | /* Return */ |
Schreeker | 15:462c8c89fe35 | 95 | return bStateLCD; |
Schreeker | 12:7c9c5a541380 | 96 | } |
Schreeker | 12:7c9c5a541380 | 97 | |
Schreeker | 12:7c9c5a541380 | 98 | /************************************************************************************ |
Schreeker | 12:7c9c5a541380 | 99 | * void void initLED() |
Schreeker | 12:7c9c5a541380 | 100 | * Zweck: Blinken der LED's beim Anschalten des Boards. 4x Blinken im 250ms Abstand |
Schreeker | 12:7c9c5a541380 | 101 | * Parameter: |
Schreeker | 12:7c9c5a541380 | 102 | keine |
Schreeker | 12:7c9c5a541380 | 103 | * return Parameter: |
Schreeker | 12:7c9c5a541380 | 104 | keine |
Schreeker | 12:7c9c5a541380 | 105 | *************************************************************************************/ |
Schreeker | 12:7c9c5a541380 | 106 | void initLED(){ |
Schreeker | 12:7c9c5a541380 | 107 | /* Variabeln */ |
Schreeker | 12:7c9c5a541380 | 108 | int i = 0; |
Schreeker | 12:7c9c5a541380 | 109 | |
Schreeker | 12:7c9c5a541380 | 110 | /* Setzen der PWM-Periode auf 20ms */ |
Schreeker | 19:51747c0ab062 | 111 | oLEDXN.period_ms(10); |
Schreeker | 19:51747c0ab062 | 112 | oLEDXP.period_ms(10); |
Schreeker | 19:51747c0ab062 | 113 | oLEDYN.period_ms(10); |
Schreeker | 19:51747c0ab062 | 114 | oLEDYP.period_ms(10); |
Schreeker | 12:7c9c5a541380 | 115 | |
Schreeker | 12:7c9c5a541380 | 116 | /* 4x Blinken der LED's mit 250ms Pause dazwischen*/ |
Schreeker | 12:7c9c5a541380 | 117 | while(i<8){ |
Schreeker | 12:7c9c5a541380 | 118 | /* Toggeln der LED's */ |
Schreeker | 12:7c9c5a541380 | 119 | oLEDXN = ((int)oLEDXN.read()+1) % 2; |
Schreeker | 12:7c9c5a541380 | 120 | oLEDXP = ((int)oLEDXP.read()+1) % 2; |
Schreeker | 12:7c9c5a541380 | 121 | oLEDYN = ((int)oLEDYN.read()+1) % 2; |
Schreeker | 12:7c9c5a541380 | 122 | oLEDYP = ((int)oLEDYP.read()+1) % 2; |
Schreeker | 12:7c9c5a541380 | 123 | |
Schreeker | 12:7c9c5a541380 | 124 | /* Warten */ |
Schreeker | 12:7c9c5a541380 | 125 | wait_ms(250); |
Schreeker | 12:7c9c5a541380 | 126 | |
Schreeker | 12:7c9c5a541380 | 127 | /* Zählvariabel erhöhen */ |
Schreeker | 12:7c9c5a541380 | 128 | ++i; |
Schreeker | 12:7c9c5a541380 | 129 | } |
Schreeker | 12:7c9c5a541380 | 130 | } |