ESP8266 - GPIO Erweiterungs Board mit MCP23017 und ESP-01

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hier mal eine Lösung für das Problem mit den wenigen bzw. je nach Modul überhaupt nicht vorhandenen frei beschaltbaren GPIOs, vielleicht kann es ja jemand brauchen. :)

    Ich wollte das Board zwar generell eher einfach halten, ein paar Dinge hab ich dann aber doch integrieren müssen. :D
    Etwas das ich bspw. unbedingt haben wollte ist die Möglichkeit den MCP23017 sowohl mit 3.3V als auch mit 5V betreiben zu können. Allerdings wollt ich aus Platzgründen nicht zusätzlich noch einen 5V Regler verbauen sondern hab das so gemacht dass man den MCP einfach per Jumper entweder mit den 3.3V aus dem LM1117 oder der Eingangsspannung direkt versorgen kann.
    Man braucht also wenn der MCP mit 5v betreiben werden soll auch eine Eingangspannung von 5V. Ich verwende da ein einfaches USB Netzteil (Handy Ladegerät).
    Ist die Eingangsppannung höher als 5V muss der MCP daher auf jeden Fall mit 3.3V betrieben werden.

    Die maximale des Reglers (LM1117) liegt zwar theoretisch bei 15V (ich hatte fälschlicherweise im Kopf es wären 16v), praktisch wird sich das allerdings wegen der dann enstehenden Hitze nicht ausgehen. (Muss aber noch schauen wie hoch man sicher gehen kann). Ich würd daher sagen am besten extern runter auf ~5V reglen und dann erst auf das Board gehen.

    Da die 3.3V Pegel des ESP theoretisch nur bis zu einer MCP Versorgungsspannung von ~4.5V reichen hab ich um auch bei 5V auf der sicheren Seite zu sein eine Pegelwandlung integriert. Eine einfache aus 2 Mosfets und 4 Widerständen bestehende Lösung hab ich hier entdeckt: http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter


    Aktuelle Version
    Auf den Bildern sieht man aktuell die Version 0.2. Angehängt ist aber auch schon die Version 0.3. Allerdings hab ich die bisher noch nicht getestet. Da es da aber nur ein paar kleine Änderungen gab hab ich da überhaupt keine Bedenken und würde auch empfehlen dass ihr die fertigen lässt, hauptsächlich weil die Bohrlöcher für das ESP Modul bei der 0.2er gerade etwas zu klein sind.
    Falls ihr euch fragt was mir der ersten Version passiert ist:
    Da ich den Pegelwandler bevor ich die Platinen gemacht hab nicht ausgiebig getestet hab und zumindest ein "frickelloses" Board haben wollte, hab ich mir einfach gleich 2 Versionen(bzw. Varianten) gemacht und bei der ersten die Pegelwandlung weggelassen. Da der Pegelwandler aber funktioniert wie er soll hab ich die Variante ohne Pegelwandler nicht auch noch angehängt.

    Leider ist sich das mit dem frickellos dann doch nicht ganz ausgegangen da mir durch ein Missgeschick der Plus Pin(VBUS) der Micro USB Buchse abgerissen ist. Konnte das aber einfach mit einer kleinen Drahtbrücke richten, wie man auf dem Bild sehen kann.

    Änderungen Version 0.3
    * Beim zusammenbauen ist mir aufgefallen dass der MCP doch recht nahe beim ESP-01 sitzt, den Abstand hab ich etwas größter gemacht.
    * Der Footprint vom Tantal Kondensator war etwas zu klein
    * Die Bohrlöcher für das ESP Modul waren auch etwas zu klein
    * Falsche maximale Einganspannung korrigiert
    * Bestückungsdruck und ein paar Routen optimiert
    * C5 durch einfachen Pin Header ersetzt

    Ideen für die nächste Version
    * Pegelwandler einfacher überbrückbar machen (Ist aber auch so schon recht einfach möglich)
    * Jemand Ideen/Wünsche? :)


    Bauteilliste:
    * ESP-01
    * MCP23017 + Sockel(28pin) [DIP]

    * LM1117-3.3(AMS1117-3.3) [SOT-223]
    * 10µF Kermik Kondensator am Eingang[0805]
    * 100µF Tantal Kondensator am Ausgang [1210 / Case B]

    * 100nF Kermik Kondensator jeweils am MCP und ESP-01 [THT]

    * Micro USB Buchse (so eine) [SMD]
    * Terminal Block (3.5mm) [THT]
    * 2x Taster "Tactile" (GPIO0, Reset) [THT]
    * SMD LED (1206) + passender Vorwiderstand für 3.3V (0805)
    * 2x 10K Widerstand [THT]
    * 4x 4K7 Widerstand (0805)
    * 2x BSS138 (Oder bspw. 2n7000) (SOT-3)

    * Zusätzlicher I2C Header um bspw. noch ein weiteres MCP23017 Board ranzuhängen

    * Ein paar 2.54mm Stift- und Buchsenleisten

    Falls mir noch was wichtiges einfällt werd ich es ergänzen.
    Sollte was unklar sein einfach Fragen. :thumbs1:


    Bilder

    Unbestückt:


    Bestückt:

    Ein kleines LED Addon das ich mir zum testen gemacht hab

    Version 0.3: (ungetestet)


    (OT PS: Der erwähnte Temp Logger kommt als nächstes. :) )

  • ESP8266 - GPIO Erweiterungs Board mit MCP23017 und ESP-01? Schau mal ob du hier fündig wirst!

  • Ja hey joh,
    mein Güte ... da hast Du Dir ja mal wieder was einfallen lassen :thumbs1:
    Aber wie ist das dann mit z.B. verschiedenen Sensoren? Also einen DS18B20, einen DHT22, meinetwegen noch ein PIR dazu ... würde das funktionieren?
    Kann ich mir, ehrlich gesagt, nicht so recht vorstellen ... rein theoretisch müsste dann ja auch I2C und/oder SPI über den Portexpander möglich sein, oder?
    Du hattest da zwar -> hier <- schon mal was dazu geschrieben ... aber so recht verstanden habe ich das nicht. Oder war das in einem anderen Zusammenhang?

    cu,
    -ds-

  • Hey, ds. Danke. :)

    Also an Sensoren hatte ich eigentlich weniger gedacht, eher LEDs, Relais, Taster, LCD oder so. Evenutell langsamere Sensoren wie beispielsweise diese Erdfeuchte Messfühler mit digitalem Ausgang o.ä. :)

    Das erwähnte Sensor Setup hat damit nichts zu tun. Dafür gibt es ein eigenes Board. Hab das aber noch nicht fertig aufgebaut und getestet. Das kommt aber als (über)nächstes.

    DON'T PANIC!

  • Ah ja ... siehste ;) ... dacht' ich's mir doch ...

    Das Problem dürfte auch nicht unbedingt nur die Geschwindigkeit sein. Ich denk' da gibts eher Trouble mit dem GPIO an sich. Du fährst ja z.B. 1Wire Protokoll für einen DS18B20, dann schaltest Du um, und plötzlich soll der gleiche physikalische Pin für das SCK Signal zuständig sein und beim nächsten Umschalten dient der dann vielleicht noch als Rx der rs232 ...

    Ich hatte mir letztes Jahr mal einen Signal-Muxer ( mit einem 74HC4067 ) zugelegt ( da hatte ich -> in diesem Beitrag <- was dazu geschrieben ) und wollte den noch unbedingt ausprobieren. Hat leider bis heute nicht geklappt =(

    bye,
    -ds-

  • Hey klasse Sache das Teil.
    Bin selber grade am basteln mit dem ESP und hab schon über den MCP nachgedacht.
    Aber was hast du denn da mit dem Resetpin am ESP verkabelt? Das interessiert mich!

    Edit:
    Wo lässt du deine Platinen fertigen? Das sieht immer so megaschnieke aus mit ner richtigen Platine statt den Prototypingboards!

    Einmal editiert, zuletzt von DerMega (7. März 2016 um 08:56)

  • Hi GMaN, Danke.

    Ich verwende für die Ansteuerung im Moment dieses Modul:
    https://github.com/tuxBurner/esp8…cripts/mcp23017

    Um das Board zu testen hab ich mir das hier programmiert:
    (Wobei ich mir die Zeilen(die ersten 12 in der on:receive Funktion) mit denen die GET Paramter in Lua Arrays "verwandelt" werden hier abgeschaut hab: http://randomnerdtutorials.com/esp8266-web-server/
    (ist imho das genialste (und komplizierteste) an dem code)

    &quot;mcp_api_server.lua&quot;

    Damit kann ich jetzt bspw. so:

    Code
    curl -s "http://192.168.1.111/?pin=9&state=1"


    GPB0 auf HIGH,
    und so:

    Code
    curl -s "http://192.168.1.111/?pin=9&state=0"


    auf LOW setzen.

    Mehr wie einzelne Pins zu setzen ist mit dem Skript noch nicht möglich. Mehrere Pins gleichzeitig setzen und Pins lesen kommt noch.
    Dafür fangt das Skript alle falschen Eingaben ab wodurch es nicht möglich ist den ESP durch einen falschen Parameter zum absturz zu bringen. :)
    Bei einer fehlbenutzung wird auch eine Fehlermeldung und kurze (HTML) Hilfe ausgegeben.

    Hier noch die init.lua dazu:

    &quot;init.lua&quot;

    Sieht bestimmt aufwändiger aus als sie ist.
    In den ersten paar Zeilen wird geprüft ob RX beim start mit GND verbunden ist. Fallls ja macht der ESP einen eigenen AccessPoint auf, falls nicht verbindet er sich mit dem hinterlegten. Anschließend wird in beiden Fällen der "API (Web)Server" (das Skript oben) gestartet.



    Hey Mega, thx.
    Mir sind einfach nur die unmodifizierten ESP-01 Module ausgegangen. :lol: Die Verbindung ist für den normalen Betrieb nicht nötig.
    Der ESP könnte sich dadurch aber wenn er in den DeepSleep versetzt wird um Strom zu sparen wieder selber "aufwecken"(resetten).

    Die Platine(n) hab ich hier fertigen lassen: http://de.vrint-pcb.com/show/7-pcb's
    Aber nur weil die so ein nettes Angebot für Neukunden hatten(und immer noch haben).
    War aber meine erste eigene Platinenbestellung. Sonst macht das immer Neueinsteiger (:danke_ATDE:) für mich. :D
    Ich weiß jetzt aber gar nicht wo er die immer machen lässt.

    DON'T PANIC!

  • Moinsen raspberti,

    Ich bin jetzt nur per Zufall auf diesen Artikel gestoßen.
    Dabei denke ich, wenn ich auf des Layout sehe, und auf das Datum des Ursprungs, sowie in das Profil geschaut hast, wirst du keine Antwort mehr erhalten.
    Ich habe mal versucht diese ESP-01 GPIO Extender v0.3.brd Datei von Eagle bei meinem PCB Anbieter einzuladen. Ja das geht ;)
    Nachdem ich mir diese Schaltung auch ohne wirklichen Schaltplan ( veraltete Eagle Version für mich nicht mehr lesbar ist ) genauer angesehen - habe ich einen gewaltigen Bug entdeckt.
    Wenn man den MCP23017 vor einer Überspannung im Direkt gespeisten Modus schützen will, hätte man auch ein Z-Diode mit vorsehen können. Diese ist nicht zu finden :!: Dann könnte man den Platz des LM117 besser für zwei MCP1802-50 / MCP1802-33 alternativ den MCP1804-33 nutzen und statt des Tanatal-Elkos auf Kerkos entsprechende der Herstellerangaben der MCP1802/1804 ersetzen. Das ist kleiner bringt zudem auch die notwendigen Stromstärken.
    Gefährlich finde ich bei diesem Aufbau die Dimensionierung des dieses LM117 :!:Da es keinen weiteren Schutzmechanismus gibt und man bedenken sollte, daß der MCP23017 insgesamt 16 Ausgänge zur Verfügung stellen kann. Tatsache bleibt das der maximale Ausgangsstrom in der Summe aller Ausgänge nur 125 mA betragen darf, was wiederum bedeutet - pro GPIO OUT nur 7mA bei gleichzeitiger Ansteuerung zur Verfügung stehen ... :conf: Da ist der LM117 mit 800mA mehr als reichlich überdimensioniert. Weiterhin würde ich einen Printtaster vorsehen, falls es mal auf dem I²C Bus zu Störungen kommt, damit man den MCP23017-Reset gesondert betätigen kann, ohne die gesamte Schaltung neu starten zu müssen.

    Franky

    Franky

  • Moinsen raspberti,

    Dann schaust du mal hier !
    Ich habe keine Ahnung woher du die Information genommen hast, daß für einen INPUT Funktion zwei was auch immer benötigt werden !?
    Du kannst jeden der 16 GPIO-Pins des MCP23017 auf Eingang programmieren. Damit reicht eine einfacher Taster der mit einem PullUp Widerstand gegen GND geschaltet ist.
    Das funktioniert mit jedem MCP23017 und auch jeder MCP23017 Platine so. Außer ein besonders Schlauer hat sich wieder irgendwelchen Unsinn einfallen lassen.
    Nun kommt das große ABER ! Das ist dessen Programmierung. Eigentlich sind diese Expander für den Betrieb an einem Microcontroller vorgesehen. Das man diese nun vermehrt auch am PI verwendet ist wohl zu erwarten gewesen. Leider hast du keine Angeben hinterlassen mit welchem Board du diese Expanderplatine betreiben willst. Raspberry Pi Zero bis 4 er Serie, der PICO Serie mit dem RB2040 oder einem ESP, oder auch einem Arduino ?
    Bei den µC ist es überhaupt kein Problem, da nutzt man den je nach Port-Register INT_A / INT_B Ausgang um dem Controller auf einen solchen Event aufmerksam zu machen. Das bedeutet sobald ein als Eingang definierter Port auf LOW abfällt, schaltet einer der beiden INT Ausgänge auf HIGH, wiederum abhängig davon zu welchem Port-Register dieser Eingang gehört. Das nutzt man nun dahingehend aus, auf dem Controller einen Interrupt auszulösen, der in der Ablauffolge des Programm, die aktuelle Programmausführung unterbricht und die dazugehörige Interruptbehandlungsroutine (hier jetzt die Abfrage des MCP23017) ausführt, um dann im Programmlauf fortzufahren. Diese I/O Interrupte sind bei µControllern gang und gebe. Jedoch fehlen diese beim PI, und müssen softwareseitig implementiert werden. Das kann man dank dieser beiden INT-Ports in einen SUB-Thread auslagern, so das man nicht ständige den I²C Bus mit einer permanenten Abfrage blockieren muß. Will man nun am PI diesen Expander auch als EIngangsmelder verwenden, muß man, wenn man nicht ständig den Bus Blockieren will, noch 2 zusätzliche GPIO am PI belegen, um auf die INT_A / INT_B Signale reagieren zu können.
    Von der Verwendung von WiringPI wie in der Waveshare Anleitung würde ich grundsätzlich abraten, da diese Software seit 2019 nicht mehr weiter entwickelt wird. Hier kann man sich je nach bevorzugter Programmiersprache selber etwas passendes Zusammenschreiben. Sowohl über die Arduino IDE und C/C++ bei PICO, ESP und Arduino selber sind diese Hardware I/O Interrupte wie auch bei µPython für ESP und PICO sind das Standardfunktionen. Hier müßtest du die beiden Eingänge nur auf einen Pegelwechsel von Low zu High als Interruptvektor bestimmen, und als Eventroutine die entsprechende Abfrage des jeweiligen Portregisters durchführen.

    Franky

    Franky

  • Ich habe keine Ahnung woher du die Information genommen hast, daß für einen INPUT Funktion zwei was auch immer benötigt werden !?

    Möglicherweise war davon die Rede, dass man den GPIO-Port-Expander auch zur Flankenerkennung nutzen möchte ohne "pollen" zu müssen.

    Ginge auch mit dem RPi Softwaremäßig. INTA triggert GPIO des RPi, RPi fragt BankA komplett ab. Unterschiede führen dann zu einer Aktion. Für BankB dasselbe.

  • Moinsen,

    weder in der Anleitung noch in dem unter Code ist ein wirkliches Beispiel vorhanden, wie man mit Python auf einem PI eine INPUT Abfrage umsetzt. Hier gibt es nur ein Polling Beispiel. Selbst der Beispielcode für C , wo von uns immer noch keiner weiß, welches HW-System der @SUB-TO mit welcher Programmiersprache benutzen möchte, setzt noch auf WiringPi ! Beispiele für ein µC wie dem Pico oder den ESP fehlen vollständig. Deswegen hatte ich trotzdem schon angeführt, weil auch diese beiden µC-Boards über die Arduino IDE programmiert werden können, daß hierfür schon fertige Programm-Bibliotheken zur Verfügung stehen.
    RPi.GPIO wird ihm bei einem Raspi PICO, oder einem ESP nur wenig nützen :baeh2:

    Franky

    Franky

  • RPi.GPIO wird ihm bei einem Raspi PICO, oder einem ESP nur wenig nützen

    Ich bezog mich auf den RPi mit einem SoC.

    Jedenfalls ist die Art, wie man das auf einem SoC oder auf einem Mikrocontroller implementiert, identisch.

    In beiden Fällen wird ein Interrupt durch den Port-Expander getriggert, der dann wiederum vom Port-Expander den aktuellen Status der jeweiligen Bank holt und dann ggf. bei Änderungen des Bit-Musters entsprechende Callbacks auslöst. So kann jeder GPIO des Port-Expanders einen eigenen Callback bekommen.

    Wann INTA/INTB getriggert wird, kann man sicherlich konfigurieren und steht auch im Datenblatt (zu faul jetzt nachzusehen).

  • Moinsen,

    wie ich schon ausführte und um die Begriffe von @DeaD_EyE zu verwenden, Triggern die Ausgänge von INT_A / INT_B bei entsprechender Konfiguration als INPUT, und der Parametrierung auf Fallende Flanke to LOW für genau 600ns (Siehe Datasheet) !
    Somit bleiben dem Interrupthandling noch etwa 10ms Zeit das betreffende Port-Register abzufragen, bevor der eigentliche Eingang durch die Tatserbetätigung wieder auf HIGH springen könnte, sofern es sich um eine manuelle Tasterauslösung handelt. Zum schnellen erfassen im Sinne eines Frequenzzählers sind diese Bausteine nicht oder nur bedingt geeignet. Wenn die dazugehörige Software auf den ausführenden Controllersystem egal ob SoC, oder µC entsprechend Performance-Optimiert programmiert ist, lassen sich Abfrageraten bis etwa und nur grob weil µController-Abhängig bis 120 Hz umsetzen. Hierfür muß man dann schon, auch wieder µC Abhängig zu C oder Assembler greifen. Mit µPython sind dieser Raten nicht erreichbar. Das Pico mit µPython schafft hier nur etwa, auch mit einer Streuung - die vom Gesamtaufbau und der Vc des MCP23017 abhängig ist - knappe 50-60 Auswertungen / Sek, das ESP etwas mehr, so ungefähr 70-90 /Sekunde.
    Hierzu noch die Anmerkung: Wenn du den MCP23017 mit 5 Volt statt der üblichen und PI/ESP-Kompatiblen 3,3 V betreibst, reagieren diese schneller - du benötigst dann jedoch einen bidirektionalen Levelshifter (Pegelangleicher von 3,3 auf 5,0 V).
    Wenn du mehr Performance benötigst, solltest du auf die Artverwandten MCP23S17 via SPI Bus setzen.

    Franky

    Franky

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!