lakai_- Geschrieben August 2, 2016 at 07:36 Geschrieben August 2, 2016 at 07:36 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 Zitieren
photron Geschrieben August 2, 2016 at 14:11 Geschrieben August 2, 2016 at 14:11 Die servo Variable ist an der Stelle nicht bekannt, da sie nicht im Scope ist. Du solltest dich mal über Scopes und Gültigkeitsbereiche in C informieren. Damit du das Beispiel erstmal in Gang bekommst musst du folgendes tun: Bei rotary_poti_register_callback als letztes Parameter einen Pointer zum Servo Objekt übergeben: rotary_poti_register_callback(&rp, ROTARY_POTI_CALLBACK_POSITION, (void *)cb_position, &servo); Diese Parameter kommt dann als user_data beim Callback an. Dort kannst du dann daraus wieder den Pointer zum Servo Objekt zurück casten und nutzen: void cb_position(int16_t position,void *user_data) { Servo *servo = (Servo *)user_data; servo_position = 9000*position/150; servo_set_position(servo, 1, servo_position); } Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.