- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: ASURO Projekt Einen Motor pausieren

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Anzeige

    E-Bike
    Ich habe nicht viel mit dem Asuro gemacht, und es ist schon etwas her.
    Aber ich habe Deinen Code erst mal etwas besser lesbar formatiert.

    Über fähig und undfähig sollte man nicht entscheiden, wenn man grade erst anfängt etwas zu lernen.
    Wenn nach längerer Zeit, intensiven Befassen mit einem Thema keinerlei Verbesserung der Fähigkeiten messbar ist, dann kann man von Unfähigkeit sprechen.
    Momentan von, noch unwissend und noch unerfahren.

    Da es eine Referenz gibt, kann man dort nachlesen was die Befehle machen, das ist immer ganz hilfreich um sich über die Möglichkeiten die man hat zu informieren.
    http://www.asurowiki.de/pmwiki/pub/html/asuro_8h.html

    Die folgenden Asuro spezifischen Befehle nutzt Du:

    FrontLED (unsigned char status)
    Steuert die vorne, nach unten zeigende, Front-LED.

    LineData (unsigned int *data)
    Liest die Daten der beiden Linienverfolgungssensoren.
    Die Linien-Beleuchtungs-LED kann sowohl an- als auch ausgeschaltet sein.

    MotorDir (unsigned char left_dir, unsigned char right_dir)
    Steuert die Drehrichtung der Motoren.

    MotorSpeed (unsigned char left_speed, unsigned char right_speed)
    Steuert die Geschwindigkeit der Motoren.

    Msleep (int ms)
    Wartefunktion in ms.
    Code:
    01#include <avr/io.h>
    02#include "asuro.h"
    03
    04int main(void)
    05{
    06  Init();
    07  unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander
    08  FrontLED(ON);
    09
    10  Msleep(1000);
    11  while (1)
    12  {
    13    LineData(data);
    14    if ((data[0]<700) && (data [1]<700))
    15    {
    16      MotorDir(FWD,FWD); //beide Motoren vorwärts
    17      MotorSpeed(85,0); //linker Motor speed 85
    18      Msleep(160);
    19      MotorSpeed(0,0); //beide Motoren halt
    20      Msleep(3000);
    21      MotorDir(RWD,RWD); //beide Motoren rückwärts
    22      MotorSpeed(85,0); // linker Motor speed 85
    23      Msleep(160);
    24      MotorSpeed(0,0); //beide Motoren halt
    25    }
    26    if ((data[0]>700) && (data[1]>700))
    27    {
    28      MotorDir(FWD,FWD); //beide Motoren vorwärts
    29      MotorSpeed(0,0); //beide Motoren halt
    30    }
    31    if ((data[0]>700) && (data[1]<700))
    32    {
    33      MotorDir(RWD,RWD); //beide Motoren rückwärts
    34      MotorSpeed(85,0); // linker Motor speed 85
    35      Msleep(160);
    36      MotorSpeed(0,0); //beide Motoren halt
    37      Msleep(3000);
    38      MotorDir(FWD,FWD); //beide Motoren vorwärts
    39      MotorSpeed(85,0); // linker Motor speed 85
    44      Msleep(160);
    41      MotorSpeed(0,0); //beide Motoren halt
    42    }
    43    MotorDir(FWD,FWD); !!!!!!!!!!!! //beide Motoren vorwärts
    44    MotorSpeed(0,100); // rechter Motor speed 100
    45    Msleep(480);
    46    MotorSpeed(0,0); //beide Motoren halt
    47  }
    48}
    Alleine durch das Einrücken bekommt man schon mal ein Gefühl für die Struktur des Codes.

    Was einem sofort ins Auge springt, sind in Zeile 14, 26 und 32 die IF Anweisungen die direkt aufeinander folgen.
    Man könnte jetzt in Zeile 26 und 31 aus IF ein ELESE IF machen.

    Dann hat jedes Asuro Codebeispiel das ich habe ein return (0); nach der while (1); Schleife.
    Also:

    Code:
    47  }
    48 return (0);
    49}
    Das hat jetz noch nichts mit der Funktion Deines Codes zu tun, hilft aber sauberen Code zu produzieren, der Dir nicht Später mal mit unerwarteten Fehlern um die Ohren fliegt.

    Soweit ich das sehe nimmst Du die FrontLed als Lichtquelle und die beiden Linienfolger Sensoren LineData um mit den IF Konstruken 3 Zustände zu unterscheiden.
    Dort findet dann eine reine Zeitsteuerung des linken Motors statt.
    Immer 0,16 Sekunden Fahren mit rund 33% der möglichen Motorgeschwindigkeit (85 von 255) und 3 Sekunden Stillstand.
    Am Ende lässt Du den rechten Motor für 0,48 Sekunden mit rund 39% der möglichen Motorgeschwindigkeit (100 von 255) laufen.

    Der rechte Motor wird nun außerhalb des IF Konstrukts angesteuert. Also unabhängig davon was für Werte LineData hat.
    Ergänz Doch mal Deinen Coder zuert um das return (0);
    und dann definier doch mal ein Motor Halt am Anfang der WHILE Schleife, damit die Motoren erst mal sicher gestoppt sind.

    Code:
    .
    .
    .
    11  while (1)
    12  {
    13    MotorDir(FWD,FWD);
    14    MotorSpeed(0,0); //beide Motoren halt
    15    LineData(data);
    .
    .
    .
    45    MotorDir(FWD,FWD); !!!!!!!!!!!! //beide Motoren vorwärts
    46    MotorSpeed(0,100); // rechter Motor speed 100
    47    Msleep(480);
    48    MotorSpeed(0,0); //beide Motoren halt
    49  }
    50 return (0);
    51}
    Geändert von i_make_it (08.05.2017 um 00:10 Uhr)

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2017
    Beiträge
    7
    Hallo,
    erst mal wollte ich sagen, dass ich es echt super finde, wie nett man hier unterstützt wird. Danke
    Leider war ich heute und gestern Abend verhindert durch eine Konformation. Deshalb habe ich mich nicht direkt dahinter gesetzt und mich gemeldet.

    Ich habe die Verbesserungsvorschläge umgesetzt und hatte auch schon else vor dem 2. und 3. if aber ohne hat das Program auch funktioniert. Weshalb mir die bedeutung davon nicht ganz klar war.

    Wie gesagt setzt der Eine motor zum Falschen Zeitpunkt ein.
    Das will ich Sie mir sagten mit Gettime versuchen zu unterbinden. Nur ist mir die Gettime Funktion nicht ganz klar.
    Wie man die Begriffe (bei mir in der asuro lib ) nachließt und sie definiert sind ist mir klar und ich verstehe auch einiges nur die time.c beziehungsweise das Gettime darin nicht. Wenn ich nun dieses Programm, so wie ich es dastehen habe auf den Aduro flashe, müsste dann die Front LED alle 500 ms oder beispielsweise alle 5000 ms an und ausgehen?
    Beziehungsweise macht sie nicht nach dem flashen...

    #include <avr/io.h>
    #include "asuro.h"
    #include "myasuro.h"
    int main(void)
    { // Alle 500 ms die Front-LED umschalten.
    unsigned long zeit;
    unsigned char on_off = TRUE;
    zeit = Gettime ();
    while (1)
    {
    if (Gettime () > zeit + 500)
    {
    zeit = Gettime ();
    FrontLED (on_off);
    on_off ^= 1;
    }
    }
    }

    Könnte mir vielleicht einer etwas dieses Programm erklären weil mir nicht ganz klar ist was on _ off bedeutet genauso dieses hoch gleich eins. Ich habe versucht, mir das klarzumachen und die Gettime Funktion in mein Programm einzubinden doch leider konnte ich mir das nicht ganz erklären.
    Ich wurde leider in die ganze Thematik kopfüberhineingeworfen und bekomme wenig schulische Unterstützung. Und mein ziehl war es etwas eigenentwickeltes mit dem ASURO zu entwerfen und nichts vorhandenes zu kopieren. Leider ist mir die Informatik doch etwas fremd, wenn ich sie auch sehr interessantfinde ... Nur falls ihr euch wundert warum ich sowenig kenntnisse habe.

    PS: ich hoffe, dass das nun mit dem Code stimmt 😬

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Code:
    unsigned char on_off = TRUE;
    Das ist die Definition der Variable mit dem Namen "on_off".
    Die Variable ist vom Typ char (also max. 265 verschiedene Zustände, 0-255).
    Und sie ist unsigned (also ohne Vorzeichen, mit wäre der Wertebereich -128 bis 127)
    Die Variable wird mit dem Wert TRUE (wahr) also 1 vorbelegt

    Code:
    on_off ^= 1;
    Um diese Zeile zu verstehen, muß man die Operatoren in C/C++ kennen.
    http://www2.informatik.uni-halle.de/.../c_operat.html
    ^= bitweises XOR (exklusives OR)

    Damit wird also der Wert bei jedem Ausführen von Binär 0 auf Binär 1 und zurück geändert.
    Es ist die kürzeste Schreibweise um in C ein Bit zu Togglen.
    Der lange Weg wäre:
    Code:
    if (on_off == 1)
    {
      on_off = 0;
    }
    else if (on_off == 0)
    {
      on_off = 1;
    }
    Du mußt Dich also zum einen mit der Programiersprache C/C++ generell und zum anderen mit den Besonderheiten des Asuro befassen um den Code von Beispielen verstehen zu können und selbst sinnvollen und funktionsfähigen Code schreiben zu können.
    Geändert von i_make_it (08.05.2017 um 10:25 Uhr)

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Ich kann dir auch das AVR GCC Tutorial von Mikrocontroller.net empfehlen https://www.mikrocontroller.net/arti...R-GCC-Tutorial

    Und bitte den Code in codetags schreiben (code) dein code (/code). Statt den runden Klammern nimmst du eckige.

    Dann sieht es so aus
    Code:
     dein code
    MfG Hannes

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    05.05.2017
    Beiträge
    7
    Ich probier es mir beizubringen Problem ist nur das man das ganze in 2 Monaten lernen soll und daher nur oberflächlich schrammt weil keine Zeit da ist um einen ganzen c kurs oder ähnliches zu machen.
    Und irgendwie wird mir von dem benutzen von Gettime abgeraten weil es zu komlex für die Schule sei.
    Aber ich schau mal vieleicht wird es mir noch schlüßig
    Danke

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 28.06.2007, 19:34
  2. Was für einen Motor fur einen Rasenmäher?
    Von LLiinnuuxx im Forum Motoren
    Antworten: 76
    Letzter Beitrag: 07.11.2006, 21:15
  3. Suche einen Motor für einen Roboterarm
    Von Battle MC im Forum Motoren
    Antworten: 20
    Letzter Beitrag: 22.03.2006, 07:50
  4. Was für einen Motor?
    Von Blubb im Forum Motoren
    Antworten: 2
    Letzter Beitrag: 01.03.2005, 17:59
  5. Projekt: Motor per PC steuern
    Von paramedic im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 04.12.2004, 00:20

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen