lakai_- Geschrieben August 2, 2016 at 07:36 Share 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 Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben August 2, 2016 at 14:11 Share 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 Link zu diesem Kommentar Share on other sites More sharing options...
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.