Projekt: RN-Motor




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
'     http://www.roboternetz.de/phpBB2/vie...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





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