Die zweite Version der Diplomarbeit

Dependencies:   Servo mbed

Committer:
sophia
Date:
Thu Apr 05 06:53:03 2018 +0000
Revision:
0:d2197672dfca
DIplomarbeit Version 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sophia 0:d2197672dfca 1 #include "mbed.h"
sophia 0:d2197672dfca 2 #include "Servo.h" // Servo
sophia 0:d2197672dfca 3
sophia 0:d2197672dfca 4
sophia 0:d2197672dfca 5 //Schrittmotor
sophia 0:d2197672dfca 6 DigitalOut enable(p24); // um den Schrittmotor ein- und ausschalten zu können
sophia 0:d2197672dfca 7 DigitalOut step(p23); // ist dieser Pin HIGH, macht der Schrittmotor einen Schritt
sophia 0:d2197672dfca 8 DigitalOut dir(p22); // zum Ändern der Drehrichtung des Schrittmotors
sophia 0:d2197672dfca 9 Timer t;
sophia 0:d2197672dfca 10
sophia 0:d2197672dfca 11
sophia 0:d2197672dfca 12
sophia 0:d2197672dfca 13 //Servo
sophia 0:d2197672dfca 14 Servo servo_radius(p26); //Servomotor zum Ändern des Radius
sophia 0:d2197672dfca 15 Servo servo_phi(p25); //Servomotor zum Ändern des WInkel phi
sophia 0:d2197672dfca 16 int _posr; //für das Speichern und Übergeben des aktuellen Radius
sophia 0:d2197672dfca 17 int _posphi; //für das Speichern und Übergeben des aktuellen Winkels phi
sophia 0:d2197672dfca 18
sophia 0:d2197672dfca 19 //Buttons
sophia 0:d2197672dfca 20 InterruptIn btn (p20); //schwarzer??? Button; zum Weiterschalten der States
sophia 0:d2197672dfca 21 InterruptIn btn_gross(p19); // zum Richtungswechsel des Schrittmotors im ST_KINN
sophia 0:d2197672dfca 22 // wird gedrückt, wenn der Laserpunkt gesehen wird
sophia 0:d2197672dfca 23
sophia 0:d2197672dfca 24 //Laser
sophia 0:d2197672dfca 25 DigitalOut laser(p21);
sophia 0:d2197672dfca 26
sophia 0:d2197672dfca 27 //Serielle
sophia 0:d2197672dfca 28 Serial pc(USBTX, USBRX); // zur Übertragung der Daten an den Computer über eine Serielle Schnittstelle
sophia 0:d2197672dfca 29
sophia 0:d2197672dfca 30 //Funktionen
sophia 0:d2197672dfca 31 void onestep(); //Schrittmotor bewegt sich um eine, mit der Hardware festgelegten, Schrittweite
sophia 0:d2197672dfca 32 void changedir(); //Richtungsänderung des Schrittmotors
sophia 0:d2197672dfca 33 void position(); //Position umrechnen und übertragen
sophia 0:d2197672dfca 34 void rad_neg(); //Radius von -90 bis 0 abfahren
sophia 0:d2197672dfca 35 void rad_pos(); //Radius von 90 bis 0 abfahren
sophia 0:d2197672dfca 36 void muster(); // das ganze Muster, dass abgefahren wird
sophia 0:d2197672dfca 37 void Init();
sophia 0:d2197672dfca 38 void ButtonInterrupt();
sophia 0:d2197672dfca 39 void ButtonGehalten();
sophia 0:d2197672dfca 40 void ButtonDoppeldrueck();
sophia 0:d2197672dfca 41
sophia 0:d2197672dfca 42
sophia 0:d2197672dfca 43
sophia 0:d2197672dfca 44 //Statemachine
sophia 0:d2197672dfca 45 int state;
sophia 0:d2197672dfca 46 void funk_nichts();
sophia 0:d2197672dfca 47 void funk_kinn();
sophia 0:d2197672dfca 48 void funk_links();
sophia 0:d2197672dfca 49 void funk_rechts();
sophia 0:d2197672dfca 50
sophia 0:d2197672dfca 51 const int ST_NICHTS = 1;
sophia 0:d2197672dfca 52 const int ST_KINN = 2;
sophia 0:d2197672dfca 53 const int ST_LINKS = 3;
sophia 0:d2197672dfca 54 const int ST_RECHTS = 4;
sophia 0:d2197672dfca 55
sophia 0:d2197672dfca 56 int main(void) {
sophia 0:d2197672dfca 57 Init();
sophia 0:d2197672dfca 58 while(1) {
sophia 0:d2197672dfca 59 if(state == ST_NICHTS)
sophia 0:d2197672dfca 60 funk_nichts();
sophia 0:d2197672dfca 61 if(state== ST_KINN)
sophia 0:d2197672dfca 62 funk_kinn();
sophia 0:d2197672dfca 63 if(state == ST_LINKS)
sophia 0:d2197672dfca 64 funk_links();
sophia 0:d2197672dfca 65 if(state == ST_RECHTS)
sophia 0:d2197672dfca 66 funk_rechts();
sophia 0:d2197672dfca 67
sophia 0:d2197672dfca 68 }
sophia 0:d2197672dfca 69 }
sophia 0:d2197672dfca 70
sophia 0:d2197672dfca 71 void Init()
sophia 0:d2197672dfca 72 {
sophia 0:d2197672dfca 73 state = 1;
sophia 0:d2197672dfca 74 }
sophia 0:d2197672dfca 75
sophia 0:d2197672dfca 76 void funk_nichts()
sophia 0:d2197672dfca 77 {
sophia 0:d2197672dfca 78 pc.printf("xHalten Sie ihre Augen auf der Hoehe des schwarzen Kreuzes.\n ");
sophia 0:d2197672dfca 79 pc.printf("xST_NICHTS");
sophia 0:d2197672dfca 80 while(1)
sophia 0:d2197672dfca 81 {
sophia 0:d2197672dfca 82 if(btn == 1)
sophia 0:d2197672dfca 83 {
sophia 0:d2197672dfca 84 state= ST_KINN;
sophia 0:d2197672dfca 85 return;
sophia 0:d2197672dfca 86 }
sophia 0:d2197672dfca 87 }
sophia 0:d2197672dfca 88 }
sophia 0:d2197672dfca 89
sophia 0:d2197672dfca 90 void funk_kinn()
sophia 0:d2197672dfca 91 {
sophia 0:d2197672dfca 92 pc.printf("xHalten Sie den Knopf so lange gedrueckt bis die gewuenschte Hoehe erreicht ist.\n");
sophia 0:d2197672dfca 93 pc.printf("xUm die Richtung zu aendern druecken Sie den Knopf doppelt.\n");
sophia 0:d2197672dfca 94
sophia 0:d2197672dfca 95 dir = 0;
sophia 0:d2197672dfca 96 btn_gross.rise(&ButtonInterrupt);
sophia 0:d2197672dfca 97 t.start();
sophia 0:d2197672dfca 98 while(1)
sophia 0:d2197672dfca 99 {
sophia 0:d2197672dfca 100 if(btn == 1)
sophia 0:d2197672dfca 101 {
sophia 0:d2197672dfca 102 state = ST_LINKS;
sophia 0:d2197672dfca 103 return;
sophia 0:d2197672dfca 104 }
sophia 0:d2197672dfca 105 }
sophia 0:d2197672dfca 106 }
sophia 0:d2197672dfca 107
sophia 0:d2197672dfca 108 void funk_links()
sophia 0:d2197672dfca 109 {
sophia 0:d2197672dfca 110 pc.printf("xLinkes Auge \n ");
sophia 0:d2197672dfca 111 pc.printf("xST_LINKS");
sophia 0:d2197672dfca 112 btn_gross.rise(&position);
sophia 0:d2197672dfca 113 muster();
sophia 0:d2197672dfca 114 while(1)
sophia 0:d2197672dfca 115 {
sophia 0:d2197672dfca 116 if(btn == 1)
sophia 0:d2197672dfca 117 {
sophia 0:d2197672dfca 118 state= ST_RECHTS;
sophia 0:d2197672dfca 119 return;
sophia 0:d2197672dfca 120 }
sophia 0:d2197672dfca 121 }
sophia 0:d2197672dfca 122 }
sophia 0:d2197672dfca 123
sophia 0:d2197672dfca 124 void funk_rechts()
sophia 0:d2197672dfca 125 {
sophia 0:d2197672dfca 126 pc.printf("xRechtes Auge \n ");
sophia 0:d2197672dfca 127 pc.printf("xST_RECHTS");
sophia 0:d2197672dfca 128 btn_gross.rise(&position);
sophia 0:d2197672dfca 129 muster();
sophia 0:d2197672dfca 130 while(1)
sophia 0:d2197672dfca 131 {
sophia 0:d2197672dfca 132 if(btn == 1)
sophia 0:d2197672dfca 133 {
sophia 0:d2197672dfca 134 state= ST_NICHTS;
sophia 0:d2197672dfca 135 return;
sophia 0:d2197672dfca 136 }
sophia 0:d2197672dfca 137 }
sophia 0:d2197672dfca 138 }
sophia 0:d2197672dfca 139 void position() //auslesen Position
sophia 0:d2197672dfca 140 {
sophia 0:d2197672dfca 141 int x = (_posr * cos((double)_posphi * 3.1415/180) + 100);
sophia 0:d2197672dfca 142 int y = 100-(_posr * sin((double)_posphi * 3.1415/180)) + 100;
sophia 0:d2197672dfca 143 pc.printf("%d %d\n", x, y);
sophia 0:d2197672dfca 144 }
sophia 0:d2197672dfca 145
sophia 0:d2197672dfca 146 void rad_neg() //Radius von -90 bis 0)
sophia 0:d2197672dfca 147 {
sophia 0:d2197672dfca 148 for (int i = -90; i <= 0; i+=10) {
sophia 0:d2197672dfca 149 servo_radius.position(i);
sophia 0:d2197672dfca 150 _posr = -i; // fürs umrechnen (Radius ist somit immer zwischen 0 und 90
sophia 0:d2197672dfca 151 laser = 1;
sophia 0:d2197672dfca 152 wait(1);
sophia 0:d2197672dfca 153 laser = 0;
sophia 0:d2197672dfca 154 wait(1);
sophia 0:d2197672dfca 155
sophia 0:d2197672dfca 156 }
sophia 0:d2197672dfca 157 }
sophia 0:d2197672dfca 158
sophia 0:d2197672dfca 159 void rad_pos() //Radius von 90 bis 0)
sophia 0:d2197672dfca 160 {
sophia 0:d2197672dfca 161 for (int i = 90; i >=0; i-=10) {
sophia 0:d2197672dfca 162 servo_radius.position(i);
sophia 0:d2197672dfca 163 _posr = i;
sophia 0:d2197672dfca 164 laser = 1;
sophia 0:d2197672dfca 165 wait(1);
sophia 0:d2197672dfca 166 laser = 0;
sophia 0:d2197672dfca 167 wait(1);
sophia 0:d2197672dfca 168
sophia 0:d2197672dfca 169 }
sophia 0:d2197672dfca 170 }
sophia 0:d2197672dfca 171
sophia 0:d2197672dfca 172 void muster() // abgefahrenes Muster
sophia 0:d2197672dfca 173 {
sophia 0:d2197672dfca 174 for(int i = -90; i< 90; i+= 15) { //Winkel
sophia 0:d2197672dfca 175 servo_phi.position(i);
sophia 0:d2197672dfca 176 //_posphi = i;
sophia 0:d2197672dfca 177 _posphi = 360-(i + 90); // für Berechnung, die Winkel gehen nun von 0 bis 180
sophia 0:d2197672dfca 178 //straightoben();
sophia 0:d2197672dfca 179 rad_pos();
sophia 0:d2197672dfca 180
sophia 0:d2197672dfca 181 }
sophia 0:d2197672dfca 182
sophia 0:d2197672dfca 183 for(int i = -90; i< 90; i+= 15) { //Winkel
sophia 0:d2197672dfca 184 servo_phi.position(i);
sophia 0:d2197672dfca 185 //_posphi = i;
sophia 0:d2197672dfca 186 _posphi = 360-(i + 270); // für Berechnung, die Winkel gehen nun von 180 bis 360
sophia 0:d2197672dfca 187 //straightunten();
sophia 0:d2197672dfca 188 rad_neg();
sophia 0:d2197672dfca 189
sophia 0:d2197672dfca 190 }
sophia 0:d2197672dfca 191 }
sophia 0:d2197672dfca 192
sophia 0:d2197672dfca 193 void ButtonInterrupt()
sophia 0:d2197672dfca 194 {
sophia 0:d2197672dfca 195 t.reset();
sophia 0:d2197672dfca 196
sophia 0:d2197672dfca 197 while(btn_gross)
sophia 0:d2197672dfca 198 {
sophia 0:d2197672dfca 199 if(t.read_ms() >= 1000)
sophia 0:d2197672dfca 200 {
sophia 0:d2197672dfca 201 ButtonGehalten();
sophia 0:d2197672dfca 202 return;
sophia 0:d2197672dfca 203 }
sophia 0:d2197672dfca 204 }
sophia 0:d2197672dfca 205
sophia 0:d2197672dfca 206 while(t.read_ms() <= 1000)
sophia 0:d2197672dfca 207 {
sophia 0:d2197672dfca 208 if(btn_gross)
sophia 0:d2197672dfca 209 ButtonDoppeldrueck();
sophia 0:d2197672dfca 210 }
sophia 0:d2197672dfca 211 }
sophia 0:d2197672dfca 212
sophia 0:d2197672dfca 213 void ButtonGehalten()
sophia 0:d2197672dfca 214 {
sophia 0:d2197672dfca 215 while(btn_gross)
sophia 0:d2197672dfca 216 {
sophia 0:d2197672dfca 217 step = 1;
sophia 0:d2197672dfca 218 wait_ms(10);
sophia 0:d2197672dfca 219 step = 0;
sophia 0:d2197672dfca 220 wait_ms(10);
sophia 0:d2197672dfca 221 }
sophia 0:d2197672dfca 222 }
sophia 0:d2197672dfca 223
sophia 0:d2197672dfca 224 void ButtonDoppeldrueck()
sophia 0:d2197672dfca 225 {
sophia 0:d2197672dfca 226 dir = !dir;
sophia 0:d2197672dfca 227 }