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
Lesezeichen