Figura 1: D1 ESP8266mod -12F en formato Uno
A través de mi colaboración en el blog y con los libros electrónicos, rápidamente en contacto con los nuevos productos de la gama. Especialmente cuando hay poca o ninguna información que se pueda encontrar en nuestra página web o en Internet, se despierta mi curiosidad. Este es el caso del D1, un ESP8266mod-12F en el diseño del Arduino Uno. Qué tienen en común las placas? Son compatibles con los pines? O hay diferencias que hay que tener en cuenta?
Un vistazo al etiquetado revela rápidamente que la asignación de pines es diferente y hay una advertencia de que los GPIOS sólo toleran 3,3 V, a diferencia del Arduino Uno. Aparte del etiquetado en la parte delantera, hay un etiquetado muy a propósito con los números GPIO en la parte posterior.
Mis primeros intentos son comprobar las etiquetas GPIo con la ayuda del programa Blink. Como ya había integrado los ESPs con el board manager en el Arduino IDE, busco el D1 bajo ESP8266. Primer obstáculo superado. Si aun no ha integrado los ESP en el Arduino IDE, consulte los libros electrónicos sobre ESP8266 y ESP32.
Figura 2: Gestor de placas del Arduino IDE
Todos las designaciones están confirmadas, y se presenta el notorio LED_BUILTIN en GPIO2 (se sabe que es 13 en la Uno, 0 o 1 en otros ESPs, o no se sabe). Además, hay otro LED azul en la fila con el LED ON, que está conectado a GPIO14/SCK. Como se puede ver claramente en la figura, sólo hay una entrada analógica A0.
Figura 3: Pinout y LEDs
Sensores e interfaces
A continuación, pruebo los programas de los sensores e interfaces y empiezo con el DHT22, un sensor de temperatura y humedad relativa. Además de la alimentación (3,3 V o 5 V), necesita un pin para la línea de datos. El pin de datos está conectado a VCC a través de una resistencia pull-up de 10kOhm. Por lo tanto, decido utilizar VCC = 3,3V. Tal y como se indica en el sketch de Arduino, defino el pin de datos con #define DHTPIN 2; pero cuidado: GPIO2 está situado de forma diferente que en la Uno, aquí en TX1/D9.
La visualización no es sólo en el monitor de serie, sino también un LCD1602 con adaptador I2C. Suministro la pantalla con 5V debido a que el contraste es mucho mejor. El puerto I2C está duplicado en la placa, ambos etiquetados como D14/SDA y D15/SCL. Estos pines están ubicados de forma diferente que en la Uno (A4 y A5).
Figura 4: Montaje experimental con DHT22 y LCD1602 con adaptador I2C
El sketch con el DHT22 funciona sin ninguna queja, así que sigo con el BME280 de Bosch, un sensor combinado de temperatura, humedad y presión atmosférica. También tengo uno de estos con una interfaz I2C y SPI. Primero pruebo el lado con la interfaz I2C paralela al LCD1602 con adaptador I2C.
Con el sketch de Internet, hubo dos dificultades al principio, pero se resolvieron rápidamente. Primero: el método .init() para inicializar el objeto bme no fue reconocido. Ya había experimentado esto antes y usé bme.begin () en su lugar con éxito. Y en segundo lugar, la biblioteca de programas de Adafruit tiene por defecto la dirección I2C 0x77. Debido a la dirección 0x76 de mi BME280, la línea en el código es por tanto bme.begin (0x76).
También me parece destacabla el truco de programación del sketch de demostración. La inicialización forma parte de la prueba del sensor:
if (! bme.begin (0x76)) {
Serial.println (F ( "No se pudo encontrar un sensor válido BME280, cableado cheque!"));
mientras que (1) de retardo (10);
}
Figura 5: Configuración de prueba con BME280 y LCD1602 con adaptador I2C
Tras las dificultades iniciales, esta prueba también transcurrió sin sin más problemas.
En el otro lado de mi BME280 (no de AZ-Delivery) hay un segundo conector en el lado opuesto con la interfaz SPI. Para esto, utilizo el programa de demostración bme280test de Lady Ada (Limor Fried). Sin embargo, hay que comentar otra línea y definir números de pin diferentes para el D1 que para el Uno:
Así que los siguientes cambios:
#include
#inClude
#define bme_sck 14 // Original 13
#define bme_miso 12
#define bme_mosi 13 // Original 11
#define bme_cs 0 // Original 10
// ADAFUIT_BME280 BME; // Se comenta la línea para I2C, en lugar de:
ADAFUIT_BME280 BME (BME_CS, BME_MOSI, BME_MISO, BME_SCK); //
// SPI SPI
El pin D10 / SS no es adecuado porque impide la carga del programa y no funciona. El pin D8 = GPIO0 es muy adecuado para CS, otros pines son posibles.
E Importante: la instanciación Adafruit_BME280 bme ser I2C debe ser comentada con//
y en su lugar se deben eliminar los caracteres de comentario // para el software SPI.
Figura 6: Configuración de la prueba con el BME280 en la interfaz SPI
Conclusión provisional
Los GPIOS que aparecen en el panel trasero, así como las interfaces I2C y SPI, funcionan sin problemas.
¿Y además?
¿Qué distingue al D1 del Uno? Los sketches mostrados hasta ahora fueron tomados de la colección de ejemplos del Arduino Uno con pequeños asjustes. Pero si se necesita más potencia de cálculo y memoria, el D1 es sin duda una recomendación. Me atraen especialmente los ESP por la interfaz WiFi incorporada, fácilmente reconocible por las antenas de la PCB.
Así que, sin más preámbulos, una extensión del programa para el experimento con el DHT22 con el fin de que los datos de medición estén disponibles también en la WLAN doméstica. Recuerde que aquí debe introducir su SSID y contraseña personales. Y esta parte también funciona sin quejas.
Ahora la única pregunta que queda es qué Shields Arduino Uno también se ajustan al D1:
Esto nos lleva de nuevo al tema de la compatibilidad de los pines. Ya habíamos visto que lamentablemente no es así. Por lo tanto, los únicos Shields que se tienen en cuenta son aquellos para los que estas diferencias no son significativas, por ejemplo, el Shield de prototipos.
No hay mucho que pueda salir mal. Los pines se enlazan uno a uno. Sólo hay que ignorar el etiquetado. Así que coloque el diagrama de pines del D1 al lado.
No probé el Ethernet Shield por la interfaz WiFi incorporada.
Con el Display Shield se deben hacer tantos cambios estructurales (véase el blog de Gerald Lechner) que no lo he probado y no puedo recomendarlo.
Pero con el Keypad Shield LCD1602 sólo es necesario un pequeño cambio estructural para utilizar los cinco botones: Soldar una resistencia de 3.9 kOhm entre la entrada A0 y GND (véase la Figura). Por cierto, el LCD funciona sin un adaptador I2C. Por lo tanto, se debe incluir una biblioteca de programas diferente. Los GPIOs utilizados se pueden ver en la figura:
|
Figura 7: Asignación de pines de la pantalla del teclado LCD con una resistencia adicional de 3,9 kOhm.
Todos los botones están conectados a la entrada analógica A0 a través de un divisor de voltaje (véase más abajo).
La evaluación de las claves requiere una atención especial.
El divisor de voltaje está diseñado de tal manera que con 5V aplicados, la diferencia entre los voltajes individuales es de aproximadamente 1V.
Por lo tanto, añada un divisor de voltaje con una resistencia de 3,9 kOhm entre A0 y GND (véase la Figura de arriba).
Sin embargo, si hemos instalado la resistencia de protección de 3900 Ohm para que en ningún caso se apliquen más de 3,3 V a A0, esta diferencia se reduce.
|
Sin resistencia en paralelo |
3900 Ohm |
Ningún botón |
5,00 V |
3,30 V |
SELECT |
3,60 |
2,60 |
LEFT |
2,50 |
1,97 |
DOWN |
1,60 |
1,40 |
UP |
0,70 |
0,66 |
RIGHT |
0,00 |
0,00 |
Estos valores de voltaje son valores aproximados que se convierten a valores entre 0 y 1023 por el ADC (= Convertidor Digital Analógico) de 10 bits. A continuación, en el programa consulta si el valor medido se encuentra entres dos números determinados, por ejemplo, y esto corresponde a una tecla determinada. Estos valores numéricos pueden tener que ser ajustados para el D1.
Figura 8: Divisor de voltaje para los cinco botones en la entrada A0
Conclusión
En definitiva, la D1 con el ESP8266MOD-12F es una placa exitosa que combina las ventajas del Arduino Uno en cuanto a funcionamiento y alimentación con las ventajas del ESP (más memoria, WiFi).
PD Existe una confusión en el momento de escribir si el nombre del nuevo D1 con ESP8266Mmod-12F es ahora D1 R1 o D1 R2. En el IDE, no importaba lo que se preseleccionara. Y no veo más pistas en el etiquetado. Lo que me importa es el microcontrolador utilizado, y se denomina ESP8266mod-12F.
Aquí se encuentra la descarga.
12 comentarios
Thomas Schmidt
Sehr guter Beitrag mit sehr vielen nützlichen Infos zu den Pinouts des D1 Boards. Die meisten Seiten behandeln leider nur den kleinen WEMOS D1 MINI. Top hat mir sehr geholfen!
Thomas
Hallo zusammen!
wie bekomme ich eigentlich den richtigen Treiber installiert?
Finde keinen passenden Eintrag beim Bordverwalter.
Gruß
Thomas
Raina
Good way of telling, and nice post to take information on the topic of my
presentation focus, which i am going to convey in college.
… perhaps someone will be interested in my article about signals for binary options
Miguel Torres
Un buen artículo del Blog, interesante las aportaciones para programar el módulo.
Rudolf Reiber
Entwarnung!
Nachdem ich viel Zeit in die Sache investiert habe (auch mit dem Oszilloskop die Signale verfolgt habe) konnte ich feststellen, dass einer der beiden DHTs einen »Halbdefekt« hat. Bei dem schadhaften Teil ist es so, dass er funktioniert (und auch einen Reset übersteht), wenn er nicht direkt an 3,3V des D1 angschlossen wird, sondern über einen digitalen IO-Pin mit 3,3V versorgt wird. Im Fehlerfall ist es so, dass der D1 zwar das Signal zum Start der Datenübertragung sendet, der DHT das aber offensichtlich nicht erkennt und sich tot stellt. Warum er sich aber je nach Spannungsversorgung unterschiedlich verhält (und z.B. auch beim Anstecken des USB-Kabels in jeden Fall korrekt startet), ist mir ein Rätsel.
Der zweite DHT funktioniert so wie er soll. Fazit: never trust a DHT!
Rudolf Reiber
Nachtrag zum Nachtrag ….
Also: wenn ich den den USB-Stecker des D1 abziehe und ihn dann erneut einstecke, dann läuft das Programm völlig korrekt, auch wenn der DHT an +3.3V direkt angeschlossen ist. Nur nach einem Neukompilieren oder einem RESET per Taster auf dem Board startet das Teil nicht korrekt. Es wird offensichtlich kein richtiger Tiefen-RESET durchgeführt.
Wenn ich aber den DHT über den PIN »D2« mit Spannung versorge, klappt auch der RESET.
Das verstehe wer will!
Rudolf Reiber
Nachtrag zum Nachtrag: Der Fehler besteht weiterhin! (Hatte vergessen, das +Sensor Kabel wieder auf den 3,3V Pin des D1 zu setzten.)
Rudolf Reiber
Nachtrag:
Das Problem wurde durch den Einbau eines Pegelwandlers zum LCD behoben.
Rudolf
Rudolf Reiber
Bei mir tritt ein seltsamer Fehler auf!
Bei der Inbetriebnahme der Schaltung meldet sie immer, dass der DHT22 nicht ausgelesen kann. (Das LCD-Display arbeitet korrekt). Wenn ich dann die +Leitung des DHT von den 3,3V abstecke und wieder anstecke, werden die Messwerte angezeigt. Nach jedem Einschalten bzw. Reset das gleiche Spiel: erst nach abklemmen und wieder anstecken der +Leitung des DHT tut es. Wenn ich dagegen die +Leitung des DHT z.B. an den Port D2 (GPIO16) anschließe, diesen als OUTPUT deklariere und im Programm dann auf HIGH setzte, arbeitet das Programm von Anfang an ohne Probleme, die Werte werden korrekt angezeigt.
Ausprobiert mit 2 verschiedenen D1 Boards und 2 verschiedenen DHT22 Sensoren.
Das gleiche an einem UNO arbeitet völlig problemlos.
Sehr seltsam!
Rudolf
Bernd Albrecht
Herr Klaas kritisiert völlig zu Recht, dass das LCD mit 5V betrieben wird und die I2C-Leitungen SCL und SDA nicht über einen Pegelwandler angeschlossen werden.
Ich habe den Versuchsaufbau noch einmal hergestellt und in der Tat fast 5V an den Pins gemessen. Aber auch nach einer längeren Mittagspause hat alles noch sicher funktioniert.
Dennoch: bitte die 3,3V Eingangsspannung an den Pins des D1-8266 beachten und ggf. Pegelwandler/Logic Level Converter https://www.az-delivery.de/en/products/logiklevel-wandler-3-3v-5v?pos=5&_sid=c5725e14b&ss=r verwenden.
Ulrich Klaas
Und das geht gefahrlos ohne Pegelwandler für den I2C zum Display das mit 5V betrieben wird ??
Ist das nicht Panikbetrieb ?
Joachim Meitzner
Dieser Bericht gefällt mir sehr, beschreibt er doch auch die Stolpersteine bei der Programmierung dieses Bords.