Go Down

Topic: robotermotor ansteuern mit l293d (Read 3197 times) previous topic - next topic

funkheld

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

Code: [Select]

$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

Webmeister

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

sth77

#2
Feb 09, 2011, 10:51 am Last Edit: Feb 09, 2011, 10:56 am by sth77 Reason: 1
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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Webmeister

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

funkheld

#4
Feb 09, 2011, 04:55 pm Last Edit: Feb 09, 2011, 05:08 pm by funkheld Reason: 1
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).

Quote

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?  :(

Webmeister

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.

funkheld

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


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

gruss

Webmeister


sth77

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.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

funkheld

#9
Feb 09, 2011, 07:12 pm Last Edit: Feb 09, 2011, 07:25 pm by funkheld Reason: 1
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

Code: [Select]

$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

sth77

Arduino-Standard ist die 8bitige PWM. Konfigurationsorgien entfallen somit nahezu vollständig, wenn man nicht bis hinunter in die Registerebene rutscht bzw. rutschen will.  :)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

funkheld

#11
Feb 09, 2011, 07:32 pm Last Edit: Feb 09, 2011, 07:34 pm by funkheld Reason: 1
...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

funkheld

#12
Feb 09, 2011, 07:50 pm Last Edit: Feb 09, 2011, 07:52 pm by funkheld Reason: 1
...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

Webmeister

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

sth77

#14
Feb 09, 2011, 08:05 pm Last Edit: Feb 09, 2011, 09:16 pm by sth77 Reason: 1
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...
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Go Up