From 467506e5ce497f404869c6a85d25f683fd6d9fdc Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Thu, 9 Mar 2023 09:02:33 +0100 Subject: [PATCH] implemented untested version of freefall detection --- .../examples/MicroBit/jumper/src/main.adb | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/src/main.adb b/ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/src/main.adb index d60f988..21a2c1c 100644 --- a/ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/src/main.adb +++ b/ASYD_Safety/Ada_Microbit/examples/MicroBit/jumper/src/main.adb @@ -1,5 +1,5 @@ ------------------------------------------------------------------------------ --- Template -- +-- JUMPER TEAM BJS -- ------------------------------------------------------------------------------ with LSM303; use LSM303; @@ -7,24 +7,31 @@ with LSM303; use LSM303; with MicroBit.Display; with MicroBit.Accelerometer; with MicroBit.Console; -with MicroBit.IOs; with MicroBit.Time; use MicroBit; -use MicroBit.IOs; procedure Main is Data : LSM303.All_Axes_Data; - Value : MicroBit.IOs.Analog_Value; + FreeFallCounter : Integer; + FreeFallDetectionCycles : Integer; + FreeFallCondition : Boolean; + Threshold : Axis_Data; begin Console.Put_Line ("Jumper - starting up .."); - loop + -- Initialization + FreeFallCondition := False; + FreeFallCounter := 0; + FreeFallDetectionCycles := 100; -- 100 * 5ms = 500ms + Threshold := 20; + loop + -- READ DATA -- Read the accelerometer data Data := Accelerometer.Data; @@ -32,28 +39,37 @@ begin Console.Put_Line ("X:" & Data.X'Img & ASCII.HT & "Y:" & Data.Y'Img & ASCII.HT & "Z:" & Data.Z'Img); + -------------------------------------------------------------------- + + -- FREEFALL DETECTION + -- check wether all axis are sub-threshold => increment counter + if abs(Data.X) < Threshold and + abs(Data.Y) < Threshold and + abs(Data.Z) < Threshold then + FreeFallCounter := FreeFallCounter + 1; + -- otherwise reset counter + else + FreeFallCounter := 0; + end if; + -- Set free fall condition when counter reaches threshold + if FreeFallCounter >= FreeFallDetectionCycles then + FreeFallCondition := True; + end if; + -------------------------------------------------------------------- + + -- DISPLAY -- Clear the LED matrix Display.Clear; - -- Check, whether we are free floating or not (to be refined ...) - if -100 < Data.X and Data.X < 100 then - Display.Display ('0'); - else + -- Check, wether FreeFallCondition was triggered + if FreeFallCondition then Display.Display ('X'); - end if; - - -- Read analogue pin (could be 0,1,2,3,4, or 10) - Value := MicroBit.IOs.Analog (2); - Console.Put_Line ("Value : " & Value'Image); - - -- Set output - if Value > Analog_Value(200) then - MicroBit.IOs.Set (12, True); else - MicroBit.IOs.Set (12, False); + Display.Display ('0'); end if; - Time.Sleep (50); + Time.Sleep (5); -- 200 samples / s + end loop; end Main;