Beiträge von Golpe
-
-
-
Ich versuche schon mich deutlich und verständlich genug mich auszudrücken, um keiner zu stören und so wenig Zeit wie möglich zu rauben.
(Dafür belese ich mich auch im Netz vor ich irgendwelche sinnlose Frage Stelle oder Thema erstelle).
Ich bedanke mich doch für deine Antworte, aber manche Aussagen kamen mir ein bisschen" Aggro" vor.
Spätestens, wenn mir so was vorkommt, zieh ich mich zurück und benutzte ich den Forum so wenig wie möglich und versuche irgendwieanders eine Lösung zu finden.
Villeicht irre ich mich mit meiner Empfindung, denn beim lesen ist nicht das gleiche als ob man persönlich spricht.
-
Glauben ist kein Wissen also hat er geraten, manchmal klappt das auch, aber zuverlässig halt nicht immer und wenns nicht klappt ist jede Antwort Bandbreitenverschwendung und Lebenszeitvernichtung die evtl. sinnvoller gefüllt hätte werden können.
Tut mir leid, dass ich dich so gestört habe. Solche aussagen finde ich ehrlich gesagt noch mehr Lebenszeitsvernichtung und davon wird man noch weniger schlauer als man ist.
Vielleicht sollte man ein bisschen Verständnis für Anfänger haben und nachvollziehen, dass nicht jeder, der nicht so viel Ahnung hat, sich nicht gleich auf dem Punkt ausdrucken kann.
Ob du es verstanden hast oder nur geraten vielen dank trotzdem STF es hat wundebar geklappt.
-
Erstmal danke ich euch alle für die schnelle Antworten
Bis jetzt versteht nur ein einziger Mensch auf der Welt was du willst!
ich glaube STF hat mich doch verstanden, denn er hat mir dir eine gute Lösung vorgeschlagen (muss ich mal testen).
du musst schon deutlicher werden!
Pi mit Source Code und Roboter Prototyp sind am Schreibtisch zu Hause und bleiben auch da. Wenn ich unterwegs bin will ich auf dem Pi Desktop rankommen, um von überall programmieren bzw. kompiliren zu können, bzw. die Ergebnisse (Rückmeldungen) über die Konsole sehen zu können.
So wie eine Art "Team Viewer".
Ich entschuldige mich, wenn ich mich manchmal nicht deutlich genug ausdrücke...
-
Und wenn du deinen Code auf Github bzw. einer Cloud ablegst?
Mir gehts darum, dass ich den Code auch unterwegs testen kann (nicht nur bearbeiten), bzw. die GPIOs schreiben und lesen kann (auch Compiler Meldungen lesen).
Mit dem Vorschlag ist aber nicht möglich oder? Github kenne ich nicht so richtig...
-
Welches Betriebssystem hast Du auf deinem Client-PC?
Ist ein Client-PC, der PC von dem ich aus dem Internet arbeiten möchte?
wenn ja:
ich habe in meinem Laptop ein Windows 10 aber ich würde gerne auch über VNC zugreifen übers iPad und über mein Android Handy, (so wie im Heimnetz) und eventuell im Zukunft über eine Virtuelle Maschine auf dem Laptop, wo evtll.Debian laufen soll.
dann nutze doch den Dienst von der Fritzbox
ich guck mir es gleich an...
P.S. Fritzbox= 7362 SL
-
Hallo alle zusammen,
ich arbeite grade zuhause an diesem Projekt Projekt_Rasenmäherroboter mit Raspberry und C-Sprache und würde ich gerne auch von aussen aus dem Internet weiter arbeiten.
Ich benutze immer VNC und zuhause habe ich eine Fritzbox.
Ich wollte mal fragen welche die beste bzw. einfachste bzw. schnellste Möglichkeit ist, um mein Ziel zu erreichen (VPN?, DynDNs?, port freigabe?...).
Und auch wie ich es einrichten könnte (vielleicht kennt ihr eine vernünftige Anleitung).
Ich habe mal vor einige Zeit versucht eine VPN einzurichten aber es hat nicht geklappt.
Danke!
-
Moin alle zusammen.
Nach 3 Tage Kopfbrechen schreibe ich mal wieder hier.
Ich habe erstmal alle Tipps von dreamshader unter die Lupe genommen und erstmal mich dafür entschiden das Projekt zu modulisieren.Erstmal nur mit einem Header, einem Quellsource und einem main Datei.
Da die Funktion mit dem Thread nicht so gut klappt, habe ich sie erstmal auskommentiert und mich auf eine funktionierende Modalisierung konzentriert.
Erstmal hat es gut geklappt. Dannach habe ich mich gefreut und versucht mehr Funktionen zu erzeugen, um die main Funktion übersichtlicher zu machen und die ganze Prozedur weiter zu üben.
Obwohl (meiner Meinung nach) ich die Funktion "initOlivia()" genauso wie die andere geschrieben habe (.h und quellcode neu kompiliert-> main.c neu kompiliert und gebuildet), funktioniert sie nicht wenn ich sie im Quellcode definiere und im .h Datei sie als extern deklariere. (es kommt die Meldung " undefined reference to olivia", obwohl der Linker -lolivia doch kennt).
Wenn ich die Deklaration in .h lasse und die Definition in main.c schreibe, dann gehts ja.
olivia.h
Code
Alles anzeigen#ifndef OLIVIA_H #define OLIVIA_H //DEFINES //define motor states #define OFF 0 #define ON 1 //define PIN number #define M1LFT 16//motor 1 left. otput pin #define M1RGHT 20//motor 1 right. output pin #define M2LFT 25//motor 2 left. output pin #define M2RGHT 8//motor 2 right. output pin #define BTN 12 //button. input pin for obstacle detection #define ENIN 21//enable. input pin for simulation with a second button #define ENOUT 7//enable. output pin to enable in of ic l293d #define ECHO 18//Ultrasonic data #define TRIGGER 23//Ultrasonic trigger //define read values #define VAL_ENIN gpioRead(ENIN)//read enable input #define VAL_BTN gpioRead(BTN)//read button #define VAL_ECHO gpioRead(ECHO)//read Ultrasonic data //some programming help... #define D_MILLIS 1000 //GENERAL FUNCTIONS extern signed char InitOlivia(); extern signed char setPinMode(); //set IOs Mode extern signed char IOsInitialise(); //initialise IOs extern signed char PUDsInitialise(); //handle PUll Up-down resistors ////THREADS ////turn threads ´cause obstacles //extern void *turnUS(void *turn_void_ptr); //turn ´cause Ultrasonic //STATEMACHINE //possible states typedef enum { AUS=0, VORWAERTS, RUECKWAERTS, DREHEN} state_t; extern state_t state; extern unsigned char stateMachine(); #endif
olivia.c:
C
Alles anzeigen#include <stdio.h> #include <pigpio.h> //#include <pthread.h> #include "olivia.h" ///////////// //FUNCTIONS// ///////////// //SET MODE FUNCTION. Returns 0(OK) or -1(failed) signed char setPinMode() { signed char IOsSetState,failNr; //printf("\nhallo\n"); //Sets the GPIO mode, typically input or output. for(IOsSetState=9,failNr=0;IOsSetState>0;IOsSetState--) { switch(IOsSetState) { case 0: case 1: if(gpioSetMode(BTN,PI_INPUT)) failNr=IOsSetState; break; case 2: if(gpioSetMode(ENIN,PI_INPUT)) failNr=IOsSetState; break; case 3: if(gpioSetMode(ENOUT,PI_OUTPUT)) failNr=IOsSetState; break; case 4: if(gpioSetMode(M1LFT,PI_OUTPUT)) failNr=IOsSetState; break; case 5: if(gpioSetMode(M1RGHT,PI_OUTPUT)) failNr=IOsSetState; break; case 6: if(gpioSetMode(M2LFT,PI_OUTPUT)) failNr=IOsSetState; break; case 7: if(gpioSetMode(M2RGHT,PI_OUTPUT)) failNr=IOsSetState; break; case 8: if(gpioSetMode(TRIGGER,PI_OUTPUT)) failNr=IOsSetState; break; case 9: if(gpioSetMode(ECHO,PI_INPUT)) failNr=IOsSetState; break; } } if(!failNr) printf("\nGPIOs mode were sucessfully selected\n"); else { printf("\nGPIO set mode case %d failed\n",failNr); IOsSetState=-1; } return IOsSetState; } //INITIALISE INPUTS-OUTPUTS. Returns 0(OK) or -1(failed) signed char IOsInitialise() { signed char IOsInitState,failNr; for(IOsInitState=9,failNr=0;IOsInitState>0;IOsInitState--) { switch(IOsInitState) { case 0: case 1: if(gpioWrite(BTN,0)) failNr=IOsInitState; break; case 2: if(gpioWrite(ENIN,0)) failNr=IOsInitState; break; case 3: if(gpioWrite(ENOUT,0)) failNr=IOsInitState; break; case 4: if(gpioWrite(M1LFT,0)) failNr=IOsInitState; break; case 5: if(gpioWrite(M1RGHT,0)) failNr=IOsInitState; break; case 6: if(gpioWrite(M2LFT,0)) failNr=IOsInitState; break; case 7: if(gpioWrite(M2RGHT,0)) failNr=IOsInitState; break; case 8: if(gpioWrite(TRIGGER,0)) failNr=IOsInitState; break; case 9: if(gpioWrite(ECHO,0)) failNr=IOsInitState; break; } } if(!failNr) printf("\nGPIOs were sucessfully initialisated\n"); else { printf("\nGPIO initialise case %d failed\n",failNr); IOsInitState=-1; } return IOsInitState; } //INITIALISE PULL UP-PULL DOWN. Returns 0(OK) or -1(failed) signed char PUDsInitialise() { signed char PUDsInitState,failNr; for(PUDsInitState=2,failNr=0;PUDsInitState>0;PUDsInitState--) { switch(PUDsInitState) { case 0: case 1: if(gpioSetPullUpDown(ECHO, PI_PUD_OFF)) failNr=PUDsInitState; break; case 2: if(gpioSetPullUpDown(TRIGGER, PI_PUD_OFF)) failNr=PUDsInitState; break; } } if(!failNr) printf("\nPUDs were sucessfully initialisated\n"); else { printf("\nPUD initialise case %d failed\n",failNr); PUDsInitState=-1; } return PUDsInitState; } /////////// //THREADS// /////////// ////THREAD ULTRASOSNIC "turn if distance<10 cm" //void *turnUS(void *turn_void_ptr) //{ //int *turn_ptr=(int*)turn_void_ptr; //double distanceUS=0,startUS,stopUS,timediffUS; //for(;;) //{ //gpioTrigger(TRIGGER,10,1); //send pulse //startUS=gpioTick(); //while (!VAL_ECHO) //{ //startUS=gpioTick(); //wait until Echo rising edge //printf("\nhier bleibe ich haengen :/\n"); //} //printf("\necho state= %d\n",VAL_ECHO); //while (VAL_ECHO) stopUS=gpioTick(); //wait until Echo falling edge //timediffUS=stopUS-startUS; //calculate time difference //distanceUS=(timediffUS*343)/20000; //calculate distance //printf("\ndistance from obstacle= %.2lf cm\n",distanceUS); //if (distanceUS<10.) *turn_ptr=1; //gpioSleep(PI_TIME_RELATIVE, 1, 0); //} //return NULL; //} ///////////////// //STATE MACHINE// ///////////////// signed char executeState (); //parameter of each state typedef struct { int m1rechts; int m1links; int m2rechts; int m2links; int EnIn; int EnOut; int Hindernis; int Wartezeit; int Naechster; } motor_state_t; state_t state=AUS;//set initial state int zaehler=1;//for time delay // Table for state machine motor_state_t state_table[4] = { //M1r M1l M2r M2l //| | | | EnIn //| | | | | EnOut //| | | | | | Hindernis //| | | | | | | Wartezeit //| | | | | | | | naechster Zustand Name //---------------------------------------------------------------------- {OFF , OFF , OFF , OFF , 1, 0, 0, 0, VORWAERTS}, // AUS {ON , OFF , OFF , ON , 0, 1, 1, 1, RUECKWAERTS}, // VORWAERTS {OFF , ON , ON , OFF , 0, 1, 0, (3*D_MILLIS), DREHEN}, // RUECKWAERTS {ON , OFF , OFF , OFF , 0, 1, 0, (5*D_MILLIS), VORWAERTS}}; // DREHEN unsigned char stateMachine() { unsigned char FSMok; //printf("\nhallo\n") executeState (); if (zaehler>0) zaehler--; else if ( ((state_table[state].EnIn) && VAL_ENIN ) || ((state_table[state].EnOut) && (state_table[state].Hindernis==0)) ) { state = state_table[state].Naechster; FSMok=0; zaehler = state_table[state].Wartezeit; } //obstacle //turn if -> motors enabled and (Button-or-Ultrasonic activated) else if (state_table[state].EnOut && VAL_BTN) { state = RUECKWAERTS; FSMok=0; zaehler = state_table[state].Wartezeit; } //disable else if ((state_table[state].EnOut) && VAL_ENIN) { state= AUS; FSMok=0; zaehler = state_table[state].Wartezeit; } printf("\nhallo\n"); return FSMok; } signed char executeState () { signed char executeStateState,failNr; for(executeStateState=4,failNr=0;executeStateState>0;executeStateState--) { switch(executeStateState) { case 0: case 1: if( gpioWrite(M1RGHT,(state_table[state].m1rechts))!=0) failNr=executeStateState; break; case 2: if( gpioWrite(M1LFT,(state_table[state].m1links))!=0) failNr=executeStateState; break; case 3: if( gpioWrite(M2RGHT,(state_table[state].m2rechts))!=0) failNr=executeStateState; break; case 4: if( gpioWrite(M2LFT,(state_table[state].m2links))!=0) failNr=executeStateState; break; } } if(!failNr) printf("\nFSM state= %d\n",state); else { printf("\nExecute state case %d failed\n",failNr); executeStateState=-1; } return executeStateState; }
main.c:
C
Alles anzeigen//olivia´s main #include <stdio.h> #include <pigpio.h> #include <pthread.h> #include "olivia.h" //CALL ALL INIT FUNCTIONS (setpinmode,IOs init, Pullup-down resistors) //Returns 0(OK) or -1(failed) signed char InitOlivia() { signed char InitCaseState,failNr; for(InitCaseState=4,failNr=0;InitCaseState>0;InitCaseState--) { switch(InitCaseState) { case 0: case 1: if (PUDsInitialise()!=0) failNr=InitCaseState;//initialise pigpio break; case 2: if (IOsInitialise()!=0) failNr=InitCaseState; break; case 3: if (setPinMode()!=0) failNr=InitCaseState; break; case 4: if (gpioInitialise() < 0) failNr=InitCaseState; break; } } if(!failNr) printf("\nOlivia´s initialisation sucessfully\n"); else { printf("\nInitialisation case %d failed\n",failNr); InitCaseState=-1; } return InitCaseState; } //Main function int main (int argc, char *argv[]) { //volatile int turn=0;//volatile?? nachlesen unsigned char loop=1;//immer 1 oder irgendwann auf 0 setzen? InitOlivia(); printf("\nhallo\n"); //pthread_t ultrasonic;//thread ID //// create a thread---with this ID,-----,-calling this-,with this parameter //if(pthread_create (&ultrasonic, NULL, turnUS , (void*)&turn) != 0 ) //// ^ //// | //// nachlesen warum bei volatile variablen!!! //{ //perror("create US thread failed"); //return(1); //} while (loop) { //printf("\nUltrasonicsensor= %d\n",turn); stateMachine() ;//start state machine //else printf("\nFSM State= %d\n",state); gpioDelay(2*D_MILLIS); } //if( pthread_join(ultrasonic, NULL)!=0 )//terminate ultrasonic thread //{ //perror("terminate US thread failed"); //return(1); //} gpioTerminate(); return 0; }
Vielleicht hat einer Zeit sich es anzugucken...
Wenn ich die main.c ausführe so wie ihr den Code sieht, dann werden die erfolgreiche printf Meldungen der Funktionen setpinmode, iosInitialise, pudinitialise und initolivia auf die Konsole gezeigt, dannach wird in die main while-schleife gesprungen und die statemachine wird immer wieder aufgerufen (wie gehabt). Mich irritiert aber, dass die printf Meldungen, die ich in die Funktionen der Statemachine implementiert habe, nicht in die Konsole gezeigt werden, so wie bei setpinmode und die andere Funktionen.
Habt ihr eine Ahnung warum das seien könnte?
Danke!
P.S. Ich hoffe dass ich alles deklariert habe, wo es hingehört, wenn es euch etwas auffällt, sagt bitte Bescheid
-
Ich belese mich auch parallel bzgl. Erstellung von Bibliotheken...
Ich wollte anfangen langsam die funktionen aufteilen..
Exemplarisch habe ich mir mal setPinMode() vorgenommen:
Heute Abend habe ich mich damit beschäftigt.
Ein Dozent meinte mal zu uns das in der Laufbedingung einer for-schleife sollten wir kein UND oder ODER reinpacken (warum weiß ich nicht mehr, ich soll ihm mal nächste Monat fragen...), aus dem Grund habe deine Verbesserung so geändert:
Code
Alles anzeigen////////////////////////////////////////////////// //SET MODE FUNCTION. Returns 0(OK) or -1(failed)// ////////////////////////////////////////////////// signed char setPinMode(); //declaration //definition. signed char setPinMode() { signed char IOsSetState,failNr; //Sets the GPIO mode, typically input or output. for(IOsSetState=9,failNr=0;IOsSetState>0;IOsSetState--) { switch(IOsSetState) { case 0: case 1: if(gpioSetMode(BTN,PI_INPUT)) failNr=IOsSetState; break; case 2: if(gpioSetMode(ENIN,PI_INPUT)) failNr=IOsSetState; break; case 3: if(gpioSetMode(ENOUT,PI_OUTPUT)) failNr=IOsSetState; break; case 4: if(gpioSetMode(M1LFT,PI_OUTPUT)) failNr=IOsSetState; break; case 5: if(gpioSetMode(M1RGHT,PI_OUTPUT)) failNr=IOsSetState; break; case 6: if(gpioSetMode(M2LFT,PI_OUTPUT)) failNr=IOsSetState; break; case 7: if(gpioSetMode(M2RGHT,PI_OUTPUT)) failNr=IOsSetState; break; case 8: if(gpioSetMode(TRIGGER,PI_OUTPUT)) failNr=IOsSetState; break; case 9: if(gpioSetMode(ECHO,PI_INPUT)) failNr=IOsSetState; break; } } if(!failNr) printf("\nGPIOs mode were sucessfully selected\n"); else { printf("\nset mode case %d failed\n",failNr); IOsSetState=-1; } return IOsSetState; } ///////////////////////////////////////////////////////////////////////
so sollte es auch funktionieren oder? bzw. wären alle Fälle der Abfrage berücksichtigt?
-
-
Hallo! Ich muss es mir mal in Ruhe angucken.
Die letzten 2 Tage hatte ich leider nicht die Ruhe zuhause, um mich zu konzentrieren...
-
ich werde langsam irre.
Warum funktioniert das
C
Alles anzeigen#include <stdio.h> #include <pigpio.h> void us() { int turn=0; double distanceUS=0,startUS,stopUS,timediffUS; gpioTrigger(23,10,1); //send pulse startUS=gpioTick(); while (!gpioRead(18)) { printf("\necho state= %d\n",gpioRead(18)); startUS=gpioTick(); //wait until Echo rising edge } printf("\necho state= %d\n",gpioRead(18)); while (gpioRead(18)) stopUS=gpioTick(); //wait until Echo falling edge timediffUS=stopUS-startUS; //calculate time difference distanceUS=(timediffUS*343)/20000; //calculate distance printf("\ndistance from obstacle= %.2lf cm\n",distanceUS); if (distanceUS<10.) turn=1; printf("\%d\n",turn); }
und das nicht? (restlicher Code in ältere posts..) (bleibt weiterhin in der erste while schleife hängen)
Code
Alles anzeigen//pthread "turn if distance<10 cm" definition void *turnUS(void *turn_void_ptr) //turn_void_ptr=&turn??? stimmt das? { int *turn_ptr=(int*)turn_void_ptr; double distanceUS=0,startUS,stopUS,timediffUS; for(;;) { gpioTrigger(TRIGGER,10,1); //send pulse startUS=gpioTick(); while (!VAL_ECHO) { startUS=gpioTick(); //wait until Echo rising edge printf("\nhier bleibe ich haengen :/\n"); } printf("\necho state= %d\n",VAL_ECHO); while (VAL_ECHO) stopUS=gpioTick(); //wait until Echo falling edge timediffUS=stopUS-startUS; //calculate time difference distanceUS=(timediffUS*343)/20000; //calculate distance printf("\ndistance from obstacle= %.2lf cm\n",distanceUS); if (distanceUS<10.) *turn_ptr=1; gpioSleep(PI_TIME_RELATIVE, 1, 0); } return NULL; }
danke!
-
ich wollte nur was beitragen und nicht nur immer geholfen werden.
Nicht, dass ihr mich falsch versteht...
-
Hallo dreamshader
da ich dein Code für das eventuelle Nutzen in meinem Projekt unter die Lupe nehme, ist mir etwas aufgefallen.
Dein Programm funktioniert auch ohne
und die 3 Zeile
CodegpioWrite(24, 1); /* sets gpio24 high */ gpioDelay(10); gpioWrite(24, 0); /* sets gpio24 high */----->WOBEI HIER HAST DU DICH VERSCHRIEBEN ODER?sollte hier Low sein?
könnte man sie damit zusammen fassen
ich hoffe dass ich mich mit meine Anfänger Mund nicht verquatsche und du es so aus andere Gründe geschrieben hast...
bis bald
-
Ja, aber nicht richtig durchgeguckt, denn ich versuche immer die Sachen mit meinem vorhandenes Wissen zu machen (wenn ich denke, dass dafür mein Wissen und Verständnis reicht). "Schummeln" mag ich zuerst nicht .
Vielleicht sollte ich es aber machen..
-
Ich würde mir dann erstmal vornehmen, den o.g. Code funktionierend machen ( das der us Sensor funktioniert), danach denn Code so kurz, knackig und lesbar umschreiben ( durch weiteres Belesen und eure Hilfe), und danach das bis nun getan in verschiedene sourcefiles aufteilen und mit includes arbeiten.
So das ich eine sinnvolles Basis Struktur für künftige Features Implementierungen habe und alles lesbar und übersichtlich für die Menschheit bleibt.
Nicht dass ich mich überstürzte und dann wird alles nix...
Dann hätte ich schon mal eine Basis und ein Arbeitssystem.
-
Moin!
soooo.
ich glaube dass ich alle Vorschläge von dreamshader abgearbeitet habe (bestimmt nicht so schick wie man es machen sollte).
An die Art und Weise, wie ich die Returns der Funktionen abfrage bezweifle ich noch... (bestimmt gibts geschickte Wege oder? und effizienter... und vor allem lesbarer?)
Jedenfalls laufen nun im End Effekt 2 Programme paralell aber ich habe nur eine Konsole. Gibts einen Weg die printf´s von beide Prozesse auf der Konsole auszudrücken?
nach die Änderungen bleibt der Ultraschall thread weitherhin in der erste while Schleife hängen (ECHO ändert sich nicht, trotz ich davor einen fallender Flanke erzeuge).
Wenn ich die Ultraschall Funktion bzw. ihre Aufruf auskommentiere, kriege ich den ursprüngliche Prozess auf die Konsole, nun natürlich schneller, denn ich habe den Delay geändert, aber dadurch, reagiert der Simulationstaster für "enable" nicht ordnungsgemäß.
D.h. wenn ich einschalte gehts, aber beim ausschalten geht Enable nicht immer auf dem ersten Tastendruck auf 0. Soll ich die Zeit doch höher machen oder liegt es an etwas anderes? hat damit die Pullup oder down Widerstand damit was zu tun?.
auf dem u.g. Code habe ich ein Paar Fragen als Komentar geschrieben, die ich mir stelle.
Dazu kommt folgendes:
1. Da der Code immer länger und unübersichtlicher wird, kann man Funktionen wie bei mir "Initialisierung von GPIO" und "setmode gpio" oder threads wie bei mir die US Messung als Bibliothek oder Block oder sowas in einen extra Datei speichern und auf dem Datei von Main und State Machine als Header einbinden?
2.Sollte man immer bei der Funktionsabfrage den exit(1) schreiben? bzw. gibts eine andere möglichkeit die Returns abzufragen, so dass, dadurch der Code nicht so lang wird? bzw. lesbarer?
3. Ich habe gestern angefang, mich mit Theorie von Pointer bzw. Zeiger zu beschäftigen, denn ich sehe das ich überall gebraucht werden. Sollte ich mich mit dem Thema weiter, tiefgründig beschäftigen oder nur so ein paar Anhaltspunkte kennen?
C
Alles anzeigen#include <stdio.h> #include <pigpio.h> #include <pthread.h> #include <stdlib.h>//(exit()) //define motor states #define OFF 0 #define ON 1 //define PIN number #define M1LFT 16//motor 1 left. otput pin #define M1RGHT 20//motor 1 right. output pin #define M2LFT 25//motor 2 left. output pin #define M2RGHT 8//motor 2 right. output pin #define BTN 12 //button. input pin for obstacle detection #define ENIN 21//enable. input pin for simulation with a second button #define ENOUT 7//enable. output pin to enable in of ic l293d #define ECHO 18//Ultrasonic data #define TRIGGER 23//Ultrasonic trigger //define read values #define VAL_ENIN gpioRead(ENIN)//read enable input #define VAL_BTN gpioRead(BTN)//read button #define VAL_ECHO gpioRead(ECHO)//read Ultrasonic data //some programming help... #define D_MILLIS 1000 unsigned char stateMachine(int turn); //FSM function declaration unsigned char setPinMode(); //Set Pin function declaration unsigned char IOsInitialise(); //input output initialise function declaration void *turnUS(void *turn_void_ptr);//Ultrasonic measure pthread //possible states typedef enum { AUS=0, VORWAERTS, RUECKWAERTS, DREHEN} state_t; //parameter of each state typedef struct { int m1rechts; int m1links; int m2rechts; int m2links; int EnIn; int EnOut; int Hindernis; int Wartezeit; int Naechster; } motor_state_t; //set initial state state_t state = AUS; int zaehler=1; // Table for state machine motor_state_t state_table[4] = { //M1r M1l M2r M2l //| | | | EnIn //| | | | | EnOut //| | | | | | Hindernis //| | | | | | | Wartezeit //| | | | | | | | naechster Zustand Name //---------------------------------------------------------------------- {OFF , OFF , OFF , OFF , 1, 0, 0, 0, VORWAERTS}, // AUS {ON , OFF , OFF , ON , 0, 1, 1, 1, RUECKWAERTS}, // VORWAERTS {OFF , ON , ON , OFF , 0, 1, 0, (3*D_MILLIS), DREHEN}, // RUECKWAERTS {ON , OFF , OFF , OFF , 0, 1, 0, (5*D_MILLIS), VORWAERTS}}; // DREHEN //Main function int main (int argc, char *argv[]) { volatile int turn=0;//volatile?? nachlesen unsigned char loop=1;//immer 1 oder irgendwann auf 0 setzen? if (gpioInitialise() < 0) //initialise pigpio { perror("\npigpio initialisation failed\n"); exit (1);//warum? } else printf("\npigpio initialised okay\n"); if (setPinMode()!=0) //set pin mode { perror("\nGPIOs set failed\n"); exit(1); } if (IOsInitialise()!=0) //initialise pins (set initial value) { perror("\nGPIOs init. failed\n"); exit(1); } pthread_t ultrasonic;//thread ID // create a thread---with this ID,-----,-calling this-,with this parameter if(pthread_create (&ultrasonic, NULL, turnUS , (void*)&turn) != 0 ) // ^ // | // nachlesen warum bei volatile variablen!!! { perror("create US thread failed"); exit(1); } while (loop) { printf("\nUltrasonicsensor= %d\n",turn); if( stateMachine(turn)!=0)//start state machine { perror("\nstate machine failed\n"); exit(1);//exit benutzen oder loop=0 setzen???? } else printf("\nFSM State= %d\n",state); gpioDelay(2*D_MILLIS); } if( pthread_join(ultrasonic, NULL)!=0 )//terminate ultrasonic thread { perror("terminate US thread failed"); exit(1); } gpioTerminate(); return 0; } unsigned char stateMachine(int turn) { unsigned char FSMok=0; if( gpioWrite(M1RGHT,(state_table[state].m1rechts))!=0) { printf("/nMotor 1 Right Write failed\n"); exit(1); } if( gpioWrite(M1LFT,(state_table[state].m1links))!=0) { printf("/nMotor 1 left Write failed\n"); exit(1); } if( gpioWrite(M2RGHT,(state_table[state].m2rechts))!=0) { printf("/nMotor 2 Right Write failed\n"); exit(1); } if( gpioWrite(M2LFT,(state_table[state].m2links))!=0) { printf("/nMotor 2 left Write failed\n"); exit(1); } if (zaehler>0) zaehler--; else if ( ((state_table[state].EnIn) && VAL_ENIN ) || ((state_table[state].EnOut) && (state_table[state].Hindernis==0)) ) { state = state_table[state].Naechster; FSMok=0; zaehler = state_table[state].Wartezeit; } //obstacle //turn if -> motors enabled and (Button-or-Ultrasonic activated) else if ((state_table[state].EnOut) && (VAL_BTN||(turn==1))) { state = RUECKWAERTS; FSMok=0; zaehler = state_table[state].Wartezeit; } //disable else if ((state_table[state].EnOut) && VAL_ENIN) { state= AUS; FSMok=0; zaehler = state_table[state].Wartezeit; } return FSMok; } //function set mode definition unsigned char setPinMode() { unsigned char IOsSetState=0; //Sets the GPIO mode, typically input or output. gpioSetMode(BTN, PI_INPUT); gpioSetMode(ENIN, PI_INPUT); gpioSetMode(ENOUT, PI_OUTPUT); gpioSetMode(M1LFT, PI_OUTPUT); gpioSetMode(M1RGHT, PI_OUTPUT); gpioSetMode(M2LFT, PI_OUTPUT); gpioSetMode(M2RGHT, PI_OUTPUT); gpioSetMode(TRIGGER, PI_OUTPUT); gpioSetMode(ECHO, PI_INPUT); printf("\nGPIOs mode were sucessfully selected\n"); return IOsSetState; } //function Inputs, Outputs initialise definition unsigned char IOsInitialise() { unsigned char IOsInitState=0; //initialise gpios gpioWrite(BTN,0); gpioWrite(ENIN,0); gpioWrite(ENOUT,0); gpioWrite(M1LFT,0); gpioWrite(M1RGHT,0); gpioWrite(M2LFT,0); gpioWrite(M2RGHT,0); gpioWrite(TRIGGER,0); gpioWrite(ECHO,0); printf("\nGPIOs were sucessfully initialisated\n"); return IOsInitState; } //pthread "turn if distance<10 cm" definition void *turnUS(void *turn_void_ptr) //turn_void_ptr=&turn??? stimmt das? { int *turn_ptr=(int*)turn_void_ptr; double distanceUS=0,startUS,stopUS,timediffUS; gpioWrite(TRIGGER,1); gpioDelay(10); gpioWrite(TRIGGER,0); //gpioTrigger(TRIGGER,10,1); //send pulse startUS=stopUS=time_time(); //catch send time (by falling edge) while (VAL_ECHO==0) { startUS=time_time(); //wait until Echo rising edge printf("\nhier bleibe ich haengen :/\n"); } //printf("\necho state= %d\n",VAL_ECHO); while (VAL_ECHO==1) stopUS=time_time(); //wait until Echo falling edge timediffUS=stopUS-startUS; //calculate time difference distanceUS=(timediffUS*34300)/2; //calculate distance printf("\ndistance from obstacle= %2.lf cm\n",distanceUS); if (distanceUS<10.) *turn_ptr=1; return NULL; }
danke!
-
Na das heißt erstmal grenzschleife und nicht rasensensor benutzen, vermute ich mal.
Gibts hier schon einen Thread bzgl. Selbständig zur Ladestation fahren bzw. Begrenzungschleife oder ein externer link, der hilfreich seien könnte?
-
Meinst du sollte ich lieber den rasensensor seien lassen und doch eine grenzschleife einbuddeln? ( und die Zeit in eine andere sinnvollere Feature investieren)
Manche Redewendungen verstehe ich beim lesen nicht ( wie sie gemeint sind)