Jump to content

Servo mit Rotary Brick steuern


Recommended Posts

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

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...