Jump to content

lakai_-

Members
  • Gesamte Inhalte

    11
  • Benutzer seit

  • Letzter Besuch

Posts erstellt 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. 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.

  6. 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

  7. 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

     

  8. 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

     

  9. 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...