PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Balancieren auf 1 Rad / Entfleuchen auf 2 Rädern



HermannSW
01.04.2007, 00:25
Beim Durchsuchen meiner Videos vom Asuro fand ich zwei interessante wieder.

Ich hatte damals einiges über balancierende Roboter/Asuro's gelesen und wollte auch meinem Asuro das Balancieren beibringen. Damit das nicht ein reines Nachmachen war, versuchte ich, ein Rad fixiert zu lassen (mittels BREAK), und somit mit nur einem Rad zu balancieren.

Das etwas schummerige Licht war notwendig, da der Außenlichtschutz um die IR-FortLED und die Fototransistoren bei einer solchen Neigung des Asuro natürlich unwirksam war. Die Rolle mit Süßstofftabletten ließ sich mit Isolierband gut als Kontergewicht verwenden.

Hier nun das Video:
http://www.stamm-wilbrandt.de/videos/070221_004339_frame.gif (Video 3gp (http://www.stamm-wilbrandt.de/videos/070221_004339.3gp) mpeg (http://www.stamm-wilbrandt.de/videos/070221_004339.mpeg))

Am verblüffendsten fand ich, wie einfach das Programm war, welches dieses Balancieren ermöglichte:
#include <asuro.h>

#define SPEED 0xdF

#define THRESHOLD 231

int main(void)
{
unsigned int sum,data[2];

Init();

FrontLED(ON);

MotorSpeed(SPEED,SPEED);
MotorDir(BREAK,BREAK);

for(;;) {
LineData(data);

sum=data[LEFT]+data[RIGHT];

if (sum<THRESHOLD) MotorDir(RWD,BREAK);
else MotorDir(FWD,BREAK);
}

while (1);

return 0;
}


Ein paar Tage zuvor klappte das mit dem Balncieren noch nicht so ganz. Aber einmal war der Asuro fast dran, entschied sich aber, auf 2 Rädern zu entfleuchen! Wie gut, daß ich ihn gerade noch vor der Tischkante erwischt habe ... :)
http://www.stamm-wilbrandt.de/videos/070218_000611_frame.gif (Video 3gp (http://www.stamm-wilbrandt.de/videos/070218_000611.3gp) mpeg (http://www.stamm-wilbrandt.de/videos/070218_000611.mpeg))

stochri
01.04.2007, 12:15
Hallo Hermann,

sehr erstaunlich, was man erreichen kann, wenn man unvoreingenommen an eine Sache herangeht. Nicht schlecht !

Das "entfleuchen"-Video geht bei mir aber leider nicht.

Gruss,
stochri

waste
01.04.2007, 12:29
Gratuliere Hermann!

Ich habe bei meinen Versuchen auch so angefangen. War auch erstaunt, dass es mit einem 2 Punkt-Regler schon geht.

Gruß Waste

HermannSW
02.04.2007, 01:05
Hallo,

Hallo Hermann,

sehr erstaunlich, was man erreichen kann, wenn man unvoreingenommen an eine Sache herangeht. Nicht schlecht !

Das "entfleuchen"-Video geht bei mir aber leider nicht.

Gruss,
stochriging denn das 1. Video?
Ich habe beide 3gp-Videos von meinem Fotohandy mittels des Mobile Media Converter 1.2.0 ins mpeg-Format wandeln lassen.

Da ich das Video aber echt gut finde, habe ich es eben als animated-gif gespeichert, jetzt aber mit 388Kb ohne Ton (gegenüber 61Kb mit Ton für 3gp):
http://www.stamm-wilbrandt.de/videos/070218_000611_anim.gif
(Endlosschleife: 8s Video, 1s Pause, nachdem Alles geladen ist)

[Wie? 3gp-Video in Quicktime Player 7.1.5 mittels Pfeil-Rechts-Taste einzelbildweise abspielen, jedes Bild mittels CTRL-C kopieren, in Irfanview 3.85 mit STRG-V und S als .gif speichern, und die einzelnen gif's mittels gifsicle zu einem animated gif zusammensetzen ... :)]


Angeregt durch dieses nette Entfleuchen habe ich nun aber noch eine große Frage!
Könnt Ihr Euch vorstellen, daß der Asuro auf 2 Rädern eine Kontour umfahren kann?

Genauer: Im Bild links oben ist eine schwarz ausgefüllte Kontour dargestellt. Der Asuro soll diese am Rand auf zwei Rädern umfahren. Da innen alles schwarz ist, braucht man für die Randverfolgung nur einen Fototransistor -- dies sei hier der rechte. Der linke schaut immer brav (evtl. mit Schrumpfschlauchfokussierung) in die innere schwarze Fläche. Mittels seiner Helligkeitswerte kann der Asuro balancieren (siehe schematisch rechts unter im Bild, Ausschnitt der zu umfahrenden Kontour und Teil des Asuro mit dargestellten Fototransistoren und FortLED). Nun soll das Balancieren durch eine forcierte leichte "Vorlage" in eine leichte Vorwärtsbewegung gewandelt werden. Der rechte Fototransistor soll für eine Rechts-/Links-Steuerung der Räder beim (langsamen) Vorwärtsfahren sorgen ...
http://www.stamm-wilbrandt.de/videos/Umfahren.gif

Ich bin erst dabei, darüber Nachzudenken, habe noch nichts programmiert, und bin dankbar für Kommentare!

_HP_
02.04.2007, 01:26
Hi Hermann,

Du hast mir mit diesem Thread einen angenehmen Abend beschert :-) Es hat mir natürlich keine Ruhe gelassen, dass es mit einem so einfachen Programm möglich sein sollte, auf zwei Rädern zu fahren. Also haben ich meinem ASURO 4 AA Accus auf das Batteriepaket geschnallt und ein wenig an den Parametern in Deinem Programm gespielt.

Meine Linienfolgeeinheit ist mit einer superhelle LED bestückt und ich habe den Versuch auf weißer Presspappe unter schwacher Taschenlampenbeleuchtung durchgeführt.

Und - JA, es hat funktioniert!!!! Meine Parameter waren:

#define SPEED 240
#define THRESHOLD 53

Na - jedenfalls hat es mir super Spaß gemacht, auch wenn ich das wohl in ein paar Stunden bereuen werde, wenn ich mich am Schreibtisch zu irgendwas motivieren soll...

Danke also für Deine Anregung. Als nächstes werde ich mich dann wohl mal mit Regelungstechnik beschäftigen müssen. Frage an Waste: Welches Buch (welche Bücher) kannst Du dafür empfehlen? Ich habe mir schon mal "Einführung in die Regelungstechnik" von Mann/Schiffelgen/Froriep besorgt. War das eine gute Entscheidung?

Na wie auch immer - ich muss jetzt ins Bett - kann aber jedem das Experiment nur empfehlen...

Gruß,

_HP_

waste
02.04.2007, 21:07
Angeregt durch dieses nette Entfleuchen habe ich nun aber noch eine große Frage!
Könnt Ihr Euch vorstellen, daß der Asuro auf 2 Rädern eine Kontour umfahren kann?
Ja, das kann ich mir vorstellen.
Probier mal mit dem rechten Sensor zu balancieren und dem linken Rad eine geringe Geschwindigkeit vorgeben! Dann sollte er eigentlich automatisch der Kontur folgen. Die Schwelle sollte so eingestellt sein, dass der rechte Sensor auf die Mitte der schwarz/weiß Grenze balanciert.

@_HP_
Ich selbst habe keine Bücher zur Regelungstechnik, kann dir deshalb auch kein bestimmtes empfehlen. Wenn ich was nachschauen muss, reicht mir das Internet.

Waste

HermannSW
03.04.2007, 21:24
Hi,


Angeregt durch dieses nette Entfleuchen habe ich nun aber noch eine große Frage!
Könnt Ihr Euch vorstellen, daß der Asuro auf 2 Rädern eine Kontour umfahren kann?
Ja, das kann ich mir vorstellen.diese Bemerkung hat mich zu ersten Spielereien bzgl. Vorwärtsneigung verleitet ... :)



Erstes Video flott (30s, 3gp (http://www.stamm-wilbrandt.de/videos/070403_014401.3gp) / mpeg (http://www.stamm-wilbrandt.de/videos/070403_014401.mpeg)) http://www.stamm-wilbrandt.de/videos/070403_014401_anim.gif.
Zweites Video langsam, aber dafür vor/zurück/vor tänzelnd ... :) (30s, 3gp (http://www.stamm-wilbrandt.de/videos/070403_015303.3gp) / mpeg (http://www.stamm-wilbrandt.de/videos/070403_015303.mpeg)).


Vielleicht könnte es ja später mal die Befehle void Go2W ( int distance, int speed)
void Turn2W (int degree, int speed)als Varianten der Befehle Go() und Turn() in der Asuro-Lib geben (xxx2W = "on 2 wheels") ...


Falls Ihr jetzt Lust zum Probieren bekommen habt, dann: Einfach ein Kontergewicht hinten aufschnallen (letztes Mal war es eine Süßstofftablettenrolle, diesmal war es ein zusätzlicher 2x2xAA-Batteriepack), sodaß der Asuro einen brauchbaren (?) Gleichgewichtspunkt hat.
Dann ein Programm flashen, welches die Fotosensorwerte ausgibt, z.B. dieses:
#include <asuro.h>

int main(void)
{
unsigned int data[2];

Init();

FrontLED(ON);

for(;;) {
LineData(data);

PrintInt(data[LEFT]);
SerPrint(",");
PrintInt(data[RIGHT]);
SerPrint(" / ");
PrintInt(data[LEFT]-data[RIGHT]);
SerPrint(",");
PrintInt(data[LEFT]+data[RIGHT]);
SerPrint("\r\n");

Msleep(500);
}

while (1); // unreachable code

return 0;
}
Nun den Asuro im Gleichgewichtszustand halten und die Werte hierfür im Terminalprogramm ablesen.
Dann mit diesen Werten im Zweipunktregler weiter oben im Thread experimentieren!Viel Spaß!

stochri
03.04.2007, 22:58
Hallo Herrann,

wie man aus Deinem Video schön sieht, hat die Einrad-Balance gegenüber der 2Rad-Balance sogar Vorteile: Der Roboter fährt nicht so einfach vom Tisch, wenn er versucht das Gewicht nach vorne Auszubalancieren. Das war bei meinen Experimenten immer das Problem.

Gruss,
stochri

_HP_
04.04.2007, 22:46
Hi,

ich habe das Programm von Hermann mal als Vorlage genommen und es etwas "verkompliziert". ;-)

Inhaltlich bleibt es bei dem Zweipunktregler. Allderdings versuche ich den Einfluß des Umgebungslichtes zu unterdrücken (ich meine die Idee dazu mal bei waste gefunden zu haben). Bei meinen Messungen (mit einer superhellen LED am Liniensensor) war es allerdings nötig, eine Wartezeit zwischen den Messungen mit aus- bzw. eingeschalteter LED einzuschieben, da die LED zu träge ist. Das mag mit anderen LEDs anders sein.

Weiterhin habe ich die Taster dazu verwendet, um "on the fly" die Parameter für Geschwindigkeit und Hell/Dunkelschwelle zu ändern. Dies geht mit schrittweisem Erhöhen oder erniedrigen oder direktem Eingeben über ein Terminalprogramm oder - im Falle der Hell/Dunkelschwelle - auch über das Messen des Wertes, wenn man den Roboter in der austarierten Stellung hält.

Die Funktionen UartGetc() und ReadInt() schlage ich vor als Erweiterung in die nächste Lib-Version aufzunehmen. Natürlich fehlt dann auch noch ein ReadLong(), dass aber analog zu ReadInt() zu programmieren wäre. Damit hätten die entsprechenden Print-Funktionen dann auch ihr Gegenstück.

Schaut Euch das mal an, experimentiert damit und sagt eure Meinung...

Gruß,

_HP_

EDIT: Der code wurde leicht verändert.



/************************************************** **************************/
/*!
\file test.c

\brief
Programm zum Balancieren von ASURO auf den Hinterrädern.

\par Hinweis:
Die Regelung erfolgt mittels Zweipunktregler. Bitte auch die Infos zur\n
Funktion main() beachten.

\author _HP_

\version beta - 04.04.2007 - _HP_\n
first implementation

\version beta - 05.04.2007 - _HP_\n
bugfixing in ReadInt und kleine Änderungen im Hauptprogramm
************************************************** ***************************/
/************************************************** ***************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
* *
************************************************** ***************************/
#include <asuro.h>
#include <stdlib.h>

#define INI_SPEED 240
#define INI_THRESHOLD 53

// Tastenwert bitorientiert, K1 = Bit5, K2 = Bit4, K3 = Bit3, K4 = Bit2,
// K5 = Bit1, K6 = Bit0
#define K1 (1 << 5) // Schalter an der linken Seite neben der IR-Diode
#define K2 (1 << 4)
#define K3 (1 << 3)
#define K4 (1 << 2)
#define K5 (1 << 1)
#define K6 (1 << 0)


/************************************************** **************************/
/* */
/* Funktion: UartGetc() */
/* */
/*!
\brief
Einlesen eines Zeichens von der serielle Schnittstelle. Die Funktion wartet\n
solange, bis ein Zeichen gelesen wurde!

\param
keine

\return
gelesenes Zeichen

\author _HP_

\version beta - 04.04.2007 - _HP_\n
first implementation

\par Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
\code
char c;
c = UartGetc();
\endcode
************************************************** ***************************/
char UartGetc(void)
{
unsigned char data = 0x00; // gelesenen Zeichen

UCSRB = 0x10; // Empfaenger einschalten
while (data == 0x00)
{
if (UCSRA & 0x80) data = UDR;
}
return data;
}


/************************************************** **************************/
/* */
/* Funktion: ReadInt() */
/* */
/*!
\brief
Einlesen einer Zahl im Integerbereich (+/- 32767) von der serielle /n
Schnittstelle./n

Die Funktion wartet bis entweder 6 erlaubte Zeichen (Ziffern und an erster\n
Stelle ein Vorzeichen) eingegeben, oder ein Zeichen im Bereich 0x00 - 0x1F\n
gelesen wurden!

\param
keine

\return
Integerwert der eingegebenen Zeichen

\author _HP_

\version beta - 04.04.2007 - _HP_\n
first implementation

\version beta - 05.04.2007 - _HP_\n
numbers[] um ein byte vergrößert, um immer ein NULL-Zeichen\n
am Ende zu haben

\par Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
\code
int z;
z = ReadInt();
\endcode
************************************************** ***************************/
int ReadInt(void)
{
unsigned char c; // gelesenes Zeichen
unsigned char i = 0; // Index in numbers
char numbers[7] = {0x00}; // Vorzeichen und 5 Ziffern + abschließendes /0

while (i < 6) // Es können maximal 5 Ziffern und ein Vorzeichen gelesen werden
{
c = UartGetc();
if ((c > 0x2F) && (c < 0x3A))
{
numbers[i++] = c;
}

if ((i == 0) && ((c == 0x2B) || (c == 0x2D))) // Vorzeichen an erste Position zulassen
{
numbers[i++] = c;
}

if (c < 0x20) // Beenden bei Eingabe eines nichtdruckbaren Zeichens
{
i = 10;
}
}

return atoi(numbers);
}


/************************************************** **************************/
/* */
/* Funktion: ReadSensor() */
/* */
/*!
\brief
Das Licht an den Liniensensoren wird gemessen und die Summe von beiden\n
Sensoren wird zurückgegeben.

Die Funktion minimiert den Einfluß des Umgebungslichtes, indem eine Messung\n
zunächst bei ausgeschaltetem Umgebungslicht durchgeführt wird. Das Ergebnis\n
dieser Messung wird von der Messung mit eingeschalteter LED abgezogen.\n
Da die LED eine gewisse Trägheit besitzt, wird nach dem Ein- bzw. Ausschalten\n
eine kurze Zeit gewartet, bis die Messung erfolgt. Diese Zeit muss evtl. auf\n
den eigenen ASURO abgestimmt werden.

\param
keine

\return
Summe beider Fototransistoren, bereinigt um den Wert des Umgebungslichtes.

\author _HP_

\version beta - 04.04.2007 - _HP_\n
first implementation

\par Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
\code
int Licht;
Licht = ReadSensor();
\endcode
************************************************** ***************************/
int ReadSensor(void)
{
unsigned int FotoTrans[2]; // gemessene Werte der Fototransistoren (FotoTrans[0] ist links)
int LightEnv; // Summe des gemessen Umgebungslichtes beider Fototransistoren
unsigned char Delay = 10; // Wartezeit in 1/36 ms bis die FrontLED reagiert hat.

FrontLED(OFF);
Sleep(Delay);
LineData(FotoTrans);
LightEnv = FotoTrans[0] + FotoTrans[1];
FrontLED(ON);
Sleep(Delay);
LineData(FotoTrans);

return FotoTrans[0] + FotoTrans[1] - LightEnv;
}

/************************************************** **************************/
/* */
/* Funktion: main() */
/* */
/*!
\brief
Programm zum Balancieren des ASURO auf den Hinterrädern.\n

Die Grundidee ist von HermannSW beschrieben im Thread\n
https://www.roboternetz.de/phpBB2/viewtopic.php?t=29269 .\n
Es ist notwendig, den ASURO hinten so zu beschweren, dass sich die Nase\n
nicht zu weit über dem Boden befindet, wenn er sich im Gleichgewicht\n
befindet.

Mit den Tastern kann man die Parameter für die Helligkeit im \n
Gleichgewichtszustand und die Geschwindigkeit des linken Motors im\n
laufenden Betrieb wie folgt ändern:\n

Taster linke Seite ändert die Helligkeitsschwelle der Sensoren im\n
Gleichgewichtszustand... \n
K1 gedrückt : Threshold++; \n
K2 gedrückt : Threshold--; \n
K3 gedrückt : Threshold über Terminalprogramm vorgeben \n
K1 und K2 gedrückt: Threshold aktuellen Wert der Sensoren übernehmen \n

Taster rechte Seite ändert die Geschwindigkeit... \n
K4 gedrückt : Speed über Terminalprogramm vorgeben \n
K5 gedrückt : Speed--; \n
K6 gedrückt : Speed++; \n

Bei jedem Betätign der Taster werden die neuen Werte für THRESHOLD \n
und SPEED über die Infrarotschnittstelle ausgegeben.

\param
keine

\author _HP_

\version beta - 04.04.2007 - _HP_\n
first implementation

\version beta - 05.04.2007 - _HP_\n
Auswerung der Taster verbessert und Umlaute in den Ausgaben entfernt
************************************************** ***************************/
int main(void)
{
int Light; // Summe des gemessenen Lichtes der Fototransistoren ohne Umgebungslicht
int T1, T2; // Werte der Taster bei zwei aufeinanderfolgenden Messungen
int Threshold = INI_THRESHOLD; // Schwellwert des Lichtes für die Fototransistoren, der eingehalten werden soll.
int Speed = INI_SPEED; // Geschwindikeit der Motoren, wenn der Wert der Fototransistoren vom Sollwert abweicht.

Init();

FrontLED(ON);

MotorSpeed(Speed,0); // Regelung erfolgt nur über das linke Rad
MotorDir(BREAK,BREAK);

for(;;) {

// Ändern der Parameter mit den Tastern:
T1 = PollSwitch();
T2 = PollSwitch();
if (T1 && T2 && T1 == T2)
{
// Motor stoppen wenn Werte geänder werden
StatusLED(RED);
MotorSpeed(0,0);

// Taster linke Seite ändert die Hell/Dunkel-Schwelle...
if (T1 == K1) Threshold++;
if (T1 == K2) Threshold--;
if (T1 == K3)
{
SerPrint("\r\nBitte einen Wert fuer THRESHOLD eingeben: ");
Threshold = ReadInt();
}
if (T1 == (K1 + K2)) //K1 und K2 gedückt
{
SerPrint("\r\nAutokalibration von THRESHOLD!");
Threshold = ReadSensor();
}

if (Threshold < 0) Threshold = 0;
if (Threshold > 1023) Threshold = 1023;

// Taster rechte Seite ändert die Geschwindigkeit...
if (T1 == K4)
{
SerPrint("\r\nBitte einen Wert fuer SPEED eingeben: ");
Speed = ReadInt();
}
if (T1 == K5) Speed--;
if (T1 == K6) Speed++;

if (Speed < 0) Speed = 0;
if (Speed > 255) Speed = 255;


// Ausgabe der aktuellen Werte
SerPrint("\r\nTHESHOLD: ");
PrintInt(Threshold);
SerPrint(" SPEED: ");
PrintInt(Speed);
SerPrint("\r\n");

Msleep(200);
StatusLED(GREEN);
MotorSpeed(Speed,0);

}

// Licht an den Liniensensoren messen
Light = ReadSensor();

// Fahre rückwärts, wenn es zu dunkel und vorwärts wenn es zu hell wird.
if (Light < Threshold) MotorDir(RWD,BREAK);
else MotorDir(FWD,BREAK);
}

return 0;
}

HermannSW
06.04.2007, 01:28
Hallo,

Inhaltlich bleibt es bei dem Zweipunktregler. Allderdings versuche ich den Einfluß des Umgebungslichtes zu unterdrücken (ich meine die Idee dazu mal bei waste gefunden zu haben).
...
Schaut Euch das mal an, experimentiert damit und sagt eure Meinung...Habe es heute abend im Zug übersetzt und gleich ausprobiert! Hat auf unterschiedlichsten Untergründen sofort funktioniert, und auch der Wechsel von Sonnenlicht und Schatten hat (wohl Dank Deiner an Waste angelehnten Technik) nicht gestört!
Dank der Übernahme der Sensorwerte (K1 & K2 gedrückt) kann man den Asuro mittels darauffolgender Tastendrücke K1/K2 sehr schnell auf einem neuen Untegrund zum Balancieren kriegen.
Im fahrenden Zug hat der Zweipunktregler allerdings seine Grenzen gefunden: länger als 3 Sekunden hat er nie das Wackeln des Zuges (RE) ausgleichen können. Ich muß mal den PD-Regler für das Balancieren von Waste ausprobieren (siehe folgenden Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?t=15307)), vielleicht verkraftet der ja die Stöße im fahrenden Zug ...



...
Bei jedem Betätign der Taster werden die neuen Werte für THRESHOLD \n
und SPEED über die Infratotschnittstelle ausgegeben.
...
Wo kann ich denn die Infratotschnittstelle finden? :)



...
MotorSpeed(Speed,0); // Regelung erfolgt nur über das linke Rad
MotorDir(BREAK,BREAK);
...Wenn ich BREAK richtig verstehe, dann geschieht das Bremsen durch einen Kurzschluß des Motors im Gegensatz zu FREE, wo das Rad frei laufen kann.
Allerdings liegt bei MotorSpeed(...,0) wegen PWM keine Spannung auf dem rechten Motor, sodaß sich BREAK dort wie FREE verhält, oder?
[das Programm funktioniert aber auch so]

damaltor
06.04.2007, 11:36
ich glaube auch, die bremse funktioniert besser wenn motorspeed recht hoch ist. könnte aber auch sein dass in der asuro.c schon etwas entsprechendes programmiert ist.

HermannSW
06.04.2007, 13:20
ich glaube auch, die bremse funktioniert besser wenn motorspeed recht hoch ist.ich auch, deshalb ja meine Frage.


könnte aber auch sein dass in der asuro.c schon etwas entsprechendes programmiert ist.Leider nein, hier der Abschnitt aus motor.c der neuesten Asurolib 270rc2:
...
inline void MotorSpeed (
unsigned char left_speed,
unsigned char right_speed)
{
OCR1A = left_speed;
OCR1B = right_speed;
}
...
inline void MotorDir (
unsigned char left_dir,
unsigned char right_dir)
{
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
}
...

Ich denke, daß für eine maximale Bremswirkung bei BREAK der entsprechende Wert für MotorSpeed auf 255 gesetzt werden sollte ...

...
\par Arbeitsweise:
Ueber die Parameter werden die Port-Pin's zu den H-Bruecken beider Motoren so\n
gesetzt, dass die jeweils 4 beteiligten Transitoren einer Bruecke den Strom\n
durch die Motoren entweder
- FWD vorwaerts durchleiten
- RWD rueckwaerts durchleiten
- BREAK den Motor kurzschliessen (Bremswirkung)
- FREE oder von der Stromversorgung trennen (Motor laeuft aus)
...
Last, but not least, noch eine Frage zur Begrifflichkeit :)
Warum heißt das eigentlich BREAK und nicht BRAKE? (dt. bremsen = engl. to brake)

damaltor
06.04.2007, 13:46
hrhr... da hab ich schon oft drüber nachgedacht... ich denke mal das lag daran dass jemand nicht genug drüber nachgedacht hat.

vielleicht sollte man einfach mal einen feldversuch starten, den asuro mit 255 fahren zu laseen, dann free, brake mit 0 und brake mit 255 nacheinander testen und sehn wie er stehenbleibt...

HermannSW
06.04.2007, 19:54
Hallo,

vielleicht sollte man einfach mal einen feldversuch starten, den asuro mit 255 fahren zu laseen, dann free, brake mit 0 und brake mit 255 nacheinander testen und sehn wie er stehenbleibt...habe den Test eben mit dem folgenden Programm durchgeführt, mit für mich unerwartetem Ergebnis:
#include <asuro.h>

#define K1 (1<<5)
#define K2 (1<<4)
#define K3 (1<<3)
#define K4 (1<<2)
#define K5 (1<<1)
#define K6 (1<<0)

uint8_t getSwitch(void);

int main(void)
{
uint8_t sw1;

Init();

sw1 = getSwitch();

Msleep(1000);

MotorDir(FWD,FWD);
MotorSpeed(255,255);

Msleep(1500);

switch (sw1)
{
case K1: MotorDir(BREAK,BREAK);
MotorSpeed(0,255);
break;
case K2: MotorDir(FREE,BREAK);
MotorSpeed(0,255);
break;
case K3: MotorDir(FREE,BREAK);
MotorSpeed(0,0);
break;

case K4: MotorDir(BREAK,BREAK);
MotorSpeed(255,0);
break;
case K5: MotorDir(BREAK,FREE);
MotorSpeed(255,0);
break;
case K6: MotorDir(BREAK,FREE);
MotorSpeed(0,0);
break;

default:
MotorDir(BREAK,BREAK);
}

while (1);

return 0;
}

uint8_t getSwitch(void)
{
uint8_t t1, t2, t3;

while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();

if ((t1==t2) && t1)
break;

Msleep(50);
}

while (1)
{
t2 = PollSwitch();
t3 = PollSwitch();

if ((t2==t3) && !t2)
break;

Msleep(50);
}

return t1;
}BREAK mit Speed=0 verhält sich genauso wie BREAK mit Speed=255!

Dies habe ich mit Robertor, dem Asuro meines Sohnes, getestet, der eine Endgeschwindigkeit von 1,8m/s hat.

Bei Tastern K1 und K4 (BREAK,BREAK) mit Speed=(0,255)/(255,0) rutscht der Asuro einfach geradeaus.

In allen anderen Fällen fährt er beim Abbremsen noch eine Kurve nach links oder rechts.

Ich vermute, daß BREAK mit Speed=0 deshalb genauso bremst, wie mit Speed=255, da PWM nur auf den unteren Teil der H-Brücke wirkt, der Motor aber im oberen Teil der H-Brücke kurzgeschlossen wird, wo PWM gar keinen Einfluß hat ...

damaltor
06.04.2007, 20:58
hmm... eigenartiges ding. aber gut, die werte sollten also gleich sein und dann bremst er. sollte das mal wichtig sein, ist das schonmal gut zu wissen

_HP_
08.04.2007, 22:31
Hallo Hermann,

es freut mich, dass Du mein Programm ausprobiert hast - und vor allem, dass es selbst im Zug funktioniert hat. Mir war auch wichtig ein paar Möglichkeiten zu zeigen, wie man ohne ständiges Neucompilieren eines Programmes Werte ändern kann. Darum auch die Möglichkeit, die Parameter mittels Terminalprogramm eingegben zu könne.

Mit der Infratotschnittstelle hast Du mich natürlich voll erwischt - sie ist aber mittels Edit-Button nun tatsächlich tot ;-)

Noch etwas zu dem BREAK Befehl für die Motoren. Ich denke, die Entwickler der Software meinen eigentlich BRAKE. Aber da lief gerade dieser komische Werbespot im Fernsehen - Have a break, have a ... (worum ging es da eigentlich) und so Wurde aus der Bremse eine Pause....

Aber im Ernst: Wenn die Motoren kurzgeschlossen werden, dann wird, sobald sie sich drehen, eine Spannung indiziert, die der Drehbewegung entgegenwirkt. Darum ist es schon sinnvoll, auch im Stand diesen Befehl zu verwenden, wenn sich ein Rad möglichste nicht drehen soll. Probier es aus: Nimm einen Motor, schließ ihn kurz und drehe ihn mit der Hand. Du wirst mehr Kraft brauchen, als wenn der Motor nicht kurzgeschlossen ist.

Schönes Restosterwochenende noch... und ja, wir kommen wohl um die Regelungstechnik nicht herum....

Gruß,

_HP_