- 12V Akku mit 280 Ah bauen         
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
    40
    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.652
    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:	64
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:	45
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:	34
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 17:47 Uhr)

  3. #3
    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)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.652
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    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.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.652
    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.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.707
    .. 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

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    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.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.652
    Doch noch nicht Ende.

    Auf der Suche nach Schnittstellen tun sich noch Möglichkeiten auf, das nodeMCU direkt mit dem Arduino/Atmega zu verbinden. Das nodeMCU-Board kann mit 3.3V versorgt werden und die IOs können direkt verbunden werden:

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

Name:	nodeMCU an Arduino.jpg
Hits:	12
Größe:	43,7 KB
ID:	33706

    Verbunden über die SPI-Schnittstelle. Ich fand einen Beitrag dazu im Netz. Leider ist dann mein Rechner runtergefahren, weil ich das nodeMCU mit der Versorgung falsch angeschlossen habe und alles am USB angeschlossen war, deshalb keine Quelle an dieser Stelle. Dort kam auch die Frage nach dem 3.3V-Logikpegel, mit der Antwort, der 8266 sei gegenüber 5V an den Eingängen tolerant und würde dadurch nicht zerstört.
    Vielleicht ist es aber doch besser, dann den Atmega auch mit 3.3V zu betreiben.

    -----------------------------------------------------------------------------------

    Dazu noch mal ein Nachtrag von mir:

    Also das Datenblatt gibt es nicht her, es ist auch bekannt, dass dort nur 3.3V stehen, die man als Input an einem nodeMCU anlegen soll. Allerdings sollen Schutzdioden vorhanden sein, die nur nicht überlastet werden dürfen. Hierzu mal folgender Text eines Users:

    "It is true, and the data sheet even eludes to the fact, that the GPIO are 5V tolerant but here's the rub. The pins have protection clamping diodes on the pins that protect the circuitry from over voltage. The problem is that they usually can only take 20-25ma of current. If you want to use these pins with 5V it is best to include a series resistor. This technique has been used many times in some uncomfortably puckering situations. One ap-note I read from Atmel many years ago used an AVR input pin to sense the AC line directly to get the mains line frequency as a time base for a digital clock. They actually put a several meg ohm resistor on one of the I/O lines and plugged it into the wall!! On that processor The current was limited to 25ma max so as long as the series resistor limited the current to less than 25 ma all was fine.
    I use a similar technique on my ESP designs to interface the 5V 315mhz receivers to the ESP8266. I run everything through 10K ohm resistors and it all works happy."

    Quelle: http://www.letscontrolit.com/forum/viewtopic.php?t=1882

    Sieht so aus, dass eine Widerstandsbeschaltung am Eingang durchaus praktikabel ist. Das hatten wir hier ja schon woanders durch, wo dann auch Widerstandsnetzwerke als Vorschlag kamen. Sicherer wird es wohl sein, zumindest einen Vorwiderstand an den IOs des nodeMCU zwischen zu schalten, wenn einem das dann doch zu heiß ist, direkt 5V-Signale an die Eingänge zu legen.


    MfG
    Moppi





    PS: Danke @Searcher, der mich auf die SPI-Schnittstelle aufmerksam machte!
    Geändert von Moppi (14.10.2018 um 17:59 Uhr)

Ä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, 18: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, 14:01
  3. Antworten: 1
    Letzter Beitrag: 26.06.2017, 09: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, 22:21
  5. ESP8266/NodeMCU Kommunikationsprobleme
    Von thewulf00 im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 5
    Letzter Beitrag: 30.03.2016, 05:04

Berechtigungen

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

12V Akku bauen