hi allerseits,
der anfang ist gemacht, das ladegerät als solches funktioniert, wird aber aufgrund von warnungen - die ich allerdings noch hinterfragen möchte - nur beim abgeschalteten asuro verwendet...
Druckbare Version
hi allerseits,
der anfang ist gemacht, das ladegerät als solches funktioniert, wird aber aufgrund von warnungen - die ich allerdings noch hinterfragen möchte - nur beim abgeschalteten asuro verwendet...
Hallo
Sieht gut aus! Das Ladegerät von E-Zahnbürsten ist genauso. Wie soll er die station später finden?
Anderes Thema aber wie kann man Plexi biegen?
mfg palermo
lexi vorsichtig erwärmen, und dann vorsichtig biegen. wenn du es zu schnell biegst oder zu stark erwärmst, wird es matt.
das ist ein e-zahnbürsten-ladegerät.
Mit einem guten Föhn?
Ja ein Haarföhn bringt da nix.
Aber Plexiglas ist so spröde, dass es nur sehr schwer zu bearbeiten ist.
Bei ner einfachen Bohrung kann es schon zerspringen.
Besser ist Makrolon, das hat bessere Eigenschaften zum zerspannen und biegen, ist allerdings ziemlich genau doppelt so teuer wie Plexiglas.
@damaltor:
naja, wenns nur matt werden würde wäre es ja nicht so schlimm. Aber nach dem "ganz fest" kommt ja bekanntlich "ganz locker"...
@palermo:
ich föne mir die haare nicht (hab schon zu wenig dafür) :-(
um die station zu finden sehe ich mehrere möglichkeiten:
- IR bake orten
- wärme des ladegerätes orten
- position (kompas)
- odometrie
- ......?
aber eines nach dem anderen...
Jetzt muss erstmal geklärt werden was passiert, wennn er meinetwegen 24h am ladegerät hängt obwohl der akku voll ist, weil irgendwelche überwachung versagt hat... :-(
und wo zu bekommen? Ich habe schon ein paar sachen aus plexiglas gemacht, man muss es halt vorsichtig bearbeiten. Zum biegen eignet sich hervorragend das mini schweissgerät von conrad, kostet blos ein paar euro...Zitat:
Zitat von Asuro-n00b
tolles Projekt! :) Sieht sehr gut aus. Bin gespannt, was draus wird. O:)
Ich bin von der Linienverfolgung über die Taster jetzt gerade zur Odometrie gekommen. Die macht mir durch die neue Lib noch etwas Kopfzerbrechen. :-s Nebenbei lese ich noch Asuro Band I und II. Die Bücher gefallen mir sehr gut und den dritten Teil werd ich mir auch noch kaufen. Da wird es um den Einstieg in die Regelungstechnik gehen. 8-[
Bei E-bay bietet ab und zu mal jemand Reststücke an...
ja, die bücher sind spitze. Im 2ten band ist auch ein programm zu odometrie, muss schon sagen so gerade ist mein asuro noch nie gefahren...
Aber bei dem Programm aus dem Buch seh ich nicht, wo er die Odometrie aktiviert. Muss man das nicht vorher, bevor man es auslesen kann?
Vielleicht hängt das damit zusammen, dass im Buch die Original Library verwendet wird.
Ich hoffe, das bezieht sich nicht auf meinen ängstlichen Beitrag über das Laden von eingebauten Akkus. Denn da hätte ich jetzt bei deiner Ladekonstruktion überhaupt keine Bedenken. Wegen der geringen Leistung die übertragen wird und wegen der galvanischen Trennung ist es sicher ungefährlich für den Kleinen.Zitat:
wird aber aufgrund von warnungen ... nur beim abgeschalteten asuro verwendet
naja, ein bischen schiss habe ich schon bekommen...
ich habe vor einer stunde den braun-service bemüht und nach dem prinzip gefragt nach dem die arbeiten. Wenn da einfach nur strom reingepowert werden würde ohne rücksicht auf den ladezustand wäre die lebesdauwer der akkus (wer legt die bürste schon neben der ladestation hin!) nicht sehr hoch. Mal schauen was sie mir antworten...
Paar kleine Anmerkung zum Wiederfinden da Ladestation von mir:
- Wärme Ortung ist nicht geeignet (viel zu störanfällig)
- Odometrie ist auch sehr ungenau, vor allem wenn du eine weile rumgefahren bist
- Kompass alleine wird nicht aureichend
Ich finde die beste Variante (die auch schon oft benutzt wurde) ist eine Bake an der Ladestation aufzustellen. Daran kann der Roboter sich grob orientieren. Auf dem Boden um die Bake hast du noch einen Streifen für die Linienfolgesensoren, damit Asuro exakt andocken kann.
Fast wie der Leitstrahl, den Flugzeuge benutzen um sicher zu landen.
MfG Marcus
plexiglas lässt sich mit einem heissluftfön (also kein haarfön) ganz fein biegen. vorsichtig halt...
ich habe immer mal wieder mit "bastelglas" gearbeitet. etwa halb so teuer wie plexiglas, aber von den eigenschaften recht ähnlich.
überhaupt wäre zB eine art kreis um die ladestation nicht schlecht, so dass der asuro nur ungefähr peilen muss und sich dann im kreis orientieren kann.
hi allerseits,
warscheinlich weil ich so lange offline war wurde ich per pm gefragt wie weit ich nun mit der automatischen ladestation bin...
noch nicht sehr weit, aber es wird daran - zumindest theorethisch - gearbeitet...
Ich selber würde gerne helfen, aber leider bin ich noch nicht sehr weit fortgeschritten in der Asuro-Welt, aber ich werde trotzdem mal meine Idee zur Wiederfindung posten ...
Dazu gefällt mir die Idee von Acu ganz gut ...
Die Bake kann ja ähnlich wie ein Leuchtturm sein, nur das der auf Infrarotbassis einen bestimmten Impuls sendet, wenn der Asuro nun mit dem Infrarot-Entfernungsmesser ausgerüstet ist und man den Asuro so programmiert, dass er auch auf den Impuls des "Leuchtturms" reagiert, müsste er doch auf diesen Punkt zufahren können und ab einer gewissen Entfernung die Linienfolgesensoren aktivieren, um die Leitstreifen zum Andocken zu finden.Zitat:
Zitat von ACU
Ist doch möglich oder?
so ähnlich habe ich es mir auch gedacht. Nur muss sich mein asuro auch noch um 180° drehen und zumindest die letzte strecke rückwärts hinfahren weil die vorrichtung zum andocken hinten ist.
Momentan bin ich dabei das auslesen der akkus zu testen, er soll ja bei einer bestimmten spannung seine tätigkeit (welche auch immer) abbrechen und energie holen.
so sieht mein programm aus:
was mich dabei wundert ist /sind die unterschiede bzw. die schwankungen der ausgelesenen werte (vonn 800 bis 950, wenn ich den asuro hochbocke, kann ich es am monitor ausgeben)Code:#include "asuro.h"
#include "inka.h"
int wert, i;
int main (void)
{
Init();
WaitforStart();
while(1)
{ //start programm
wert = Batterie (); //Abfrage batterispannung
EncoderInit ();
for (i = 0; i < 4; i++) //start eigentliches programm
{
Go (200, 150);
StatusLED(GREEN);
Msleep(500);
Turn (90, 150);
StatusLED(YELLOW);
Msleep(500);
if (wert < 700) // 810 entsprechen ca. 4,455 Volt
{
StatusLED(RED);
PrintInt(wert);
break; //statt break dann sprung zu ir-suchprogramm
}
SerWrite("\r ",4);
PrintInt(wert);
}
} //ende programm
return 0;
}
bis anfang der nächsten woche komme ich überhaupt nicht dazu weiterzumachen :-(, weil ich etwas dringendes übersetzen muss...:-) - schliesslich bring das geld...
eine andere frage:
könnte es sein, dass das US-modul die genauigkeit der odometrie beeinflusst? jedenfalls sind die quadrate, die der suro ohne fährt viel genauer, die turn funktion macht wirklich 90°...
Kleine Frage am Rande:
Was ist das US-Modul?
b2t:
Ich würde es vielleicht so machen, dass er die Linie folgt und diese geht an der Station vorbei und fängt an heller zu werden bzw. ist dann heller als die andere. Dann kann ja der Asuro merken oh ... andere Intensität ... => Rückwärtsgang und dieser Linie folgen ...
Müsste doch möglich sein oder?
evtl wäre das auch ein einsatzgebiet für die barcodes. der die linie wird einfach gestrichelt zum ende hin.
eigentlich sollte das us modul den rest nicht beeinflussen... =)
Was ist nun eigentlich das US-Modul?
ultraschall-entfernungsmessung. das ist eine erweiterungsplatine, welche in dem buch für den asuro beschrieben wird.
hi allerseits,
ich versuche mich wieder mal an meinem projekt, mit der batteriespannung und dem aussortieren der ausreisser bin ich eigentlich zufrieden, obwohl man es sicher elegenter machen kann:
ich wollte mir aber zu den Batterie() werten auch noch die daraus errechnete spannung ausgeben, was ich auch mache, wo und wonach ich auch suche, es wird einfach nix im terminal ausgegeben...Code:/*ladestation_anfahren*/
#include "asuro.h"
#include "inka.h"
#include "stdio.h"
unsigned int batt_1;
unsigned int batt_2;
unsigned int batt_3;
double u_batt;
int main (void)
{
Init();
WaitforStart();
while(1)
{
(batt_1)=Batterie();
(batt_2)=Batterie();
(batt_3)=Batterie();
if ((batt_1)<((batt_2)-(batt_2)/100)) (batt_1)=Batterie();
if ((batt_2)<((batt_3)-(batt_3)/100)) (batt_2)=Batterie();
if ((batt_3)<((batt_1)-(batt_1)/100)) (batt_3)=Batterie();
(u_batt)= 0,0055*Batterie();
SerWrite("\r\n batt_1: ",11);
PrintInt(batt_1);
SerWrite(" batt_2: ",9);
PrintInt(batt_2);
SerWrite(" batt_3: ",9);
PrintInt(batt_3);
SerWrite(" u_batt: ",9);
printf ("%5f", (u_batt));
SerWrite(" [V]",4);
{
EncoderInit();
if (PollSwitch()>0) {
StatusLED(RED);
Go (-100, 150);
}
else {
Go (200, 150);
StatusLED(GREEN);
Msleep(500);
}
if (PollSwitch()>0) {
StatusLED(RED);
Go (-100, 150);
}
else {
Turn (90, 150);
StatusLED(YELLOW);
Msleep(500);
}
}
}
return 0;
}
auszug aus dem oberen code:
was stimmt da nicht?Code:PrintInt(batt_3);
SerWrite(" u_batt: ",9);
printf ("%5f", (u_batt));
SerWrite(" [V]",4);
Hallo inka,
printf alleine funktioniert so nicht. Dazu müßtest du die Ausgabe (STDOUT) auf die serielle Schnittstelle umleiten. Alternativ könntest du sprintf verwenden, dann ist das Ziel ein String. Den könntest du dann mit SerWrite ausgeben.
Wie das geht, steht im mikrocontroller.net Tutorial
Für Floating Point Ausgaben benötigts du zudem noch eine AVR Lib, die du im Makefile hinzufügen mußt, siehe
http://www.mikrocontroller.net/artic...mit_AVR-Studio
Allerdings fiunktioniert die Umleitung von STDOUT, so wie im Tutorial beschrieben, mit neueren AVR-GCC Compilern wohl nicht mehr.
hi allerseits,
dank Printfloat bin ich wieder ein kleines stückchen im projekt weitergekommen, jetzt kann ich am monitor den stand der batterieladung überprüfen. Schön wäre es allerdings, wenn ich jetzt noch ein schritt weiterkäme - den batteriestand in Volt auf der LCD erweiterungsplatine anzuzeigen. dazu muss ich die am monitor ausgegebene floatvariable wieder in einen string umwandeln um sie dann "pixel für pixel" auszugeben. Ist das so? Ich habe im asuro-band II nämlich keine funktion gefunden, die es möglich macht irgendwelche, wie auch immer geartete variable auszugeben. Nur text und pixel...
text ist schonmal nicht schelcht.
ich hab mal nen ansatz zum nachdenken für dich:
du hast eine zahl die den batteriezusatnd beschreibt. am besten wäre ein int oder ein char.
wenn du aus diesem die einzelnen ziffern extrahierst (dazu unten mehr), macht das die sache einfacher. beispiel: aus 123 wird 1 und 2 und 3
jetzt such n dem display-zeichensatz nach der position der null. direkt dahinter kommen 1,2,3... usw. wenn du jetzt den positionswert der null zu einer zahl die du so extrahiert hast addierst, kommst du automatisch auf das richtige, auszugebende zeichen. beispiel: wir nehmen an, dass die null den wert 48 (oder 0x30) hat. jetzt wollen wir die zahl 140 ausgeben:
zuerst zerlegen: 1 4 0
jetzt die eins ausgeben:
48 + 1 = 49 --> wert für eine eins auf dem display
48 + 4 = 52 --> wert für eine vier auf dem display
48 + 0 = 48 --> wert für eine null auf dem display
jetzt brauchen wir nur noch eine methode, um die ziffern aus der ganzen zahl rauszubekommen. diese die ich dir jetzt zeige geht nur für ganzzahlen, also chars und ints. in diesem falle nehme ich einen char als beispiel, die integer funktionieren genauso (bloss dass die zahlen zwei stellen mehr haben).
Beispiel: 246
zuerst wollen wir die hunderterstelle haben.
unsigned char hunderter(unsigned char zahl){
return zahl/100;
}
das war schonmal recht einfach. die zahl wird durch 100 geteilt, der rest fällt weg, und die hunderter bleiben. 246 / 100 = 2
jetzt die zehner:
unsigned char zehner(unsigned char zahl){
return (zahl - (100 * hunderter(zahl)))/10;
}
zuerst wird hundert mal die hunderterstelle abgezogen und dann der rest durch 10 geteilt.
246 - 100*2 = 46
46 / 10 = 4
jetzt nur noch die einerstelle:
unsigned char einer(unsigned char zahl){
return zahl - (100*hunderter(zahl)) - (10*zehner(zahl));
}
es werden erst hundert mal die hunderterziffer, und dann zehn mal die zehner-ziffer abgezogen.
246 - 100*2 - 10*4 = 6
und dann kannst du das so machen wie oben beschreiben. den zeichenwert der null addieren ("offset") und ans display ausgeben.
hi damaltor,
danke erstmal, die erkklärung zu den stellen im display so weit verstandan...
frage noch dazu:
was bedeutet das konkret?Zitat:
(bloss dass die zahlen zwei stellen mehr haben).
in diesem beispiel ist "unsigned char hunderter" eine vorher noch zu definierende variable, die nach der ausführung der berechnung im o.g. beispiel den wert 2 hat?Zitat:
Beispiel: 246
zuerst wollen wir die hunderterstelle haben.
unsigned char hunderter(unsigned char zahl){
return zahl/100; }
"(unsigned char zahl)" entspricht im beispiel der zahl 246 (die ja auch noch zugewiesen werden muss? Könnte dort die zahl vor dem komma aus dem spannungswert der batterie übernommen werden (natürlich die einserstelle incl. der berechnung)?
mit "{ return zahl/100;}" wird das ergebnis hunterter berechnet und wo ausgegeben?
Hallo
Das Thema "PrintChar()" hatten wir grad in einem anderen Thread. Das Ergebniss ist eine geile Funktion von izaseba weiter unten im Thread:
https://www.roboternetz.de/phpBB2/vi...=328202#328202
mic
unsigned char hunderter ist die funktion, welche aus dem "unsigned char zahl" die hunderterstelle extrahiert und mit return zurückgibt.
beispiel:
hunnis = hunderter(batteriespannung)
zehnis = zehner(batteriespannung)
einis = einer(batteriespannung)
jetzt ist in jeder der drei variablen ein byte gespeichert, das die jeweilige stelle reräsentiert, bei 246 also:
hunnis = 2
zehnis = 4
einis = 6
das sind also keine variablen, sondern funktionen :P
radbruch: es geht nicht um das senden ans terminal, sondern um das senden an ein lcd display...
hi damaltor,
du hast es nicht einfach mit mir :-(
dieser code:
liefert diese warnunge, bzw. fehlermeldungen:Code:int main(void)
{
Init();
unsigned int zahl;
zahl=Batterie();
unsigned int hunderter(unsigned int zahl){
return zahl/100;
}
SerWrite("\r\n hunderter: ",14);
PrintInt(hunderter);
return 0;
}
leider verstehe ich weder das eine noch das andereCode:../lcd_ausgabe.c:21: warning: passing arg 1 of `PrintInt' makes integer from pointer without a cast
../lcd_ausgabe.c:24: internal compiler error: trampolines not supported
mach mal PrintInt(*hunderter)
eigentlich muss nämlich eine zahl in den klammern stehen und nicht eine variable =) den zweiten fehler würd ich mal ignorieren, evtl verschwindet der dann von allein.
was auch gehen könnte ist:
PrintInt(Hunderter(zahl));
die zweite lösung wars:
hunderter: 9 zehner: 0 einer: 6
:-) danke
sehr gut. und so ähnlich müsste es auch mit dem display klappen, indem du den offset addierst und dann ausgibst.
AARGH:
mir fällt grad was auf. das sollte durchaus so funktionieren wie vorher (PrintInt(hunderter);) ABER du hast die funktion INNERHALB der main-funktion deklariert. dieser absatz
MUSS ÜBER DER MAIN-FUNKTION STEHEN und nicht mittendrin :PCode:unsigned int hunderter(unsigned int zahl){
return zahl/100;
}
ich habe es jetzt so abgeändert:
die auskomentierte zeile mit batterie hat er angemeckert, weil keine konstante, kommt später dran. Die warnung wg. der geänderten zeile PrintInt(hunderter);Code:#include "asuro.h"
#include "lcd.h"
#include "i2c.h"
int zahl=246;
//int zahl=Batterie();
int hunderter( int zahl){
return zahl/100;
}
int zehner( int zahl){
return (zahl - (100 * hunderter(zahl)))/10;
}
int einer( int zahl){
return zahl - (100*hunderter(zahl)) - (10*zehner(zahl));
}
int main(void)
{
Init();
SerWrite("\r\n hunderter: ",14);
PrintInt(hunderter);
SerWrite(" zehner: ",9);
PrintInt(zehner(zahl));
SerWrite(" einer: ",8);
PrintInt(einer(zahl));
return 0;
}
kommt aberr wieder:
Zitat:
../lcd_ausgabe.c:30: warning: passing arg 1 of `PrintInt' makes integer from pointer without a cast
hallo,
mit diesem code
habe ich bereits die größe des hexfiles erreicht die in den atmega8 nicht mehr reinpasst, bzw. eine fehlermeldung beim flashen ausgegeben wird...Code:#include "asuro.h"
#include "lcd.h"
#include "i2c.h"
int zahl;
unsigned int batt_1, batt_2, batt_3;
float spannung;
/************hunderter**********/
int hunderter( int zahl){
return zahl/100;
}
/*************zehner************/
int zehner( int zahl){
return (zahl - (100 * hunderter(zahl)))/10;
}
/*************einer*************/
int einer( int zahl){
return zahl - (100*hunderter(zahl)) - (10*zehner(zahl));
}
/************************batterieabfrage*************************************/
void batt_abfrage(void)
{
(batt_1)=Batterie();
(batt_2)=Batterie();
(batt_3)=Batterie();
if ((batt_1)<((batt_2)-(batt_2)/100)) (batt_1)=Batterie();
if ((batt_2)<((batt_3)-(batt_3)/100)) (batt_2)=Batterie();
if ((batt_3)<((batt_1)-(batt_1)/100)) (batt_3)=Batterie();
spannung=(batt_3 + batt_2 + batt_1)/535.1;
}
int main(void)
{
Init();
zahl=Batterie();
batt_abfrage();
SerWrite("\r\n hunderter: ",14);
PrintInt(hunderter(zahl));
SerWrite(" zehner: ",9);
PrintInt(zehner(zahl));
SerWrite(" einer: ",8);
PrintInt(einer(zahl));
SerWrite(" spg: ",6);
PrintFloat(spannung,1,5);
return 0;
}
Kann das sein, oder ist da irgendwo ein fehler? Ich habe mit staunen festgestellt, dass das Printfloat mit dem einbinden von printf.c eine vergrößerung der hexdatei von 18,235k auf 22,237k bewirkt. Eine printzeile! Da muss ich wohl um mein ziel zu erreichen noch was tun...
tja.. floats sind halt echt tückisch. da gehen einige kilobyes flöten... deshalb behilft man sich soweit es geht mit ints oder am besten sogar chars.
du teilst auch durch 535.1, was ja auch ein float ist. evtl solltest du durch 535 teilen, und versuchen alles auf integer zu bringen. das würde den code deutlich verkleinern.
warum setzt du batt_1 ,2 ,3 in klammern? geht auch ihne denke ich, könnte sein dass der compiler hier ein paar unnötige bytes produziert.
was evtl ein problem sein könnte, ist dass die unsigned int bis zu 5 stellen haben können. deshalb wird die zahl der hunderter nicht korrekt berechnet, da alle stellen über der dritten mit in die hnderterstelle eingefügt werden.
du brauchst also, wenn du größere zahlen als 999 bearbeitest, noch eine funktion für tausender, und wenn du größere zahlen als 9999 bearbeitest, auch eine für 10tausender.
schönen guten morgen...
ein anderes thema, hängt aber auch mit der ausgabe am lcd zusammen. Folgender code:
lässt sich problemlos compilieren, am lcd tut sich aber nix...Code:#include "asuro.h"
#include "lcd.h"
int main(void)
{
Init(); //Initialisiert ASURO
InitLCD();
PrintAlignLCD (LEFT, 1, "Ich bin");
PrintAlignLCD (RIGHT, 2, "asuro");
// for(;;);
return 0;
}
was habe ich übersehen?
das mit den klammern habe ich geändert, aber beim teilen durch 535 werden alle nachkommastellen durch nullen ersetzt :-(Zitat:
Zitat von damaltor
hmm das ist wahr. aber wenn du die zhal vorher mit 100multiplizierst, und dann bei der ausgabe darauf achtest das komma an die richtige stelle zu setzen, hast du trotzdem zwei nackommastellen... =)
10 / 8 = 0.125 -> kommazahlen
10 * 100 / 8 = 125 -> keine kommazahlen
ok,
das habe ich glaube ich verstanden, werde ich ausprobieren...
der beitrag weiter oben - was habe ich bei der initialisierung des lcd vergessen? Zumindest in der lcd.c habe ich weiter nichts gefunden? Ist es eigentlich so, dass mit der lcd.c aus der 2.7.1 lib jetzt alle programme aus dem band II nicht funktionieren?