- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Fertiges RN-Projekt: RN-Motor ST Schrittmotor Ansteuerung

  1. #1
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1

    Fertiges RN-Projekt: RN-Motor ST Schrittmotor Ansteuerung

    Anzeige

    Praxistest und DIY Projekte
    Projekt: RN-Motor


    Bild hier  

    Schrittmotorboard mit I2C oder RS232 Ansteuerung ist nun fertig

    Anleitung, Schaltplan etc. ist im Download-Bereich zu finden.

    Hier die wesentlichen Features im Überblick:

    • Deutlich höheres Drehmoment (Motorkraft) durch automatische PWM-Stromregelung
    • Maximal zulässiger Strangstrom kann durch einfachen Befehl von einem Controller oder PC zwischen 0 und 2A festgelegt werden. Kein rumschrauben mehr an Potis!
    • Es können nahezu alle bipolaren Schrittmotoren beliebiger Nennspannung 1V bis zur Versorgungsspannung (7 bis 22V) angesteuert werden. Beispiel: Sie können auch einfach einen 1.9V Motor an ein Board mit 9V oder 12V anschließen, der Motor wird nicht überlastet da der max. Strom eingestellt wird. RN-Motor arbeitet etwas ähnlich wie die L297/L298 Schaltung, bietet jedoch mehr High Level-Funktionen
    • Durch die Verwendung eines programmierten Controllers und mehrer integrierter Schaltkreise benötigt das ganze Board nur wenig Bauteile. Dies reduziert Kosten und erleichtert den Aufbau.
    • Ein mitgelieferter Steuerprogramm erlaubt die Ansteuerung der Schrittmotoren bequem per Mausklick. Durch die Möglichkeit unterschiedliche Ströme und Geschwindigkeiten einzustellen, lassen sich Schrittmotoren auch optimal austesten.
    • Übermittelt wird nur der Befehl der beschreibt wieviel Schritte ein bestimmter Motor in welcher Geschwindigkeit und Drehrichtung erfolgen soll. Um die Generierung und das zählen der Schritte kümmert sich das Board völlig automatisch. Dadurch wird der steuernde Controller oder PC erheblich entlastet
    • 255 exakte Geschwindigkeitstufen möglich
    • Drehrichtung und max Strombedarf jederzeit änderbar
    • Endlosfunktion, welche Schrittmotoren solange dreht bis ein Stopp Befehl kommt
    • Schrittezähler, die ausgeführten Schritte der Motoren können jederzeit abgerufen werden, somit läßt sich exakt die Länge der gefahrenen Strecke berechnen
    • Bei ausgeschalteten Motoren benötigt das Board weniger als 40mA, das ist deutlich weniger als bei üblichen L297/L298 Schaltungen.
    • Board läßt sich auch per RS232 Befehl in Sleep-Mode versetzen um Stromaufnahme weiter zu verringern (auf ca. 20mA).
    • LED signalisiert wenn die Betriebsspannung nicht ausreicht um den Schrittmotor-Nennstrom (also maximale mögliche Leistung) bei der gewählten Geschwindigkeit zu erreichen. Eine recht nützliche Analysefunktion.
    • ISP-Programmieranschluß –Atmel Programmierer können das Board mit einem eigenen Betriebsystem versehen. Dies ist aber nicht notwendig!
    • Zur Steuerung des Board´s würde im Notfall ein RS232 TX PORT reichen. Bei der RN-Control könnte fast jeder Port dafür verwendet werden wenn in Basic programmiert wird. Ideal sind jedoch zwei Ports um auch die Rückmeldungen des Motorboards auswerten zu können.
    • Ansteuerung über beliebige Controller z.B. RN-Control, RNBFRA, C-Control oder PC
    • Erlaubte Versorgungsspannung 7V bis 22 V
    • Sehr kompakt, nur halbes Europaformat nach Roboternetz-Norm (ca. 100x75mm). Dadurch mit anderen Boards nach Roboternetz-Standard huckepack verschraubbar.
    • Deutsche Doku mit Programmbeispielen für RN-Control (I2C-Beispiel)und C-Control (RS232 Beispiel) und PC-Steuerprogramm für RS232 Version


    Hier ein Ansteuerbeispiel für die RN-Control:


    Code:
    '###################################################
    'Schrittmotoransteuerung mit RN-Control und
    'Ansteuerungsboard RN-MOTOR über I2C
    '
    '
    'Aufgabe:
    ' Dieses Testprogramm beschreibt die Motorboard I2C-Funktionen
    ' und legt einige der Befehle auf die 5 Tasten
    
    ' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
    ' Taste 1: Stellt für den linken Motor den Motorstrom auf 200mA ein und schaltet Motor danach ein
    ' Taste 2: Lässt den linken Motor endlos drehen
    ' Taste 3: Fragt der bereits ausgeführten Motorschritte des linken Motors vom Board ab und
    '          berechnet daraus Umdrehungen und Fahrtstrecke
    '          Daten werden über RS232 angezeigt
    ' Taste 4: Ändert die Geschwindigkeit des linken Motors mit jedem Tastendruck
    ''Taste 5: Schaltet den linken Motor wieder aus
    
    ' Achtung:
    ' In der Bascom Version 1.11.7.4 ist noch ein kleienr Bug in der I2C
    ' Libary. Dadurch funktioniert eventuell der I2CSEND Befehl nicht korrekt
    ' Zum korrekten Ablauf des Demos sollte daher die aktuelle Libary
    ' in Bascom installiert werden. Kann man hier Downloaden
    ' Infos dazu im Roboternetz-Thread
    '     https://www.roboternetz.de/phpBB2/vi...t=694&start=22
    '
    
    
    'Autor: Frank Brall
    'Weitere Beispiele und Beschreibung der Hardware
    'in der Anleitung zu RN-Motor
    'Anleitung findet man unter http://www.Roboternetz.de im Download Bereich
    'oder www.robotikhardware.de
    'Weitere Beispiele sind im Roboternetz gerne willkommen!
    '##############################################################
    
    
    
    Declare Function Tastenabfrage() As Byte
    
    
    $regfile = "m16def.dat"
    
    'Befehle im Schrittmotorbetrieb
    'K ist eine Kennungsnummer die bei RN-Motor immer 10 ist, danach folgt Befehlscode und notwendige Parameter
    'Es müssen immer 5 Bytes übertragen werden, auch wenn weniger Parameter ausreichen
    
    'k 1 x y     Motor maximaler Strom x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = (Milliampere / 10)
    '            Beispiel : Y = 150 Bedeutet 1,5A Oder Y = 20 Bedeutet 200ma
    'k 2 y       Referenzspannung des Controllers (normal 2.5 und muss nicht geändert werden)
    '            Beispiel:  y=241 bedeutet 2,41 V
    'k 3 x       Motor stopp (Haltespannung bleibt ein) x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren Stopp
    'k 4 x y     Motor Drehrichtung x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren y=0=Links rum  y=1 rechts rum
    'k 5 x yl yh Motor genau y Schritte bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
                    'y wird in High und Low Byte übertragen
    'k 6 x       Motor endlose Schritte bewegen bis Stop Befehl kommt x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    
    'k 7 x       Motor einen einzigen Schritt bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    'k 8 x y     Motor Schrittgeschwindigkeit x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = 1 bis 255
    'k 9 x       Motor ganz ausschalten  x=0 Linker Motor  x=1 Rechte Motor  x2= Alle Motoren Stopp
    
    'k 10 x      Motor ein und init  x=0 Linker Motor  x=1 Rechte Motor
    
    'k 11        Konfiguration und Testwerte werden über RS232 ausgegeben
    
    'k 12        Sleep Mode
    
    'k 13 x      Motor selektieren
    
    'k 14 x      x=0 Vollschrittmodus  x=1 Halbschrittmodus
    
    
    Const Befehl_maxstrom = 1
    Const Befehl_referenzspannung = 2
    Const Befehl_stop = 3
    Const Befehl_drehrichtung = 4
    Const Befehl_schrittanzahl_drehen = 5
    Const Befehl_endlos_drehen = 6
    Const Befehl_einzigen_schritt = 7
    Const Befehl_geschwindigkeit = 8
    Const Befehl_ausschalten = 9
    Const Befehl_einschalten = 10
    Const Befehl_konfiguration_zeigen = 11
    Const Befehl_sleep_modus = 12
    Const Befehl_motor_selektieren = 13
    Const Befehl_schrittmotormodus = 14
    
    Const Motor_links = 0
    Const Motor_rechts = 1
    
    Const I2crnmotorslaveadr = &H56                             'I2C SlaveAdresse von RN-Motor Erweiterung
    Const I2crnmotorsreadlaveadr = &H57                         'I2C SlaveAdresse von RN-Motor Erweiterung
    
    Dim I2cdaten(6) As Byte                                     'Array um Befehlsfolge auszunehmen
    Dim Lowbyte As Byte
    Dim Highbyte As Byte
    Dim Schritte As Long
    Dim Temp As Byte
    Dim Ltemp As Long
    Dim Umdrehungen As Single
    Dim Fahrstrecke As Word
    
    Dim Geschwindigkeit As Byte
    
    Dim I As Integer
    Dim N As Integer
    Dim Ton As Integer
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    Geschwindigkeit = 250
    I2cinit
    
    
    
    
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    Dim Taste As Byte
    
    
    
    
    
    I = 0
    Sound Portd.7 , 400 , 450                                   'BEEP
    Sound Portd.7 , 400 , 250                                   'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    Print
    Print "**** RN-Control  V1.4 *****"
    Print "Demoprogramm um Zusatzkarte RN-Motor im Schrittmotormodus zu testen"
    Print
    Do
       Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                'Motorstrom auf 200mA begrenzen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_maxstrom                   'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2cdaten(4) = 200 / 10                          '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
                'Halbschrittmodus
    '            I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
    '            I2cdaten(2) = Befehl_schrittmotormodus          'Befehlscode
    '            I2cdaten(3) = 1                                 'Beide Motoren Halbschrittmodus
    '            I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
                'Motor einschalten
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_einschalten                'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
    
             Case 2
                'Motor endlos drehen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_endlos_drehen              'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
             Case 3
               'Motor für Datenabruf anwählen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_motor_selektieren          'Befehlscode
                I2cdaten(3) = 0                                 '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
                'Schritte abrufen und Umdrehungen und Fahrtstrecke berechnen und über RS232 anzeigen
                I2cstart
                I2cwbyte I2crnmotorsreadlaveadr
                I2crbyte Temp , Ack
                Schritte = Temp
                I2crbyte Temp , Ack
                Ltemp = Temp * 256
                Schritte = Schritte + Ltemp
                I2crbyte Temp , Ack
                Ltemp = Temp * 65536
                Schritte = Schritte + Ltemp
                I2crbyte Temp , Nack
                Ltemp = Temp * 16777216
                Schritte = Schritte + Ltemp
                I2cstop
                Print "Schrittanzahl:" ; Schritte
                Umdrehungen = Schritte / 200                    'Wenn Schrittwinkel 1,8 Grad beträgt dann durch 200 teilen
                Print "Umdrehungen: " ; Umdrehungen
                'Umfang des rades mal Umdrehungen ergibt Fahrtstrecke
                'Umfang berechnet sich auch U=3.14 * Druchmesser
                'In dem Beispiel nehmen wir ein 10 cm Rad am Roboter an
                Fahrstrecke = Umdrehungen * 31.4
                Print "Der Roboter ist " ; Fahrstrecke ; " cm gefahren "
    
             Case 4
                'Geschwindigkeit ändern
                If Geschwindigkeit > 40 Then
                  Geschwindigkeit = Geschwindigkeit - 20
                Else
                  Geschwindigkeit = Geschwindigkeit - 1
                End If
                Print "Geschwindigkeitsstufe: " ; Geschwindigkeit
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_geschwindigkeit            'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2cdaten(4) = Geschwindigkeit                   '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
              Case 5
                'Motor ausschalten
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_ausschalten                'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
    
          End Select
          Sound Portd.7 , 400 , 500                             'BEEP
       End If
    
       Waitms 100
    Loop
    
    End
    
    
    
    
    'Diese Unterfunktion fragt die Tastatur am analogen Port ab
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
    
       Tastenabfrage = 0
       Ton = 600
       Start Adc
       Ws = Getadc(7)
    '   Print "ws= " ; Ws
       If Ws < 1010 Then
          Select Case Ws
             Case 410 To 455
                Tastenabfrage = 1
                Ton = 550
             Case 340 To 380
                Tastenabfrage = 2
                Ton = 500
             Case 250 To 305
                Tastenabfrage = 3
                Ton = 450
             Case 180 To 220
                Tastenabfrage = 4
                Ton = 400
             Case 100 To 130
                Tastenabfrage = 5
                Ton = 350
          End Select
          Sound Portd.7 , 400 , Ton                             'BEEP
       End If
    
    End Function
    Und hier ein Beispiel für Ansteuerung mit PC (Visual Basic):

    Code:
    Option Explicit
    
    Dim mybuffer As Variant
    Dim low As Byte
    Dim high As Byte
    
    
    Private Sub buttlDrehLinks_Click()
        SendBefehl "#rmd" & Chr(0) & Chr(0), "OK"
    End Sub
    
    Private Sub buttlDrehRechts_Click()
     SendBefehl "#rmd" & Chr(0) & Chr(1), "OK"
    End Sub
    
    Private Sub buttlEndlosdrehen_Click()
        SendBefehl "#rme" & Chr(0), "OK"
    End Sub
    
    Private Sub buttlGeschwindigkeituebermitteln_Click()
        SendBefehl "#rmg" & Chr(0) & Chr(HScrolllgeschwindigkeit.Value), "OK"
    End Sub
    
    Private Sub buttLMotorAus_Click()
        SendBefehl "#rma" & Chr(0), "OK"
    End Sub
    
    Private Sub buttLMotorEin_Click()
         SendBefehl "#rmo" & Chr(0), "OK"
         
    End Sub
    
    Private Sub buttlmotorstop_Click()
         SendBefehl "#rms" & Chr(0), "OK"
    End Sub
    
    Private Sub buttLSchritt_Click()
         SendBefehl "#rmm" & Chr(0), "OK"
    End Sub
    
    Private Sub buttlSchritteuebermitteln_Click()
         high = Int(HScrolllschritte.Value / 256)
         low = HScrolllschritte.Value - (high * 256)
         SendBefehl "#rmz" & Chr(0) & Chr(low) & Chr(high), "OK"
    End Sub
    
    Private Sub buttLschritteZeigen_Click()
         SendBefehl "#rmp" & Chr(0), "OK"
    End Sub
    
    Private Sub buttLStatus_Click()
         SendBefehl "#rmt", "OK"
    End Sub
    
    Private Sub buttLStrom_Click()
        SendBefehl "#rmi" & Chr(0) & Chr(lmaxstrom.Value / 10), "OK"
    End Sub
    
    Private Sub buttrDrehLinks_Click()
    SendBefehl "#rmd" & Chr(1) & Chr(0), "OK"
    End Sub
    
    Private Sub buttrDrehRechts_Click()
      SendBefehl "#rmd" & Chr(1) & Chr(1), "OK"
    End Sub
    
    Private Sub buttrEndlosdrehen_Click()
        SendBefehl "#rme" & Chr(1), "OK"
    End Sub
    
    Private Sub buttrGeschwindigkeituebermitteln_Click()
        SendBefehl "#rmg" & Chr(1) & Chr(rHScrolllgeschwindigkeit.Value), "OK"
    End Sub
    
    Private Sub buttRMotorAus_Click()
      SendBefehl "#rma" & Chr(1), "OK"
    End Sub
    
    Private Sub buttRMotorEin_Click()
       SendBefehl "#rmo" & Chr(1), "OK"
    End Sub
    
    Private Sub buttrmotorstop_Click()
         SendBefehl "#rms" & Chr(1), "OK"
    End Sub
    
    Private Sub buttrSchritt_Click()
         SendBefehl "#rmm" & Chr(1), "OK"
    End Sub
    
    Private Sub buttRSchritteuebermitteln_Click()
         high = Int(RHScrolllschritte.Value / 256)
         low = RHScrolllschritte.Value - (high * 256)
         SendBefehl "#rmz" & Chr(1) & Chr(low) & Chr(high), "OK"
    End Sub
    
    Private Sub buttrschritteZeigen_Click()
         SendBefehl "#rmp" & Chr(1), "OK"
    End Sub
    
    Private Sub buttrStatus_Click()
         SendBefehl "#rmt", "OK"
    End Sub
    
    Private Sub buttRStrom_Click()
        SendBefehl "#rmi" & Chr(1) & Chr(rmaxstrom.Value / 10), "OK"
    End Sub
    
    Private Sub buttVref_Click()
    frmVref.Show 1
    End Sub
    
    Private Sub Form_Load()
        txtStrom = ""
        txtLSchritte = ""
        txtlGeschwindigkeit = ""
        
        txtStromR = ""
        txtRSchritte = ""
        txtrGeschwindigkeit = ""
        
        'txtStrom = lmaxstrom.Value
        'txtLSchritte = HScrolllschritte.Value
        'txtlGeschwindigkeit = HScrolllgeschwindigkeit.Value
        txtlog = ""
        
       ComboComPort.ListIndex = 0
       MSComm1.CommPort = ComboComPort.ListIndex + 1
       MSComm1.Settings = "9600,N,8,1"
       MSComm1.InputLen = 0
       MSComm1.PortOpen = True
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
      MSComm1.PortOpen = False
    End Sub
    
    Private Sub HScrolllgeschwindigkeit_Change()
        txtlGeschwindigkeit = HScrolllgeschwindigkeit.Value
    End Sub
    
    Private Sub HScrolllschritte_Change()
    txtLSchritte = HScrolllschritte.Value
    End Sub
    
    Private Sub lmaxstrom_Change()
        txtStrom = lmaxstrom.Value
    End Sub
    
    
    
    Function SendBefehl(befehl As Variant, warteauf As String) As Boolean
       Dim buffer As String
       Dim rueckgabe As String
       Dim n As Long
       Dim bytefeld() As Byte
       Dim anz As Integer
       Dim i As Integer
       
       anz = Len(befehl)
       ReDim bytefeld(anz)
       For i = 1 To anz
        bytefeld(i - 1) = Asc(Mid(befehl, i, 1))
       Next i
       
       SendBefehl = False
       buffer = ""
       MSComm1.Output = befehl
    
       n = 0
       Do
          If n > 100000 Then
            Beep
            Exit Function
          End If
          rueckgabe = MSComm1.Input
          txtlog = txtlog & rueckgabe
          DoEvents
          buffer = buffer & rueckgabe
       n = n + 1
       Loop Until InStr(buffer, warteauf)
    
    txtlog.SelStart = Len(txtlog.Text)
    'txtlog.SelLength = 1
    DoEvents
    SendBefehl = True
    End Function
    
    
    Private Sub rHScrolllgeschwindigkeit_Change()
        txtrGeschwindigkeit = rHScrolllgeschwindigkeit.Value
    End Sub
    
    Private Sub RHScrolllschritte_Change()
    txtRSchritte = RHScrolllschritte.Value
    End Sub
    
    Private Sub rmaxstrom_Change()
     txtStromR = rmaxstrom.Value
    End Sub
    Genaue Befehlsübersicht ist in der Anleitung! Hier

    Gruß Frank



    Bild hier  

    Auch eine Steuersoftware für PC´s wird bereitgestellt werden:

    Bild hier  

    Bild hier  

  2. #2
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Hier die aktuelle Ansteuersoftware für RN-Control, wobei diese mit dem neusten Bascom Compiler compiliert werden kann (mit Vollversion getestet):

    Code:
    '###################################################
    'Schrittmotoransteuerung mit RN-Control und
    'Ansteuerungsboard RN-MOTOR über I2C
    '
    ' Achtung:
    ' Diese Demo ist mit Bascom Compiler 1.11.7.7 getestet
    ' Nur ältere Bascom Versionen benötigen eine neue Libary
    ' https://www.roboternetz.de/phpBB2/vi...t=694&start=22
    '
    ' Die Firmware von I2C-RN-Motor sollte 1.6c oder 1.6 oder darüber lauten,
    ' Haben Sie noch ältere Firmware im Board, dann eine Mail mit Kundennummer
    ' und Anschrift an support@robotikhardware.de senden. Man erhält
    ' dann gratis ein Firmwareupdate als HEX File. Ist ein ISP-Kabel
    ' vorhanden, kann dieses einfach in RN-Motor eingespielt werden
    ' Dir Firmware Versionsnummer der RS232 Version sind unabhängig und können anders lauten
    '
    '
    'Aufgabe:
    ' Dieses Testprogramm beschreibt die Motorboard I2C-Funktionen
    ' und legt einige der Befehle auf die 5 Tasten
    
    ' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
    ' Taste 1: Stellt für den linken Motor den Motorstrom auf 200mA ein und schaltet Motor danach ein
    ' Taste 2: Lässt den linken Motor endlos drehen
    ' Taste 3: Fragt der bereits ausgeführten Motorschritte des linken Motors vom Board ab und
    '          berechnet daraus Umdrehungen und Fahrtstrecke
    '          Daten werden über RS232 angezeigt
    ' Taste 4: Ändert die Geschwindigkeit des linken Motors mit jedem Tastendruck
    ''Taste 5: Schaltet den linken Motor wieder aus
    
    '
    
    'Autor: Frank
    'Weitere Beispiele und Beschreibung der Hardware
    'in der Anleitung zu RN-Motor
    'Anleitung findet man unter http://www.Roboternetz.de im Download Bereich
    'oder www.robotikhardware.de
    'Weitere Beispiele sind im Roboternetz gerne willkommen!
    '##############################################################
    
    
    
    Declare Function Tastenabfrage() As Byte
    Declare Sub Aendereslaveid()
    
    '$regfile = "m16def.dat"
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    'Befehle im Schrittmotorbetrieb
    'K ist eine Kennungsnummer die bei RN-Motor immer 10 ist, danach folgt Befehlscode und notwendige Parameter
    'Es müssen immer 5 Bytes übertragen werden, auch wenn weniger Parameter ausreichen
    
    'k 1 x y     Motor maximaler Strom x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = (Milliampere / 10)
    '            Beispiel : Y = 150 Bedeutet 1,5A Oder Y = 20 Bedeutet 200ma
    'k 2 y       Referenzspannung des Controllers (normal 2.5 und muss nicht geändert werden)
    '            Beispiel:  y=241 bedeutet 2,41 V
    'k 3 x       Motor stopp (Haltespannung bleibt ein) x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren Stopp
    'k 4 x y     Motor Drehrichtung x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren y=0=Links rum  y=1 rechts rum
    'k 5 x yl yh Motor genau y Schritte bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
                    'y wird in High und Low Byte übertragen
    'k 6 x       Motor endlose Schritte bewegen bis Stop Befehl kommt x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    
    'k 7 x       Motor einen einzigen Schritt bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    'k 8 x y     Motor Schrittgeschwindigkeit x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = 1 bis 255
    'k 9 x       Motor ganz ausschalten  x=0 Linker Motor  x=1 Rechte Motor  x2= Alle Motoren Stopp
    
    'k 10 x      Motor ein und init  x=0 Linker Motor  x=1 Rechte Motor
    
    'k 11        Konfiguration und Testwerte werden über RS232 ausgegeben
    
    'k 12        Sleep Mode
    
    'k 13 x      Motor selektieren
    
    'k 14 x      x=0 Vollschrittmodus  x=1 Halbschrittmodus
    'k 15 99 99 x  Slave ID zwischen Hex 50 und Hex 70 ändern (erst ab RN-Motor Firmware 1.1 möglich)
    
    
    Const Befehl_maxstrom = 1
    Const Befehl_referenzspannung = 2
    Const Befehl_stop = 3
    Const Befehl_drehrichtung = 4
    Const Befehl_schrittanzahl_drehen = 5
    Const Befehl_endlos_drehen = 6
    Const Befehl_einzigen_schritt = 7
    Const Befehl_geschwindigkeit = 8
    Const Befehl_ausschalten = 9
    Const Befehl_einschalten = 10
    Const Befehl_konfiguration_zeigen = 11
    Const Befehl_sleep_modus = 12
    Const Befehl_motor_selektieren = 13
    Const Befehl_schrittmotormodus = 14
    
    Const Motor_links = 0
     Const Motor_rechts = 1
    
    Const I2crnmotorslaveadr = &H56                             'I2C SlaveAdresse von RN-Motor Erweiterung
    Const I2crnmotorsreadlaveadr = &H57                         'I2C SlaveAdresse von RN-Motor Erweiterung
    'Achtung, wenn das Motor-Board überhaupt nicht reagiert, dann könnte dieses eine andere Slave
    'Adresse besitzen. Im Zweifel schließen Sie das Motorboard an die RS232 vom PC an und
    'drücken Sie die RESET-Taste am Motorboard.Dann kann die Slave ID über ein
    'Terminalprogramm angezeigt werden
    
    Dim I2cdaten(6) As Byte                                     'Array um Befehlsfolge auszunehmen
    Dim Lowbyte As Byte
    Dim Highbyte As Byte
    Dim Schritte As Long
    Dim Temp As Byte
    Dim Ltemp As Long
    Dim Umdrehungen As Single
    Dim Fahrstrecke As Word
    
    Dim Geschwindigkeit As Byte
    
    Dim I As Integer
    Dim N As Integer
    Dim Ton As Integer
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    Geschwindigkeit = 250
    I2cinit
    
    
    
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    Dim Taste As Byte
    
    
    
    
    
    I = 0
    Sound Portd.7 , 400 , 450                                   'BEEP
    Sound Portd.7 , 400 , 250                                   'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    Print
    Print "**** RN-Control  V1.4 *****"
    Print "Demoprogramm um Zusatzkarte RN-Motor im Schrittmotormodus zu testen"
    Print
    Do
       Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                'Motorstrom auf 200mA begrenzen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_maxstrom                   'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2cdaten(4) = 200 / 10                          '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
                'Halbschrittmodus
    '            I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
    '            I2cdaten(2) = Befehl_schrittmotormodus          'Befehlscode
    '            I2cdaten(3) = 1                                 'Beide Motoren Halbschrittmodus
    '            I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
                'Motor einschalten
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_einschalten                'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
    
             Case 2
                'Motor endlos drehen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_endlos_drehen              'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
    
             Case 3
               'Motor für Datenabruf anwählen
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_motor_selektieren          'Befehlscode
                I2cdaten(3) = 0                                 '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
                Waitms 1
                'Schritte abrufen und Umdrehungen und Fahrtstrecke berechnen und über RS232 anzeigen
                I2cstart
                I2cwbyte I2crnmotorsreadlaveadr
                I2crbyte Temp , Ack
                Schritte = Temp
                I2crbyte Temp , Ack
                Ltemp = Temp * 256
                Schritte = Schritte + Ltemp
                I2crbyte Temp , Ack
                Ltemp = Temp * 65536
                Schritte = Schritte + Ltemp
                I2crbyte Temp , Nack
                Ltemp = Temp * 16777216
                Schritte = Schritte + Ltemp
                I2cstop
                Print "Schrittanzahl:" ; Schritte
                Umdrehungen = Schritte / 200                    'Wenn Schrittwinkel 1,8 Grad beträgt dann durch 200 teilen
                Print "Umdrehungen: " ; Umdrehungen
                'Umfang des rades mal Umdrehungen ergibt Fahrtstrecke
                'Umfang berechnet sich auch U=3.14 * Druchmesser
                'In dem Beispiel nehmen wir ein 10 cm Rad am Roboter an
                Fahrstrecke = Umdrehungen * 31.4
                Print "Der Roboter ist " ; Fahrstrecke ; " cm gefahren "
    
             Case 4
                'Geschwindigkeit ändern
                If Geschwindigkeit > 40 Then
                  Geschwindigkeit = Geschwindigkeit - 20
                Else
                  Geschwindigkeit = Geschwindigkeit - 1
                End If
                Print "Geschwindigkeitsstufe: " ; Geschwindigkeit
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_geschwindigkeit            'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2cdaten(4) = Geschwindigkeit                   '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
              Case 5
                'Motor ausschalten
                I2cdaten(1) = 10                                'Kennung muss bei RN-Motor immer 10 sein
                I2cdaten(2) = Befehl_ausschalten                'Befehlscode
                I2cdaten(3) = Motor_links                       '1 Parameter
                I2csend I2crnmotorslaveadr , I2cdaten(1) , 5    'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
                I2cstop
    
    
          End Select
          Sound Portd.7 , 400 , 500                             'BEEP
       End If
    
       Waitms 100
    Loop
    
    End
    
    
    
    
    ' Diese Unterfunktion fragt die Tastatur am analogen Port ab
    ' Sollte beim betätigen einer Taste kein Quittungston kommen, dann
    ' muss die die Tastenabfrage (Select Case Anweisung in Funktion )
    ' an ihr Board angepaßt werden. Widerstandstoleranzen sorgen in
    ' Einzelfällen manchmal dafür das die Werte etwas anders ausfallen
    ' Am besten dann den WS wert mit Print für jede Taste ausgeben lassen
    
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
    
       Tastenabfrage = 0
       Ton = 600
       Start Adc
       Ws = Getadc(7)
    '   Print "ws= " ; Ws
       If Ws < 1010 Then
          Select Case Ws
             Case 400 To 455
                Tastenabfrage = 1
                Ton = 550
             Case 335 To 380
                Tastenabfrage = 2
                Ton = 500
             Case 250 To 305
                Tastenabfrage = 3
                Ton = 450
             Case 180 To 220
                Tastenabfrage = 4
                Ton = 400
             Case 100 To 130
                Tastenabfrage = 5
                Ton = 350
          End Select
          Sound Portd.7 , 400 , Ton                             'BEEP
       End If
    
    End Function
    
    
    
    'Diese Funktion kann genutzt werden um die SlaveID von RN-Motor
    'zu aendern. Dies ist allerdings erst in der neusten Firmware
    'von RN-Motor möglich. Bei älteren Versionen müsste Controller gewechselt
    'werden. Die Aktuelle Version und Slave ID wird über
    'RS232 von RN-Motor bei RESET ausgegeben
    Sub Aendereslaveid()
       I2cdaten(1) = 10                                         'Kennung muss bei RN-Motor immer 10 sein
       I2cdaten(2) = 15
       I2cdaten(3) = 99                                         '1 Parameter Sicherheitskennung
       I2cdaten(4) = 99                                         '2 Parameter Sicherheitskennung
       I2cdaten(5) = &H58                                       'Hier neue Slave ID Eintragen
       I2csend I2crnmotorslaveadr , I2cdaten(1) , 5             'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    End Sub
    Da auch nach C-Control Beispiel öfters gefragt wird. Hier eines für die RS232-Schnittstelle. Ähnlich gehts natürlich mit RN-Control oder allen anderen Boards mit RS232 auch:

    Code:
    'DEMO das aufzeigt
    'wie einfach RN-Motor über RS232
    'auch mit einer C-Control angesteuert werden kann
    
    
    
    'Motorstrom festlegen
      
      Print "#rmi" ; : Put 2 : Put 58
      pause 20
     
     'beide Motoren ein
      Print "#rmo" ; : Put 2
      pause 20
    
     'beide motoren rechts
      Print "#rmd" ; : Put 2 : Put 0
    
      pause 20
      'geschwindigkeit
      Print "#rmg" ; : Put 2 : Put 25
      pause 20
    
      'endlos drehen
      Print "#rme" ; : Put 2
    
    
    
    
    #hinundher
      pause 1000
    
     'Linker motor nach links
      Print "#rmd" ; : Put 0 : Put 0
    
     'rechter motor nach rechts
      Print "#rmd" ; : Put 1 : Put 1
    
      pause 1000
    
     'Linker motor nach rechts
      Print "#rmd" ; : Put 0 : Put 1
    
     'rechter motor nach links
     'Print "#rmd" ; : Put 1 : Put 0
    
    
    GoTo hinundher
    Ein Demo für C-Control und RN-Motor I2C findet man hier:
    https://www.roboternetz.de/phpBB2/dl...le&file_id=251

  3. #3
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Hier noch ein kleines Demo für RN-Control. Der Motor wird alle 4 Sekunden genau 100 Schritte weitergedreht

    Code:
    '###################################################
    'Kleines Demoprogramm mit
    'RN-Control und Ansteuerungsboard RN-MOTOR über I2C
    'Alle 4 Sekunden wird Motor 100 Schritte weiterbewegt
    '
    'Autor: Frank
    'Weitere Beispiele und Beschreibung der Hardware
    'in der Anleitung zu RN-Motor
    'Anleitung findet man unter http://www.Roboternetz.de im Download Bereich
    'oder www.robotikhardware.de
    'Weitere Beispiele sind im Roboternetz gerne willkommen!
    '##############################################################
    
    
    
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    
    'Befehle im Schrittmotorbetrieb
    'K ist eine Kennungsnummer die bei RN-Motor immer 10 ist, danach folgt Befehlscode und notwendige Parameter
    'Es müssen immer 5 Bytes übertragen werden, auch wenn weniger Parameter ausreichen
    
    'k 1 x y     Motor maximaler Strom x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = (Milliampere / 10)
    '            Beispiel : Y = 150 Bedeutet 1,5A Oder Y = 20 Bedeutet 200ma
    'k 2 y       Referenzspannung des Controllers (normal 2.5 und muss nicht geändert werden)
    '            Beispiel:  y=241 bedeutet 2,41 V
    'k 3 x       Motor stopp (Haltespannung bleibt ein) x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren Stopp
    'k 4 x y     Motor Drehrichtung x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren y=0=Links rum  y=1 rechts rum
    'k 5 x yl yh Motor genau y Schritte bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
                    'y wird in High und Low Byte übertragen
    'k 6 x       Motor endlose Schritte bewegen bis Stop Befehl kommt x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    
    'k 7 x       Motor einen einzigen Schritt bewegen x=0 Linker Motor  x=1 Rechte Motor  x2= Beide Motoren
    'k 8 x y     Motor Schrittgeschwindigkeit x=0 Linker Motor  x=1 Rechte Motor x2= Beide Motoren Y = 1 bis 255
    'k 9 x       Motor ganz ausschalten  x=0 Linker Motor  x=1 Rechte Motor  x2= Alle Motoren Stopp
    
    'k 10 x      Motor ein und init  x=0 Linker Motor  x=1 Rechte Motor
    
    'k 11        Konfiguration und Testwerte werden über RS232 ausgegeben
    
    'k 12        Sleep Mode
    
    'k 13 x      Motor selektieren
    
    'k 14 x      x=0 Vollschrittmodus  x=1 Halbschrittmodus
    'k 15 99 99 x  Slave ID zwischen Hex 50 und Hex 70 ändern (erst ab RN-Motor Firmware 1.1 möglich)
    
    
    Const Befehl_maxstrom = 1
    Const Befehl_referenzspannung = 2
    Const Befehl_stop = 3
    Const Befehl_drehrichtung = 4
    Const Befehl_schrittanzahl_drehen = 5
    Const Befehl_endlos_drehen = 6
    Const Befehl_einzigen_schritt = 7
    Const Befehl_geschwindigkeit = 8
    Const Befehl_ausschalten = 9
    Const Befehl_einschalten = 10
    Const Befehl_konfiguration_zeigen = 11
    Const Befehl_sleep_modus = 12
    Const Befehl_motor_selektieren = 13
    Const Befehl_schrittmotormodus = 14
    
    Const Motor_links = 0
     Const Motor_rechts = 1
    
    Const I2crnmotorslaveadr = &H56                             'I2C SlaveAdresse von RN-Motor Erweiterung
    Const I2crnmotorsreadlaveadr = &H57                         'I2C SlaveAdresse von RN-Motor Erweiterung
    'Achtung, wenn das Motor-Board überhaupt nicht reagiert, dann könnte dieses eine andere Slave
    'Adresse besitzen. Im Zweifel schließen Sie das Motorboard an die RS232 vom PC an und
    'drücken Sie die RESET-Taste am Motorboard.Dann kann die Slave ID über ein
    'Terminalprogramm angezeigt werden
    
    Dim I2cdaten(6) As Byte                                     'Array um Befehlsfolge auszunehmen
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    
    
    Wait 3                                                      'Kurz warten damit RN-Motor sich initialisieren kann
    
      I2cinit
    
      'Motorstrom auf 200mA begrenzen
       I2cdaten(1) = 10                                         'Kennung muss bei RN-Motor immer 10 sein
       I2cdaten(2) = Befehl_maxstrom                            'Befehlscode
       I2cdaten(3) = Motor_links                                '1 Parameter
       I2cdaten(4) = 200 / 10                                   '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
       I2csend I2crnmotorslaveadr , I2cdaten(1) , 5             'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
       I2cstop
    
    
      'Motor einschalten
      I2cdaten(1) = 10                                          'Kennung muss bei RN-Motor immer 10 sein
      I2cdaten(2) = Befehl_einschalten                          'Befehlscode
      I2cdaten(3) = Motor_links                                 '1 Parameter
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 5              'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
      I2cstop
    
    
                'Alle 4 Sekunden 100 Schritte
    Do
      I2cdaten(1) = 10                                          'Kennung muss bei RN-Motor immer 10 sein
      I2cdaten(2) = Befehl_schrittanzahl_drehen                 'Befehlscode
      I2cdaten(3) = Motor_links                                 '1 Parameter
      I2cdaten(4) = 100
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 5              'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
    
      Wait 4
    Loop
    
    End

  4. #4
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Neues Board!

    RN-Motor gibt es leider derzeit nicht mehr als Bausatz oder Platine. Es gibt aber ein Nachfolge-Bausatz der ähnlich arbeitet und sogar eine Reihe Verbesserungen beinhaltet. Er nennt sich RN-Schrittmotor
    Viele Anregungen die zum Board RN-Motor eintrafen wurden in RN-Schrittmotor umgesetzt. So verfügt das Board nun über 3 Ansteuerungsmöglichkeiten. Entweder per I2C-Bus, per RS232-Schnittstelle oder im herkömmlichen Taktmodus mit Takt- und Richtungseingängen.
    Für RN-Schrittmotor gibts Bausatz als auch Einzelplatine! Auch Beispielprogramme für RN-Control sind vorhanden.

    Dokumentation (Url): https://www.roboternetz.de/phpBB2/dl...le&file_id=367



    Aktuelle und kostenlose Firmware-Updates hier auf der Seite downloaden!

Berechtigungen

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

Solar Speicher und Akkus Tests