robotermotor ansteuern mit l293d

hallo, wie kann ich das jetzt umsetzen in den arduinio. es ist eine motorsteuerung für mein roboter in bascom. funktioniert wunder mit bascom, links vor...usw...

gruss

$regfile = "M644pdef.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 19200

Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output

Config Portd.4 = Output
Config Portd.5 = Output

Declare Sub Li_vor()
Declare Sub Re_vor()
Declare Sub Li_zurueck()
Declare Sub Re_zurueck()
Declare Sub Robby_vor()
Declare Sub Robby_zurueck()
Declare Sub Robby_links()
Declare Sub Robby_rechts()
Declare Sub Robby_aus()

Dim M_wert As Word

M_wert = 120

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256

Start Timer1

Wait 1

Call Li_vor()
Wait 1
Call Robby_aus()
Waitms 100

Call Li_zurueck()
Wait 1
Call Robby_aus()
Waitms 100

Call Re_vor()
Wait 1
Call Robby_aus()
Waitms 100

Call Re_zurueck()
Wait 1
Call Robby_aus()

End

Sub Re_vor()
   Portc.4 = 0
   Portc.5 = 1

   Pwm1a = M_wert
End Sub

Sub Re_zurueck()
   Portc.4 = 1
   Portc.5 = 0

   Pwm1a = M_wert
End Sub

Sub Li_zurueck()
   Portc.2 = 1
   Portc.3 = 0

   Pwm1b = M_wert
End Sub

Sub Li_vor()
   Portc.2 = 0
   Portc.3 = 1

   Pwm1b = M_wert
End Sub

Sub Robby_aus()
   Pwm1a = 0
   Pwm1b = 0
End Sub

Eine Übersetzung deines Programmcodes wirst du hier nicht bekommen, aber dieses Tutorial hilft dir dabei. (im verlinkten Tutorial als PDF findest du weitere Links zu fertigen Arduino-Funktionen) http://oomlout.co.uk/?p=222

Der Meister hat gesprochen! ;) Letztlich ist dieses Bascom-Programm doch ganz trivial: Zuerst werden die entsprechend benötigten Pins als Ausgänge definiert, für jeden Motor benötigt man prinzipiell 2 Pins für die Drehrichtung, wenn man zusätzlich die Geschwindigkeit einstellen will, macht man das über eine PWM am jeweiligen Enable-Eingang des L293D. Das kann man (aus meiner Sicht einfacher als in Bascom) auch mit dem Arduino-Board machen, der verwendete Mega644 wie im Bascom-Beispiel wird nicht benötigt. Nur noch als Idee, wenn du dich an die Arduino-Umsetzung machst: Man kann die Motoren auch aktiv bremsen, indem man gleiche Pegel an die drehrichtungsbeeinflussenden Pins legt. Bei größeren und damit schwereren Robotern (Trägheit!) laufen dann die Motoren dann nicht mehr so stark nach.

Die texliche Erklärung von sth77 ist in folgendem Tutorial schön darsgestellt. http://itp.nyu.edu/physcomp/Labs/DCMotorControl

es ist der 644p drauf. ich benutze zur zeit nur den sanguino(644), läuft mit dem sanguinotool eigentlich sehr stabil.

die ganzen hilfen oben bringen mich nicht weiter, weil ich da kein pwm-einstellung finde usw. ausserdem habe ich einen l293d und die ganze pwm-geschichte erscheint da nicht. es wird nur mit h-brücken geschaltet und nicht geregelt über pwm.

zumindest brauche ich mal hierfür eine hilfe: Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256 Start Timer1 ...für den ardunio(sanguino).

Nur noch als Idee, wenn du dich an die Arduino-Umsetzung machst: Man kann die Motoren auch aktiv bremsen, indem man gleiche Pegel an die drehrichtungsbeeinflussenden Pins legt. Bei größeren und damit schwereren Robotern (Trägheit!) laufen dann die Motoren dann nicht mehr so stark nach.

das möchte ich nicht machen, weil der roboter mit dem bascomprogramm gut funktioniert. ich habe noch eine andere erweiterung in bascom, wo ich über funk dann die daten rübersende , wonach der roboter dann fährt. :)

mir geht es oben nur um die grundsatzfrage der ansteuerung mit dem arduino, mehr nicht. wahrscheinlich baut hier keiner roboter mit einer pwm-steuerung? :(

Versuch zuerst die einfache Ansteuerung des Motors mittels PWM und Richtungssignal aufzubauen und zu verstehen. Beispielsketche sind im Tutorial ja dabei. ;)

Wenn dies funktioniert, kannst du das gesamte Programm mit den einzelnen Richtungs-und Bewegungsfunktionen (Links/Rechts, Vorwärts/Rückwärts etc.) erstellen.

....Beispielsketche sind im Tutorial ja dabei.....

hmm, innernhalb der arduino-ide finde ich kein beispiel mit motorsteuerung für den l293d und pwm.

gruss

Dieses Tutorial meine ich damit: http://itp.nyu.edu/physcomp/Labs/DCMotorControl

http://www.arduino.cc/en/Reference/AnalogWrite

Das ist alles, was du brauchst. Der Pin am enableA und enableB muss PWM-fähig sein. Und in deinem Beispielprogramm passiert ja noch nicht viel PWM-lastiges. Da wird nur einmal ein PWM-Wert von 120 (medium) und einmal von 0 (aus) eingestellt. Das ganze Timer-Gedöns fällt beim Arduino bei PWM-Sachen flach, daher sagte ich ja bereits, es ist hier sehr einfach.

ich wollte euch nicht gleich zu anfang strapazieren. über funk teile ich dem roboter dann den wert von 0-255 mit , so wie die pwm-einstellung unter bascom konfiguriert ist, der wert nennt sich unten "Ps": If Left(text , 2) = "ps" Then Right_len = Len(text) - 2 Text1 = Right(text , Right_len) Ps = Val(text1) End If

der pwm-wert geht hier nur bis 255(8-bit), es geht auch noch anders mit der pwm-frequenz : PWM-Modus vom Atmega: 8-Bit PWM 9-Bit PWM 10-Bit PWM

darum frage ich mich, wie du darauf kommst : ...Das ganze Timer-Gedöns fällt beim Arduino bei PWM-Sachen flach... hmm..., woher weiss der arduino, das ich die pwm-requenz für 255(8-bit) gewählt habe, oder die frequenz für 9-bit oder die frequenz für 10-bit ?

..Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256...

schau dir mal die einstellung für "Prescale" an.

gruss

$regfile = "M644pdef.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 19200

Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Portc.5 = Output

Config Portd.4 = Output
Config Portd.5 = Output

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "COM1:" For Binary As #1

Declare Sub Li_vor()
Declare Sub Re_vor()
Declare Sub Li_zurueck()
Declare Sub Re_zurueck()
Declare Sub Robby_vor()
Declare Sub Robby_zurueck()
Declare Sub Robby_links()
Declare Sub Robby_rechts()
Declare Sub Robby_aus()

Dim Ps As Word

Dim Right_len As Byte
Dim Text As String * 10
Dim Text1 As String * 4

Ps = 0

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256

Enable Interrupts

Start Timer1

Wait 1

Do
      Input #1 , Text

      If Left(text , 3) = "vor" Then
         Right_len = Len(text) - 3
         Text1 = Right(text , Right_len)
         Call Robby_aus()
         Waitms 20
         Call Robby_vor()
      End If
      If Left(text , 3) = "zur" Then
         Right_len = Len(text) - 3
         Text1 = Right(text , Right_len)
         Call Robby_aus()
         Waitms 20
         Call Robby_zurueck()
      End If
      If Left(text , 3) = "lin" Then
         Right_len = Len(text) - 3
         Text1 = Right(text , Right_len)
         Call Robby_aus()
         Waitms 20
         Call Robby_links()
      End If
      If Left(text , 3) = "rec" Then
         Right_len = Len(text) - 3
         Text1 = Right(text , Right_len)
         Call Robby_aus()
         Waitms 20
         Call Robby_rechts()
      End If
      If Left(text , 4) = "stop" Then
         Call Robby_aus()
      End If
      If Left(text , 2) = "ps" Then
         Right_len = Len(text) - 2
         Text1 = Right(text , Right_len)
         Ps = Val(text1)
      End If

      Text = ""
      Text1 = ""

Loop

End

Sub Robby_vor()
   Call Re_vor()
   Call Li_vor()
End Sub

Sub Robby_zurueck()
   Call Re_zurueck()
   Call Li_zurueck()
End Sub

Sub Robby_links()
   Call Re_vor()
   Call Li_zurueck()
End Sub

Sub Robby_rechts()
   Call Re_zurueck()
   Call Li_vor()
End Sub

Sub Re_vor()
   Portc.4 = 0
   Portc.5 = 1

   Pwm1a = Ps
End Sub

Sub Re_zurueck()
   Portc.4 = 1
   Portc.5 = 0

   Pwm1a = Ps
End Sub

Sub Li_zurueck()
   Portc.2 = 1
   Portc.3 = 0

   Pwm1b = Ps
End Sub

Sub Li_vor()
   Portc.2 = 0
   Portc.3 = 1

   Pwm1b = Ps
End Sub

Sub Robby_aus()
   Pwm1a = 0
   Pwm1b = 0
End Sub

Arduino-Standard ist die 8bitige PWM. Konfigurationsorgien entfallen somit nahezu vollständig, wenn man nicht bis hinunter in die Registerebene rutscht bzw. rutschen will. :)

...Arduino-Standard ist die 8bitige PWM. Konfigurationsorgien entfallen somit nahezu vollständig, wenn man nicht bis hinunter in die Registerebene rutscht bzw. rutschen will....

hmm.., das ist aber scheisse..., das ist mit das wichtigste. darum trippelten alle nur auf der stelle mit mein programm.

also muss ich das andere direkt von der registerebene machen?

hoffentlich wird das mal geändert, das man den bitwert vom pwm auswählen kann.

"Pwm = Clear Down" > auch diese daten sind wichtig.

gruss

...The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6....

das fehlt auch gerade noch, das die nicht ganz auf "0" schalten können und der motor dauend mit strom versorgt wird, bzw der motor schaden nehmen kann.

man..., wer hat das nur fabriziert?

kommt man irgendwie an den source von den pwm-gedöns vom arduino ran, das man da etwas manipulieren kann für den eigenbedarf?

gruss

@funkheld Kannst du bitte die Zitate jeweils als Quote, im Editor mit dem Icon "Sprechblase", einfügen. Alle Leser werden es dir danken.

Und bitte mit Quellenangabe, dass man auch mal selbst nachlesen kann. [edit] Selbst gefunden, steht ja so im von mir vorgeworfenen Link zur Befehlsreferenz von analogWrite ().

Aber mal ganz allgemein: Gibt es diese genannte Einschränkung nur auf der Arduino-Plattform? Nach meinem Verständnis ist das doch hardwareseitig und somit Atmels "Verschulden".

[edit] Und wenn du die Einschränkungen bei Pin 5 und 6 anführst, warum nutzt du nicht die anderen PWM-Pins, die da wären 3, 9, 10, und 11? Irgendwie ist es recht mühselig, dir die ganzen Informationen zu entlocken. Wie es sich bei einem 644er (und nicht wie beim Uno und Duemilanove) beim 328er verhält, weiß ich allerdings nicht. Und mir scheint, dass du es ebensowenig weißt. Aber immerhin ist der Eifer da, irgendwas anders und besser zu machen...

dieser mischmasch arduino-gestricke und dann wieder winvar-tiefenmischmasch. hmmm...., woher weiss man jetzt das dieser arduino-mischmasch mir jetzt nicht dazwischen funkt wenn ich den winavr-tiefenmischmasch einsetze....hm...und mir den pwm irgendwie ausbremst....???

...Gibt es diese genannte Einschränkung nur auf der Arduino-Plattform?....

so weit mir bekannt ist ...ja.

der rp6 und asuro sind mit ihren selbstgestrickten befehlen auch auf der untersten ebene vonwin-avr, aber/und nachvollziehbar.