Jump to content

Recommended Posts

Geschrieben

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

 

Geschrieben

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);
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...