Archiv verlassen und diese Seite im Standarddesign anzeigen : einfache tests mit der lib 2.7
hi allerseits,
bin schon wieder da...
ein einfaches progrämmchen, rauskopiert aus der encoder.c und um ein paar zeilen ergänzt:
#include "asuro.h"
#include "inka.h"
int i=0;
int main(void)
{
Init();
WaitforStart();
/*-------------------------------------------*/
EncoderInit ();
for (int i = 0; i < 4; i++)
{
Go (200, 150);
Turn (90, 150);
}
/*---------------------------------------------*/
return 0;
}
was bedeutet in diesem zusammenhang diese fehlermeldung beim compilieren?
../test_lib_2_7.c:13: error: 'for' loop initial declaration used outside C99 mode
bin etwas verwirrt...
Das geht in C so nicht, nur in C++:
C++
for (int i = 0; i < 4; i++)
{
Go (200, 150);
Turn (90, 150);
}
C
int i;
for (i = 0; i < 4; i++)
{
Go (200, 150);
Turn (90, 150);
}
http://www.it-academy.cc/article/1446/ANSI+C99+Grundlagen.html#1.9.4.Die%20for-Schleife|outline
linux_80
22.06.2007, 19:53
Hallo,
wenn man den C-Standard ändert kann man u.a. die Variable auch im for deklarieren, zB:
CFLAGS += -std=gnu99
im makefile mit dazuschreiben
Erklärung:
http://ccrma.stanford.edu/planetccrma/man/man1/avr-gcc.1.html
Ja, das mag richtig sein. Aus Gründen der Übertragbarkeit von Sourcecode hier im Forum sollte man auf diese Kunstgriffe bei ASURO vielleicht besser verzichten.
linux_80
22.06.2007, 20:13
Wenn man es schafft die neue Lib zu verwenden, schafft man es auch diesen Kunstgriff anzubringen.
Wobei ich der Meinung bin, das die Lib in diesem Fall der grössere Kunstgriff ist.
Ich rate aus Kompatibilitätsgründen davon ab.
Bezüglich CFLAGS:
http://en.wikipedia.org/wiki/CFLAGS
http://gentoo-wiki.com/CFLAGS
http://www.henkessoft.de/C++/C++%20Fortgeschrittene/C++_Fortgeschrittene.htm#1.5._Compileroptionen
nach dem entfernen des "int" aus der zählschleife ist die fehlermeldung weg. Es ging mir nur darum zu wissen woher diese kommt. Der codeschnipsel steht in der encoder.c zwar "nur" im komentar, ist aber nicht desto trotz falsch, vielleicht sollte man es irgendwo vermerken, sonst fallen noch mehr anfänger drauf rein...
Hauptsache, Du hast es nun verstanden. ;-)
damaltor
22.06.2007, 23:55
also ich denke es ist egal, wo die variable deklariert ist, zwar ist es im for-header schcieker als in der zeile drüber, aber ich würde auch auf kompatibilität setzen...
jetzt habe ich vorsichtshalber das original selftest geflasht und ablaufen lassen, alles funktioniert tadellos, wenn ich allerdings das programm
#include "asuro.h"
#include "inka.h"
int i=0;
int main(void)
{
Init();
WaitforStart();
/*-------------------------------------------*/
EncoderInit ();
for (i = 0; i < 4; i++)
{
Go (200, 150);
Turn (90, 150);
}
/*---------------------------------------------*/
return 0;
}
flashe und starte, ruckt der asuro nur 4x nacheinander ca 3cm mit ein bischen ausschlag nach rechts, aber von einem rechteck/quadrat kann keine rede sein.
Die odoscheiben sind nicht original, sie haben 6x sw und 6x ws, allerdings laufen die inneren spitzen nicht zu radmitte, sondern tangential zum innenkreis des rades (wurde mal so probiert im thread "asuro will nach hause"). Ich denke aber dass das keine rolle spielen kann. Werden die funktionen go und turn aus irgendwelchen gründen (einbinden von bibliotheken??) nicht richtig interpretiert?
Vielleicht musst Du die Werte in myasuro.h für die Odometrie anpassen. Hast Du dieses Messprogramm schon benutzt?
http://home.planet.nl/%7Ewinko001/Asuro/Software/Asuro%20033/LogOdosToHyperterminal.hex
Die Überführung der Daten aus dem Hyperterminal in ein Excel-Spreadsheet führt zu folgenden Diagrammen: http://www.henkessoft.de/Roboter/Bilder/Odometrie_Links_Rechts.jpg
Daraus kannst Du dann sinnvolle Konstanten für die Encoder ableiten.
Ansonsten: Abdunkelung der Diode/Fototransistor-Kombi und Stabilisierung des Zahnrades auf der Achse, so dass es möglichst nahe an die Diode/Fototransistor-Kombi heran kommt.
dieses messprogramm habe ich nicht benutzt, ich habe das programm von Sternthaler zum ermitteln der werte für die myasuro.h verwendet, die werte dort eingetragen, mit dem ober beschriebenem ergebnis :-(.
Jetzt habe ich die ursprünglichen werte in der myasuro.h reaktiviert, neu compiliert, immerhin fährt der asuro jetzt ein "mehreck", nach rechts, der winkel stimmt nicht mit 90^grad, die länge auch nicht aber ein fortschritt. Immerhin weiss ich jetzt, dass die myasuro.h mit eingebunden wird...
dieses messprogramm habe ich nicht benutzt
Das Programm ist doch Spitze, liefert Dir MIN und MAX für LEFT und RIGHT, und Du kannst die Daten direkt aus dem Programm Hyperterminal nach Excel transferieren zur grafischen Darstellung.
Die Längengenauigkeit von Go(...) kann man durch Kalibrierung in myasuro.h auf 1% genau treffen. Die Winkel von Turn(...) schaffe ich auch nicht genau. Da schätze ich die Abweichung auf min. 20%. Hier liegen einfach zu wenig Messwerte vor pro Grad Richtungsänderung. Vielleicht kann einer der Odometrie-Experten hier noch einen Rat geben, wie man die Genauigkeit erhöhen kann. Eine Möglichkeit besteht darin, dass man die Encoder-Scheiben direkt auf das Motor-Ritzel setzt. Ist irgendwo im Forum beschrieben.
Immerhin weiss ich jetzt, dass die myasuro.h mit eingebunden wird...Du solltest Dir wirklich die einzelnen Sourcecode-Dateien genau anschauen und auch tiefer gehen. Schau Dir an, wo myasuro.h includiert wird. Dort spielen die Konstanten, die in diesem Header mit #define festgelegt wurden, eine Rolle.
eines nach dem anreren ehenkes :-)
momentan stochere ich an viele stellen einfach nur im dunkeln und eine große lichtung wo es wirklich hell wird sehe ich noch nicht...
Aber ich habe vor - wie jetzt hier - mit einfachen 5zeilern dazuzulernen...
edit:
jetzt fährt er ziemlich genau einen quadrat ab (original odo werte, länge und winkel mit dem programm von Sternthaler gemessen in der myasuro.h).
Als ich es ganz stolz meiner frau zeigte, mente sie nur: mein gott bin ich froh, dass ich nicht im quadrat fahren muss...:-)
Tja, Außenstehende können es oft gar nicht richtig würdigen, wieviel Arbeit man aufwenden muß, damit ein Roboter mal im Quadrat fähft. O:)
radbruch
23.06.2007, 15:06
Als ich es ganz stolz meiner Frau zeigte, meinte sie nur: mein gott bin ich froh, dass ich nicht im quadrat fahren muss...
Der weibliche "Gendefekt" verhindert vermutlich, dass Frauen verstehen, was wir so treiben. Meine Frau erzählt ihren Freundinnen immer noch: "Der mic spielt mal wieder mit seinem Auto". Kein Wunder, dass die Frauen hier deutlich unterrepräsentiert sind. O:)
btw: schön dass dein asuro wieder funktioniert
Der weibliche "Gendefekt" verhindert vermutlich, dass Frauen verstehen, was wir so treiben. Meine Frau erzählt ihren Freundinnen immer noch: "Der mic spielt mal wieder mit seinem Auto". Kein Wunder, dass die Frauen hier deutlich unterrepräsentiert sind. O:)
Hallo radbruch,
Es gibt aber doch ein paar Frauen hier, und diese wären dir sicher dankbar, wenn du solche "Witze" unterlassen würdest.
Gruss
M.
radbruch
23.06.2007, 16:02
Ups, sorry. Es sollte eigentlich kein Witz sein. Da ich nicht in Ungnade fallen möchte, entschuldige ich mich natürlich sofort und öffentlich:
Liebe weibliche Roboterfans, es tut mir leid, dass ihr hier unterrepräsentiert seid.
Übrigens bin ich seid mehr als 9 Jahren glücklich mit meiner zweiten Frau verheiratet (die erste war Schrott), ziehe mehr oder weniger erfolgreich drei Kids (m18,w16+m14) groß und geniese es, wenn ich meinem neuen Hobby etwas Zeit midmen kann. Deshalb hier mal ein http://kerker.dnip.net/pics/bussi.gif und ein http://kerker.dnip.net/pics/knuddel.gif für alle (Ehe-)Partner, die wegen der Robotik manchmal etwas zu kurz kommen.
O:)
Liebe weibliche Roboterfans, es tut mir leid, dass ihr hier unterrepräsentiert seid.
Hallo radbruch,
offensichtlich hast du mich nicht ganz verstanden.
Du kannst mit Sicherheit nichts dafür, dass Frauen hier unterrepräsentiert sind, brauchst dich hierfür also auch nicht zu entschuldigen.
Ich meinte das Unterlassen solcher Ausdrücke:
Der weibliche "Gendefekt"
die erste war Schrott
Gruss
M.
radbruch
23.06.2007, 16:31
offensichtlich hast du mich nicht ganz verstanden.
Ich denke, ich habe dich schon richtig verstanden. Und ich denke, die meisten MitleserInnen haben auch mich richtig verstanden. [/offtopic]
jetzt fährt er ziemlich genau einen quadrat ab@inka: Klasse! So, dann kannst Du Dir jetzt mal die Sourcedateien des ASURO anschauen.
@ehenkes
und mich vielleicht wieder etwas mehr meinem projekt widmen. Step by step...
https://www.roboternetz.de/phpBB2/viewtopic.php?t=30676
OT on:
@radbruch
auch ich bin verschiedenen qualitäten in meinen 4 lebespartnerinen begegnet, finde also auch subjektiv eingefärbte statements durchaus ok...
@M.
eine frau die sich in "traditionell mänlichen" sphären bewegt (und Deine qualitäten hat), sollte/könnte doch drüber stehen, oder? Ich denke in solchen situationen oft an meine tochter (36) die elektronikingenieurin ist...
OT off...
und mich vielleicht wieder etwas mehr meinem projekt widmen. Step by step... Die Energieversorgung des ASURO hätte für mich die niedrigste Priorität. ;-)
naja,
es geht ja nicht allein um den saft, da könnte ich wirklich die accus über nacht laden. Es geht ja um die wege dahin. Und das allein ist ja mit einer ganzen menge software- wie auch hardwareprobleme verbunden. Ich möchte ja schliesslich nicht nur um des quadrates wegen im quadrat herumfahren...
frege zu SerPrint:
ist nur so etwas möglich
PrintInt(abst);
SerPrint ("\n\r");
PrintInt(abst0);
SerPrint ("\n\r");
oder kann man die werte auch in einer zeile hintereinander ausdrucken? Ich bekomme immer fehlermeldungen (to many arguments ...bei PrintInt bzw, to few arguments bei SerPrint) wenn ich so etwas probiere:
PrintInt(abst, abst0, abst1);
SerPrint (" ");
Die Zahl der Parameter/Argumente wird bei der Deklaration der Funktion festgelegt.
void PrintInt (int wert) {...} // genau ein Integer
void SerPrint (unsigned char* data) {...} // genau ein Pointer auf ein unsigned char-Array
void PrintInt (int wert)
{
char text [7];
itoa (wert, text, 10);
SerPrint (text);
}
void SerPrint (unsigned char *data)
{
unsigned char i = 0;
while (data [i] != 0x00)
UartPutc (data [i++]);
}
void UartPutc (unsigned char zeichen)
{
UCSRB = 0x08; // enable transmitter
UCSRA |= 0x40; // clear transmitter flag
while (!(UCSRA & 0x20)); // wait for empty transmit buffer
UDR = zeichen;
while (!(UCSRA & 0x40)); // Wait for transmit complete flag (TXC)
}
http://www.tu-clausthal.de/~rzppk/cscript/node30.html#SECTION00061000000000000000
http://www.lernnetz-sh.de/kmLinux/doc/c-vorlesung/teil6/index.htm
damaltor
01.07.2007, 18:07
das ist ein nein... ;)
jetzt habe ich es begriffen, danke ehenkes, aber hauptsächlich dank an damaltor.
Ich hätte jetzt versucht die in lib 2.7 bereits deklarierte PrintInt/SerPrint aufzubohren, das lasse ich jetzt und werde weiter SerWrite verwenden. Schade eigentlich, denn diese, in der 2.7 deklarierte neue funktion führte zum ersten mal zu einer ganz klaren ausgabe im hyperterminal (ohe wirres zeug zu drucken, oder zeichen zu überschreiben), halt nicht in einer zeile, mit immer einem blank dazwischen...
Ich hätte jetzt versucht die in lib 2.7 bereits deklarierte PrintInt/SerPrint aufzubohren.Aus Kompatibilitätsgründen sollte man Funktionen belassen, wie sie sind, sonst wird man einsam. ;-)
Du kannst aber in asuro.h (Deklaration) / print.c (Implementierung) beliebige eigene Funktionen zur Ausgabe hinzufügen, falls Du das häufig benötigst.
Aus Kompatibilitätsgründen sollte man Funktionen belassen, wie sie sind, sonst wird man einsam.
ich bin schon sehr froh hier die comunity gefunden zu haben und aus kompatibilitätsgründen habe ich ja die extrafunktionen, wie die für die US-erseiterung schon in der inka.h untergebracht...
Aber zurück zum PrintInt / SerPrint bzw. Serwrite. Vielleicht/sehr wahrscheinlich sogar rühren meine probleme damit daher, dass ich die funktion nicht genau kenne:
SerWrite("\r\n distanz in cm ",16);
PrintInt(abstand);
hier werden ja die 16 zeichen gedruckt/ausgegeben. Von wo fange ich an zu zählen? Was genau bedeutet diese \r\n? Wo genau beginnt bei der obigen konstaltion der PrintInt mit der ausgabe?
vielleicht könnte ich das auch irgendwo nachlesen, hier direkt zu fragen zu dürfen und eine - für einen anfänger verständliche - antwort fände ich vieel besser...
thx...
... hier werden ja die 16 zeichen gedruckt/ausgegeben. Von wo fange ich an zu zählen? Was genau bedeutet diese \r\n?Dein Problem sind ernsthafte Defizite in der Programmiersprache C.
Du sendest mit SerWrite(...) einen sogenannten String, das ist eine Folge von char, die in einem Array angeordnet sind. Details siehe: http://www.henkessoft.de/C++/C/arrays_pointer.htm
Schaue Dir den ASCII-Zeichencode an: http://de.wikipedia.org/wiki/ASCII
... und die Steuerzeichen: http://de.wikipedia.org/wiki/Steuerzeichen
Die Steuerzeichen sind genau ein Zeichen:
\r 13 0x0D ^M \r CR Carriage Return Wagenrücklauf/Druckkopfrücklauf
\n 10 0x0A ^J \n LF Line Feed Zeilenvorschub
Das r kommt von return und das n von newline.
d.h. diese Steuerzeichen werden als jeweils ein Zeichen mitgezählt.
Wenn ich das oben richtig zähle, sind das 17 Zeichen. PrintInt(...) fängt direkt dahinter an. Willst Du eine Zeile tiefer beginnen, sendest Du vorher ein \r\n, manchmal reicht auch schon ein \n (MS Windows) alleine.
danke ehenkes,
die ensthaften defizite in c sind mir durchaus bewusst. Ich habe schon vieles in meinem leben gemacht, bin von hause aus feinwerktechnik-ing, habe aber auch schon 1981 basic mit dem ZX81 programmiert, php-webseiten erstellt (zumindest die eigene), mit c beschäftige ich mich erst seit januar 2007, von dem zeitpunkt an, wo ich meine an alzheimer erkrankte ehefrau nach 8 jahren pflege in einem pflegeheim unterbringen musste, aber auch wollte...
werde also noch öfters noch dumme frage stellen - und auf hilfreiche antworten hoffen...
werde also noch öfters noch dumme frage stellen - und auf hilfreiche antworten hoffen...Kein Problem. Hier findest Du ein wirklich gutes C-Tutorial: http://www.pronix.de/pronix-652.html
damaltor
02.07.2007, 09:27
man kann doch alles in strings umwandeln (itoa(zahl,string,zahlensystem);) und dann alle strings verketten und im stück senden, oder?
Klar geht das:
http://www.cplusplus.com/reference/clibrary/cstdlib/itoa.html
http://www.cplusplus.com/reference/clibrary/cstring/strcat.html
hi allerseits,
habe wieder ein paar fragen...
das programm aus dem band 2 lässt sich fehlerfrei kompilieren, der asuro fährt auch schön geradeaus:
/* Geradeausfahren mit Initialisierung "geradeausplus.c"*/
#include "asuro.h"
#include "eeprom.h"
#include "inka.h"
// Schwellwert für die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int main(void) {
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
unsigned int distance=0;
unsigned int eeread,eewrite;
char eewriteflag=0;
Init();
WaitforStart();
// liest ein wort aus EEPROM
eeread=eeprom_read_word ((uint16_t*)0);
// Wert auf Plausibilität prüfen
if (eeread<512) {difference=(signed)eeread-256;}
MotorDir(FWD, FWD);
while(1)
{
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status [0] = HIGH;
difference++;
distance++;
eewriteflag=1;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status [0] = LOW;
difference++;
distance++;
eewriteflag=1;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference-- ;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference-- ;
}
// zur Sicherheit: verhindern, dass der Differenzzähler
// den erlaubten Wertebereich veriässt
if (difference<-255 ) difference=-255;
if (difference>255) difference=255;
// status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
// Zähldifferenz passend, auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255, 255+difference);
// Alle 128 Odo-Ticks den Wert ins EEPROM schreiben
if ((distance%128==0) && (eewriteflag==1)) {
eewrite=(unsigned) (difference+256);
eeprom_write_byte ((uint8_t * )0,eewrite&0xFF);
eeprom_write_byte ((uint8_t * )1,eewrite>>8);
eewriteflag=0;
}
return 0;
}
}
auf veränderungen bei TRIGGERLEVEL, auch ins extreme (2000 bzw. 200) reagiert er nicht und fährt weiter geradeaus. Ist das ok? Wozu dann diese variable überhaupt?
zweite frage: kann ich irgendwie überprüfen was da ins EEPROM geschrieben wird, und ob überhaupt???
danke euch
damaltor
14.09.2007, 13:10
trigge bezeichnet einen schwellwert, beidem eine aktion ausgeführ wird. it dieser zu hoch/iedrig,kommen fehler da die aktion zu of bzw. selten ausgeführt wird.
hi damaltor,
danke für die antwort, würde also bei diesem code
----------------------
// Schwellwert für die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
----------------------
bedeuten, dass die variierung in welchem bereich stattfinden sollte? 1er? 10er?
damaltor
16.09.2007, 16:53
die werte gehen von 0 bis 1023. wie weit du gehen musst, wirst du selbst rausfinden müssen, versuche es mit änderungen um 10-20.
die hysterese beschreibt den "variablen bereich". es geht also in deinem beispiel um den wert "600 +- 10".
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.