Bohrmaschine für Löcher in PVC-Rohr mit Lego Technik und Proxxon

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Liebes Raspberry-Pi Forum,

    ich habe mit Lego-Technik ein Gerät gebaut, um (in definierten Abständen) parallele Löcher in ein 22 20 mm PVC-Rohr zu bohren (wird als Boom für eine Yagi-Antenne benötigt). Ursprünglich hatte ich reinen "Handbetrieb" vorgesehen, bis ich sowohl für den Rohrvorschub, als auch für den Horizontalbohrer eine Motorsteuerung nachrüstete. Wäre doch toll, das ganze mit dem GPIO meiner Himbeere zu steuern, dachte ich. :s Anbei zwei Fotos!

    Mein größtes Problem ist gerade, mich überhaupt mal für eine Programmiersprache zu entscheiden (Python, php oder c, wobei ich zu Python tendiere) und vor allem die Umdrehungen des Motors für den Rohrvorschub zu zählen, bzw. wie dies in den genannten Programmiersprachen realisiert werden kann. Elektronisch habe ich das über eine rote LED und einen Fototransistor gelöst, dazwischen dreht sich auf der Motorachse eine Lochradscheibe mit 2 Löchern. Im Oszilloskop bekomme ich je Umdrehung zwei spitze, dreieckige Pulse angezeigt. Bei 3V am Fototransistor wird der Schwellwert für High/Low deutlich über- bzw. unterschritten, sagt das Voltmeter. Wie können die einzelnen Peaks gezählt werden? Auch wenn sie relativ schmal sind, wäre es gut wenn beim Wechsel von Low auf High (oder umgekehrt, ist wurscht) der Umdrehungszähler um 0,5 erhöht wird. Wenn ein bestimmter Wert erreicht ist, der dem jeweiligen Ziel-Vorschub entspricht wird der Motor wieder gestoppt, der Zähler auf 0 zurückgesetzt und die Bohrsequenz gestartet (Bohrer vor und zurückfahren steuert der Code Pilot von Lego, Bohrer an/aus geht über 230V-Relais an Transistor an GPIO-Out). Elektrotechnisch habe ich so weit alles im Griff. Mein Problem ist wie gesagt die Sache mit dem Umdrehungszähler.

    Viele Grüße aus Karlsruhe
    Michael

  • Bohrmaschine für Löcher in PVC-Rohr mit Lego Technik und Proxxon? Schau mal ob du hier fündig wirst!


  • Im Oszilloskop bekomme ich je Umdrehung zwei spitze, dreieckige Pulse angezeigt. Bei 3V am Fototransistor wird der Schwellwert für High/Low deutlich über- bzw. unterschritten, sagt das Voltmeter. Wie können die einzelnen Peaks gezählt werden? Auch wenn sie relativ schmal sind, wäre es gut wenn beim Wechsel von Low auf High (oder umgekehrt, ist wurscht) der Umdrehungszähler um 0,5 erhöht wird.


    Wieso die Impulse nicht über einen Schmitt-Trigger laufen lassen und dann per pollendem GPIO abtasten? Oder Du nimmst einen AD-Wandler und liest das Analogsignal ein. Dann hast Du es selbst in der Hand den Level der Triggerschwelle einschließlich Hysterese zu setzen. Die Frequenz der Impulse und deren Breite spielt natürlich auch eine Rolle...


  • Wieso die Impulse nicht über einen Schmitt-Trigger laufen lassen und dann per pollendem GPIO abtasten? Oder Du nimmst einen AD-Wandler und liest das Analogsignal ein. Dann hast Du es selbst in der Hand den Level der Triggerschwelle einschließlich Hysterese zu setzen. Die Frequenz der Impulse und deren Breite spielt natürlich auch eine Rolle...

    Hallo schnasseldag, Danke für Deine Antwort! Schmitt-Trigger oder AD-Wandler schön und gut, aber schaltungstechnisch würde ich es doch gerne so einfach wie möglich halten :thumbs1:
    Ich habe jetzt ein Foto vom Spannungsverlauf gemacht und angefügt. Die Drehzahl liegt im Bereich 60-70/s Damit ein Puls nicht doppelt gezählt wird, müsste ich doch nach jedem detektierten Signal beim Polling eine Pause von ca. 4 ms einlegen (im Display ist ein Raster = 1ms), damit die Spannung auf jeden Fall wieder auf low gesunken ist, oder?

  • Hallo michi,


    aber schaltungstechnisch würde ich es doch gerne so einfach wie möglich halten


    naja, schaltungstechnisch einfacher als ein Schmitt-Trigger geht eigentlich nicht. Aber nix für ungut. :)

    Die Drehzahl liegt im Bereich 60-70/s Damit ein Puls nicht doppelt gezählt wird, müsste ich doch nach jedem detektierten Signal beim Polling eine Pause von ca. 4 ms einlegen (im Display ist ein Raster = 1ms), damit die Spannung auf jeden Fall wieder auf low gesunken ist, oder?


    Naja, eine Pause würde ich (freiwillig) beim Polling (zunächst) nicht unbedingt einlegen (es sei denn, Du hast ggf. auch hier schon 2 Ecken weitergedacht). Warum warten und nicht einfach das Signal abtasten und nur bei Veränderung "reagieren"? Dennoch, Deine minimale Pulsbreite liegt bei 2ms. D.h. Du müßtest mit 1ms abtasten, um auf der sicheren Seite zu liegen, so es Dir nur auf das Zählen der Pulse ankommt. Aus praktischer Erfahrung kann ich Dir sagen, daß Du das (mittels Raspbian) zu 99,x% hinbekommen wirst (den Link hast Du vermutlich schon gelesen - falls nicht, so wäre jetzt ein guter Zeitpunkt dafür :) ). Wenn das reicht, und Fehlerfortpflanzung (zeitweilig verlorene Impulse) keine Rolle spielt, dann ist das Problem erledigt. Falls nicht, so heißt Dein Freund "µC". Laß einen Atmega die "Drecksarbeit" des Zählens/Stoppens erledigen und kommuniziere mit diesem per Raspi (o.ä.). D.h. Du sagst dem µC "Fahre soundsoviele Impulse weiter und stoppe". Ein wenig mehr Hintergrundinfo findest Du auch noch hier.

    Schöne Grüße

    schnasseldag

  • Hallo schnasseldag,

    danke fürs Feedback! Das Signal abtasten finde ich insgesamt etwas ungeeignet (verlorene Pulse sorgen laut meiner Rechnung aber nur für eine Ungenauigkeit von 13 µm). Was für eine Flankensteilheit wird denn bei GPIO.wait_for_edge benötigt? Ist mein Signal dafür ausreichend (von low auf high innerhalb 1 ms), oder sollte ich das besser mit Komparator oder Schmitt-Trigger "rechteckisieren"? Bzw. was spricht überhaupt gegen wait_for_edge. Kann man bei dieser Frequenz überhaupt noch damit arbeiten, oder ist das eher für Schalter/Taster gedacht?

    Viele Grüße
    Michi


  • Was für eine Flankensteilheit wird denn bei GPIO.wait_for_edge benötigt? Ist mein Signal dafür ausreichend (von low auf high innerhalb 1 ms), oder sollte ich das besser mit Komparator oder Schmitt-Trigger "rechteckisieren"?


    Die benötigte Flankensteilheit wird von der Hardware definiert, nicht von der Software. Leider sagt das Broadcom Datenblatt (ich kenne nur eines) nichts darüber aus, auch nicht über allfälligen Hysteresen. Im Zweifelsfall nimmst Du ein Poti und mißt sie an einigen GPIO's aus. Dann hast Du experimentelle Klarheit darüber, was die Dokumentation nicht verrät.


    Kann man bei dieser Frequenz überhaupt noch damit arbeiten, oder ist das eher für Schalter/Taster gedacht?


    Das nun liegt an der Implementierung der Funktion (Ich nehme mal an, zu zielst auf Python ab?) und dem Schedulingmodell. In C (und vermutlich auch in vielen anderen Sprachen) wird es Dir sicherlich gelingen, (kurzfristig) Abtastungen weit unter einer ms zu realisieren. Allerdings werden dortige Runtime-Implementierungen, welche Dir Callbacks der Art "Event" zur Verfügung stellen, auch nur einen Thread bemühen, der im Hintergrund den GPIO pollt. Ob Du das nun selbst machst, oder Dich auf jemand anderen verläßt, ändert an der Güte des Ergebnisses mit hoher Wahrscheinlichkeit nichts.
    Dennoch würde meine Empfehlung bei 1ms Pulsbreits lauten - vergiß den Pi zur Lösung dieser Aufgabe und kauf Dir für 3€ einen Arduino (Nano), der Dir die Low-Lovel Fahrbefehle abnimmt. Mit dem kann Dein Pi dann serielll kommunizieren. Wenn Du ein Auto brauchst, dann kaufst Du Dir ja auch keine Yacht und ziehst sie mit der Sackkarre durch die Gegend.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!