PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Motor und Timer



LinkinPark
25.07.2005, 21:39
Hallo,

ich habe ein Problem mit meiner RN-Motor I2C. Ich will dass immer nach einer bestimmten Zeit 100 Schritte gemacht werden. Funktioniert das irgendwie nie. Hat jemand so was schon mal gemacht und hat ein Beispielprogramm dazu ?

Vielen Dank

Frank
26.07.2005, 09:09
Wo hast du denn Probleme.
Im Grunde müsste dein Controllerboard/PC doch nur in deinem gewünschten Zeitintervall den Befehl an RN-Motor senden "200 Schritte bewegen".

Sollte kein Problem sein

LinkinPark
26.07.2005, 09:48
Hallo,

nein eigentlich dachte ich das auch. Ich verwende diesen Befehl:

I2cdaten(1) = 10
I2cdaten(2) = 5
I2cdaten(3) = 0
I2cdaten(4) = 100
I2csend rnm1adr , I2cdaten(1) , 5

Wenn das Program startet dreht er sich um 100 Schritte weiter. Danach sende ich keine weiteren Befehle über den I2C bis der Timer den Interrupt auslöst, in dem dann wieder der selbe Code wie ober steht, nur das diesmal Nichts passiert. Muss ich vorher irgendetwas anderes senden, bis ich wieder 100 Schritte machen kann

Frank
26.07.2005, 11:08
Sowiet ich es im Kopf habe, muss man eigentlich keinen weiteren Befehl geben. Aber du kannst ja mal Probeweise einen Motor-Stop Befehl zuvor senden (auch wenn er schon steht).
Dein Timer darf natürlich nicht zu kurz angelegt sein, die 200 Schritte müssen bereits ausgeführt worden sein.

LinkinPark
26.07.2005, 11:13
Ja der Timer braucht mindestens 1 minute bis er auslöst. Welche Befehle muss ich denn außer dem von mir geschrieben zuvor noch senden?

Frank
26.07.2005, 11:18
Wie gesagt, ich habs momentan auch nicht genau im Kopf. Probier einfach mal den Motorstop Befehl (Befehlscode 3 siehe Doku)
Was hast du denn für Firmware Version (immer bei Fragen angeben)?

LinkinPark
26.07.2005, 11:44
Also ich habe die RN-Control 1.4 und die RN-Motor 1.2. Allerdings kommt mir die ganze Sache langsam etwas komisch vor. Wenn ich folgenden Code verwende passiert nach anlegen der Spannung manchaml gar nichts, manchmal zieht der Motor an aber dreh sich nicht und in seltenen Fällen dreht er sich. Ist das nicht etwas verwunderlich ?

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Config Scl = Portc.0
Config Sda = Portc.1
Dim I2cdaten(6) As Byte

I2cdaten(1) = 10
I2cdaten(2) = 10
I2cdaten(3) = 0
I2csend &H56 , I2cdaten(1) , 5

I2cdaten(1) = 10
I2cdaten(2) = 5
I2cdaten(3) = 0
I2cdaten(4) = 100
I2csend &H56 , I2cdaten(1) , 5


Do
Loop
End

Frank
26.07.2005, 11:48
Menn du RN-Motor gleichzeitig mit Spannung versorgst musst du am Anfang kurze Pause machen bis RN-Motor sich initialisiert hat.

Zudem fehlt bei die der Bascom I2cInit Befehl


Die Versionsnummern die du gennnat hast beziehen sich auf Hardware. Die Firmware Versionsnummer (der SOftware) wird nur über RS232 bei einem RESET ausgegeben. Kann mit Terminalprogramm somit angezeigt werden.

Gruß Frank

PicNick
26.07.2005, 11:54
Sind das beim ersten senden nicht nur 4 Byte ?

LinkinPark
26.07.2005, 12:00
Hallo, ok ja vielen Dank das mit den I2Cinit war natürlich richtig. Die RN-Motor Firmware Version ist 1.6c.

Ich hab das Programm jetzt umgeändert:

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Wait 3

Config Scl = Portc.0
Config Sda = Portc.1
Dim I2cdaten(6) As Byte

I2cinit

I2cdaten(1) = 10
I2cdaten(2) = 10
I2cdaten(3) = 0
I2csend &H56 , I2cdaten(1) , 5

I2cdaten(1) = 10
I2cdaten(2) = 5
I2cdaten(3) = 0
I2cdaten(4) = 100
I2csend &H56 , I2cdaten(1) , 5

Do
Loop
End

In den 3 Sekunden müsste sich die RNM doch initialisiert haben. Jetzt Zieht der Motor immer an jedoch bewegt er sich immer noch nie.

Vielen Dank mal zwischendurch für deine Hilfe

Frank
26.07.2005, 12:34
Du solltest als erstes den Motorstrom einmal programmieren.
Danach einschalten und dann den Schrittbefehl.

@PicNick:
Nein nein, das sind schon 5 Byte. Es wird ja der I2CSEND Befehl genutzt und 5 Byte als Parameter angegeben. Es müssen nicht immer alle 5 Byte definiert werden.

LinkinPark
26.07.2005, 12:52
Hallo,

leider immer noch das selbe Bild. Der Motor dreht sich nicht. Kann es an irgendwelchen Jumpereinstellungen liegen?



$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Wait 3

Config Scl = Portc.0
Config Sda = Portc.1
Dim I2cdaten(6) As Byte

I2cinit

I2cdaten(1) = 10
I2cdaten(2) = 1
I2cdaten(3) = 0
I2cdaten(4) = 20
I2csend &H56 , I2cdaten(1) , 5

I2cdaten(1) = 10
I2cdaten(2) = 10
I2cdaten(3) = 0
I2csend &H56 , I2cdaten(1) , 5

I2cdaten(1) = 10
I2cdaten(2) = 5
I2cdaten(3) = 0
I2cdaten(4) = 100
I2csend &H56 , I2cdaten(1) , 5


Do
Loop
End

Frank
26.07.2005, 20:10
Damit ich nicht weiter im Nebel stochere habe ich mir RN-Motor mal vorgeholt und schnell ein kleines Demo für dich geschrieben.

Das Demo zeigt genau das was du willst. Alle 4 Sekunden werden hier 100 Schritte ausgeführt. Der Übersichtlichkeit wegen wird hier KEIN Timer benutzt. Du kannst das natürlich auch mit dem Timer machen. Wie du siehst ist der i2cstop Befehl noch notwendig.

Gruß Frank




'################################################# ##
'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