Jump to content

lakai_-

Members
  • Gesamte Inhalte

    11
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von lakai_-

  1. Habe jetzt die Variante mit den User Data Pointer der Callbacks probiert, aber er übernimmt die Werte der Variable aus den Funktionen nicht in der main-Funktion. Habe meinen Code bis auf den If-Schleifen-Inhalt angefügt. Habe getestet die Variable Knopf auf den Wert 1 oder 2 zu initialisieren, dann wird die jeweilige Schleife durchlaufen. Somit muss der Fehler wohl bei der Übergabe des Wertes von der Callback-Funktion an die main-Funktion passieren. #include <stdio.h> #include "ip_connection.h" #include "bricklet_dual_button.h" #include "brick_servo.h" #include "bricklet_rotary_poti.h" #define HOST "localhost" #define PORT 4223 #define UID "mJ5" #define UID_Servo "6Jo3Pm" #define UID_Poti "y8F" int16_t servo_position; int16_t servo_overflow; void cb_position(int16_t position,void *user_data) { Servo *servo = (Servo *)user_data; servo_position = 9000*position/100; servo_set_position(servo, 1, servo_position); printf("%i", servo_position); } void cb_position1(int16_t position,void *user_data) { Servo *servo = (Servo *)user_data; servo_overflow = 0; servo_position = 9000*position/100; if (servo_position <= 50) { servo_set_position(servo, 1, servo_position); printf("%i", servo_position); } else { servo_set_position(servo, 1, servo_overflow); } } void cb_state_changed(uint8_t button_l, uint8_t button_r, uint8_t led_l, uint8_t led_r, void *user_data) { (void)led_l; (void)led_r; (void)user_data; int *knopf = (int *)user_data; if(button_l == DUAL_BUTTON_BUTTON_STATE_PRESSED) { printf("Left button pressed\n"); *knopf = 1; led_r = 2; led_r = 3; } else { //printf("Left button released\n"); } if(button_r == DUAL_BUTTON_BUTTON_STATE_PRESSED) { printf("Right button pressed\n"); *knopf = 2; led_r = 2; led_r = 3; } else { //printf("Right button released\n"); } printf("\n"); } int main(void) { // Create IP connection IPConnection ipcon; ipcon_create(&ipcon); // Create device object DualButton db; dual_button_create(&db, UID, &ipcon); Servo servo; //Device object für Servo erstellen servo_create(&servo, UID_Servo, &ipcon); RotaryPoti rp; //Device object für Drehpotentiometer erstellen rotary_poti_create(&rp, UID_Poti, &ipcon); // Connect to brickd if(ipcon_connect(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not connect\n"); return 1; } // Don't use device before ipcon is connected int knopf = 0; // Register state changed callback to function cb_state_changed dual_button_register_callback(&db, DUAL_BUTTON_CALLBACK_STATE_CHANGED, (void *)cb_state_changed, (void *)&knopf); if(knopf ==1){ ... } if(knopf ==2){ ... } servo_set_output_voltage(&servo, 7400); servo_set_velocity(&servo, 1, 65535); servo_set_acceleration(&servo,1, 65535); servo_set_position(&servo, 1, -9000); servo_enable(&servo, 1); printf("%i\n",knopf); printf("Press key to exit\n"); getchar(); dual_button_destroy(&db); servo_disable(&servo, 1); servo_destroy(&servo); ipcon_destroy(&ipcon); // Calls ipcon_disconnect internally return 0; } Ich wäre für jede Hilfe wirklich sehr dankbar!!! LG Max
  2. Hallo zusammen, ich habe folgendes Problem bei der Programmierung eines Gaspedals mit C++: sobald meine Funktion über einen Callback (des Dual Button Bricklet) aufgerufen wird, möchte ich bei Betätigen eines Buttons jeweils einen bestimmten Wert auf eine Variable speichern. Wird der linke Buttons betätigt soll auf die Variable der Wert 1 und bei der rechten Taste der Wert 2 gespeichert werden. In der main-Funktion möchte ich nun den Wert der Variable abfragen und somit in bestimmte if-Schleifen übergehen. Mein Problem ist, dass der Wert der Variable nicht in der main-Funktion enthalten ist. Kann ich globale Variablen verwenden, damit ich der Variable in der Funktionen einen Wert zuweisen kann und diesen in der main-Funktion abfragen? Oder kann ich eine Variable mit der Funktion über zum Beispiel einen Zeiger mit zurück geben? Am Besten eine recht simple Lösung, die einfach der Funktionalität dient. Könnte mir jemand dabei ein Beispiel mit C++ geben bitte. Mein Code in der Funktion sieht ungefähr so aus (Dies sind nur Auszüge): void cb_state_changed(uint8_t button_l, uint8_t button_r, uint8_t led_l, uint8_t led_r, void *user_data) { (void)led_l; // avoid unused parameter warning (void)led_r; // avoid unused parameter warning (void)user_data; // avoid unused parameter warning if(button_l == DUAL_BUTTON_BUTTON_STATE_PRESSED) { printf("Left button pressed\n"); knopf = 1; } else { //printf("Left button released\n"); } Im Hauptprogramm sieht die if-Schleife wie folgt aus: if(knopf ==1){ rotary_poti_register_callback(&rp, ROTARY_POTI_CALLBACK_POSITION,(void *) cb_position, &servo); //Position-Callback für cb_funktion registrieren rotary_poti_set_position_callback_period(&rp, 50); //Periode für Positions-Callback auf 50ms setzen } Wäre echt super wenn mir jemand helfen könnte, da ich relativ schnell eine Lösung für das Problem benötige. Vielen Dank für eure Antworten! LG Max
  3. Vielen Dank schon mal. Ich habe das Makefile, das Projekt und das C++ Programm in einen neuen Ordner kopiert, damit ich weniger Dateien im gleichen Ordner habe und bessere Übersicht erhalte. Wenn ich das Programm über den Compiler auf dem PC ausführe funktioniert alles fehlerfrei. Ich habe jetzt das Test.cpp und die makefile datei auf das Red Brick geladen und es zeigt zumindest beim Upload keine Fehler an. Der Programmstatus zeigt aber dann direkt einen Error an. Auch wenn ich Continue after Error aktiviere, funktioniert das Programm dennoch nicht, da der Fehler direkt immer zu Beginn auftritt. Der Brick Viewer zeigt folgende Informationen an: Status: Current State: Executable does not exist on 2016-02-11 Last Start: 2016-02-11 Scheduler Current State: Stopped, no automativ program start Logs: 2016-02-11 Files: Makefile Pedal_Test1 Test.cpp Test.o Ich habe schon versucht das makefile umzubauen bzw anders abzuspeichern, hat aber nichts genutzt bis jetzt. Ich versuche es weiter, falls jemand eine Idee hat woran es liegt wäre es echt super wenn ihr mir helfen könntet! LG Max
  4. Vielen Dank für deine Hilfe! Das folgende Makefile wird zu meinem Projekt erstellt: # Project: Project2 # Makefile created by Dev-C++ 5.8.2 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe OBJ = bricklet_rotary_poti.o brick_servo.o ip_connection.o Test.o LINKOBJ = bricklet_rotary_poti.o brick_servo.o ip_connection.o Test.o LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc "../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libws2_32.a" "../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libadvapi32.a" -g3 INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" BIN = Pedal_Test1.exe CXXFLAGS = $(CXXINCS) -g3 CFLAGS = $(INCS) -g3 RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) bricklet_rotary_poti.o: bricklet_rotary_poti.c $(CPP) -c bricklet_rotary_poti.c -o bricklet_rotary_poti.o $(CXXFLAGS) brick_servo.o: brick_servo.c $(CPP) -c brick_servo.c -o brick_servo.o $(CXXFLAGS) ip_connection.o: ip_connection.c $(CPP) -c ip_connection.c -o ip_connection.o $(CXXFLAGS) Test.o: Test.cpp $(CPP) -c Test.cpp -o Test.o $(CXXFLAGS)
  5. Okey super danke. Ich weiß ehrlich nicht genau was du mit Dateistruktur meinst? Ich habe das Projekt ("Pedal_Test1") unter C:Tinkerforge zusammen mit allen Headern und einigen anderen kleinen Projekten abgelegt.
  6. Also das mit der Sprungantwort habe ich jetzt hinbekommen, vielen Dank! Gibt es keine relativ einfach Möglichkeit meinen Dev C++ Code für Linux ARM kompilieren zu lassen? Evtl mit CodeBlocks? Habe noch nie mit QT gearbeitet und möchte mich nicht unbedingt dort einarbeiten. Hat vll jemand auch eine Anleitung/Tutorial wie man den Dev C++ Code für Linux kompatibel macht? Wäre echt super wenn mir jemand dabei helfen könnte.
  7. Hallo, Ich habe zwei hoffentlich kurze Fragen: 1) Gibt es eine Möglichkeit wie zum Beispiel bei dem Rotary Bricklet über den Brick Viewer die Positionen eines Servomotors aufzuzeichnen? Der Hintergedanke ist, dass ich gerne die Sprungantwort meines Servomotors "messen" möchte,um ein mathematisches Ersatzmodell in Simulink dafür zu erstellen. Beim Rotary Brick kann ich ja zum Beispiel auch im Brick Viewer die aktuelle Position sehen, gibt es sowas auch für den Servomotor, damit mir angezeigt wird wie schnell der Servo seinen Winkel von beispielsweise 0 auf 60 ändert? 2) Um meinen Code auf das RED Brick zu spielen benötigte ich lediglich einen Cross Compiler sehe ich das richtig? Ich habe den Code unter Windows in C++ mit dem Orwell Dev C++ Compiler programmiert und funktioniert soweit auch sehr gut. Ich benötige nun einen Cross Compiler von Windows für Linux oder? Hat jemand gute Erfahrungen mit einem Cross-Compiler gemacht und kann mir einen guten Empfehlen oder evtl sogar eine Anleitung wie ich genau Vorgehen muss? Vielen Dank für eure Hilfe! LG Max
  8. Hallo zusammen, ich möchte gerne die Position meines Servomotors mit Hilfe des Rotary Bricklets steuern. Ich möchte dazu einfach die Callback-Funktion verwenden, es tritt aber ein Fehler beim kompilieren auf. Code und Compile Log habe ich unten angefügt. Der Programmcode ist in C geschrieben. Ich weiß ehrlich gesagt nicht wieso dieser nicht funktioniert, da alle Argumente der Servo Set Funktion gegeben sind. Danke schon mal für die Hilfe!!! LG Max Code: #include <stdio.h> #include "ip_connection.h" //Header Dateien einbinden #include "brick_servo.h" //Header Dateien einbinden #include "bricklet_rotary_poti.h" //Header Dateien einbinden #define HOST "localhost" #define PORT 4223 //Port Definieren (Im Allgemeinen immer 4223) #define UID_Servo "6Jo3Pm" // Individuelle UID des Servo Brick #define UID_Poti "a57" // Individuelle UID des Drehpotentiometers //int16_t rp_position; int16_t servo_position; void cb_position(int16_t position,void *user_data) { (void)user_data; servo_position = 9000*position/150; servo_set_position(&servo, 1, servo_position); } int main(void) { // Create IP connection IPConnection ipcon; ipcon_create(&ipcon); // Create device object Servo Servo servo; servo_create(&servo, UID_Servo, &ipcon); //Create device object Drehpotentiometer RotaryPoti rp; rotary_poti_create(&rp, UID_Poti, &ipcon); // Connect to brickd if(ipcon_connect(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not connect\n"); return 1; } // Don't use device before ipcon is connected rotary_poti_register_callback(&rp, ROTARY_POTI_CALLBACK_POSITION,(void *) cb_position,NULL); rotary_poti_set_position_callback_period(&rp, 50); servo_set_output_voltage(&servo, 6500); //Ausgangsspannung auf 6,5V setzen servo_set_velocity(&servo, 1, 65000); //Geschwindigkeit auf 65000 stellen (fast Vmax) //servo_set_acceleration(&servo,1, 65000); //Beschleunigung auf 65000 stellen (fast Amax) //servo_set_position(&servo, 1, 9000); //Setzt Position auf 9000 (ganz rechts) servo_enable(&servo, 1); printf("Press key to exit\n"); //Ausgabe für Programmende //printf("Position = &i \n",position); getchar(); // servo_disable(&servo, 1); //Servo 1 ausschalten servo_destroy(&servo); ipcon_destroy(&ipcon); // Calls ipcon_disconnect internally return 0; } Compile Log: Compiling project changes... -------- - Project Filename: C:\Tinkerforge\Pedal_Test1.dev - Compiler Name: TDM-GCC 4.8.1 64-bit Release Building makefile... -------- - Filename: C:\Tinkerforge\Makefile.win Processing makefile... -------- - Makefile Processor: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\mingw32-make.exe - Command: mingw32-make.exe -f "C:\Tinkerforge\Makefile.win" all g++.exe -c Test.cpp -o Test.o -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" -g3 Test.cpp: In function 'void cb_position(int16_t, void*)': Test.cpp:109:22: error: 'servo' was not declared in this scope servo_set_position(&servo, 1, servo_position); ^ C:\Tinkerforge\Makefile.win:37: recipe for target 'Test.o' failed mingw32-make.exe: *** [Test.o] Error 1 Compilation results... -------- - Errors: 1 - Warnings: 0 - Output Filename: C:\Tinkerforge\Pedal_Test1.exe - Output Size: 1,49918365478516 MiB - Compilation Time: 4,23s
  9. Vielen vielen Dank für die Hilfe! Funktioniert wirklich super! Ich wusste dass ich mich wirklich nur blöd anstelle, habe aber mit Bibliotheken einbinden noch nicht sehr viel gemacht.
  10. vielen Dank für die schnelle Rückmeldung! Hier ist das Compile Log: Compiling project changes... -------- - Project Filename: C:\Tinkerforge\Project1.dev - Compiler Name: TDM-GCC 4.8.1 64-bit Release Building makefile... -------- - Filename: C:\Tinkerforge\Makefile.win Processing makefile... -------- - Makefile Processor: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\mingw32-make.exe - Command: mingw32-make.exe -f "C:\Tinkerforge\Makefile.win" all gcc.exe bricklet_rotary_poti.o ip_connection.o example_callback.o -o Project1.exe -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc "../../../../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libws2_32.a" "../../../../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libadvapi32.a" ip_connection.o:ip_connection.c:(.text+0x112): undefined reference to `__imp_htonl' ip_connection.o:ip_connection.c:(.text+0x152): undefined reference to `__imp_htonl' ip_connection.o:ip_connection.c:(.text+0x192): undefined reference to `__imp_htonl' ip_connection.o:ip_connection.c:(.text+0x1d2): undefined reference to `__imp_htonl' ip_connection.o:ip_connection.c:(.text+0x212): undefined reference to `__imp_htonl' ip_connection.o:ip_connection.c:(.text+0x252): more undefined references to `__imp_htonl' follow ip_connection.o:ip_connection.c:(.text+0x1db8): undefined reference to `__imp_socket' ip_connection.o:ip_connection.c:(.text+0x1e00): undefined reference to `__imp_setsockopt' ip_connection.o:ip_connection.c:(.text+0x1e18): undefined reference to `__imp_closesocket' ip_connection.o:ip_connection.c:(.text+0x1e69): undefined reference to `__imp_closesocket' ip_connection.o:ip_connection.c:(.text+0x1ea1): undefined reference to `__imp_connect' ip_connection.o:ip_connection.c:(.text+0x1edc): undefined reference to `__imp_shutdown' ip_connection.o:ip_connection.c:(.text+0x1f1a): undefined reference to `__imp_recv' ip_connection.o:ip_connection.c:(.text+0x1f33): undefined reference to `__imp_WSAGetLastError' ip_connection.o:ip_connection.c:(.text+0x1faa): undefined reference to `__imp_send' ip_connection.o:ip_connection.c:(.text+0x3e1b): undefined reference to `__imp_getaddrinfo' ip_connection.o:ip_connection.c:(.text+0x3ed9): undefined reference to `__imp_freeaddrinfo' ip_connection.o:ip_connection.c:(.text+0x3f5d): undefined reference to `__imp_freeaddrinfo' ip_connection.o:ip_connection.c:(.text+0x3f77): undefined reference to `__imp_freeaddrinfo' ip_connection.o:ip_connection.c:(.text+0x45eb): undefined reference to `__imp_WSAStartup' c:/program files (x86)/dev-cpp/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld.exe: ip_connection.o: bad reloc address 0x0 in section `.pdata' collect2.exe: error: ld returned 1 exit status C:\Tinkerforge\Makefile.win:25: recipe for target 'Project1.exe' failed mingw32-make.exe: *** [Project1.exe] Error 1 Compilation results... -------- - Errors: 1 - Warnings: 0 - Compilation Time: 1,01s Ich hoffe die Informationen sind ausreichend. Vielen Dank
  11. Hallo, ich habe noch nicht mit Tinkerforge gearbeitet und möchte nun den Wert eines Drehpotentiometers auslesen bzw. bei Änderung des aktuellen Wertes den neuen Wert angeben. Deshalb versuche ich aktuell mit dem Rotary_Poti dies zu "simulieren" und somit einen ersten kleinen Test nachzustellen. Ich bin prinzipiell für die Sprachen C und Python offen, also falls eine Lösung mittels Python möglich ist kann ich auch jederzeit darauf umsteigen. Ich kann einigermaßen mit C programmieren hatte aber bis zum aktuellen Zeitpunkt noch nie Probleme beim einbinden von Headern. Ich denke, dass darin das Problem liegt. Ich habe alle Dateien (example_callback.c , ip_connection.c , ip_connection.h , bricklet_rotary_poti.h , bricklet_rotary_poti.c) auf C in einem gemeinsamen Ordner namens Tinkerforge zusammen mit dem Projekt gespeichert. Wie in der Online-Anleitung zu Orwell Dev C++ habe ich auch die Projekt-Parameter angepasst. Ich will einfach das example_callback.c Beispiel ans laufen bekommen und wäre für eure Hilfe echt sehr dankbar. Weiß auch nicht warum ich mich da so selten doof anstelle. Mein Problem ist, dass der Compiler den folgenden Fehler anzeigt: ip_connection.c : undefined reference to `__imp_...usw. Id returned 1 Exit Status Falls eine genaue Problembeschreibung notwendig ist bitte Bescheid geben, kann jederzeit den Fehlercode bzw. die Beschreibung dazu einfügen. Vielen Danke im Voraus für eure Hilfe! Viele Grüße Max
×
×
  • Neu erstellen...