Forum: Mikrocontroller und Digitale Elektronik NodeMCU Motor Shield - Drehrichtung lässt sich nicht ändern


von Philipp K. (phil)


Lesenswert?

Hallo,

ich versuche aktuell ein NodeMCU Motor Shield mit einem ESP32 und zwei 
Motoren anzusteuern. Das Motor Shield besitzt einen L293D. Mein Problem 
ist die Drehrichtung der Motoren.
Das Vorwärtsfahren mit folgendem Code funktioniert einwandfrei:
1
void forward(void)
2
{
3
    analogWrite(5, 1023);
4
    analogWrite(4, 1023);
5
    digitalWrite(D3, HIGH);
6
    digitalWrite(D4, HIGH);
7
}

Wenn mich nicht alles täuscht und ich die Zuordnung der Pins richtig 
verstanden habe, müsste ich doch mit folgendem Code rückwärts fahren 
können:
1
void backward(void)
2
{
3
    analogWrite(5, 1023);
4
    analogWrite(4, 1023);
5
    digitalWrite(D3, LOW);
6
    digitalWrite(D4, LOW); 
7
}
So passiert allerdings gar nichts mehr und keiner der beiden Motoren 
bewegt sich. Wenn ich hingegen folgenden Code probiere, dreht immerhin 
Motor A in die richtige Richtung, also rückwärts. Motor B dreht sich 
vorwärts:
1
void backward(void)
2
{
3
    analogWrite(5, 1023);
4
    analogWrite(4, 1023);
5
    digitalWrite(D3, LOW);
6
    digitalWrite(D4, HIGH); 
7
}

Was genau mache ich hier falsch?

Viele Grüße
Philipp

von Stefan F. (Gast)


Lesenswert?

Warum benutzt du Schreibweisen gemischt?
4 und  5 versus  D3 (=0) und D4 (=2)?

Wo ist denn der Schaltplan von diesem Shield?

von Philipp K. (phil)


Lesenswert?

Stefan U. schrieb:
> Warum benutzt du Schreibweisen gemischt?
> 4 und  5 versus  D3 (=0) und D4 (=2)?

Merkwürdigerweise kommt er damit nicht klar. Wenn ich D3 und D4 durch 0 
und 2 ersetze, passiert ebenfalls nichts mehr.

Einen richtigen Schaltplan habe ich nicht gefunden, aber hier steht, auf 
welchen GPIOs die Eingänge vom Motor Shield liegen: 
https://hackaday.io/project/8856-incubator-controller/log/29291-node-mcu-motor-shield

von Stefan F. (Gast)


Lesenswert?

Kein Schaltplan, das ist doch Käse!

Wenn diese Doku stimmt (was wir mangels Schaltplan nicht prüfen können), 
müsste es so funktionieren. Hast du eventuell vergessen, D3 und D4 als 
Ausgang zu konfigurieren?

Mach doch zur Kontrolle einfach LED's an diese Pins dran.

von Philipp K. (phil)


Lesenswert?

Eigentlich habe ich das gemacht. Nur der Vollständigkeit halber mal der 
komplette Code. Sieht nicht schön aus und ist munter aus verschiedenen 
Code-Beispielen zusammenkopiert.
Aber die Ausgänge sind doch korrekt konfiguriert, oder?
1
#include <ESP8266WiFi.h>
2
#include <ESP8266WebServer.h>
3
// configure server
4
ESP8266WebServer server(80);
5
const char *form = "<center><form action='/'>"
6
"<button name='dir' type='submit' value='4'>Forward</button><br>"
7
"<button name='dir' type='submit' value='1'>Left</button> "
8
"<button name='dir' type='submit' value='2'>Right</button><br>"
9
"<button name='dir' type='submit' value='3'>Backward</button><p>"
10
"<button name='dir' type='submit' value='5'>Stop</button>"
11
"</form></center>";
12
void stop(void)
13
{
14
    analogWrite(5, 0);
15
    analogWrite(4, 0);
16
}
17
// Macht: Links
18
void left(void)
19
{
20
    analogWrite(5, 1023);
21
    digitalWrite(0, HIGH);
22
}
23
void backward(void)
24
{
25
    analogWrite(5, 1023);
26
    analogWrite(4, 1023);
27
    digitalWrite(D3, LOW);
28
    digitalWrite(D4, LOW); 
29
}
30
// Forward klappt
31
void forward(void)
32
{
33
    analogWrite(5, 1023);
34
    analogWrite(4, 1023);
35
    digitalWrite(D3, HIGH);
36
    digitalWrite(D4, HIGH);
37
}
38
void right(void)
39
{
40
    analogWrite(5, 1023);
41
    analogWrite(4, 1023);
42
    digitalWrite(0, HIGH);
43
    digitalWrite(2, LOW);
44
}
45
void handle_form()
46
{
47
    // only move if we submitted the form
48
    if (server.arg("dir"))
49
    {
50
        // get the value of request argument "dir"
51
        int direction = server.arg("dir").toInt();
52
        // chose direction
53
        switch (direction)
54
        {
55
            case 1:
56
                left();
57
                break;
58
            case 2:
59
                right();
60
                break;
61
            case 3:
62
                backward();
63
                break;
64
            case 4:
65
                forward();
66
                break;
67
            case 5:
68
                stop();
69
                break;
70
        }
71
        // move for 300ms, gives chip time to update wifi also
72
        delay(300);
73
    }
74
    
75
    // in all cases send the response
76
    server.send(200, "text/html", form);
77
}
78
void setup()
79
{
80
    pinMode(5, OUTPUT); // A D1 PWM control 0 - 1023
81
    pinMode(4, OUTPUT); // B D2 PWM control 0 - 1023
82
    pinMode(D3, OUTPUT); // A D3 Direction 0/1
83
    pinMode(D4, OUTPUT); // B D4 Direction 0/1
84
85
    // connect to wifi network
86
    WiFi.begin("FRITZ!Box 6490 Cable-2", "XXX");
87
    // static ip, gateway, netmask
88
    WiFi.config(IPAddress(192,168,8,51), IPAddress(192,168,8,1), IPAddress(255,255,255,0));
89
    // connect
90
    while (WiFi.status() != WL_CONNECTED)
91
    {
92
        delay(200);
93
    }
94
  
95
    // set up the callback for http server
96
    server.on("/", handle_form);
97
    // start the webserver
98
    server.begin();
99
    pinMode(5, OUTPUT); // 1,2EN aka D1 pwm left
100
    pinMode(4, OUTPUT); // 3,4EN aka D2 pwm right
101
    pinMode(0, OUTPUT); // 1A,2A aka D3
102
    pinMode(2, OUTPUT); // 3A,4A aka D4
103
}
104
void loop()
105
{
106
    // check for client connections
107
    server.handleClient();
108
}

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Mach mal LED's an die Pins. Dann siehst du, welches der beiden Boards 
nicht tut, was es soll.

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.