selbstgeschriebenes Skript bringt Pi zum Abstürzen

  • Hallo zusammen,


    anbei der Code für einen GCode Interpreter, der theoretisch 4 Motoren "gleichzeitig" steuern kann (3D + 4. Motor). Ich komme direkt zu meinem Problem:
    Wenn ich eine GCode Zeile habe, die zum Beispiel so aussieht: "G1 X67 Y67 E20.1 F7800", dann rechnet mein Pi das runter und steuert die 3 Motoren "gleichzeitig" (leider langsamer, als ich es erwarten würde, weiß noch nicht genau, warum. Vielleicht, weil es ja nur "mehr oder weniger" gleichzeitig ist...)


    Wenn nun eine GCode Zeile folgendermaßen ausschaut: "G1 X92.150 Y93.154 F7800.000", dann stürtzt der Pi ab. Ich weiß nicht genau, was er dann macht (Power LED + WLAN Stick leuchten beide noch), allerdings rührt sich kein Motor und WinSCP und Putty sagen beide, dass der Pi nicht mehr erreichbar wäre.
    Manchmal fängt er sich wieder (hat scheinbar von selbst das Python-Skript abgebrochen) und ist wieder erreichbar, manchmal hilft nur vom Netz nehmen und neu anschließen.


    Mein Frage nun: Warum ist das so, was kann ich dagegen unternehmen? ;)


    Falls Fragen auftauchen, antworte ich natürlich sehr gern :)
    Vielen Dank schon mal für Eure Ideen, Tipps.


    VG


    elchico



    Hinweis: die Funktion IJPosition funktioniert noch nicht.





  • Stromversorgung der Motoren über eigene Stromquelle (5 V, 3.5 A => ausreichend).
    Stromversorgung vom Pi: 5 V, 1 A


    Wo finde ich den Errorlog?



    Syslog (auf heute begrenzt):


    Edited once, last by elchico ().

  • Hallo Elchico,


    wie sieht denn Deine Schaltung aus?


    Hast Du an die Freilaufdioden gedacht?


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Quote


    Jun 9 14:14:40 raspberrypi kernel: [ 82.645817] Out of memory: Kill process 2323 (sshd) score 1 or sacrifice child
    Jun 9 14:14:40 raspberrypi kernel: [ 82.645837] Killed process 2323 (sshd) total-vm:9264kB, anon-rss:8kB, file-rss:4kB
    Jun 9 01:20:01 raspberrypi kernel: imklog 5.8.11, log source = /proc/kmsg started.


    Kann es sein das du SWAP ausgeschaltet hast?
    Beobachte mal den RAM Verbrauch, evtl. hängt es damit zusammen

  • Andreas:
    Nein, bisher habe ich noch keine verbaut. Leider weiß ich nicht, wie ich dir die Schaltung aufmalen kann, deswegen eine kurze Beschreibung:
    Ich habe alle benötigten Pins (im Python Skript unter der Funktion "parameter") auf ein Steckbrett per Steckbrücken geschaltet und von dort wiederum mit Steckbrücken an die entsprechenden Pins der Motoren. Stromversorgung läuft vom Netzteil auf das Steckbrett und dort per Parallelschaltung an die einzelnen Motoren. Außerdem habe ich eine LED parallel geschaltet, um eine visuelle Rückmeldung zu haben, ob Strom fließt oder nicht (als Überprüfung für mich, damit ich nicht bastle, wenn der Strom noch drauf ist).


    meigrafd:
    Hatte Swap nicht ausgeschaltet, habe es jetzt allerdings auf 1024 MB vergrößtert. Habe hierüber (http://jankarres.de/2013/11/ra…rpi-monitor-installieren/) ein Monitor installiert und darüber den RAM beobachtet.
    Ergebnis: er bleibt bei 67 mm bei ca. 13 %, schießt bei 93 mm auf 95 % (+ Swap Auslagerung). Habe das Skript jetzt, obwohl der Pi sich scheinbar aufhang, laufen lassen (5 min) und siehe da, er hat sich wieder gefangen. Allerdings werden die Motoren nicht flüssig angesteuert (ich nehme mal an, dass das an der hohen RAM Auslastung liegt).


    Weiß jemand, woran es genau liegt, dass die Auslastung bei 93 so in die Höhe schießt, bei 67 allerdings bei 13 % liegt?



    VG und danke schon mal!
    elchico

  • Hallo Elchico,



    Andreas:
    Nein, bisher habe ich noch keine verbaut. Leider weiß ich nicht, wie ich dir die Schaltung aufmalen kann, deswegen eine kurze Beschreibung:
    Ich habe alle benötigten Pins (im Python Skript unter der Funktion "parameter") auf ein Steckbrett per Steckbrücken geschaltet und von dort wiederum mit Steckbrücken an die entsprechenden Pins der Motoren. Stromversorgung läuft vom Netzteil auf das Steckbrett und dort per Parallelschaltung an die einzelnen Motoren. Außerdem habe ich eine LED parallel geschaltet, um eine visuelle Rückmeldung zu haben, ob Strom fließt oder nicht (als Überprüfung für mich, damit ich nicht bastle, wenn der Strom noch drauf ist).


    handelt es sich bei der Stromversorugung des Rapberry Pi und der Motoren um ein un dieselbe?


    Motoren ohne Freilaufdioden zu betreiben ist grob fahrlässig, da eine nicht unerhebliche Rückspannung induziert wird, die die angelegte Spannung um ein Vielfaches übertreffen kann - das heißt bei jedem Umpolen bekommt der Rapberry Pi seine Packung ab. Und vehält sich entsprechend.



    Beste Grüße



    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Andreas:
    Nein, ist nicht dieselbe Stromversorgung: Motoren über 5 V und 3.5 A und Pi über 5 V und 1 A. Die Schutzdioden werde ich einbauen :)




    Ich habe inzwischen das Skript auch mal laufen lassen, ohne dass die Motoren am Strom angeschlossen waren (also alle Pins etc ganz normal aktiviert etc, aber einfach die Stromversorgung der Motoren weggelassen) und auch hier schießt der RAM Verbrauch auf 95 %.


    Damit denke ich, ist es ein Rechenproblem Software-seitig, oder? Allerdings ist der Anstieg von 67 mm (13 %) auf 93 mm (95 % + SWAP) enorm. Bei weniger als 67 mm sinkt die RAM Auslastung nur geringfügig.
    Aber wo in meinem Skript ist eine solche Rechenpower nötig?



    VG und danke nochmals.


    elchico

  • [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Ich habe aber, denke ich, das Problem gefunden. Das Problem ist die "control" Funktion.[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]In dieser arbeite ich zwar auch vieles mehrfach ab, aber das Hauptproblem dafür, dass der Computer in die Knie geht, ist folgendes: Ich suche die kleinste Zahl x, die durch alle drei vorgegebenen Längen (im unteren Code: a, b, c) teilbar ist. Dann iteriere ich von 1 bis x und immer, wenn x durch eine der drei Längen teilbar ist, macht dieser Motor einen Schritt. Außerdem soll nur dann eine bestimmte Zeit gewartet werden, falls überhaupt mindestens ein Schritt gemacht wird. Andernfalls soll einfach weiter iteriert werden.[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Das funkioniert ganz gut, wenn die Längen irgendwie gut miteinander korrelieren (alle 67 oder 67 und 33.5 etc). Falls aber zum Beispiel 67 und 66 auftaucht, muss der Computer 4422 (kleinste gemeinsame Zahl) finden und von 1 iterieren, weswegen er hier leistungstechnisch in die Knie geht (bei größeren Zahlen oder 3 Zahlen noch viel eher...).[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Zusammenfassung: Das Problem ist zum einen das Suchen von "x" (wobei das sehr sehr lange dauern...), und auch das iterieren bis x. Gibt es hierfür eine schnellere Lösung?[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]VG[/font]
    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]elchico[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]PS: ich habe einen Code geschrieben, der genau das gleiche macht wie der in meinem Skript unten, nur etwas übersichtlicher ist.[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]

    Code
    import time[/font][/size][/color]   a = 67b = 1c = 68def LCM(a,b,c):                                #gibt kleinste Zahl zurueck, die durch a, b und c teilbar ist   lst = [a,b,c]   sorted(lst)   if 0 in lst:       lst[lst.index(0)]=1   print lst   a = lst[0]   b = lst[1]   c = lst[2]   d = c   while d%a != 0:       d=d+b   e = d   while d%b != 0:        #and c       e=e+d       print e   return ecommon_number = LCM(a,b,c)a_step = common_number/ab_step = common_number/bc_step = common_number/cprint common_numberfor i in range (1, common_number+1):             #pruefen, ob kleinste Zahl durch a und/oder b und/oder c teilbar ist   m = 0                                        #falls kleinste Zahl durch mindestens eine der drei Zahlen (a,b,c) teilbar ist => warte 1 sek   if (i % a_step) == 0:       print "a"       m = 1   if (i % b_step) == 0:       print "b"       m = 1   if (i % c_step) == 0:       print "c"       m = 1   if m == 1:[color=#323d4f][size=12][font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]       time.sleep(1)

    [/font][/size][/color]

  • Hallo Elchico,


    na für die Berechnung des kgV (kleinstes gemeinsames Vielfaches) gibt es aber Algorithmen, die in wenigen Schritten zum Ziel führen.


    Zum Beispiel der hier für die Programmiersprache C:




    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().