Sophia Hölzl
/
Diplomarbeit_Augimeter_V2
Die zweite Version der Diplomarbeit
main.cpp@0:d2197672dfca, 2018-04-05 (annotated)
- Committer:
- sophia
- Date:
- Thu Apr 05 06:53:03 2018 +0000
- Revision:
- 0:d2197672dfca
DIplomarbeit Version 2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |