Forum: Mikrocontroller und Digitale Elektronik PIR Sensor an Raspberry Pi Pico


von Florian W. (Gast)


Angehängte Dateien:

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.

von m.n. (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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
von m.n. (Gast)


Lesenswert?

So kompliziert?
Bei Arduino reicht: pinMode(GP1, INPUT)
;-)

von Εrnst B. (ernst)


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.

von m.n. (Gast)


Lesenswert?

Na, dann sollte man wohl doch besser
PADS_BANK0->GPIO1 = 0xc2;  // ggf. Bitnummern aus rp2040.h verwenden
schreiben ;-)

von Harald (Gast)


Lesenswert?

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?

von Εrnst B. (ernst)


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.

: Bearbeitet durch User
von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Harald schrieb:
> Detailfoto von der Ecke

01C = 10k

von Harald (Gast)


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.

von Harald (Gast)


Angehängte Dateien:

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.

von Florian W. (Gast)


Angehängte Dateien:

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.

von spess53 (Gast)


Lesenswert?

Hi

>Dort erkennt man auch den Chip den Harald sich schon angesehen hat.

Und im Text steht

Detektor-Chip
BIS0001

MfG Spess

von Εrnst B. (ernst)


Lesenswert?

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

von Florian W. (Gast)


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?

von Εrnst B. (ernst)


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.

: Bearbeitet durch User
von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Ε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.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

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"

von m.n. (Gast)


Lesenswert?

Ε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.

von Florian W. (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.