PIR Sensor an Raspberry Pi Pico

Gast #7026037
Lesenswert?

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.
Angehängte Dateien:
#7026106
Lesenswert?

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.
#7026153
Lesenswert?

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.
Gast #7026239
Lesenswert?

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.
Gast #7026293
Lesenswert?

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.
Angehängte Dateien:
Gast #7026369
Lesenswert?

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.
Angehängte Dateien:
Gast #7026407
Lesenswert?

Ε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?
#7026411
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren