4 Ultraschallsensoren?

  • Liebe Community,

    ich würde gerne 4 Ultraschallsensoren an meinen Pi anschließen und alle benutzen können. Diese sollen mehrmals pro Sekunde die Entfernung überprüfen (Signal aussenden, auffangen und dann über mein Script berechnen). Meine Frage nun ist eig. ob mir dafür jemand einen Schaltplan zeichnen kann bzw. mir sagen kann, wie ich das anstellen kann. Desweiteren müssten noch 1 Temperatursensor und noch weitere Komponenten untergebracht werden (sofern möglich).

    Ich habe lediglich diesen Thread gefunden: Entfernungsmessung mit Ultraschall
    Dort sind im Anhang 2 Bilder, jedoch nur für einen Sensor...

    Wie kann ich das machen (ich habe einen T-Cobbler und ein Steckbrett). Wäre jemand so freundlich und könnte mir einen Schaltplan zeichnen (nur Ultraschallsensoren)?

    MfG

  • Das wird dann aber eine enge Nummer, was die Anzahl der GPIOs und Deiner weiteren Komponenten angeht. Jedes der Module benötigt einen Anschluss an den Plus- und Minuspol der 5V Spannung des RasPi. Du kannst sie also alle parallel legen. Ich habe noch nie nachgemessen, wieviel so ein Modul braucht, aber sollte es zu Abstürzen oder Hängern im Betrieb kommen, musst Du den Strom vielleicht woanders her holen. Das wäre Plan B.

    Dann benötigt jedes der Module zwei GPIOs. Einen für das Trig Signal und einen für das Echo Signal. Ganz wichtig ist, dass Du jede der Schaltungen mit einer Pegelanpassung versiehst. Denn was von den Modulen kommt hat 5V, was der RasPi verträgt sind 3,3V. In der verlinkten Schaltung ist das durch einen Spannungsteiler gelöst worden. Der funktioniert sehr gut. Ich verwende ihn (mit etwas anderen Werten) auch in anderen Schaltungen.

    Einen Schaltplan benötigst Du also nicht. Du baust vier mal den Spannungsteiler an die vier Module und schließt diese an 4 x 2 GPIOs an. Die Stromversorgung kannst Du parallel legen - also Plus (rot) auf Plus auf Plus auf Plus auf Plus. Minus (schwarz) genau so.

  • Moin,

    na ganz so schlimm ist es imho wohl nicht. Die Stromversorgung über die GPIO-Leiste hängt davon ab, wie der RPi befeuert wird. Bekommt er seinen Saft von einem aktiven Hub über Rückeinspeisung, und stellt der genügend Leistung zur Verfügung, ist das erstmal kein Problem.
    Das Trigger-Signal kann man imho auch zusammen legen, also ein GPIO für vier Trigger.
    Bleiben noch vier IOs für die Echo-Signale.
    Insgesamt werden also nur fünf Pins benötigt ... geht doch ;) ...
    Die Schaltung kann einfach übernommen werden, allerdings halt quasi vervierfacht.

    cu,
    -ds-

  • Vielen Dank für eure Antworten. Das mit den Input GPIO's sollte kein Problem werden und ein GPIO als Trigger (wie dreamshader sagte) hatte ich sowieso vor, da ich sowieso alle 4 Signale brauche (1 mal losschicken und dann warten bis alle wieder da sind). Eine externe Stromversorgung wäre sowieso schon vorhanden für ein anderes Modul.

    MfG

  • Hallo,

    Zitat

    (1 mal losschicken und dann warten bis alle wieder da sind).

    Da wirst du wohl ein kleines Problem bekommen.
    Denn du musst ja nach dem Puls auf die positive Flanke, und dann eine Zeit starten und zählen bis zur negativen Flanke.
    Und das 4x gleichzeitig ?.
    Aber mach es anders (hab ich ebenso gelöst).
    Den Puls an alle 4 ist ok.
    Bei der Auswertung auf einen Sensor konzentrieren, und die anderen 3 ins "leere" laufen lassen. Dann den 2. usw.
    Du musst bis zum nächsten Puls allerdings so lange warten, bis auch der "lahm'ste" Sensor fertig ist.
    Also einfach nen kleinen timeout zw. 2 Pulsen.

    gruß root

  • Hallo root,

    ich dachte, dass ich das mit den Sensoren asynchron mache. Ich schicke das Signal gleichzeitig los und werte dann asynchron für jeden Sensor aus. Sobald alle fertig sind, arbeite ich dann mit den erhaltenen Centimeterwerten. Ist das nicht so gut oder gibt es da ein Problem mit der Zeitmessung?

    Btw., wenn wir schon beim Programmieren sind:
    Ich erhalte einen Fehler, wenn ich "" mache.

    Code
    IntelliSense: Das Argument vom Typ ""void (MODULE_ULTRASONIC::*)(int gpio, int level, uint32_t tick)"" ist mit dem Parameter vom Typ ""gpioAlertFunc_t"" inkompatibel.
    Code
    void MODULE_ULTRASONIC::receiveSignal(int gpio, int level, uint32_t tick)
    Code
    typedef void (*gpioAlertFunc_t)    (int      gpio,
                                        int      level,
                                        uint32_t tick);

    Kann mir jemand verraten, wieso?

    MfG

  • Hallo DaJuBi,


    ...
    Aber mach es anders (hab ich ebenso gelöst).
    Den Puls an alle 4 ist ok.
    Bei der Auswertung auf einen Sensor konzentrieren, und die anderen 3 ins "leere" laufen lassen. Dann den 2. usw.
    ...

    ich glaub, cleverer wäre es, auf die fallende Flanke eine ISR zu legen (Interrupt-Service-Routine).
    Bis Du nach der anderen Methode das letzte Signal hast, liegt Dein Roboter schon im Abgrund ;) ...

    Nix für ungut, root, aber das ist imho eher suboptimal ;) ...

    cu,
    -ds-

    Hi DaJuBi,


    ...
    Ich erhalte einen Fehler, wenn ich "" mache.

    Code
    IntelliSense: Das Argument vom Typ ""void (MODULE_ULTRASONIC::*)(int gpio, int level, uint32_t tick)"" ist mit dem Parameter vom Typ ""gpioAlertFunc_t"" inkompatibel.
    Code
    void MODULE_ULTRASONIC::receiveSignal(int gpio, int level, uint32_t tick)
    Code
    typedef void (*gpioAlertFunc_t)    (int      gpio,
                                        int      level,
                                        uint32_t tick);


    ...

    Mönsch, sei doch nicht so geizig mit Deinen sourcen ... hast Du da nicht ein bisschen mehr?
    Ich verstehe das wenn ich "" mache nämlich nicht.
    Da scheinst Du was in Anführungszeichen zu setzen ... aber was?

    cheers,
    -ds-

  • hi ds,

    Zitat

    ich glaub, cleverer wäre es, auf die fallende Flanke eine ISR zu legen (Interrupt-Service-Routine).
    Bis Du nach der anderen Methode das letzte Signal hast, liegt Dein Roboter schon im Abgrund Icon_wink ...


    ..ist korrekt, und eleganter.
    ...vor allen Dingen, wenn der Nachbrenner bereits gezündet ist ...:lol:


  • Hi DaJuBi,


    Mönsch, sei doch nicht so geizig mit Deinen sourcen ... hast Du da nicht ein bisschen mehr?
    Ich verstehe das wenn ich "" mache nämlich nicht.
    Da scheinst Du was in Anführungszeichen zu setzen ... aber was?

    cheers,
    -ds-


    Hey,

    ahh, tut mir leid, da wollte ich noch was reinkopieren ...

    Wenn ich "gpioSetAlertFunc(pin_in, receiveSignal);" mache :)

    MfG

  • Habe nun einfach ein Array erstellt, wo ich bei der Initialisierung eines Ultraschallmodules den Zeiger auf die Instanz der Klasse zwischenspeichere. Anschließend habe ich für jedes Modul nun eine eigene Funktion, die über das Array dann auf die receiveSignal-Funktion zugreift und die - an die "Zwischenfunktionen" übergebene - Parameter einfach weitergibt.

    Ist zwar nicht so schön, aber mir ist jetzt nichts eingefallen und ich sitze sowieso noch eine Weile an dem Code, werde das also wsl. noch irgendwie schöner machen.

    MfG

  • Code schöner machen ? nie im Leben, nix ist dauerhafter als Provisorien......:lol:

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (8. Juni 2014 um 16:42)

Jetzt mitmachen!

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