SSTV mit ESP32-Cam

  • Hallo,


    dies ist mein erstes Lebenszeichen in diesem Forum.

    Zunächst eine kurze Vorstellung: Ich bin zwar kein Amateurfunker, sondern nur ein ehemaliger CB-Funker (Libelle-09 war mein damaliges Rufzeichen), der seit den 80er Jahren immer wieder einmal damit geliebäugelt hat, die C-Prüfung zu machen, und dann doch nicht das dafür notwendige Engagement aufgebracht hat.
    Mit Elektronik beschäftige ich mich schon seit Mitte der 70er, zunächst mit KOSMOS-Elektronik-Experimentierkästen, später mit selbstgestrickten Schaltungen, erste Software-Programme habe ich Anfang der 80er geschrieben. Inzwischen beschäftige ich mich viel mit Arduino, neuerdings mit ESP32 und jetzt ganz neu mit der ESP32-Cam.


    Im Internet habe ich ein Projekt entdeckt, in dem mit einer ESP32-Cam ein Bild in ein SSTV-Signal umgewandelt werden kann. Ein dänischer Amateurfunker (OZ5DZL) hat das auf seiner Internetseite vorgestellt: https://blog.dzl.dk/2022/09/14/stand-alone-sstv-camera/

    Seine Software ist auf die Betriebsmodi Robot8 und Martin1 beschränkt.


    Ich würde gerne statt Martin1 den wesentlich schnelleren Robot36-Modus benutzen, habe aber einen (oder mehrere :/ ) Fehler in meinem Code, so daß die Bildübertragung von MMSSTV nicht erkannt wird.
    Auf die Modi Martin2 und Robot12 konnte ich die Software bereits erfolgreich erweitern, aber an Robot36 beiße ich mir die Zähne aus.


    Leider reagiert der Entwickler des Projekts nicht auf Kommentare in seinem blog, so daß ich keinen Kontakt mit ihm aufnehmen kann.


    Jetzt hoffe ich darauf, daß jemand aus diesem Forum, der Arduino (also C++) programmiert, so freundlich ist, und einmal über mein Programm schauen kann, wo der bzw. die Fehler liegen könnte(n).


    Es wäre sehr freundlich von Euch, wenn Ihr mich bei meinem Problem unterstützen würdet.


    Ich würde mich sehr freuen!


    Viele Grüße,

    Libelle-09


    P.S. Diesen post habe ich von der Arbeit aus geschrieben, den Source-Code werde ich von zu Hause aus nachliefern.

  • Hallo Libelle-09,


    schon mal da nachgesehen?


    73 de dl5sdc

    Günter


    P.S.:

    Antwort von ChatGPT :) ;)


    "I'm sorry, as an AI language model, I don't have the ability to browse the internet or access specific source code files unless they have been previously stored in my memory during my training.


    However, if you're looking for SSTV Robot 36 C++ source code, I suggest searching for it on code sharing platforms such as GitHub or GitLab, or asking in forums dedicated to SSTV and/or programming. You might be able to find someone who has already written or can help you write the code you need."

  • Hallo Libelle,


    danke für Deine Vorstellung und den Hinweis auf ein schönes Bastel-Projekt. Wie es der Zufall so will habe ich so ein ESP32-CAM Modul auf dem Schreibtisch liegen und mache damit erste Gehversuche. SSTV könnte ich damit mal ausprobieren.


    Zu Deinem C++ Code kann ich nichts beitragen, dazu fehlt mir die Tiefe und Übung in der Programmierung. Es gibt aber evtl. hier im Forum Funkfreunde, die da etwas trittfester sind als ich das jemals sein könnte. Lass' uns in jedem Fall mal an Deinen Erfolgen (und gerne auch an den Misserfolgen) teilhaben. SSTV ist ja sehr schön zum Herzeigen, auch wenn Du vielleicht noch nicht auf dem AFU-Bändern senden kannst.


    In jedem Fall wünsche ich Dir genug Motivation, Dir endlich mal selbst den Wunsch nach dem Rufzeichen zu erfüllen. Beste Voraussetzungen bringst Du in jedem Fall mit.


    Viel Spass beim Basteln mit Mikrocontrollern und Kameras


    Michael / dk7ux



    PS: Verrate uns doch mal Deinen Vornamen, das ist persönlicher.

  • Hallo Funkfreund,


    willkommen im Forum und weiterhin viel Spass beim Basteln mit der Technik und allem, was dazugehört.

    73 Michael, DF2OK.

    ~ AFU seit 1975 ~ DARC ~ G-QRP-Club ~ DL-QRP-AG ~ AGCW ~ FISTS ~ QRPARCI ~ SKCC ~

    "Wir müssen uns vor der Klimaerwärmung nicht fürchten. Uns rottet die soziale Kälte viel früher aus."

  • Hallo,


    vielen Dank für Eure Antworten!


    Gestern Nacht habe ich es endlich geschafft. :) :) :)

    Es ist zum Haare-Ausraufen!

    Mein Programm-Code war fehlerfrei, jedoch der Arduino Editor hat meine Zeile


    pixel_time = 88 / 320;


    irgendwie nicht rechnen wollen.
    Statt der vorgesehen 36 Sekunden hat die ESP32-Cam immer nur ca 10 Sekunden Töne erzeugt, egal wie ich meinen Code modifiziert hatte.


    Als ich mir zum 100. Mal sicher war, daß mein Programm eigentlich funtionieren muß, habe ich in meiner Verzweiflung angefangen zu Experimentieren und einfach feste Werte eingegeben, bis RX-SSTV endlich ein Bild decodieren konnte. Und was soll ich sagen, bei 0,12 hatte ich erstmals ein sichtbares Bild mit halber Breite, und bei 0,275 funktionierte es endlich. Und was ergibt 88/320? 0,275!


    Egal wie ich die Zeile umformuliert habe, ob es


    pixel_time = (88 / 320);


    oder was auch immer, es funktionierte nicht.


    Nur mit festem Wert, oder wenn ich die Variablen


    visible_pixels_time und width benutzt habe, also


    pixel_time = visible_pixels_time / width;


    Um das zu herauszufinden, habe ich mehr als eine Woche vergeblich einen Fehler in meinem Programmcode gesucht. :cursing:

    Aber dafür läuft es jetzt wie am Schnürchen!


    73,

    Libelle-09 (Markus)

  • als die Zeit für einen einzelnen Pixel, also bei Robot36 in der Zeile Y-Signal 88/320=0,275 :|

    und 44/320=0,1375 für einen Pixel in der Zeile RY und BY.

    Und genau so hatte ich es, nur nicht als Variable, sondern als Zahl der Gesamtzeit für eine Zeile geteilt durch die Zahl der Pixel.

  • Moin,


    Max meint wohl eher den Typ, also int, float, double usw. Float sollte es schon sein.


    Ausserdem ist das nicht der Arduino Editor, sondern der avr-gcc Compiler, der dort rechnet. Durch den Optimizer sogar vorab, da zwei Festwerte dividiert werden. Das bedeutet, der Compiler rechnet nicht jedesmal neu, wenn pixel_time im Programm auftaucht, sondern tauscht den Wert in Deinem Programm, so wie Du es programmiert hast, gegen 0 aus. Das Ergebnis wird selbst bei float immer 0 sein, weil der C-Compiler hier die Division ohne Dezimalpunkt als Integer-Werte betrachtet. Deswegen funktioniert das, wenn Du statt der fixen Zahlenwerte Variablen schreibst, dann betrachtet der Compiler das nicht mehr als Konstante.


    Wenn Du es so schreibst, geht es auch, weil es dann zwei float Werte sind:


    float pixel_time;

    pixel_time = (88.0/320.0)


    Und dann kommt da auch 0.275 bei raus. Grundlagen C Programmierung oder hier ;)


    73, Tom

    DL-QRP-AG #1186|G-QRP #14624|FISTS #15933|SKCC #13896|LIDS #88

    https://isnix.de * Life is too long for QRO * Ep. III 2L DCC

    Edited 4 times, last by DL7BJ ().

  • Hallo Markus,


    Tom hat es bereits auf den Punkt gebracht:

    Das Ergebnis wird selbst bei float immer 0 sein, weil der C-Compiler hier die Division ohne Dezimalpunkt als Integer-Werte betrachtet.

    Da Zähler und Nenner int sind, setzt der Compiler/Parser Integer-Division, das unmittelbare Ergebnis ist 0. Erst bei der Zuweisung an pixel_time wird die 0 auf float gecastet.


    Wenn Du alternativ die Zeile als


    pixel_time = (float)88/(float)320;


    schreibst, oder mindestens in der Form


    pixel_time = (float)88/320;


    kommst Du ebenfalls zum gewünschten Ergebnis. Da die 88 auf float gecastet wird, wird Float-Division erzwungen, wodurch implizit auch die 320 auf float gecastet wird.


    vy73

    Thilo

  • Moin,

    pixel_time = (float)88/(float)320;

    jo, in C führen besonders viele Wege nach Rom! Man könnte auch bei Festwerten mit Konstanten oder gar einem #define arbeiten (nicht so schön). Ich habe mir schon in den 80ern angewöhnt (damals mit dem Amiga oder Turbo C unter DOS), bei float grundsätzlich die Zahlen mit Dezimalpunkt zu schreiben, .0 ist auch kürzer als (float) ;)


    73, Tom

    DL-QRP-AG #1186|G-QRP #14624|FISTS #15933|SKCC #13896|LIDS #88

    https://isnix.de * Life is too long for QRO * Ep. III 2L DCC

  • Die casts waren, um auf Typinferenz einzugehen. Im Code nutze ich in so einem Fall den f suffix, um die Konstante explizit als float zu definieren.


    vy73

    Thilo


    p.s.: I <3 c ;)

    1.0f*(((((1<<2)|1)<<1)|1)<<3)/(2^5*0xa)

  • Hallo,


    vielen Dank für Eure Tipps!


    Wie geschrieben funktioniert Robot36 jetzt.


    Als nächstes Projekt würde ich gerne den Modus Fast-FM programmieren, nur finde ich nirgendwo Informationen, wie das Signal codiert ist.

    Weiß zufällig jemand von Euch etwas darüber?


    73,

    Markus

  • Hallo Günter,


    Danke für den Link! Ich interessiere mich seit den 90ern für SSTV und Fax, aber dieses Buch kannte ich noch nicht. Und jetzt kann man es sogar gratis downloaden. Danke an den Autor und für den Hinweis.


    markus: Ich fürcht nur, daß der Modus Fast-FM in freier Wildbahn so gut wie nicht (mehr) verwendet wird.


    73

    Marcus