Forum: Mikrocontroller und Digitale Elektronik Bascom AVR - L293D Motoransteuerung


von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Hallo Leute!

Ich möchte meinen 4- Rad- Roboter (alle 4 DC Motoren) über einen Arduino 
UNO (Atmega328P mit einem passend aufsteckbaren L293D Motor-Shield) und 
Bascom AVR ansteuern.
Dazu habe ich ein Testprogramm adaptiert: Motortreiber TB6612FNG 
test1.BAS
Es ist das erste Programm auf dieser Seite:
https://www.mikrocontroller-elektronik.de/preiswerter-dual-motortreiber-tb6612fng/
(Ich habe nur den Link kopiert, damit keine Urheberechte davon berührt 
sind.)
Das adaptierte Programm funktioniert - das bedeutet, dass sich zumindest 
ein Motor dreht (der zweite manchmal - wahrscheinlich ein 
Wackelkontakt). Nur drehen sich die beiden Motoren nach der Pause stets 
in eine Richtung - laut Programm soll sich ja immer wieder die 
Drehrichtung umkehren.
Das Kernproblem liegt aber wo anders. Das L293- Shield kann ja alle 4 
Motoren ansteuern (2x L293D Chips), nur fehlen mir die 
Verbindungsinformationen von den Atmega328P Portpins zu den passenden 
Eingangspins der beiden L293D.
Im Internet habe ich dazu keine Informationen gefunden, nur im 
Testprogramm sieht man die Zuordnung von dem einen L293D zu den 
Portpins. Durch Ausmessen mit dem Multimeter habe ich die verb. PWM- 
Ports (Geschwindigkeit) ermittelt: PB3,PD3,PD5,PD6. Die Port- 
Verbindungen zu den anderen 4 Inputs des zweiten L293D habe ich nicht 
gefunden. Kennt wer diese Port- Zuordnungen?
Danke.

Beitrag #6567099 wurde vom Autor gelöscht.
von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Also ich habe da am 28.01. um 22:11 eine Nachricht bekommen, dass es 
eine Antwort auf meine Frage gibt - von Armin H.
Nur finde ich diese Antwort hier nicht. Wo ist die?
Übrigens das mit der Drehrichtung hat sich geklärt - die ist nur im 
zweiten Programm programmiert.
Die Frage ist ja wie sind die 4 Verbindungen von den Arduino Uno 
Portpins hin zu den Inputs des zweiten L293D Chip auf dem L293D- shield.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ekkehard N. schrieb:
> Die Frage ist ja wie sind die 4 Verbindungen von den Arduino Uno
> Portpins hin zu den Inputs des zweiten L293D Chip auf dem L293D- shield.

?
In dem verlinkten Artikel wird nur ein Dual Motortreiber verwendet und 
die Belegung ist im Programm beschrieben:
1
; hier mal PortB 1
2
Config Pinb.1 = Output
3
Motor1_pwm Alias Portb.1
Wenn du einen zweiten Motortreiber anschliesst, sollte der also andere 
Pins bekommen als der erste Motortreiber. Ausserdem sollte der so 
verkabelt werden, das er auch an PWM fähigen Pins liegt. Also z.B. auf 
Timer 2 (PortB.3 und PortD.3)
Der Mega hat insgesamt 6 PWM fähige Outputs. Die Richtungs Pins brauchen 
keine PWM Ausgänge.

von Ekkehard N. (Firma: Privat) (machsnicht)


Angehängte Dateien:

Lesenswert?

Gut ich versuche meine Fragestellung etwas mehr zu präzisieren:
Es geht um bestimmte Verbindungsleitungen auf einem Motortreiber- shield 
für einen Arduino Uno. Mit diesem shield kann 4 Motoren ansteuern. Die 
Informationen zu diesem shield findet man hier:
http://wiki.sunfounder.cc/index.php?title=L293D_Motor_Driver_Shield
Links oben sieht man die Platine mit den 2 L293D Motortreibern, links 
der IC1 und rechts der IC2. Mit dem IC1 und dem Testprogramm kann ich 
Motor1 und Motor2 ansteuern (nur das mit der Drehrichtungsumkehr 
funktioniert nicht).
Jetzt ist die Frage, wie ich mit IC2 die Motoren 3 und 4 ansteuern kann?
Leider sind die L293D- Steuereingänge M1A bis M4B nicht direkt mit einem 
Atmega328P Portpin verbunden sondern über das 74HC595 Schieberegister. 
Das kann man im Schaltplan erkennen und deshalb kann man mit dem 
Multimeter keine ohmsche Verbindungen auf dem shield messen.
Wie muss jetzt dieses Testprogramm erweitert werden, damit sich auch 
Motor 3 und 4 sich drehen?
Was auf dem shield fix "verdrahtet" ist: PWM2A mit PB3, PWM2B mit PD3, 
PWM0A mit PD6 und PWM0B mit PD5.
Im Programm müsste man wohl "Motor1_pwm Alias Portb.1" und Motor2_pwm 
Alias Portb.2 entsprechend ändern, dann kann man diese beiden Portpins 
für andere Zwecke nutzen. Diese fixen 4 PWM Portpins dienen zur 
Geschwindigkeitsregelung.
Wenn man jetzt die Analog- Portpins, die benutzten PWM- Portpins und die 
Portpins für den ISP- Programmer "abzieht", dann bleiben folgenden 
Portpins für die 8 Inputs der Motortreiber übrig: PB0, PB1, PB2,  PD0, 
PD1, PD2, PD4 und PD7 - das sind ausreichend Digitalportpins.
Bei den 4 PWM- Portpins ist man ja an die Verdrahtung am shield 
gebunden. Ist man bei den 8 freien Portpins dann völlig frei in der 
Programmierung?
Es muss ja nur die paarweise Zuordnung für jeden Motor programtechnisch 
passen. Sehe ich das richtig?
Die Programmierlogik ergibt sich ja aus der Wahrheitstabelle (siehe 
Anhang)
Das Gefährt sieht übrigens so aus:
https://www.amazon.de/gp/product/B07F73738Z/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

von Spess53 (Gast)


Lesenswert?

Hi

>Das Gefährt sieht übrigens so aus:
>https://www.amazon.de/gp/product/B07F73738Z/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

Warum planst du dann einen fast 30 Jahre alten Treiber einzusetzen, der 
von deiner Versorgungsspannung etwa 2,6V schluckt? Nur weil er zufällig 
auf das Ardudingsda passt?

MfG Spess

von M. K. (sylaina)


Lesenswert?

Spess53 schrieb:
> Nur weil er zufällig
> auf das Ardudingsda passt?

Ich fürchte, genau das ist der Grund.

Man kann sich so ein Shield holen und damit etwas spielen, prinzipell 
funktionieren auch moderne Motortreiber so. Für ein konkretes Projekt 
würde ich aber heute auch keinen L293 und Co mehr einsetzen, eher ein 
DRV8825 und Co.

von Stephan (Gast)


Lesenswert?

Hallo Ekkehard N.

die Drehrichtung der Motoren wird durch den 74xxx595 bestimmt,
dessen Ausgänge, die mit den Motorrichtungs-Pins der L293D, verbunden 
sind,
müssen zuerst richtig gesetzt werden.

Tutorial für den 595:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

die Portbelegung des Shields für den Arduino ist hier dargestellt:
https://www.roboter-bausatz.de/media/image/62/03/eb/Multi-MotorShieldSchematic.jpg

Hier ein Beispiel, allerdings C-Code:
https://playground.arduino.cc/Main/AdafruitMotorShield/

Dass die Motoren mit dem Code für den TB6612FNG laufen ist "Rainer 
Zufall",
da die Ausgänge des 74xxx595 nach dem Einschalten einen zufälligen 
Zustand haben. Daher hat Motor 2 keinen Wackelkontakt.

Gruß Stephan

von Peter D. (peda)


Lesenswert?

L293D
- hoher Ruhestromverbrauch
- hoher Spannungsabfall
- kein Kurzschlußschutz

Nimm moderne MOSFET-Schalter.

von korax (Gast)


Lesenswert?

Spess53 schrieb:
> Warum planst du dann einen fast 30 Jahre alten Treiber einzusetzen, der
> von deiner Versorgungsspannung etwa 2,6V schluckt? Nur weil er zufällig
> auf das Ardudingsda passt?

Das beantwortet des TOs Frage..

von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Danke mal - für die vielen Antworten.
Warum ich die L293D Treiber nehme? JA stimmt schon, weil das shield auf 
den Arduino Uno passt, weil es auch zu den Motoren passt und weil alles 
relativ günstig ist. Außerdem wollte ich möglichst wenig zusätzlichen 
"Hardware"- Aufwand, weil ich schon an dem Gefährt genug zum 
Herumschrauben hatte. Ich habe mich ja vorher hier informiert:
https://rn-wissen.de/wiki/index.php/Getriebemotoren_Ansteuerung
JA und ich habe das mit der Verlustleistung gelesen, doch die kleinen 
DC- Motoren haben eine sehr geringe Stromaufnahme (wahrscheinlich 
Laststrom: ≤150mA) und falls es da Probleme geben sollte, dann klebe ich 
Kühlkörper auf die ICs, oder tausche die Treiber gegen L293B 
(pinkompatibel) aus - die stecken ja in einem Sockel.
Ich will ja keinen Rasenmähroboter bauen mit GPS- Navigation (so eine 
Bauanleitung gibt es in einem Bascom AVR- Buch), das wäre ja ein 
Overkill.
Wenn ich so einen Mäher wollte, dann würde ich mir so etwas kaufen - 
will ich aber nicht.
Mich wunderts, dass es für dieses "Spielzeug- Gefährt" keine 
veröffentlichten Programme gibt - zur L293D shield Motoransteuerung 
gibts wenig und dann fast nur was mit Arduino IDE.

von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Den Schaltplan des Treiber- shields habe ich mir heute etwas näher 
angesehen und das dürfte passen. Für dieses shield gibt es auch andere 
Hersteller.
Das Schieberegister dient wohl nur dazu, dass ein paar Portpins des 
Mikrocontrollers eingespart werden. Das ist meiner Meinung hier nicht 
nötig.
Deshalb überlege ich, ob ich das 74HC595 Schieberegister aus dem Sockel 
nehmen soll und auch den R2 (10 k Pull up nach 5 Volt) entferne. Dann 
kann ich von diesem IC- Sockel von den QA bis QH- Output- pins über 
Drahtbrücken Verbindungen zu den Portpins PB0, PB1, PB2, PD0, PD1, PD2, 
PD4 und PD7 anlöten. Damit kann man Programmcode einsparen. Diese QA bis 
QH- Output- pins am Sockel sind alle über 11 k Pull down Widerstände mit 
GND verbunden.

von Ekkehard N. (Firma: Privat) (machsnicht)


Angehängte Dateien:

Lesenswert?

So jetzt habe ich das 74HC595 aus dem Sockel entfernt. Ebenso habe ich 
den R2 (10k Pull up) ausgelötet und die Leiterbahnverbindung zu der +5V 
Versorgung unterbrochen.
Jetzt muss man noch die 8 Drahtbrücken richtig verbinden. Man kann die 
Drähte direkt in  den Sockel stecken, doch wäre hier ein 
Präzisionssockel empfehlenswert und die Drahtenden müssen vom 
Durchmesser passen. Das würde für einen Versuchsaufbau reichen. Besser 
ist es einen weiteren Sockel in den vorhandenen Sockel zu stecken, der 
an der Oberseite Kontakte zum Löten hat.
Solche Sockel gibt es z.b. bei fischerelektronik.de
Ich habe über 30 Jahre alte 16- polige Flachbandkabelstecker mit 
vergoldeten Kontakten von Siemens verwendet. Nun lötet man Drahtbrücken 
vom Pin12 nach Pin15, Pin14 nach Pin5, Pin13 nach Pin7 und Pin11 nach 
Pin6. Dann fehlen noch die 4 Drahtbrücken vom Sockel zu den Lötpunkten 
auf der Seite des shields, die von 0 bis 13 (Digitalports) nummeriert 
sind. Ich bezeichne diese Lötpunkte mit den entsprechenden Atmega328p 
Portpins: PB2 nach Sockelpin 2, PB1 nach Sockelpin 3, PD2 nach Sockelpin 
1 und PD1 nach Sockelpin 4. Zu den übrigen Verbindungen von den 
Digitalports zu den L293D- Inputs verweise ich an dieser Stelle auf das 
nachgereichte Testprogramm. Dort erkennt man die Zuordnungen.
Es bleiben lediglich die Ports PB5 und PD0 unbenutzt. Ich habe noch eine 
Foto des Aufbaus angehängt - das folgende Testprogramm dazu 
funktioniert.

von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Hier das Testprogramm:
1
'###################################################
2
'Motortreiber_Test1.BAS
3
'Testprogramm für das L293D Arduino shield
4
'Es werden 4 DC Motoren angesteuert
5
'Richtung: Vorwärts und Rückwärts
6
'###################################################
7
8
$regfile = "m328pdef.dat"
9
$crystal = 16000000                                         'Quarzfrequenz
10
11
Config Pinb.0 = Output
12
Config Pinb.1 = Output
13
Config Pinb.2 = Output
14
Config Pinb.3 = Output
15
Config Pinb.4 = Output
16
Config Pind.1 = Output
17
Config Pind.2 = Output
18
Config Pind.3 = Output
19
Config Pind.4 = Output
20
Config Pind.5 = Output
21
Config Pind.6 = Output
22
Config Pind.7 = Output
23
24
Motor1_pwm Alias Portb.3
25
Motor1_in1 Alias Portb.2
26
Motor1_in2 Alias Portb.1
27
Motor2_pwm Alias Portd.3
28
Motor2_in1 Alias Portd.2
29
Motor2_in2 Alias Portd.1
30
Motor3_pwm Alias Portd.5
31
Motor3_in1 Alias Portb.4
32
Motor3_in2 Alias Portd.4
33
Motor4_pwm Alias Portd.6
34
Motor4_in1 Alias Portb.0
35
Motor4_in2 Alias Portd.7
36
37
38
Wait 2
39
40
41
 Do
42
 Motor1_pwm = 1
43
 Motor2_pwm = 1
44
 Motor3_pwm = 1
45
 Motor4_pwm = 1
46
 Motor1_in1 = 0                                        'Drehrichtung Motor1
47
 Motor1_in2 = 1                                        'Drehrichtung Motor1
48
 Motor2_in1 = 1                                        'Drehrichtung Motor2
49
 Motor2_in2 = 0                                        'Drehrichtung Motor2
50
 Motor3_in1 = 1                                        'Drehrichtung Motor3
51
 Motor3_in2 = 0                                        'Drehrichtung Motor3
52
 Motor4_in1 = 1                                        'Drehrichtung Motor4
53
 Motor4_in2 = 0                                        'Drehrichtung Motor4
54
 Wait 10
55
56
 'Motor aus - bremsen
57
58
 Motor1_in1 = 0
59
 Motor1_in2 = 0
60
 Motor2_in1 = 0
61
 Motor2_in2 = 0
62
 Motor3_in1 = 0
63
 Motor3_in2 = 0
64
 Motor4_in1 = 0
65
 Motor4_in2 = 0
66
 Wait 2
67
68
 'Richtungswechsel
69
70
 Motor1_pwm = 1
71
 Motor2_pwm = 1
72
 Motor3_pwm = 1
73
 Motor4_pwm = 1
74
 Motor1_in1 = 1                                        'Drehrichtung Motor1
75
 Motor1_in2 = 0                                        'Drehrichtung Motor1
76
 Motor2_in1 = 0                                        'Drehrichtung Motor2
77
 Motor2_in2 = 1                                        'Drehrichtung Motor2
78
 Motor3_in1 = 0                                        'Drehrichtung Motor3
79
 Motor3_in2 = 1                                        'Drehrichtung Motor3
80
 Motor4_in1 = 0                                        'Drehrichtung Motor4
81
 Motor4_in2 = 1                                        'Drehrichtung Motor4
82
 Wait 10
83
84
'Motor aus - bremsen
85
86
 Motor1_in1 = 0
87
 Motor1_in2 = 0
88
 Motor2_in1 = 0
89
 Motor2_in2 = 0
90
 Motor3_in1 = 0
91
 Motor3_in2 = 0
92
 Motor4_in1 = 0
93
 Motor4_in2 = 0
94
 Wait 2
95
96
 'Richtungswechsel
97
98
 Loop
99
End

: Bearbeitet durch Admin
von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Falls sich der eine oder andere Motor in die falsche Richtung dreht, 
dann liegt das daran wie die Motor- Anschlussdrähte mit den 
Platinenklemmen verbunden sind - das lässt sich dort auch umpolen.
Einfacher ist es natürlich die Änderungen der Drehrichtung im Programm 
vorzunehmen.

von Ekkehard N. (Firma: Privat) (machsnicht)


Lesenswert?

Das Gefährt bewegt sich jetzt genau so wie gewünscht und die nächste 
Aufgabe wird sein es auf der Vorderseite und der Rückseite mit einem 
Ultraschallmodul auszustatten, damit "crashs" verhindert werden können.
Ein Modul HC-SR04 braucht schon 2 Portpins. Vielleicht lassen sich auch 
Analog Ports dafür nutzen.

Beitrag #6582426 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.