Hallo Leute, hab hier einen quick&dirty Aufbau mit dem Raspberry Pi Pico und folgendem PIR-Sensor: https://www.pollin.de/productdownloads/D811274D.PDF Auf dem Pico läuft ein C-Programm das u. A. die folgende Methode benutzt: (..) int main() { (..) gpio_set_irq_enabled_with_callback(userGPIO, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &sensor_irq_handler); (..) } Hinweis: userGPIO = GP1. Mit "&sensor_irq_handler" wird dann über an sich trivialen Code in jener Funktion die grüne User LED angesteuert sobald der Sensor Bewegung detektiert (der Code selbst tut hier nichts weiter zur Sache, kann ihn aber nachliefern bei Bedarf). Eigentlich ist das Alles ganz stumpf verbunden, da der PIR-Sensor nur drei Anschlüsse hat: PIR-Sensor - Pico: VCC - USB VBUS (+5V) GND - GND SIG - GP1 Im Prinzip funktioniert das auch alles problemlos, nun aber zu meiner Frage: Mich wundert dass der standardmäßige Output von 3,3V an SIG auf 2,7V "einbricht" (siehe Foto) sobald er mit GP1 verbunden ist. Meine Vermutung ist dass der interne Pulldown Widerstand von GP1 zu viel Strom zieht. Kann das sein? Abhilfe: Widerstand zwischen SIG und GP1? Wie groß sollte dieser sinnvollerweise sein? BTW habe mich an diesem Projekt orientiert, der Kollege benutzt an seinem SIG Ausgang aber auch keinen Widerstand: https://www.heise.de/developer/imgs/06/3/0/7/3/7/9/6/PriSensorOnARaspPiPico_Steckplatine-3b720aefc49c33dd.jpeg Danke für eure Hinweise.
Florian W. schrieb: > Meine Vermutung ist dass der interne Pulldown Widerstand von GP1 zu viel > Strom zieht. Dann muß Du nach einer Methode suchen, die ihn abschaltet.
m.n. schrieb: > Dann muß Du nach einer Methode suchen, die ihn abschaltet.
1 | gpio_set_dir(userGPIO, false); |
2 | gpio_set_pulls(userGPIO, false, false); // oder true, true. Könnte bei aktivierten IRQ besser sein. |
3 | gpio_set_input_hysteresis_enabled(userGPIO, true); |
:
Bearbeitet durch User
m.n. schrieb: > Bei Arduino reicht: pinMode(GP1, INPUT) im Arduino-Core wird das "pinMode" zu:
1 | extern "C" void pinMode(pin_size_t ulPin, PinMode ulMode) { |
2 | switch (ulMode) { |
3 | case INPUT: |
4 | gpio_init(ulPin); |
5 | gpio_set_dir(ulPin, false); |
6 | gpio_disable_pulls(ulPin); |
7 | break; |
8 | case INPUT_PULLUP: |
9 | gpio_init(ulPin); |
10 | gpio_set_dir(ulPin, false); |
11 | gpio_pull_up(ulPin); |
12 | gpio_put(ulPin, 0); |
13 | break; |
14 | case INPUT_PULLDOWN: |
15 | gpio_init(ulPin); |
16 | gpio_set_dir(ulPin, false); |
17 | gpio_pull_down(ulPin); |
18 | gpio_put(ulPin, 1); |
19 | break; |
20 | case OUTPUT: |
21 | gpio_init(ulPin); |
22 | gpio_set_dir(ulPin, true); |
23 | break; |
24 | default:
|
25 | DEBUGCORE("ERROR: Illegal pinMode mode (%d)\n", ulMode); |
26 | // Error
|
27 | return; |
28 | }
|
29 | |
30 | if (ulPin > 29) { |
31 | DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin); |
32 | return; |
33 | }
|
34 | _pm[ulPin] = ulMode; |
35 | }
|
die Hysterese/Schmidt-Trigger am Eingang kann man damit nicht aktivieren, und die nette "Bus-Keep"-Funktion bei gleichzeitig aktivem Pull-Up und Pull-Down auch nicht.
Na, dann sollte man wohl doch besser PADS_BANK0->GPIO1 = 0xc2; // ggf. Bitnummern aus rp2040.h verwenden schreiben ;-)
Mache doch mal ein Detailfoto von der Ecke auf dem PIR Board, wo der Ausgang geschaltet wird. Ist da vielleicht ein NPN mit einem Ausgangswiderstand in Reihe?
m.n. schrieb: > Na, dann sollte man wohl doch besser > PADS_BANK0->GPIO1 = 0xc2; // ggf. Bitnummern aus rp2040.h verwenden > schreiben ;-) "Besser" ist relativ. Nachdem der TE im kleinen Codeschnipsel, den er gezeigt hat, weder Arduino-funktionen noch direkten Registerzugriff verwendet hat, ist für ihn wohl eine Lösung mittels SDK besser.
:
Bearbeitet durch User
10k, das würde doch schon das Verhalten erklären - ungewöhnlich hoher Wert für einen open-collector Ausgang. Wie heißt denn das IC, da könnte man ja im Datenblatt nachschauen, ob man den problemlos verkleinern kann.
Wenn die Bildunterschrift passt und es auch hier ein TM2291 ist, ist die Lösung des Problems im Datenblatt beschrieben. Der Ausgang hat einen Widerstand (R11), damit man dort direkt einen Transistor anschließen kann (also High-Aktiv). Das wäre ja auch hier die Lösung, NPN mit Basis an den Ausgang, Emitter auf GND und Collector an den RPI-Eingang - mehr Bauteile braucht es nicht. Der interne Pull-Up bleibt dann natürlich eingeschaltet.
Hallo Leute, erstmal danke für den guten Input. Sorry hatte ein etwas nichtssagendes Datenblatt verlinkt. Das hier ist denke ich besser: https://joy-it.net/de/products/SBC-PIR Dort erkennt man auch den Chip den Harald sich schon angesehen hat. Also 10k hängt am T1 Kollektor und ist dann offenbar in Reihe mit dem internen Pico GP1 Pulldown sobald T1 sperrt? Okay ist dann wohl nachvollziehbar warum die Spannung etwas einbricht, an einem 10k fällt relativ viel ab. Angehängt übrigens noch der C-Code, für alle den er interessiert.
Hi
>Dort erkennt man auch den Chip den Harald sich schon angesehen hat.
Und im Text steht
Detektor-Chip
BIS0001
MfG Spess
Florian W. schrieb: > Angehängt übrigens noch der C-Code uiii, als PNG :) Bau da doch mal noch ein gpio_disable_pulls(userGPIO) ein. oder ein gpio_set_pulls(userGPIO, true, true); und messe danach deine Spannung am Pin
Εrnst B. schrieb: > Florian W. schrieb: >> Angehängt übrigens noch der C-Code > > uiii, als PNG :) > > Bau da doch mal noch ein gpio_disable_pulls(userGPIO) ein. > oder ein gpio_set_pulls(userGPIO, true, true); > > und messe danach deine Spannung am Pin Uh, sicher dass da nichts durchbrennt? Ohne einen Widerstand gehts doch dann schnurstracks nach Ground wenn T1 durchschaltet oder nicht?
Florian W. schrieb: > Uh, sicher dass da nichts durchbrennt? der Pin ist als Input konfiguriert. Daran ändert sich nix. Nur am Pull-Up oder Pull-Down im µC. Sicherheitshalber kann ja noch ein gpio_set_dir(userGPIO, false); dazu, um explizit auf "INPUT" zu stellen. und gpio_set_input_hysteresis_enabled(userGPIO, true); ist evtl. überflüssig, ich weiß nicht wie der Default da ist. Schadet aber auch nicht, das explizit zu initialisieren.
:
Bearbeitet durch User
Εrnst B. schrieb: > gpio_set_input_hysteresis_enabled(userGPIO, true); > ist evtl. überflüssig, ich weiß nicht wie der Default da ist. Schadet > aber auch nicht, das explizit zu initialisieren. Man findet die Reset-Einstellungen im Datenblatt.
m.n. schrieb: > Man findet die Reset-Einstellungen im Datenblatt. Ausgezeichnet. Faulheit siegt, so muss ich das nicht selber aufmachen :) Da sieht man auch gleich die Werte die man ändern muss und den Grund für: Florian W. schrieb: > Mich wundert dass der standardmäßige Output von 3,3V an SIG auf > 2,7V "einbricht"
Εrnst B. schrieb: > Faulheit siegt, Es muß nicht unbedingt Faulheit sein. Manche Angaben finden sich unter GPIO, andere unter PADS_BANK0 und völlig verkehrt ist man unter PIO.
Ernst!! Hab nun lediglich gpio_disable_pulls(userGPIO) hinzugefügt zum Code. Funktioniert wie Butter im Sinne Spannung. Danke und Grüße
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.