Liste der Anhänge anzeigen (Anzahl: 1)
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:
Anhang 33637
Liste der Anhänge anzeigen (Anzahl: 3)
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:
Anhang 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:
Anhang 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:
Anhang 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.....................
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Anhang 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!