PiCameraMMALError: Failed to enable connection: Out of resources

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Moin,


    ich bin derzeit dabei ein Script zu schreiben, welches alle 10 Sekunden ein Bild mit dem Camera-Module macht.

    Dabei habe ich, dass jetzt so gemacht, dass es eine Datei gibt, die NUR das Foto schießt (raspberryIO.py) und zusätzlich noch eine Datei (runRaspberryIO.py), die durchgehend im Hintergrund läuft und alle 10 Sekunden raspberryIO.py aufruft.


    Ich habe das erstmal so eingestellt, dass jede 10 Sekunden ein Foto geschossen werden soll. Allerdings wird nur das erste Foto geschossen und danach kommt folgender Fehler:

    Was kann ich gegen diese Fehlermeldung tun? Ist es überhaupt nötig in der raspberryIO.py file sleep(2) zu machen ebenso wie camera.start_preview()? Oder würde da camera.capture() komplett ausreichen?


    :danke_ATDE:Schon mal vorraus! :)

    Edited once, last by Gurke89 ().

  • Der Fehler liegt ziemlich sicher daran, dass du die Kamera andauernd wieder aufmachst, und da irgendwas nicht aufgeraeumt wird. Mach die Kamera *EINMAL* auf, und schedule dann nur das schiessen eines Bildes.

  • Der Fehler liegt ziemlich sicher daran, dass du die Kamera andauernd wieder aufmachst, und da irgendwas nicht aufgeraeumt wird. Mach die Kamera *EINMAL* auf, und schedule dann nur das schiessen eines Bildes.

    Okay, meinst du damit auch das ich die Kamera so gesehen nicht schließe? Also das am Ende noch sowas wie camera.stop_preview() oder camera.stop() fehlt?
    Da ich auch nicht 100% in Python drinnen bin, wie ist das genau, wenn ich Dateien importiere wie from raspberryIO import captureImage, wird dann da trotzdem oben der Code ausgeführt wie bspw camera = PiCamera() ?

  • Da du deinen Code nicht als Code formatiert hast, kann ich nicht sagen, was da wann laeuft. Weil die Einrueckungen fehlen.


    Und ja, ich meine, dass das permanente schliessen und oeffnen ein Problem ist.

  • Ok.
    Hier ist der Code nochmal richtig:


    Code: runRaspberryIO.py
    import schedule
    import time
    from raspberryIO import captureImage
    
    schedule.every(10).seconds.do(captureImage)
    
    while 1:
        schedule.run_pending()
        time.sleep(1)
  • In dem raspberryIO steht der Code in einer Funktion. Was gut ist. Aber dadurch laeuft er NICHT beim import. Und das ist auch gut so, oder wuerdest du wollen, dass eine Funktion, die potentiall zB deine Festplatte leert, automatisch aufgerufen wird?


    Damit hast du nun aber ein Problem: du musst, um meinen Vorschlag umzusetzen, die Initialisierung der Camera von der Benutzung trennen.


    Der einfachste Weg besteht darin, zwei Funktionen zu haben. Eine setup_camera, die die Kamera erzeugt und konfiguriert, und das Kamer-Objekt zurueck gibt. Und eine take_picture, welche die Kamera als Argument bekommt, und damit dann arbeitet.


    Die Alternative ist, eine Klasse zu schreiben.

  • Ok. Alles klar, dass klingt schon ziemlich logisch. Ich werde mich da mal dran versuchen und werde mich hier nochmal melden. Schon mal vielen Dank! :)

  • Wo sind die 30 Min in runRaspberryIO.py?

    Die 30 Minuten habe ich erstmal noch nicht eingestellt. Weil sonst müsste ich ja jedes Mal 30 Minuten warten :D, deshalb habe ich erstmal 10 Sekunden genommen.

    Ich habe das erstmal so eingestellt, dass jede 10 Sekunden ein Foto geschossen werden soll.

  • Also camera.stop_preview() und camera.close() (nicht stop!) kannst du wohl noch ergänzen und die Preview wird nur benötigt, damit der Sensor sich richtig einstellen kann. Ein Foto macht er auch ohne Preview.

  • Also ich habe das jetzt folgendermaßen gemacht:


    Python: runRaspberryIO.py
    import schedule
    import time
    from raspberryIO import takeImage
    
    schedule.every(10).seconds.do(takeImage)
    
    while 1:
        schedule.run_pending()
        time.sleep(1)

    Da kommt jetzt immer der PanicKernel Error:

  • Weil deine Datei runRaspberryIO.py nicht raspberryIO.py aufruft, wie es ganz oben im Beschreibungstext steht. Da bin ich noch etwas verwirrt.

    Das Problem ist bei

    Code
    schedule.every(10).seconds.do(takeImage)

    das ich bei dem do() nur eine Funktion übergeben kann..

  • Das macht doch nix besser. captureImage macht doch immer noch das setup JEDES EINZELNE MAL. Das ist doch genau das Ziel, das NICHT zu tun.


    captureImage muss camera ALS ARGUMENT bekommen. Und in runRaspberryIO.py muss erst EINMAL die Kamera angelegt werden, und dann JEDES MAL ubergeben werden, wenn caputerImage aufgerufen wird.


    takeImage ist voellig sinnlos.


    Jetzt erst die zweite Frage gesehen. Steht in der Doku wie das geht: https://schedule.readthedocs.i…ments-to-the-job-function

  • Okay, meinst du damit auch das ich die Kamera so gesehen nicht schließe? Also das am Ende noch sowas wie camera.stop_preview() oder camera.stop() fehlt?
    Da ich auch nicht 100% in Python drinnen bin, wie ist das genau, wenn ich Dateien importiere wie from raspberryIO import captureImage, wird dann da trotzdem oben der Code ausgeführt wie bspw camera = PiCamera() ?

    Sorry Trite, ich wollte dich nicht verwirren. Probiere es ruhig mit der alten Variante mit camera.stop_preview() und camera.close() am Ende. Wie ich das sehe hattest du "camera.stop()" geschrieben, was falsch ist.

  • Mein Verständnisproblem hier ist gerade mit Python, wie soll die Methode captureImage, dass zurückgegebene PiCamera Objekt aus setupCamera bekommen? Ohne das in irgendeiner Form setupCamera() in captureImage aufgerufen wird?


    Hier mein Code:


    Da ist jetzt das Problem, dass folgender Fehler kommt:

    Code
    TypeError: the first argument must be callable


    Mein Problem ist "camera" ist doch aufrufbar oder bin ich blöd?

  • Du hast es jetzt komplett doppelt offen, die Camera kannst du aber nur einmal einbinden. Wie gesagt, mach es wie dein erster Vorschlag war und probiere die Camera am Ende sauber zu schließen mit camera.stop_preview() und camera.close(). Ansonsten habe ich auch keine weitere Idee.


    Viele Grüße,

    Tigerbeere

  • Ich habe dir die Frage wie du das Objekt übergeben kannst beantwortet. Bitte den link studieren.