Posts by WillyR_aus_C

    Guten Tag Gnom,


    ja ich wollte MOSFETs verwenden. Jetzt hatte ich jedoch noch die Idee aufgegriffen, um die MCP23S17 wie auch das ESP zu schützen an den GPIOs der MCP23S17 auch noch Optokopller dazuwischen zuschalten. Erst einmal nur eine Idee die ich gedanklich übernommen habe. Also wird wohl auch durch diese Optokoppler ein gewisser Eigenstrom benötigen.

    Aber noch einmal auf den MOSFET zurück zu kommen ;)
    Bei einer Betriebsspannung von 12 Volt und einer SPOT Leistung von 4 Watt, fließt dort eine Strom von 0,333 A Somit müsste doch eine MOSFET in der Leistungsklasse bis 500 mA ausreichend sein ?
    Welchen MOSFET würdest du hierfür verwenden ? und wie diesen beschalten ? :danke_ATDE:

    Guten Tag md_fg,


    danke für die Unterbreitung des Links zu deinem Beitrag.

    Könntest du mir diese Fritzing -Datei bitte via PM zukommen lassen ? :danke_ATDE:

    Was mich jetzt aber interessiert, ist wenn ich das Datenblatt richtig interpretiere, dass jeder dieser MCP23S17 pro 1 MHz Bustakt einen Eigenstrombedarf von 1mA hat. Damit sind noch keine geschalteten GPIOs der Banken A + B gemeint. Somit deren Stromlast noch nicht inbegriffen. Laut den allgemeinen Unterlagen, jetzt nicht auf das von mir speziell verwendete ESP32 Board wird die maximale Taktfrequenz des SPI-Bus mit 9 MHz angegeben. Das heißt ich hätte einen Grundstrombedarf vom 4 * 9 * 1 mA = 36 mA ohne das ein GPIO eine Ausgangslast ansteuert. Schaut man nun in das Datenblatt zu diesen ESP-Boards von Espressif Systems hinein, wird jedoch angegeben, dass dieser 3V3 Pin nur mit maximal 40mA belastet werden darf.
    Daher hatte ich meine Frage bewusst so formuliert, ob man diesen 3V3 Pin mit diesen 4x MCP23S17 ausreizen kann, oder ob es sinnvoller wäre, diese Expander Chips nur via dieser SPI Datenleitungen + GND an das ESP anzubinden, und die Stromversorgung Vc = Pin9 des MCP23x17 über einen gesonderten Stromkreis bereitzustellen, der ebenfalls auf 3,3 Volt ausgelegt ist ?
    Auf eine höhere Betriebsspannung wollte ich verzichten, um nicht auch noch Levelshifter verwenden zu müssen.
    Das man pro GPIO Ausgang der Portexpander jeweils bis zu 25 mA jedoch in der Summe nur 125 mA wäre jetzt auf Grund der möglichen Schaltzustände nur eine Randbetrachtung. Die Idee noch Optokoppler dazuwischen zu schalten, ist ja soweit OKAY, nur möchte ich wegen der Schalttaktung 5 Sec, keine Relais verwenden, sondern die Schaltvorgänge ausschließlich auf dem elektronischen Weg herbeiführen.
    :danke_ATDE:

    Guten Tag,


    Ich bin nun nach einigem Suchen auf die Code gestoßen, der jedoch nicht für µPython geschrieben ist.


    Dieser kann, das habe ich nun auch an einem 3b+ getestet mit den benötigten 4x MCP23S17 an einem BUS, mit einer CS Leitung umgehen.

    Guten Tag,

    Ich hatte schon einen Thread eröffnet, aber in diesem ist meine zweite Frage offensichtlich untergegangen ;)

    Kann ich über den V3,3 PIn des ESP32 direkt 4 ( VIER ) dieser MCP23S17 versorgen, und dabei auch noch die Ausgänge dazu nutzen um in der Summe 60 ( dieser möglichen 64 ) Ausgänge dafür direkt einen MOSFET anzusteuern, wovon jeder jeweils eine 12 Volt 4 WATT LED Spot ansteuern / schalten soll.


    Wie müsste ich die Ausgänge der MCP23S17 beschalten ? Welchen MOSFET kann man dafür nutzen ? Ist es ratsam alternativ zu dem 3,3 V OUT PIN des ESP einen gesonderten 3,3 Volt Stromkreis aufzubauen ? Und wie müsste dieser bezüglich der Strombelastbarkeit dimensioniert sein ?

    Das ESP soll direkt über einen LDO 5,0V OUT am Eingangspin 5,0 V versorgt, wenn keine USB Verbindung besteht. Dazu wollte ich einen 1,5A Festspannungs-LDO vom Typ MCP1827S-5,0V verwenden ( Ist vorhanden ).
    Wenn das Programm ( Sonnenuhr ) einmal funktioniert, werden somit im höchsten Fall 3 ( Drei ) dieser LED Spots gleichzeitig leuchten.

    :danke_ATDE:

    Guten Tag Bernd666, DeaD_EyE


    ich hatte mit meiner Antwort keinesfalls vor jemanden vorzuführen.

    Ich habe nur auf Grund des Links, den DeaD_EyE bereit gestellt hat eine Feststellung gemacht ( ohne Feststellschrauben ;) ) dass der von Ihm dankender Weise weitergegebene Code nicht mit allen Beschaltungsvarianten um die PIN A0 bis A2 funktioniert.
    Ich habe mich auch nicht mit dem Ausgangscode der I²c Variante beschäftigt, auf den er sich für seine Modifikation auf SPI bezogen als Grundlage genutzt hat.
    Dazu bin ich nun auf diese Tabelle:

    gestoßen, und kann jetzt erst einmal mir keinen Reim darauf machen, wie diese HEX Zahlen sich zusammensetzen.


    Immer wider finde ich in dem Code diese Zeichenfolge & 0x07.
    Normal müsste ich das jetzt wenn ich das Richtig verstehe diese CONST ja ?

    Wäre jetzt meine Annahme richtig, dass ich zu dem IOCON_HAEN = const(0x08) diese A0-A2 Bit hinzurechnen ? Aber das Funktioniert dann so aber auch nicht. HEAN + A2 +A1 +A0 + diese Registerwerte aus der oben angeführten Adresse müsste dann doch den Code / Wert ergeben, der an den MCP23S7 via MOSI bei CS OW gesendet wird ?
    Was mir hier aufgefallen ist, ich es mir aber nicht erklären kann, warum diese Werte in


    Python
            self.spi = bus
            self.ce = ce
            self._GPIOA = 0x00
            self._GPIOB = 0x00
            self._IODIRA = 0xFF
            self._IODIRB = 0xFF
            self._GPPUA = 0x00
            self._GPPUB = 0x00

    völlig von dieser Tabelle aus dem Datenblatt abweichen.

    Guten Abend DeaD_EyE,


    Zumal eine Code den ich für das PI ( das Große ) gefunden habe, und auch für Python geschrieben ist, hier jedoch "SPIDEV" verwendet wird .
    Ebenso gibt es einen Code für RPI.GPIO.

    Leider fehlt mir noch das Verstädnis diesen Code egal ob mit RPI.GPIO oder SPIDEV geschrieben in µPython zu übersetzen.

    Das bitte nur als erklärenden Nachtrag betrachten.

    Guten Abend DeaD_EyE,

    Eine vollkommen falsche Aussage !



    Auch auf dem SPI Bus sind, wenn diese Angaben stimmen, und so dem Datasheet auf Seite 15 zu entnehmen die PIN Pegel der Pins für A0 bis A2 relevant .
    Weiterhin habe ich in den weiterführenden Links diese Schaltskizze gefunden.



    Daraus wird ersichtlich, dass der 23S17 genauso wie der I²C via dieser A=-A2 Adressen angesprochen und über nur eine CS Signal-Leitung gesteuert werden kann.
    Oder habe ich da jetzt einen totalen Denkfehler ?

    Guten Tag

    "unbezahlbar" ist ja relativ zu den eigenen Ansprüchen, aber es gibt MCP23017 (und auch MCP23S27) bei diversen deutschen (seriösen) Onlinehändlern für 2-3 Euro/St. zzgl. Porto.

    Hast du das mal ausgerechnet ?
    Ich hatte bei mehreren mir bekannten Händlern, wo ich auch ein Kundennummer besitze nachgesehen, ebenso bei der alles liefernden "(J)AmmerZone" und bin dann mit dem Porto dann bei einem Stückpreis von über 5 Euro gelandet. Vergleicht man das mit vor gut einem Jahr habe ich bei meinen "Standard-Online-Shop" für 10 Stück | 0,42€/ Part + 2,95 € Versand bezahlt. Schau man dann noch in die "Ä-Bucht" werden zt Preise von bis zu 14 € / Part aufgerufen ( Sofortkauf ).
    Betrachtet man das nun mit dem was ich bezahlt habe, wenn ich nicht das gewünschte geliefert wurde, liege ich hier bei einem Preis inkl Porto von 1,37 € / Part für den MCP23S17. Selbst das ist noch günstig um nicht zu sagen billig, wenn man das mit den meisten deutschen Elektronik-Versendern vergleicht.

    Guten Tag DeaD_EyE,


    Danke für den Code, mit kleinen Anpassungen hatte er soweit auch funktioniert.
    Aber leider und hier fehlt mir das Verständnis, um diese ganzen Hex-Code-Zahlen.
    In der Konfiguration A0 = 0 , A1 = 0 und A2 = 0 gemäß Adress-Pin Jumperung ( Pegel LOW ) funktioniert dein Codebeispiel. Jedoch möchte ich über einem BUS mit einem CS vier dieser Schaltkreise ansprechen. Das heißt sobald ich die Adresse an den A=-A2 Pins durch setzen auf HIGH abändere erhalte ich einen OSERROR.

    Guten Tag,

    Da z.Z. die Portexpander MCP23017 hier in D nahezu unbezahlbar geworden sind, hatte ich nun bei einem Händlerportal diese Schaltkreise von einer asiatischen Quelle bestellt. Nun sind die Teile gekommen, der Aufdruck ist nahezu unlesbar.
    Nachdem diese Chips auf die Beschaltung wie für den I²C-Bus abgedacht nicht funktionierten, brachte mich jemand auf die Idee, probiere es doch einmal mit der Beschaltung des MCP23S17 für den SPI-Bus. Und siehe da an einem 3er PI funktionieren die Teile. Die dafür gefundenen Codes für Python mit RPI.GPIO funktionieren.
    Nun dachte ich mir auch kein Problem, also kann ich diese auch an ein ESP32 anschließen (was auch ursprünglich dafür vorgesehen war), der auch über einen SPI Bus verfügt. Nun habe ich schon ganze Nächte damit verbracht einen Code für µPython zu finden. Leider bisher ohne Erfolg.
    Meine Frage dazu: Kennt oder hat jemand eine Funktionsbibliothek für den MCP23S17 in µPython, den er mir zur Verfügung stellen könnte ? Ich möchte diese Expander (4 Stück zusammen) wirklich nur als OUTPUT nutzen.

    :danke_ATDE:

    Reichen die 3,3 Volt des ESP32 am Pin0 (3,3 V out) aus um 4 dieser MCP23S17 mit nachgeschalteten LED Treibern zu betreiben, oder sollte man lieber aus der Vc 5,0 Volt über die auch das ESP32 versorgt wird einen zusätzlichen 3,3 Volt Stromkreis aufbauen ?
    Als LED Treiber hatte ich an an eine MOSFET Stufe gedacht, mit der ich direkt über den MOSFET jeweils einen 12 Volt 4 Watt LED Spot nur auf ein / aus ansteuere. [ Ergänzend es werden immer nur 3 dieser LED Spot zeitgleich angeschaltet sein. ]
    Dazu meine zweite Frage: Welcher FET und was müsste ich das noch beachten ?

    :danke_ATDE:

    Guten Abend,

    Solche Lösungen findet du im Maschinenbau. Soweit ich mich erinnern kann, gibt es für die Siemens LOGO SPS entsprechende Schnittstellenkarten, die einen solchen Asynchron-Motor ansteuern können und auch ein Lastfeadback geben. Die Logo, soll wenn ich das mal richtig in einer der "Raspberry Pi Geek" gelesen habe über das RasPi ansteuerbar / abfragbar sein. Nur bin ich nicht der Starkstromelektriker ;) der dir sagen kann, welche Motorgröße und welche Stellerkarte du dafür benötigst. Wahrscheinlich gibt es jetzt auch schon so etwas für die Home-Made CNC Maschinen.

    Zu Kaufen gibt es sowas definitiv, nur musst du dich da selber durch die Handbücher und Leistungskennlinien durcharbeiten. Hier würde ich ohnehin jetzt von meiner Seite keine explizite Empfehlung aussprechen, da mir die Betriebsparameter noch vollkommen unbekannt sind.

    Vergiss bitte nie bei der Planung - du hast so viele von außen einwirkende Parameter, die bedacht werden sollten. Nicht nur die Windlast bei Außentüren, auch Verschmutzungen, oder Temperaturen die auf die Drehgelenke einwirken können, ( wo mögliche Schmierstoffe ihre Viskosität verändern ) und was hier nicht alles noch einwirken könnte. Damit ist die Auswertung , wenn du für einen solchen Bewegungsvorgang keine definierte Festzeit definieren kannst wohl eher das größte Problem.

    Für solche Programmieraufgaben musst du wirklich hier die richtigen Leute ansprechen, die sich mit Prozessprogrammierung auskennen .

    Guten Tag,

    technisch gesehen ist das eine recht einfache Aufgabe.
    Da das PI, oder was auch immer nur das PWM Signal für das Servo, ggf einen Motor ( H-Bridge ) liefert und die Stromversorgung über einen separaten Kreis eingespeist wird, kannst du ein Fertigplatine eines Stromsensors vertrauen, inwiefern er im Arbeitsbereich /-Parameter deiner Konstruktion liegt.
    Selber eine Hall-Sensor basierte Schaltung aufbaust, oder in den Versorgungsstromkreis einen Shunt (Meßwiderstand) einbaust den, du über eine differenzielle Messung mit einem ADC (Analog-Digital-Wandler) auswerten kannst. Dazu müsstet du dir ohnehin eine Grundaufzeichnung machen, damit du über den Zeitverlauf vom Startbefehl bis "Tür am Anschlag" eine Norm-Kennlinie erhältst.
    Falls die Tür selber über einen mechanischen Türschließer verfügt, solltest du des weiteren über einen Temperatursensor nachdenken, falls es sich um eine Außentüre handelt. Der Kraft- und Widerstandsverlauf dieser Teile ist zT stark Temperaturabhängig.
    Dazu müsste man mathematisch dieser Basiskennlinie Temperaturabhängig nach oben oder unten verschieben, sowie einen Toleranzbereich aufmodulieren, damit keine Regeleinflüsse wie - aus Verschmutzung und damit einem Scheuern zwischen Türblatt und Fußboden, oder was auch immer zu keiner Funktionsbeeinträchtigung führt.
    Die rein technisch-elektronische Lösung dürfte hier der einfachste Teil der Aufgabe sein.

    Guten Abend,

    Dann würde ich schlank, da die Anzahl der Nachkommastellen bekannt ist, alle Zahlen in INT wandeln math.ceil(x * 1000) (0 .. 8400) und dann damit rechnen.

    Die Werte sind nicht immer zwanghaft 0 und 8.4 ! Diese sind je nach Meßaufgabe abweichend, und es bringt auch nichts alles bis auf die 1000ender Stelle durchzurechnen bzw darstellen zu wollen. Wenn es ZB nur von 1.2 bis 2.0 geht, dann reichen die Schritte 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9 und 2.0 aus.

    Guten Abend,


    würdest du bitte bei der Programm-Code-Eingabe diesen

    Button für Code benutzen, damit auch die Formatierung inkl. der Einrückung für "TAB" erhalten bleibt.
    Danke.

    Wenn du die Software Thonny verwendest kannst du das PICO gezielt auswählen.
    Über Extras - Optionen gelangst du in den Reiter Interpreter in dieses Fenster


    Hier wählst du das PICO aus, und wählst die Schnittstelle aus.


    Wenn das Pico erkannt ist, kannst du hier ohne Kopfstände über die untere Zeile die aktuelle Version von Micropython installieren, dazu musst du nur den Bootsel Button auf dem PICO drücken.
    Wenn das Fenster wieder geschlossen ist siehst du unten rechts in der Statuszeile ob du auf dem Pico eingewählt bis.
    Wenn du ein Programm in dem Flash speichern willst, musst du zwanghaft die Endung ".py" mit angeben. Dann ist das Programm auch ausführbar. bzw. über diese IDE zu starten.

    Guten Abend,

    Ich weis ja nicht was du vor hast, ....

    Gut dann will ich mal dem Ganzen eine Auflösung geben. Ihr werdet jetzt bestimmt wieder sagen oder feststellen wie Umständlich. Aber so sei es.
    Ich habe 2 Meßwerte aus einer ADC-Messung die die je nach Ergebnis eine auch zum Schluss auf die dritte Nachkommastelle abgeschnittene Float-Point Zahl ergeben. Also alle positiven Zahlen von 0.000 bis 8.400 mit max. drei Nachkommastellen sind möglich. Da ich aus diesen Zahlen für eine Diagrammauswertung diese mit jeweils dem kleinsten Step innerhalb von zwei ineinander verschachtelten For- Schleifen verrechnen möchte, musste ich mir etwas einfallen lassen, wie ich das einer For Schleife beibringen kann, die nur Integer kann.
    Also war mein Ansatz, weil rein über String geht es nicht, oder ich kenne den Weg nicht, dass ich die Anzahl der Nachkommastellen darüber feststelle, dass ich von dem Wert den eigenen Integer-Wert abziehe. Diese in einer While-Schleife solange mit der 10er Potenz multipliziere, bis wieder der Integer gleich dem Float-Wert ist, und ich damit einen Multiplikator erhalte, den ich in der For-Schleife nutzen kann. So das mein kleinster Step in der For-Schleife wieder der Stellen des Nachkomma-Anteils entspricht.

    Einfach mal der verkürzte zusammengefasste Funktionsablauf.
    Es funktioniert jetzt dank eures "Decimal" ;)

    Guten Tag,

    ich habe gerade ein Problem bei der Verrechnung von Integer und Float Zahlen.
    Wenn ich von einer Floatpoint Zahl eine ganzzahlige Integer-Zahl abziehe um den Rest (die Nachkommazahl) als solche zu erhalten passieren immer wieder, aber nicht bei jeder Zahlenkombination komische Dinge. So wird aus 0.4 auf einmal 0.3999999999 usw.!
    Wie kann man das vermeiden ?

    Danke im Voraus.

    Guten Tag,


    wenn das Flashen abbricht, muss es ja eine Fehlermeldung geben, wenn du den Imager benutzt !?


    Einfach mal einen Bildschirmprint machen, oder abfotografieren, wie diese Fehlermeldung dann hier einstellen als BILD. Damit ist uns allen weiter geholfen, als wenn du hier nur wahllos, und wiederholend deine Erkenntnisse und Annahmen schriftlich darlegst.
    Vermutungen helfen weder dir noch uns. Also Butter bei die Fische.
    Imager Fehler provozieren, und dann den Bildschirmprint einstellen.

    Guten Tag __blackjack__,


    Irgendwie verstehe ich deine Aussagen nicht.
    Aber lass mich das bitte im einzelnen Auseinander nehmen,


    Ein Tupel mit `tuple()` noch mal in ein Tupel umwandeln ist einmal zu viel.

    in der Zeile:

    Code
    marks = (tuple((marks,)) if type(marks) == int else marks)

    wird, falls der Übergabeparamter nur eine einzelne Ziffer enthält eine Tuple gemacht. Ansonsten bleibt alles so wie es ist marks = marks Das habe ich auch so single getestet, und diesen dem Sinn, damit die übergebenen Sortierparameter auch der Anzahl der Einträge einer Liste entspricht, die als Folge vieler in itertable übergeben wurde. Wo findet bitte nochmals eine Wandlung Tuple in Tuple statt ? Ich kann diese Aussage / Programmstelle so nicht erblicken.

    Was ebenfalls ”falsch” ist, sind die beiden ``assert``-Anweisungen die Sequenzoperationen auf etwas das `iterable` heisst machen. Iterierbare Objekte müssen keine Sequenzen sein, es muss also weder eine Länge geben, noch ein Indexzugriff möglich sein.

    Ich verstehe hiervon kein Wort.

    In dem Beispiel rufst Du die Funktion falsch auf.

    Wieso ? Und wo ? Wenn ich die Funktion sort mit (1, 1, 1) aufrufe erfolgt die Sortierung aller Index-Stellen aufsteigend. Auch das habe ich ausprobiert. Das funktioniert.

    Der explizite Vergleich von `flag` mit 1 statt einfach den ”Wahrheitsgehalt” von `flag` selbst zu benutzen. Zumal das an der Stelle auch nicht mehr wirklich Sinn macht wenn man eine Funktion haben will die 1 und -1 als Werte in `marks` haben will.

    du meinst diese Zeile: ?


    Code
    return sorted(itemtable, key=lambda item: [value * (1 if flag == 1 else -1)\
                                            for value, flag in zip(item, marks)],)

    hier habe ich den Teil schon dahingehend abgeändert, weil es mir nach meinem Post auch aufgefallen war, dass das eigentlich Unsinn ist, dass diese Zeile nun


    Code
    return sorted(itemtable, key=lambda item: [value * (-1 if flag == -1 else 1)\
                                            for value, flag in zip(item, marks)],)

    damit nur -1 zu einer absteigenden Sortierung führt, aber jede andere auch falsche Parameterzuweisung automatisch zu einer aufsteigenden Sortierung führt.


    Aber auch das ändert nichts an der Tatsache des unterschiedlichen Verhaltens.

    Ich habe nun viele Anläufe unternommen, und auch jedes Sortierergebnis händisch geprüft, ich kann die erste Stelle = Index[0] mit 1 oder -1 parametieren, die Sortierung entspricht immer der zugewiesenen Sortierrichtung. Das selbe für die 2. Stelle = Index[1] . Funktioniert rum wie num. Aber egal was ich der 3.Stelle = Index[2] zuweise, hier ist die Sortierung immer aufsteigend. Selbst (1, 1, -1) ergibt in der Sortierung immer dem Ergebnis als hätte ich (1, 1, 1) übergeben.
    Wobei, was ich mir aber nicht vorstellen kann, und auch nicht glaube das der Fehler dort zu suchen ist, das es nur eine Wert, oder Betragsänderung gibt, die die 6. Stelle nach dem Komma betrifft. Das heiß ich habe 2 List als 3er List mit Koordinaten, wo ich via Vergleich:
    table[x1][0] == table[x2][0] True erhalte, ebenso bei table[x1][1] == table[x2][1].
    Erst bei table[x1][2] == table[x2][2] erhalte ich ein False. Nehme ich nun diese beide Zahlen X1:2 und X2:2 gibt es nur in der 6. Nachkommastelle einen Unterschied.