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.
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.
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.
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
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
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.
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
L293D - hoher Ruhestromverbrauch - hoher Spannungsabfall - kein Kurzschlußschutz Nimm moderne MOSFET-Schalter.
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..
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.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.