Sophia Hölzl
/
Diplomarbeit_Augimeter_V2
Die zweite Version der Diplomarbeit
Revision 0:d2197672dfca, committed 2018-04-05
- Comitter:
- sophia
- Date:
- Thu Apr 05 06:53:03 2018 +0000
- Commit message:
- DIplomarbeit Version 2
Changed in this revision
diff -r 000000000000 -r d2197672dfca Servo.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Servo.lib Thu Apr 05 06:53:03 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/sophia/code/Servo/#1513875e653f
diff -r 000000000000 -r d2197672dfca main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Apr 05 06:53:03 2018 +0000 @@ -0,0 +1,227 @@ +#include "mbed.h" +#include "Servo.h" // Servo + + +//Schrittmotor +DigitalOut enable(p24); // um den Schrittmotor ein- und ausschalten zu können +DigitalOut step(p23); // ist dieser Pin HIGH, macht der Schrittmotor einen Schritt +DigitalOut dir(p22); // zum Ändern der Drehrichtung des Schrittmotors +Timer t; + + + +//Servo +Servo servo_radius(p26); //Servomotor zum Ändern des Radius +Servo servo_phi(p25); //Servomotor zum Ändern des WInkel phi +int _posr; //für das Speichern und Übergeben des aktuellen Radius +int _posphi; //für das Speichern und Übergeben des aktuellen Winkels phi + +//Buttons +InterruptIn btn (p20); //schwarzer??? Button; zum Weiterschalten der States +InterruptIn btn_gross(p19); // zum Richtungswechsel des Schrittmotors im ST_KINN + // wird gedrückt, wenn der Laserpunkt gesehen wird + +//Laser +DigitalOut laser(p21); + +//Serielle +Serial pc(USBTX, USBRX); // zur Übertragung der Daten an den Computer über eine Serielle Schnittstelle + +//Funktionen +void onestep(); //Schrittmotor bewegt sich um eine, mit der Hardware festgelegten, Schrittweite +void changedir(); //Richtungsänderung des Schrittmotors +void position(); //Position umrechnen und übertragen +void rad_neg(); //Radius von -90 bis 0 abfahren +void rad_pos(); //Radius von 90 bis 0 abfahren +void muster(); // das ganze Muster, dass abgefahren wird +void Init(); +void ButtonInterrupt(); +void ButtonGehalten(); +void ButtonDoppeldrueck(); + + + +//Statemachine +int state; +void funk_nichts(); +void funk_kinn(); +void funk_links(); +void funk_rechts(); + +const int ST_NICHTS = 1; +const int ST_KINN = 2; +const int ST_LINKS = 3; +const int ST_RECHTS = 4; + +int main(void) { + Init(); + while(1) { + if(state == ST_NICHTS) + funk_nichts(); + if(state== ST_KINN) + funk_kinn(); + if(state == ST_LINKS) + funk_links(); + if(state == ST_RECHTS) + funk_rechts(); + + } +} + +void Init() +{ + state = 1; +} + +void funk_nichts() +{ + pc.printf("xHalten Sie ihre Augen auf der Hoehe des schwarzen Kreuzes.\n "); + pc.printf("xST_NICHTS"); + while(1) + { + if(btn == 1) + { + state= ST_KINN; + return; + } + } +} + +void funk_kinn() +{ + pc.printf("xHalten Sie den Knopf so lange gedrueckt bis die gewuenschte Hoehe erreicht ist.\n"); + pc.printf("xUm die Richtung zu aendern druecken Sie den Knopf doppelt.\n"); + + dir = 0; + btn_gross.rise(&ButtonInterrupt); + t.start(); + while(1) + { + if(btn == 1) + { + state = ST_LINKS; + return; + } + } +} + +void funk_links() +{ + pc.printf("xLinkes Auge \n "); + pc.printf("xST_LINKS"); + btn_gross.rise(&position); + muster(); + while(1) + { + if(btn == 1) + { + state= ST_RECHTS; + return; + } + } +} + +void funk_rechts() +{ + pc.printf("xRechtes Auge \n "); + pc.printf("xST_RECHTS"); + btn_gross.rise(&position); + muster(); + while(1) + { + if(btn == 1) + { + state= ST_NICHTS; + return; + } +} +} +void position() //auslesen Position +{ + int x = (_posr * cos((double)_posphi * 3.1415/180) + 100); + int y = 100-(_posr * sin((double)_posphi * 3.1415/180)) + 100; + pc.printf("%d %d\n", x, y); +} + +void rad_neg() //Radius von -90 bis 0) +{ + for (int i = -90; i <= 0; i+=10) { + servo_radius.position(i); + _posr = -i; // fürs umrechnen (Radius ist somit immer zwischen 0 und 90 + laser = 1; + wait(1); + laser = 0; + wait(1); + + } +} + +void rad_pos() //Radius von 90 bis 0) +{ + for (int i = 90; i >=0; i-=10) { + servo_radius.position(i); + _posr = i; + laser = 1; + wait(1); + laser = 0; + wait(1); + + } +} + +void muster() // abgefahrenes Muster +{ + for(int i = -90; i< 90; i+= 15) { //Winkel + servo_phi.position(i); + //_posphi = i; + _posphi = 360-(i + 90); // für Berechnung, die Winkel gehen nun von 0 bis 180 + //straightoben(); + rad_pos(); + + } + + for(int i = -90; i< 90; i+= 15) { //Winkel + servo_phi.position(i); + //_posphi = i; + _posphi = 360-(i + 270); // für Berechnung, die Winkel gehen nun von 180 bis 360 + //straightunten(); + rad_neg(); + + } +} + +void ButtonInterrupt() +{ + t.reset(); + + while(btn_gross) + { + if(t.read_ms() >= 1000) + { + ButtonGehalten(); + return; + } + } + + while(t.read_ms() <= 1000) + { + if(btn_gross) + ButtonDoppeldrueck(); + } +} + +void ButtonGehalten() +{ + while(btn_gross) + { + step = 1; + wait_ms(10); + step = 0; + wait_ms(10); + } +} + +void ButtonDoppeldrueck() +{ + dir = !dir; +} \ No newline at end of file
diff -r 000000000000 -r d2197672dfca mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Apr 05 06:53:03 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/994bdf8177cb \ No newline at end of file