Anfrage Programmierung Raspberry Pi

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Hallo

Ich habe eine Anfrage bekommen, ob ich einen Raspberry Pi so programmieren kann, dass er auf einen Bewegungssensor reagiert und falls jemand in der Nähe ist, eines von einer Serie von Videos abspielt.

Da ich bisher nichts mit Sensoren am Raspi zu tun hatte, wollte ich mal fragen, ob ihr da einen Weg seht.

Sensor wäre der:
https://thepihut.com/blogs/raspberry-pi ... -detection
https://tutorials-raspberrypi.de/raspbe ... ensor-pir/

Wie man von Lazarus aus die Videos steuert, wäre auch noch eine Frage. Oder wäre Python einfacher? Kenne ich allerdings auch kaum.

Da es etwas eilt, möchte ich den Job (begrenztes Budget) nur zusagen, falls ich (hoffentlich mit eurer Hilfe) einen Weg zum Ziel sehe.

Danke!

kupferstecher
Beiträge: 285
Registriert: Do 17. Nov 2016, 11:52

Re: Anfrage Programmierung Raspberry Pi

Beitrag von kupferstecher »

Der Sensor liefert wohl ein Digitalsignal auf einer Leitung, das du auf einen GPIO (general purpose IO) legst. Also wie ein Taster. Die Auswertung ist einfach.

Zum Thema Video, es gibt wohl ein VLC-Plugin, hab aber selber nie etwas damit gemacht, nur davon gehört. Vielleicht reicht es auch, das Video per Command/Prozess in einem externen Player zu starten?

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Anfrage Programmierung Raspberry Pi

Beitrag von pluto »

kupferstecher hat geschrieben:Der Sensor liefert wohl ein Digitalsignal auf einer Leitung, das du auf einen GPIO (general purpose IO) legst. Also wie ein Taster. Die Auswertung ist einfach.
Richtig. Das ist eine Standard Komponente bei Arduino. Du musst einfach nur Spannung, Masse und ein IO Pin nutzen. Probleme könnte es bei der 3V Versorgung geben. Es könnte sein, dass der mit 3V Arbeiten kann, einfach ausprobieren. Oder du musst ihn mit 5 Volt versorgen und ein Spannungsteiler zwischen dem OUT und dem IO Pin setzten bzw. ein Transistor könnte auch gehen.
Ich habe davon einige hier rum liegen. Sie brauchen z.b. ca um die 4 Sekunden Abstand zwischen den erneuten Auslösen.

Socke hat, dafür eine Lib geschrieben, um sowas mit dem PI umzusetzen.

Hinweis: Die PI's können nur mit 3V umgehen nicht mit 5V. Sie können soweit, 5V Komponenten versorgen, aber nicht bei den IO Pins, die gehen direkt zu der CPU. Baut man hier ein Kurzen, ist der PI hin(höchstwahrscheinlich).
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4442
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Anfrage Programmierung Raspberry Pi

Beitrag von af0815 »

Video sollte mit V4L2 bzw. gstreamer gehen. Sollte der 3B+ oder 4 sein, sonst wird es je nach Video eng. Ich habe beides für USB-Kameras im Einsatz mit RasPi.

GPIO geht ohne großen Aufwand. Code dazu kann ich liefern.

Code: Alles auswählen

uses
  ...
  {$IFDEF RasPi}
  {$IfDef UseGPIOHAL} // GPIO HAL (bedingt root)
  ,rpi_hal
  {$Else}
  , unix
  , BaseUnix
  {$EndIf}
  {$endif}
  ....

procedure TMain.StartUp;
begin
  {$IFDEF RasPi}
  // gibt es nur am RasPi
  {$IfDef UseGPIOHAL} // GPIO HAL (bedingt root)
  if not RPI_HW_Start([InitHaltOnError,InitGPIO]) then begin
    //showmessage('GPIO Hardware Error');
    {$IfDef DbgGPIO}Debugln('GPIO Hardware Error');{$EndIf}
    FCloseRequired:=true;
  end
  else begin
    GPIO_set_input(16);
  end;
  {$Else}
  { Prepare SoC pin 16 (pin 36 on GPIO port) for access: }
  try
    fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, PIN_16[0], 2);
    {$IfDef DbgGPIO}Debugln('ST1-FD:'+IntToHex(fileDesc,4));{$EndIf}
    {$IfDef DbgGPIO}Debugln('ST1-Ret:'+IntToHex(gReturnCode,4));{$EndIf}
  finally
    gReturnCode := fpclose(fileDesc);
  end;
  { Set SoC pin 16 as output: = GPIO 36 }
  try
    fileDesc := fpopen('/sys/class/gpio/gpio16/direction', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, IN_DIRECTION[0], 3);
    {$IfDef DbgGPIO}Debugln('ST2-FD:'+IntToHex(fileDesc,4));{$EndIf}
    {$IfDef DbgGPIO}Debugln('ST2-Ret:'+IntToHex(gReturnCode,4));{$EndIf}
  finally
    gReturnCode := fpclose(fileDesc);
  end;
  {$EndIf}
  {$endif}
end;

var
  OldState, LastState, Newstate : boolean;

procedure TMain.TimerTimer(Sender: TObject);
var
  EV : String;
  IsOk: Boolean;
  Delta: Integer;
  {$IFDEF RasPi}
  {$IfnDef UseGPIOHAL}
  fileDesc: integer;
  buttonStatus: string[1] = '1';
  {$EndIf}
  {$EndIf}
begin
  Timer.Enabled:= false;
  try
    // GPIO behandeln
    {$IFDEF RasPi}
    {$IfDef UseGPIOHAL}
    // GPIO HAL (bedingt root)
    NewState := GPIO_get_PIN(16);
    {$Else}
    //
    try
      { Open SoC 16 (pin 36 on GPIO port) in read-only mode: }
      fileDesc := fpopen('/sys/class/gpio/gpio16/value', O_RdOnly);
      EdtGPIO.Text:= 'FD:'+IntToHex(fileDesc,4);
      {$IfDef DbgGPIO}Debugln('Tim1-FD:'+IntToHex(fileDesc,4));{$EndIf}
      if fileDesc > 0 then
      begin
        { Read status of this pin (0: button pressed, 1: button released): }
        gReturnCode := fpread(fileDesc, buttonStatus[1], 1);
        NewState := (buttonStatus = PIN_ON);
        EdtGPIO1.Text:= buttonStatus;
        {$IfDef DbgGPIO}Debugln('Tim2-FD:'+IntToHex(fileDesc,4));{$EndIf}
        {$IfDef DbgGPIO}Debugln('Tim2-Ret:'+IntToHex(gReturnCode,4));{$EndIf}
        {$IfDef DbgGPIO}Debugln('GPIO:' + buttonStatus);{$EndIf}
      end;
    finally
      { Close SoC pin 18 (pin 12 on GPIO port) }
      gReturnCode := fpclose(fileDesc);
    end;
    {$EndIf}
    CBRPiIn.Checked := Newstate;
    If (LastState = Newstate) and LastState then begin
      // 2 Durchläufe vorhanden
      if OldState <> LastState then
        DoIrgendwas;
      OldState := LastState;
    end;
    LastState := Newstate;
    if not Newstate then
      OldState:=false;
    {$endif}
  finally
    Timer.Enabled:= true;
  end;
end;

procedure TMain.FormDestroy(Sender: TObject);
{$IFDEF RasPi}
{$IfNDef UseGPIOHAL} // GPIO HAL (bedingt root)
var
  fileDesc: integer;
{$EndIf}
{$endif}
begin
  Timer.Enabled := false;
  {$IFDEF RasPi}
  {$IfNDef UseGPIOHAL} // GPIO HAL (bedingt root)
  try
    fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
    gReturnCode := fpwrite(fileDesc, PIN_16[0], 2);
  finally
    gReturnCode := fpclose(fileDesc);
  end;
  {$EndIf}
  {$endif}
end;

Es sind hier zwei Varianten versteckt die man mit UseGPIOHAL umschalten kann. Ich verwende die Variante ohne UseGPIOHAL normalerweise, da die kein root benötigt. Frag mich nur nicht nach der RPI_HAL. die muss ich erst suchen :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Danke erst einmal für alle Antworten. :D
Ich schaue mir das mal an.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4442
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Anfrage Programmierung Raspberry Pi

Beitrag von af0815 »

Man kann gstreamer per TProcess recht gut starten und dem die ganze Videoarbeit aufbürden. Der Vorteil ist, man kann das ganze auf der Kommandozeile testen und dann einfach das in Pascal verwenden. Ich habe auch für meine Zwexke einen Pascal Wrapper für gstreamer 1.0, nur dort wird die Sache viel härter, man sollte dann wissen wie der gstreamer und die Pipelines funktionieren + viel Geduld fürs testen haben :-)

V4L2 geht auch recht gut, nur habe ich da keine Erfahrung wie man die Daten hinein bekommt. Anzeigen ist nicht das große Problem.

Start

Code: Alles auswählen

  AProcess := TProcess.Create(nil);
  AProcess.Executable := '/bin/sh';
  AProcess.Parameters.Add('-c');
  AProcess.Parameters.Add('/usr/bin/gst-launch-1.0 -v ... gst commands...');
  AProcess.Options := [poUsePipes];
  AProcess.Execute;
Stop

Code: Alles auswählen

function IsCommandRunning(cmd:String):THandle;
var
  t:TProcess;
  s,s1:TStringList;
  erg: integer;
  h1,h2,h3:string;
begin
  Result:=0;
  t:=tprocess.create(nil);
  t.Executable:='ps';
  t.Parameters.Add('-C'+cmd);
  t.Options:=[poUsePipes,poWaitonexit];
  try
    t.Execute;
    s:=tstringlist.Create;
    try
      s.LoadFromStream(t.Output);
      if s.Count > 1 then begin
        // Zeile 0 = Text
        h1:= s[1];
        s1:=TStringList.Create;
        try
          s1.Delimiter:=#32;
          s1.StrictDelimiter:=true;
          s1.DelimitedText:= trim(s[1]);
          h2:= s1[0];
          erg := 0;
          if s1.Count > 1 then
            TryStrToInt(s1[0],erg);
          Result:=erg;
        finally
          s1.free;
        end;
      end;
    finally
      s.free;
    end;
  finally
    t.Free;
  end;
end;

procedure xxxx;
begin
 ...
         // shutdown gst-launch
        h:= IsCommandRunning('gst-launch-1.0');
        {$ifdef KAMERADEBUG}
        DebugLn('gstreamer Handle='+IntToStr(h));
        {$endif}
        if h > 0 then begin
          if fpkill(h,SIGINT)<>0 then
            DebugLn(DateTimeToStr(now) + {$I %FILE%} + '->' +{$I %CURRENTROUTINE%}+'SIGINT NOK');
         end;
      end;
.....
end;

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 5095
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Anfrage Programmierung Raspberry Pi

Beitrag von Mathias »

Was auch eine Variante ist, einen Arduino Nano an den USB des PIs anschliessen.
Auf dem Nano ein kleiner Brückensketch laufen lassen.

Hat mehrere Vorteile.
5V
Software auf dem schnellen PC entwickeln.
Bei einem Kurzschluss ist nur ein billiger Nano zerstört.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4442
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Anfrage Programmierung Raspberry Pi

Beitrag von af0815 »

Optokoppler kann ich nur wärmsten empfehlen. Nie die GPIO direkt mit der Aussenwelt verbinden. Und ja, Achtung auf die 3.3V, da hat Mathias schon recht, nur statt einen Nano zu verwenden, gleich einen Optokoppler nehmen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Vielen Dank an alle!
Ich habe den Job abgelehnt, da ich auch dank euch zur Einsicht gelangt bin, dass ich mich da in der knappen Zeit kaum einarbeiten bzw. genügend Erfahrung sammeln kann, um eine professionelle Lösung abzuliefern.
Ihr wart mal wieder sehr hilfreich. :D
Ich werde das Thema bei Gelegenheit erst einmal als Hobby angehen.

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Damit dieser Thread nicht ganz ohne Ergebnis bleibt:

Habe mir jetzt für erste Gehversuche dieses "Arduino Uno Starterset* geholt.
Für umgerechnet € 42.77 finde ich das ganz lustig, für den Anfang.

Danke nochmals für die Inputs. Ich werde bestimmt noch weitere Fragen haben.

Mathias
Beiträge: 5095
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Anfrage Programmierung Raspberry Pi

Beitrag von Mathias »

Der kostet ja ein halbes Vermögen. :shock:
45.- für die paar Bauteile.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Ein halbes Vermögen würde ich nicht direkt sagen.
Man kann das auch noch viel teurer kaufen:
https://www.digitec.ch/de/s1/product/ma ... lsrc=aw.ds
:wink:
Natürlich kann man sich das alles einzeln zusammensuchen, aber ich bezahle gerne auch etwas dafür, dass das alles erst einmal zusammenpasst und alles da ist, was man braucht.
"Starter" eben.

Mathias
Beiträge: 5095
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Anfrage Programmierung Raspberry Pi

Beitrag von Mathias »

Oder direkt beim Chinesen, da bekommt man es für 20.-
Bei Conrad und Digtec finanzierst du nur die Zwischenhändler.
Welche es auch aus China kaufrn.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Anfrage Programmierung Raspberry Pi

Beitrag von theo »

Mathias hat geschrieben:
Do 27. Aug 2020, 22:05
Oder direkt beim Chinesen, da bekommt man es für 20.-
Bei Conrad und Digtec finanzierst du nur die Zwischenhändler.
Welche es auch aus China kaufrn.
Jeder wie er mag, dafür habe ich das Ding jetzt und nicht vielleicht in zwei Monaten, wie meine letzte China Bestellung. :wink:
Die paar Kröten sind jetzt echt nicht mein Hauptproblem.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4442
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Anfrage Programmierung Raspberry Pi

Beitrag von af0815 »

Ich hätte eher geglaubt due nimmst sowas für den RasPi https://www.amazon.de/Freenove-Raspberr ... B06VTH7L28 als Starterset. Weil es ging ja um den RasPi und nicht um Arduino.

Fertige Systeme gibt es auch :-) https://www.mass.de/de/produkte/raspber ... rpi10.html ist Industrietauglich (mit 12V-24V) und kostet auch soviel. Dafür Metallgehäuse und durchdachter Aufbau.

https://www.amazon.de/GeeekPi-Prototype ... B07MCX54ZD da kann man einen Optokoppler drauf löten und die Sache ist mit dem richtigen Gehäuse auch gegessen.
20200828_081711 (2).jpg
(836.34 KiB) Noch nie heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten