- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: nodeMCU an Arduino

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Mit den ca. 730kOhm werden die 5V auf ca. 2.8V
    kannst du mir das mal erläutern?

    Angenommen du meinst R = U / I ... dann müsste bei U 5-2,8V / R 730k = 0,003mA Strom fließen

    Angenommen der TX Ausgang wäre 5V, der RX Eingang des Empfängers ist aber undefiniert hoch, denn es ist ein Eingang, da fließt (eigentlich) kein Strom! Bestenfalls fließt Strom über Schutzdioden ab aber die sollte man am besten garnicht erst dazu bringen überhaupt durchzuschalten.

    Was du meinst wäre vermutlich ein Spannungsteiler von 5V TX auf 3.3V RX, das wäre besser berechenbar.
    Für die andere Richtung von 3.3V TX auf 5V RX würde ich das Risiko eingehen und einfach direkt anschließen, denn die meisten 5V Eingänge erkennen ab 2.7V einen High Pegel, im schlimmsten Fall empfängst du halt nichts, dann müsste man über eine Lösung dafür nachdenken aber ich bin sicher dass es funktioniert.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ceos, ich habe es ausprobiert Am einem Ausgang des Arduino Uno verschiedene Widerstände angeschlossen und durchgemessen, nachdem der Ausgang auf High geschaltet war. Ich weiß, dass dort kaum ein Strom fließt, das ist auch gut so. Das nodeMCU benötigt an den Eingängen offenbar nur die Spannung, keine Leistung. Um über einen Widerstand die Spannung zu reduzieren, muss dieser sehr groß gewählt sein, in Folge fließt kaum mehr ein Strom. Deshalb, wenn man Stromfluss benötigt, setzt man auch Spannungsteiler ein. Also, hier ging es mir primär um die Frage, was man an das nodeMCU anschließen kann, wie man Pegel transportiert und diese möglichst einfach anpassen kann. Das nodeMCU "misst" an einem digitalen Eingang die Spannung, geht die auf LOW-Pegel, schaltet der Eingang auf LOW um und bleibt auch auf LOW, selbst wenn man an dem Pin nichts mehr anschließt oder die Verbindung trennt. Erkennt der Eingang ein HIGH (>2.4V), dann kippt er auf HIGH um und bleibt auf HIGH. Das bezieht sich auf die digitalen Ein-/Ausgänge (nodeMCU D1 + D2, GPIO4 + CPIO5, normale I/O Pins). Manche Eingänge haben auch einen Pull-Up oder Pull-Down-Widerstand auf dem Board verbaut. TX und RX ist wieder etwas anders: TxD (GPIO1): Serieller Ausgang des ESP über 470Ω mit dem USB-UART verbunden, RxD (GPIO3) Serieller Eingang des ESP über 470Ω mit dem USB-UART verbunden.

    Nun gibt es verschiedene Ausführungen, hier die, die ich verwende:

    Klicke auf die Grafik für eine größere Ansicht

Name:	nodeMCU.jpg
Hits:	9
Größe:	68,3 KB
ID:	33637
    Geändert von Moppi (15.09.2018 um 16:05 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Um über einen Widerstand die Spannung zu reduzieren, muss dieser sehr groß gewählt sein, in Folge fließt kaum mehr ein Strom
    worauf ich hinaus wollte, war dass ein Widerstand bei undefinierter Stromaufnahme (und das ist sogar von hergestelltem Chip zu Chip unterschiedlich wieviel Leckstrom dort herrscht) nichts bewirkt sondern eher unerwartete Störungen produziert, ein Spannungsteiler ist definitiv die bessere Lösung.

    Was du beschreibst ist ungefähr so als würdest du sagen, wenn ich mit einem Vorschlaghammer gegen eine Rohrleitung schlage, wird einem nach 730km nichts passieren wenn man sein Ohr direkt an die Leitung legt ... das kann stimmen, muss aber nciht, kommt drauf an wie die Leitung verlegt ist und wie gut sie dämpft ... aber es kann dir auch mal das Trommelfell zerreißen.

    Wenn ich jetzt einen definierten Strom über einen Spannungsteiler nach GND fließen lasse kann ich genau einstellen wie stark die Spannung abfällt egal ob der Chip einen Leckstrom vom 3uA, 100uA poder nur 0.5uA hat.

    Als Gesamtwiderstand wären 5V / 500uA = 10kOhm wohl Sinnvoll und das Verhältnis wäre dann 2/3, da der Leckstrom selten >50uA wird und somit nur maximal 10% Einfluss auf den Gesamtstrom und die Genauigkeit deines Spannungsteilers hat.

    also 5V TX -> 4kOhm -> 3.3V RX + 6kOhm -> GND
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hier erst meine 1-Wire-Lösung (mit 220k- und 470kOhm-Widerstand). Damit kann der Arduino Daten zum nodeMCU schicken:

    Ausgabe vom nodeMCU serial port:
    Code:
    Hello, world: 275!
    Hello, world: 276!
    Hello, world: 277!
    Hello, world: 278!
    Hello, world: 279!
    Hello, world: 280!
    Hello, world: 281!
    Hello, world: 282!
    Hello, world: 283!
    Hello, world: 284!
    meine Beschaltung:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Schaltung1.jpg
Hits:	63
Größe:	70,3 KB
ID:	33641

    Code fürs nodeMCU:
    Code:
     #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(4, 5); // RX, TX
    
    void setup() {
      
      // Open serial communications and wait for port to open:
      Serial.begin(115200);
      while (!Serial) {}
      
      // set the data rate for the SoftwareSerial port
      mySerial.begin(4800);
    }
    
    void loop() { // run over and over
      if (mySerial.available()) {
        Serial.write(mySerial.read());
      }
    }
    und Code für Arduino:
    Code:
    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(3, 2); // RX, TX
      int a;
    
    void setup() {
      // set the data rate for the SoftwareSerial port
      mySerial.begin(4800);
    }
    
    void loop() { // run over and over
      delay(3000);
      a++;
      mySerial.print("Hello, world: ");
      mySerial.print(a);
      mySerial.println("!");
    }

    Nun muss es auch vom nodeMCU zum Arduino funktionieren, Daten zu übertragen

    Deshalb die Software auf den Geräten vertauscht und eine zweite Leitung, vom nodeMCU zum Arduino, hinzugefügt:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Schaltung.jpg
Hits:	44
Größe:	78,8 KB
ID:	33642

    Ausgabe vom Arduino serial port:
    Code:
    Hello, world: 77!
    Hello, world: 78!
    Hello, world: 79!
    Code für nodeMCU:
    Code:
    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(4, 5); // RX, TX for nodeMCU
    //SoftwareSerial mySerial(3, 2); // RX, TX for Arduino
    
      int a;
    
    void setup() {
      // set the data rate for the SoftwareSerial port
      mySerial.begin(4800);
    }
    
    void loop() { // run over and over
      delay(3000);
      a++;
      mySerial.print("Hello, world: ");
      mySerial.print(a);
      mySerial.println("!");
    }
    Code für Arduino:
    Code:
    #include <SoftwareSerial.h>
    
    //SoftwareSerial mySerial(4, 5); // RX, TX for nodeMCU
    SoftwareSerial mySerial(3, 2); // RX, TX for Arduino
    
    void setup() {
      
      // Open serial communications and wait for port to open:
      Serial.begin(115200);
      while (!Serial) {}
      
      // set the data rate for the SoftwareSerial port
      mySerial.begin(4800);
    }
    
    void loop() { // run over and over
      if (mySerial.available()) {
        Serial.write(mySerial.read());
      }
    }
    Funktioniert die Kommunikation nach den vorherigen Voraussetzungen auch per RX + TX - Pins

    Das musste ich auch noch wissen. Beide Verbindungskabel habe ich umgesteckt, so dass jetzt RX und TX vom Arduino genutzt werden können:

    Klicke auf die Grafik für eine größere Ansicht

Name:	Schaltung2.JPG
Hits:	33
Größe:	56,2 KB
ID:	33643

    Die Pins am nodeMCU bleiben dieselben, an der Beschaltung hat sich dort nichts verändert.

    Damit ich die Verbindung hin und zurück testen kann, muss der Arduino nun Daten auf dem seriellen Port lesen und wieder ausgeben. Das nodeMCU schickt die Daten und wartet, bis sie zurückkommen.

    geänderter Code für Arduino:
    Code:
    //#include <SoftwareSerial.h>
    
    //SoftwareSerial mySerial(4, 5); // RX, TX for nodeMCU
    //SoftwareSerial mySerial(3, 2); // RX, TX for Arduino
    
    void setup() {
      // set the data rate for the SoftwareSerial port
      //mySerial.begin(4800);
    
      //der Arduino arbeitet nur noch über die norm. serielle Schnittstelle
      //die wir hier zur Kommunikation öffnen
      Serial.begin(4800);
      //und dann warten wir, bis das geklappt hat
      while (!Serial) {}
    }
    
    void loop() { // run over and over
      //der Arduino soll Daten vom nodeMCU empfangen und zurück schicken
      //deshalb schauen wir, ob was angekommen ist
      //und wenn, dann lesen wir das und schicken es zurück
      while(Serial.available()){
        Serial.write(Serial.read());
      }
    }
    geänderter Code für nodeMCU:
    Code:
     #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(4, 5); // RX, TX for nodeMCU
    //SoftwareSerial mySerial(3, 2); // RX, TX for Arduino
    
      int a;
    
    void setup() {
      
      // Open serial communications and wait for port to open:
      Serial.begin(115200);
      while (!Serial) {}
      Serial.println();
      
      // set the data rate for the SoftwareSerial port
      mySerial.begin(4800);
    }
    
    void loop() { // run over and over
      // Kontrollzähler
      a++;
      //nodeMCU verwendet hier andere Pins statt der echten RX, TX
      //weil die ser. Schnittstelle zur Ausgabe genutzt wird
      //deshalb Senden über Software Serial Port zum Arduino
      mySerial.print("Hello, world: ");
      mySerial.print(a);
      mySerial.println("!");
      
      //Arduino wird das empfangen und zurückschicken
      //deshalb warten wir mal kurz, bis was zurück kommt
      while(mySerial.available()==0){
        delay(1000);
        Serial.print(".");    //Zeigen, dass gewartet wird 
        mySerial.print(".");  //falls Verbindung getrennt wird, um aus der Schleife auszubrechen
      }
      
      //Schauen, ob auf dem Software Serial Port etwas angekommen ist
      //wenn ja, dann wird das eingelesen und zur Kontrolle ausgegeben
      //auf dem norm. seriellen Port
      while(mySerial.available()){ //solange Zeichen verfügbar
        char c=mySerial.read();     //ein Zeichen lesen
        Serial.print(c);       //Zeichen ausgeben
      }
    
    }
    Und nach etwas Fummelei funktioniert auch das, die Ausgabe vom nodeMCU serial port:
    Code:
    Hello, world: 16030!
    Hello, world: 16031!
    Hello, world: 16032!
    Hello, world: 16033!
    Hello, world: 16034!
    Hello, world: 16035!
    Hello, world: 16036!
    Hello, world: 16037!
    Hello, world: 16038!
    Hello, world: 16.....................
    Geändert von Moppi (16.09.2018 um 18:47 Uhr)

  5. #5
    HaWe
    Gast
    also geht es jetzt in beien Richtungen? auch gleichzeitig (voll-duplex) oder per Handshake, abwechselnd?

    (Ist aber sicher kein 1-Wire, das ist ein eigenes Protokoll, sondern Arduino-Serial = UART, eben einfache oder doppelte Richtung)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Zitat Zitat von Ceos Beitrag anzeigen

    also 5V TX -> 4kOhm -> 3.3V RX + 6kOhm -> GND
    Der Spannungsteiler funktioniert ebenfalls. Wie sieht es damit aus, wenn Eingänge am nodeMCU schon mit einem Pull-Up- oder Pull-Down-Widerstand versehen sind? Diese Widerstände müssten sicherlich eingerechnet werden.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ja klar, wenn da irgendwelche Beschaltung mit am Pin ist muss man das mit einrechnen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Zum Abschluss, zusammenfassend:

    1. nodeMCU: Ausgang Low = 0V, Ausgang High = 3.3V
    2. Arduno Uno: Ausgang Low = 0V, Ausgang High = 5V

    3. Möglichkeiten Pegelanpassung von einem Arduino-Ausgang zum nodeMCU-Eingang:
    einfacher Widerstand ca. 680kOhm bis 800kOhm, Spannungsteiler (vom Ausgang über ca. 4kOhm (4.7k) zum Eingang, von dort mit ca. 6kOhm (6.2k) gegen Ground), richtiger Pegelwandler.

    Die Pegelanpassung vom nodeMCU zum Arduino ist nicht notwendig. Bei der Pegelanpassung vom Arduino zum nodeMCU, über Wiederstände, kann es zur Signalverfälschung kommen. Insbesondere Spannungsteiler geben Rechtecksignale nicht sauber weiter, das Signal gleicht dann eher einem abgerundeten Sägezahn. Das nodeMCU ist hier aber unempfindlich an den Eingängen, diese zeigen nach außen das Verhalten einer bistabilen Kippstufe, die den Zustand bei Überschreiten der Low- oder High-Spannungsgrenze ändert. Insofern nodeMCU-Pins bereits mit Widerständen beschaltet sind (in techn. Dokumentation nachschauen), sollte man das bei der Berechnung eines äußeren Spannungsteilers berücksichtigen. Die Möglichkeit, echte elektronische Pegelwandler einzusetzen, ist sicher die Sauberste, aber bei Verwendung von Fertigmodulen für Arduino etc. auch die kostspieligste Variante. Pegelwandler können dann sinnvoll sein, wenn man Logiksignale absolut sauber weitergeben muss, wie schnellere Taktsignale.

    4. Serielle Kommunikation: Verbindung der Boards über normale Digital-I/O-Pins, dann mit SoftwareSerial.h.
    5. Serielle Kommunikation: Verbindung der Boards über RX/TX-Pins, dann ohne SoftwareSerial.h unter Nutzung der normalen seriellen Schnittstelle, Pegelanpassung wie oben beschrieben möglich.

    Die serielle Kommunikation ist mit einer Verbindung sowohl vom Arduino zum nodeMCU, als auch vom nodeMCU zum Arduino möglich. Oder beides, falls notwendig. Wird nur die Verbindung in eine Richtung hergestellt, kann auch nur in diese Richtung gesendet werden.

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    .. Eingänge am nodeMCU schon mit einem Pull-Up- oder Pull-Down-Widerstand versehen sind? Diese Widerstände müssten sicherlich eingerechnet werden.
    Ergänzung/Anregung zu Ceos´ Beitrag:
    Die Frage hatte ich mir auch mal gestellt und Klärung bringt das Datenblatt. ABER beim - beispielsweise - mega328p stehen im Datenblatt unter [Common DC Characteristics .. I/O Pin Pull-up Resistor] Werte von 20 kΩ Min. und 50 kΩ Max. Ähhhhh - und was nehme ich dann? (Anm.: ich bin manchmal recht pingelig, auch neugierig)

    Ich hatte bei meinem Controller das DMM genommen und einen Pin als Eingang mit PullUp konfiguriert. Ergebnis (grad nochmal am nano-Clone gemessen) a) Spannung ist 5,01 V, Kurzschlussstrom ist 14 mA. *gg* Not bad - die 35,8 k sind ja fast haarscharf die Mitte! Bei DEM GEMESSENEN Pin!
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    die internen Pull-Ups sind absolute Schätzeisen und nur da um dir für I2C oder andere LowActive High Impedance Signale den externen PullUp zu schenken

    Da UART aber PushPull macht, kannst du darauf gut verzichten.

    Das Erlebnis mit den Sägezähnen sollte bei Push Pull ebenfalls extrem minimal ins Gewischt fallen (Am Oszi mag man eine minimale Verscheleifung sehen aber sonst sollte das keinen Einfluss haben)

    Was Pegelwandler angeht, ich habe hier einen ganz simplen Chip, einen 74HCT132E, das ist ein 4 NAND-Gate mit Schmitt Trigger Eingängen. So kann man zumindest sauber und in deutlich höherer Frequenz im Vergleich zu einer Transistorstufe von 3V auf 5V umsetzen ohne Verschleifung (Ich habe es mit einem Oszilloskop vermessen und treibe die Daten-/Clockleitung meiner 5V APA102 @4MHz von einem ATXMega bei 3.3V aus an, dank der 2 Extra Gates sogar mit Enable und ohne Invertierung)

    Chips aus der 74er Reihe mit Schmitttriggern gibt es viele und vielleicht auch Varianten mit 2 Richtungen bzw. Spannungsstufen, die kosten i.d.R. auch nicht viel und gibt es meist sogar noch im Breadboard freundlichem PDIP Gehäuse
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. html-Code für nodeMCU mit Arduino IDE + Wifi libs
    Von HaWe im Forum Arduino -Plattform
    Antworten: 7
    Letzter Beitrag: 14.08.2018, 19:30
  2. nodeMCU zu nodeMCU: keine Kommunikations-Verbindung mehr nach wenigen Minuten
    Von HaWe im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 0
    Letzter Beitrag: 02.10.2017, 15:01
  3. Antworten: 1
    Letzter Beitrag: 26.06.2017, 10:06
  4. NodeMCU an Arduino-IDE, Fehler beim Kompilieren
    Von gkd im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 5
    Letzter Beitrag: 28.05.2017, 23:21
  5. ESP8266/NodeMCU Kommunikationsprobleme
    Von thewulf00 im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 5
    Letzter Beitrag: 30.03.2016, 06:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests