Beiträge von Der Hobbyelektroniker

    Hallo Wolfgang,


    normalerweise steuert man Motoren über einen H-Brücken - Chip an. Diese haben normalerweise zwei Stromversorgungen. Eine ist mit der Versorgung des Prozessors verbunden, die andere ist für den Motor. Ich habe auf meiner alten Webseite ein Beispiel mit einem Arduino und einem L293D. Durch Trennung der Stromversorgung von Logik und Motor kannst du dir manchen Ärger ersparen.


    https://www.hobbyelektroniker.ch/grundlagen/transistoren3/


    Gruss

    René

    Hallo Patrick,


    du arbeitest in C++, nicht in C. Und da versucht man explizite Pointer möglichst zu vermeiden. Üblicherweise reservieren Variablen bei der Deklaration den benötigten Speicherplatz und geben ihn bei ihrer Zerstörung wieder frei. Das geschieht zum Beispiel, wenn die Funktion verlassen wird, in der die Variable deklariert wurde. Das gilt auch für Instanzen von Klassen. In ungünstigen Fällen kann das zur Heap - Fragmentierung führen. Garbage Collection wäre eine Lösung, leider gibt es die in C++ nicht.

    Du kannst jetzt das ganze Memory - Management selbst mit reinen C - Befehlen machen. Das hilft aber nur, wenn du ganz auf den Einsatz von Bibliotheken verzichtest. Was du aber im Zusammenhang mit Klassen machen kannst, ist die explizite Erzeugung und Zerstörung von Instanzen mit new und delete. new gibt dann einen Pointer auf die Instanz zurück, hat aber die Eigenschaften der Klasse. So ruft delete automatisch den Destruktor auf, bevor der Speicher freigegeben wird.


    Im Kurs wird das aber vorläufig kein Thema sein. Diese Klassen sind auf einfachem Level schon schwierig genug. Momentan schaut sich knapp einer von fünf die Videos bis zum Ende an. Die anderen geben schon wesentlich früher auf.


    Gruss

    René

    Hallo Wolfgang,


    theoretisch kannst du 5V an den 5V Pin anlegen. Das ist aber nicht ganz ungefährlich, da der 5V - Pin direkt mit USB verbunden ist. Du musst also immer deine Batterie abklemmen, bevor du USB verwendest. 4.8 V würde ebenfalls reichen, da USB manchmal auch nicht mehr liefert. Wenn du sicher gehen möchtest, kannst du F1 unterbrechen. Dann erfolgt über USB keine Spannungsversorgung mehr.


    Eine andere Möglichkeit wäre VBAT (Pin1 des Batteriesteckers). Der Spannungsregler U1 hätte sicher keine Probleme damit. Allerdings weiss ich nicht, wie U2 (die Ladeelektronik für den LiPo) reagiert. Reguläres Laden eines 4.8V - Akkus ist sicher nicht möglich. Es müsste abgeklärt werden, ob U2 Schaden nehmen könnte.


    Theoretisch könnten auch direkt 9V angelegt werden. U1 (CE6260) ist ein 3.3V - Regler, der mit 9V zurecht kommen sollte. Du wandelst dabei aber etwa 2/3 der Leistung in diesem Regler in Wärme um. Ich bin nicht sicher, ob du das ihm antun solltest.


    Fazit: JP1 ist für den Anschluss von 3.7V - LiPos gemacht. Damit sollte es keine Probleme geben. Bei allen anderen Varianten bist du etwas auf dich allein gestellt und musst experimentieren. Wenn du sicherstellen kannst, das BAT am TP4054 eine höhere Spannung haben darf als VCC, dann wäre der Anschluss an VBAT die optimale Lösung.


    Spannungsregler.png


    Gruss

    René

    Hallo Wolfgang,


    ja, es ist der kleine Stecker unten am Board. Welcher Anschluss Pin 2 ist, kannst du einfach mit einem Multimeter testen. Wenn der Widerstand zur Masse beinahe 0 Ohm beträgt, dann hast du Pin 2. Oder du kannst das Board an USB anschliessen und mit dem Multimeter die Spannung an den zwei Pins messen. Der Pluspol ist Pin 1.


    Die Ladeelektronik ist für kleine LiPos ausgelegt. Mit NiMH-Akkus oder 1900 mAh - Akkus würde ich da nicht experimentieren. Wenn du die Ladefunktion nicht unbedingt benötigst, kannst du, wie von Frank vorgeschlagen, eine höhere Spannung nehmen und mit einem Spannungsregler (z. Bsp. 7805) auf 5V bringen.


    Gruss

    René

    Hallo Eugen und alle anderen,


    das ist natürlich nicht die Idee. Es geht nur darum, etwas vorzuschlagen, das interessant genug ist, um sich damit zu beschäftigen. Dabei geht es nicht um technische Details, wie zum Beispiel Klassen. Dieser Aufruf geht natürlich an alle. Der Vorschlagende sollte in der Lage sein, so ein Projekt mehr oder weniger mit seinen Mitteln zum Laufen zu bringen. Dann könnten wir verschiedene Lösungsansätze ausprobieren. So kann man selbst erfahren, was die fortgeschrittenen Programmiertechniken bringen.


    Gruss

    René

    Hallo Eugen,


    jetzt ist alles klar. Mit deiner grossen Assembler - Erfahrung kannst du eigentlich jedes Problem lösen. Du bist es gewohnt, lösungsorientiert zu arbeiten.


    Wenn ich ein Tutorial vorbereite, gehe ich den anderen Weg. Ich überlege, was ich erklären möchte und suche dann ein Problem dazu. Im realen Leben läuft es natürlich so, wie du es beschreibst.


    Ich arbeitete immer gerne mit Assembler (hauptsächlich Z80), aber meine berufliche Entwicklung führte mich schon vor mehr als 30 Jahren davon weg. Beim Arduino wollte ich mich aus Zeitgründen dann nicht mehr darauf einlassen. Es ist zwar möglich, man handelt sich damit aber viel Arbeit ein.


    Wenn du Interesse hast, kannst du ein konkretes Projekt vorschlagen, das wir dann gemeinsam mit verschiedenen Lösungsansätzen hier im Forum durchziehen können. Auf diesen Zug würden vermutlich noch weiter Forums-Mitglieder aufspringen. Es sollte allerdings ungefährlich sein, also nicht direkt mit Netzspannung arbeiten.


    Gruss

    René

    Hallo Andreas


    Da gibt es keine fertigen Rezepte. Mit 11 Jahren und guten Mathe - Noten sind alle Voraussetzungen gegeben. Da bleibt wirklich nur noch das Thema Motivation. Da stellen sich verschiedene Fragen:


    - Ist das Interesse bereits da, oder musst du es zuerst wecken?

    - Ist das Kind bereit sich selbstständig in das Thema einzuarbeiten oder wäre 'etwas mit Opa zu machen' die Hauptmotivation?

    - Wie steht es mit dem manuellen Geschick? Kosmos oder Franzis Experimentierkästen sind natürlich vom Manuellen her sehr viel einfacher, als wenn man ein Buch und einzelne Komponenten kauft.

    - Soll mehr in Richtung Programmierung oder Elektronik gegangen werden?


    Das ist also sehr individuell. Versuche zusammen mit dem Grosskind ein einfaches Projekt durchzuziehen, das in wenigen Stunden beendet werden kann. Dann siehst du, wo die Interessen liegen.


    Ein Ferienkurs mach nur Sinn, wenn bereits ein konkretes Interesse vorhanden ist.


    Und vergiss die Chinesen. Lieferungen sind dort momentan etwas Glückssache. Es könnte sein, dass die Sommerferien vorbei sind, bevor die Ware kommt. Ich würde in der Schweiz auf Lieferanten wie bastelgarage.ch oder Play-Zone zurückgreifen.


    Gruss

    René

    Hallo Wolfgang,


    ich habe zwar kein neues Board hier, aber das Schema sagt eigentlich genug aus.


    Heltec_Akku.png


    Die Ladeelektronik für einen 3.7V LiPo - Akku ist bereits eingebaut. An Pin 1 wird der + - Pol des Akkus angeschlossen, Pin 2 geht zu Minus. Sobald das Board mit USB verbunden ist, wird der Akku aufgeladen. Wenn die Versorgung über USB wegfällt, versorgt der Akku das Board mit Spannung.


    Gruss

    René

    Hallo Eugen,


    die grosse Erleuchtung wird sicher auch im nächsten Video nicht kommen. Es gibt dir aber hoffentlich eine Idee, wo du das einmal verwenden könntest. Der grosse AHA - Effekt wird erst kommen, wenn du versuchst das Gelernte in einem eigenen Projekt zu verwenden. Kai hat das in seinem Beitrag sehr schön erklärt.


    Dass ich jetzt die Klassen und die objektorientierte Programmierung etwas ausführlicher behandle, geschieht auch aus Eigennutz. Die Ideen für einfache Projekte mit LEDs gehen mir langsam aus. Ich möchte aber auch nicht das hunderttausendste Video zur Ansteuerung eines billigen China - Displays veröffentlichen. Jetzt kann ich entweder die Arduino - Reihe beenden oder auf komplexere Beispiele übergehen. Da möchte ich einfach auf Klassen nicht verzichten.


    Möglicherweise wird sich dein Wunsch nach nützlicheren Projekten erfüllen. Das wird aber Zeit benötigen und die Videos werden anspruchsvoll sein, wenn man wirklich verstehen möchte, wie es funktioniert.


    Gruss

    René

    Hallo Jürgen,


    vielen Dank!

    Das wird vermutlich nicht das letzte Problem sein. Aber mit jedem gelösten Problem lernt man etwas. Hier ganz einfach: es kann auch an der Hardware liegen!

    Hier im Kurs kann ich nur die Grundlagen zeigen. Das dann auf ein reales Projekt vernünftig anzuwenden, ist eine ganz andere Sache. Es ist normal, dass man die Dinge oft viel zu kompliziert angeht. Das führt dann dazu, dass man plötzlich irgendwo nicht mehr weiterkommt. Mit zunehmender Erfahrung bekommt man das aber immer besser in den Griff. Wunder darf man aber nicht erwarten. Ich programmiere seit über 40 Jahren und laufe immer noch gelegentlich an eine Wand. Dann einfach zwei Schritte zurückgehen und überlegen, ob es noch einen anderen Weg gibt.


    Gruss

    René

    Hallo Eugen,


    was ist eine lukrative Lösung? Schon da gibt es beinahe so viele Meinungen, wie Zuschauer. Für den einen sind die einfachen Übungsbeispiele schon zu kompliziert, ein anderer hätte am liebsten eine fertige Lösung mit zehntausenden von Programmzeilen. Das nächste Video würden dann aber frühestens im nächsten Jahr kommen.

    Um erfolgreich Software zu entwickeln braucht es eigentlich vier grundlegende Kompetenzen:

    - Die Fähigkeit, ein reales Problem so zu abstrahieren, dass es programmtechnisch abgebildet werden kann.

    - Die Fähigkeit, das Modell in so kleine Schritte zu unterteilen, dass die Übersicht gewahrt werden kann und vernünftige Tests gefahren werden können.

    - Grundlegende Techniken der Informatik sollten bekannt sein. Das hilft beim Umsetzen immer wiederkehrender Anforderungen.

    - Die Werkzeuge, wie Programmiersprachen und Entwicklungsumgebungen sollte man beherrschen.


    Ich kann mich hier nur auf die Werkzeuge und einige grundlegende Techniken konzentrieren. Wenn ich auf Youtube einen grossen Programmierkurs anbiete, umfasst der wenige Dutzend 15 - Minuten Videos. Ein Student der Informatik beschäftigt sich mehrere Dutzend Stunden pro Woche mit Programmieren. Und das über mehrere Jahre. Das erlernen einer Programmiersprache ist dabei der einfachste Teil. Dann kommt er in den Berufsalltag und braucht noch Monate oder Jahre bis er die notwendigen praktischen Erfahrungen hat.


    Bei einem Hobby geht das natürlich nicht. Das Prinzip ist aber dasselbe. Die Grundlagen anschauen und damit experimentieren (die blinkenden LEDs sind hier sehr nützlich). Wenn man glaubt, dass man es verstanden hat, sollte man ein Projekt suchen, das einem interessiert. Bescheidenheit ist aber auch hier eine Tugend. Es macht keinen Sinn, sich mit einem Projekt zu beschäftigen, das einem vollständig überfordert. Das frustriert nur und landet dann irgendwo in der Schublade. Du kannst dich schon an grosse Projekte wagen, es muss die einfach klar sein, dass dich das Monate oder Jahre beschäftigen wird


    Wenn du die Sache mehr oder weniger verstanden hast, bist du schon auf einem guten Weg. Du bist dadurch in der Lage, fremden Programmcode besser zu verstehen. Wenn du ein eigenes Projekt realisierst, versuche es laufend zu verbessern. Versuche dabei die Techniken aus meinen Videos einzubauen. Es ist ein grosser Werkzeugkasten, schau welche Teile dir zusagen.


    Das Internet ist voll mit grossartigen Projekten, Github ist voll davon. Da ist alles vorhanden und kann heruntergeladen werden. Nur detaillierte Erklärungen gibt es keine. Das liegt aber nicht an der Faulheit des Entwicklers. Es ist beinahe unmöglich, ein grosses Projekt so zu erklären, dass ein Grossteil der Zuschauer das versteht. Mit einem soliden Grundwissen kann man sich aber auch in solche Projekte besser einarbeiten.


    Gruss

    René

    Hallo Jürgen,


    es freut mich, dass es jetzt funktioniert. Die ganze WiFi - Geschichte im ESP32 hat ein gewisses Eigenleben. Es hätte also durchaus auch komplizierter werden können. Deine Fehlermeldung ist in ntptime.py aufgetreten. Ich vermute auf der Zeile


    addr = socket.getaddrinfo(host, 123)[0][-1]


    Das passiert normalerweise, wenn die Socket - Informationen nicht vollständig sind. Das kann, wie in deinem Fall, eine Hardwareursache haben, es gibt aber auch viele Möglichkeiten, dass von der Software her etwas schief läuft.


    Viele Grüsse

    René

    Hallo Jürgen,


    so wie es scheint, hast du keine Verbindung zum Internet. Dein Board hat vermutlich auch noch keine IP-Adresse zugewiesen bekommen.

    Kannst du dein Programm und alle .py - Files, die du auf dem Heltec - Board hast in ein ZIP-File packen und hier einer Meldung anhängen?

    Dann kann ich das einmal anschauen.


    Gruss

    René

    Hallo Karsten,


    es steht einfach ein Speicherbereich zur freien Verfügung. Wie du diesen verwendest, hängt von dir ab. Darum muss der Leseteil wissen, welche Daten in der Schreibfunktion gespeichert wurden.


    Damit der Leseteil überhaupt feststellen kann, ob ich schon einmal etwas geschrieben habe, arbeite ich mit einer Signatur und einer Versionsnummer. Das sind bereits die ersten Einträge, die ich schreibe. Zusätzlich speichere ich die anderen variablen, eine nach der anderen. Nach jedem Schreibschritt, erhöhe ich die Adresse um die Grösse der entsprechenden Variablen. Ein Beispiel:


    Das geht so weiter, bis alle Variable geschrieben sind.


    Das Lesen ist eigentlich genau so einfach. Allerdings wird die Funktion komplizierter, da ich nicht weiss, ob ich überhaupt schon einmal etwas geschrieben habe. Da ich immer zuerst die Signatur schreibe, kann ich in einem ersten einen int einlesen. Falls dieser der Signatur entspricht, weiss ich, dass die Daten von mir sind.


    Wenn klar ist, dass die Daten von mir sind, lese ich die Version. Diese ist im Moment noch nicht wichtig, gelesen werden muss sie aber trotzdem.


    Jetzt kommen meine eigentlichen Variablen. Ich weiss ja, dass ich die Variablen var1 und var2 geschrieben habe.

    Was ist, wenn ich nun zusätzlich var3 schreiben möchte?

    Dann füge ich in schreiben() einfach zwei Zeilen hinzu.

    Code
    1. EEPROM.put(adresse,var3); // schreibt var3
    2. adresse += sizeof(var3); // erhöht die Adresse um die Länge von var3

    Beim Lesen füge ich in lesen() ebenfalls 2 Zeilen hinzu.

    Code
    1. EEPROM.get(adresse,var3); // var3 lesen
    2. adresse += sizeof(var3);

    Beim ersten Start nach der Änderung weiss ich beim Lesen aber nicht, ob ich var3 schon einmal geschrieben habe. Deshalb verwende ich die Version. Ist die Version immer noch 2, habe ich noch keine var3 gespeichert. Es ist also sinnlos, diese zu lesen. Beim Schreiben setzte ich die Version auf 3, so dass ich beim nächsten Lesen sehen kann, dass jetzt meine neue Datenstruktur gilt. Du kannst auch auf den Test verzichten. Beim ersten Lesen wirst du dann einfach einen zufälligen Wert für var3 erhalten.

    Oder in unserem einfachen Fall kann der Test vereicfacht werden. Anstelle von switch / case genügt ein einfaches if.

    Code
    1. if (version == 3) {
    2. EEPROM.get(adresse,var3); // var3 lesen
    3. adresse += sizeof(var3);
    4. }


    Gruss

    René

    Hallo Frank,


    ja, selbstverständlich ist das ok! Das Projekt 'Wetterstation' läuft sowieso nicht besonders gut. Ich habe massive Probleme mit dem Speicherbedarf. Sobald die Prognose für mehrere Tage geholt werden soll, wird der Speicher knapp. Momentan kann ich das nicht vernünftig lösen.


    Displays sind von der Softwareseite her bei Programmierung in C besser unterstützt, als mit Python. Möglicherweise kann man da etwas abschauen, ev. kann man auch ein C-Modul in Python einbinden. Hier habe ich aber auch keine Erfahrung.


    Gruss

    René

    Hallo Patrick,


    es wird schon noch weitergehen. Der Sinn der Vererbung wird auch an einem einfachen Beispiel gezeigt werden. Das Thema ist aber sehr umfassend, so dass ich nicht sehr tief eindringen kann. Ich hoffe aber, dass ich wenigstens eine Idee vermitteln kann, wozu das ganze eigentlich gut ist.


    Gruss

    René

    Hallo nische,


    sicher sind deine Beiträge hier erwünscht. Sie sind eine echte Bereicherung für das Forum. Es muss sich nicht immer um Arduino & Co. handeln!


    Das Forum ist noch recht klein, deshalb dauert es manchmal eine Weile, bis eine Reaktion kommt. Du kannst aber sicher sein, dass die Beiträge gelesen werden.


    Gruss

    René

    Hallo Patrick,


    damals war es doch sehr oberflächlich. Ich nehme an, dass auf Grund des damaligen Video kaum jemand in der Lage gewesen wäre, eine eigene Bibliothek zu schreiben. Diesmal gehen wir mit der Vererbung doch ein ganzes Stück weiter.


    Gruss

    René

    Hallo zusammen,


    ihr seid wieder einmal etwa 4 Lektionen voraus:)!


    Code in .h - Files zu schreiben ist eigentlich unschön, aber für den Anfang wesentlich einfacher. Was man NIE tun sollte, ist eine zweite .ino - Datei zu verwenden. Das entfernt man sich soweit von den normalen C++ - Mechanismen, dass es früher oder später zu Problemen kommt.


    Die .h - Datei wird in den Quellcode des Sketches eingebunden und hat über diesen Zugriff auf Arduino.h. Deshalb muss bei meinen einfachen Beispielen in der .h - Datei Arduino.h nicht inkludiert werden.

    Die .cpp - Datei mit der dazugehörigen .h - Datei wird (sehr vereinfacht gesagt) unabhängig vom Sketch übersetzt und später dazugelinkt. Bei diesem Vorgang ist Arduino.h unbekannt und muss daher explizit in die .h - Datei inkludiert werden.


    Arduino.h stellt eine Menge Makros und Klassen zur Verfügung, ohne die viele Arduino - Befehle nicht funktionieren.


    Gruss

    René