-
        
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: RNMotor-Board - Frage zur I2C-Ansteuerung

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459

    RNMotor-Board - Frage zur I2C-Ansteuerung

    Moin,
    @Frank, ich wollte mich ja nochmal bei dir melden, wenn ich das Motor-Board ausprobiert habe. Leider hat eine andere Bestellung etwas auf sich warten lassen, aber jetzt habe ich die nötigen Kabel und ein Application Board für mein Mega8 und konnte heute mit dem Testen beginnen.

    Ich programmiere das Mega8-Modul mit dem AVRco (Pascal), der hier wohl nicht so verbreitet ist. Ich habe noch nicht so viel Ahnung von dem Ding, aber das wird schon noch kommen :-) Ich habe mir die Anleitung zum Motor-Board angeschaut, bei der ja zu jedem Befehl auch ein Bascom-Beispielcode vorhanden ist. Die Sprache kenne ich leider überhaupt nicht, aber mich hat gewundert, dass die Daten in ein Array gesetzt werden und dann nur das erste Element versendet wird:

    Dim I2cdaten(6) As Byte
    'Motorstrom auf 200mA begrenzen
    I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
    I2cdaten(2) = 10 'Befehlscode
    I2cdaten(3) = 0 '1 Parameter
    I2csend &H56, I2cdaten(1),5 'Befehl wird gesendet

    Oder verstehe ich das nur falsch? Vielleich könnte mir jemand noch etwas genauer beschreiben, was man genau an die Platine senden soll.

    Was muss man eigentlich alles senden, damit sich der Motor zunächst einmal dreht (zum Testen, ob es überhaupt geht)? Reicht da "Motor einschalten", also Befehlscode 10?

    Und noch eine Frage zum Verändern der Slave ID: Wird die für immer gespeichert? Das wäre gut...

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Hi Johannes,

    ja AVR-Pascal ist hier kaum verbreitet. Das liegt unter anderem auch daran das es nur für den Mega8 einen günstigen Compiler gibt und der Mega8 etwas knapp für größerer Bots ausgelegt ist.
    Die I2C-Befehle von Bascom dürften nicht so sehr verschieden sein. Der Befehl mit dem Array ist nur eine Erleichterung da man so nicht alle Beides einzeln absenden muß. Man kann aber auch einen einfachen Befehl nutzen um einzelne Bytes zu senden.

    Jeder RN-Motor Befehl besteht aus einer Sequenz von 5 Bytes. Das erste Byte muß immer 10 sein, danach kommt der Befehlscode und danach noch 3 Parameter.
    Es gibt auch Befehle die weniger Parameter benötigen, dennoch müssen 5 Bytes gesendet werden. Der Inhalt der unbedeutend Bytes ist völlig egal.
    Diese Methode wurde gewählt weil Bytesequenzen mit fester Länge platzsparender und sicherer verarbeitet werden konnten.

    Welchen Bedeutung die einzelnen Bytes haben kannst du ja in der Tabell in der Anleitung recht gut ersehen.
    Du mußt nur immer daran denken, ein Befehl besteht aus folgeder Sequenz:
    i2cstart
    slave Adresse senden (meißt Hex 56)
    byte 1 senden (immer 10)
    byte 2 senden (Befehlscode)
    byte 3 senden (1. Parameter)
    byte 4 senden (2. Parameter)
    byte 5 senden (3. Parameter)
    i2cstop

    Damit sich der Motor erst mal dreht, müssen mindestens zwei Befehle gegeben werden:

    Motor einschalten
    Endlos drehen einschalten

    Vorausgesetzt die Standard Stromstärke von 100mA reicht, würde dann schon Motor laufen. Ansonsten vorher noch Strom einstellen.

    Wenn du die Slave Adresse durch einen I2C Befehl verstellst, dann ist dies dauerhaft verstellt. Also auch ein Reset oder Stromausfall stellt das nicht zurück. Du kannst diese natürlich durch einen neuen i2C-Befehl jederzeit wieder verstellen.

    Sollte noch was unklar sein, einfach fragen.

    Gruß Frank

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Moin Frank,
    ich habe es jetzt endlich hinbekommen, die Motoren drehen sich. Alles wunderbar, aber ein paar Probleme gibt es noch. Beispielsweise funktioniert bei mir der Endlos-Befehl nicht. Stattdessen wird der Motor in der Position gehalten. Ich kann also momentan nur über Einzelschritte drehen, aber auch immer nur einen Motor einzeln. Beide Motoren zusammen (also mit dem ensprechenden Parameter auf 2 gesetzt) passiert auch nichts.

    Außerdem wird bei mir alles ziemlich heiß, auch die Motoren, und die LED leuchtet, auch wenn ich den Strom ganz niedrig gestellt habe. Warum ist eigentlich dieser eine dreipolige IC (Spannungsregler?) rechts nicht am Kühlkörper dran?

    Aber sonst bin ich zufrieden!
    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  4. #4
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Hi Johannes,

    irgendwo muß bei deiner Ansteuerung noch was falsch sein. Vielleicht schickst du die Befehle zu schnell hintereinander. Einige Befehle wie das STrom einstellen benötigen ein paar Milliisekunden. Mach mal probehalber zwischen jeden RN-Motor Befehl (also jede 5er Sequenz) 200 ms Pause. Die Zeiten kannst du später immer noch reduzieren, nur erst mal zum testen.
    Der Endlos Befehl ist schon einer der wichtigsten, ich nehme den nur!

    Das die LED leuchtet und das es zu warm wird deutet darauf hin da sdu einen zu hohen Strom eingestellt hast. Kann das sein? Teste Motoren ruhig mit niedrigerem Strom, gewöhnlich laufen die Motoren auch schon mit einem Bruchteil des Nennstromes.

    Der Spannungsregler für die Logik wird gewöhnlich nicht sehr heiß, dahe rwar es nicht unbedingt notwendig diesen zu kühlen. Zudem war es platzmäßig auch schlecht anders zu lösen, da das Board sich genau an die Standard-Größenvorgaben halten mußte (Roboternetz-Norm).
    Mit einem kleinen Winkel kann man ihn aber immer noch am Kühlkörper befestigen, aber wie gesagt gewöhnlich ist dies nicht notwendig.

    Solltest du nicht weite rkommen kannst du mal den Pascal Ansteuercode von dir posten. VIelleicht steig ich ja durch, obwohl meine Pascal Zeiten schon lange zurück liegen.

    Gruß Frank

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Moin Frank,
    ja, irgendwo ist da noch der Wurm drin. Ich habe beispielsweise einmal während dem betrieb einen Motor abgeklemmt. Danach ging gar nichts mehr. Aber nachdem ich dann ein paar Wait-Zeiten geändert hatte, ging es wieder. Im moment passiert wiederum gar nichts. Hier mal mein Code

    Code:
      // Maximalstrom
    
    Var
      [...]
      data5 : array[1..4] of byte;
      MotorNumber : byte;
    
    [...]
      data5[1] := 1;
      data5[2] := MotorNumber;
      data5[3] := 50;
      data5[4] := 0;
      mDelay( 100 );
      TWIout( 43, 10, data5 );
    
      // Drehrichtung
      data5[1] := 4;
      data5[2] := MotorNumber;
      data5[3] := 1;
      data5[4] := 0;
      mDelay( 200 );
      TWIout( 43, 10, data5 );
      
      // Voll-/Halbschritt
      data5[1] := 14;
      data5[2] := 0;
      data5[3] := 0;
      data5[4] := 0;
      mDelay( 10 );
      TWIout( 43, 10, data5 );
    
      // Geschwindigkeit
      data5[1] := 8;
      data5[2] := MotorNumber;
      data5[3] := 10;
      data5[4] := 0;
      mDelay( 10 );
      TWIout( 43, 10, data5 );
    
      // Einschalten
      data5[1] := 10;
      data5[2] := MotorNumber;
      data5[3] := 0;
      data5[4] := 0;
      mDelay( 10 );
      TWIout( 43, 10, data5 );
    
      // Endlos drehen
      data5[1] := 6;
      data5[2] := MotorNumber;
      data5[3] := 0;
      data5[4] := 0;
      mDelay( 10 );
      TWIout( 43, 10, data5 );
    Aber ich werde morgen noch ein wenig rumexperimentieren.

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  6. #6
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Hi Johannnes,

    wenn während des Betriebes Motor abgeklemmt wird, schaltet RN-Motor den Motor derzeit aus. Also nicht abklemmen wenn du experimentierst.

    Ich kenn leider die Syntax von dem Pascal Befehl TWIOUT nicht, aber irgendwie scheint mir die merkwürdig. Können da Werte teils als Byte und teils als Arry übergeben werden? Vielleicht kannst du mir mal Beschreibung von dem Befehl posten.

    Wenn das wirklich so geht sind die Befehle so weitgehend in Ordnung, allerdings die Reihenfolge ist etwas ungünstig.
    Den Strom solltest du immer als erstes einstellen, das hast du ja gemacht. In deinem Fall hast du den Strom auf 500mA pro Strang eingestellt.

    Dann solltest du Halbschritt einschalten wenn du magst, ich lass das immer weg da ich meißt nur Vollschritt nehm.

    Danach sollte man immer erst mal den Motor einschalten. Durch einschalten bewegt sich ja noch nix, nur der Motor bekommt schon Spannung. Du merkst das wenn du versuchst den Motor mit der Hand zu drehen.

    Danach kann man dann Drehrichtung, Endlosschritt, Einzelschritt, Bestimmte Schrittanzahl, Schrittabruf, Stop usw. beliebig verwenden.

    Den Delay Befehl solltest du hinter TWIOut einsetzten, ist einfach logisch übersichtlicher. Vor allem hinter Stromeinstellen und Einschalten sollte ruhig mal 200ms Pause sein. Hinte rdie anderen kannst du ja probehalber geringeren Delay Wert nehmen.

    Tja mit I2C ist das manchmal so eine Sache, nicht alle Compiler unterstützen das I2C Protokoll 100% korrekt. Daher muß man manchmal etwas experimentieren. Eigentlich sind Delay´s nämlich überflüssig wenn der Compiler das Clock Signal richtig überwacht und auf den Slave wartet. Aber viele schnell gebastelte I2C-Libarys machen das nicht, daher ist eben das experimentiern notwendig.

  7. #7
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Was mir noch merkwürdig erscheint, du verwendest die Slave ID Dezimal 43. Eigentlich kann die nicht richtig sein, denn es sind nur Slave ID´s zwischen Hex 50 und Hex 70 möglich

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Moin Frank,
    schon komisch, ich habe die Reihenfolgen geändert, und jetzt geht es. Naja, mir ist das alles noch ein Rätsel. Ich glaube, beim ARVco gibt es noch eine andere I2C Lib, viellleicht probiere ich die mal aus.

    Bei dem TWIout ist es so, dass man die Adresse, dann den Register und dann die Daten angibt. Aber der Register ist ja praktisch das erste Byte, das gesendet wird. Zu den Adressen: Beim Pascal unterscheidet man nicht zwischen Sende- und Empfängeradresse. Die letzte Stelle von der Binärzahl wird immer weggelassen, wodurch natürlich eine neue Zahl entsteht.

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  9. #9
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Na fein das es geht.
    Die beschriebene Sytax von TWIout ist aber in der Tat schon recht ungewöhnlich und gewöhnungsbedürftig. Nicht alle I2C-Slaves haben Register. Aber letzlich gehts ja auch damit.

    Gruß Frank

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Jup, funktioniert jetzt alles. Ich habe auch die SlaveID von dem einen Board ändern können und kann nun 4 Motoren getrennt ansteuern. Demnächst werde ich den Code mal auf meine Website packen. Falls es doch noch einmal jemanden geben sollte, der mit Pascal das Motorboard ansteuern will.

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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