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:
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?

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 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 }