lakai_-
-
Gesamte Inhalte
11 -
Benutzer seit
-
Letzter Besuch
Posts erstellt von lakai_-
-
-
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
-
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
-
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)
-
Okey super danke.
Ich weiß ehrlich nicht genau was du mit Dateistruktur meinst?
Ich habe das Projekt ("Pedal_Test1") unter C:Tinkerforge zusammen mit allen Headern und einigen anderen kleinen Projekten abgelegt.
-
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.
-
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
-
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
-
Vielen vielen Dank für die Hilfe! Funktioniert wirklich super!
Ich wusste dass ich mich wirklich nur blöd anstelle, habe aber mit Bibliotheken einbinden noch nicht sehr viel gemacht.
-
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
-
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
Variable
in Software, Programmierung und externe Tools
Geschrieben
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.
Ich wäre für jede Hilfe wirklich sehr dankbar!!!
LG Max