Elektroniczny odstraszacz kretów :D

Prezentacje projektów
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Elektroniczny odstraszacz kretów :D

Post autor: niveasoft » 15 cze 2022, 17:54

Kupiłem na Alledrogo dwa odstraszacze kretów po 20zł każdy. Reklamują je tak : Żeby kret się nie przyzwyczaił częstotliwości, odstępy w czasie i długość dźwięku się zmieniają.
Wyszło na to że nic z tego nie jest prawdą. Możecie na jednym foto zobaczyć co jest w środku. Zwykły brzęczek który można kupić za 5zł więc częstotliwość dźwięku jest stała. Do tego to 404Hz a krety nie lubią wyższych częstotliwości.
Do tego jest tam zbudowany na dwóch tranzystorach najprostszy bistabilny przerzutnik tak więc i odstępy są stałe i długość dźwięku jest stała.

Na foto z psem możecie zobaczyć, że trzeba te odstraszacze uszczelnić taśmą. Ja tego nie zrobiłem za pierwszym razem i zalała mi go woda...dlatego musiałem zbudować swój moduł elektroniczny :D Krzyżyk na wieczku jest po to by go po czasie łatwiej było znaleźć w trawie ;)

Użyłem Attiny2331, chociaż wystarczyłby jakiś Tiny13, bo mam ich dużo. Jako przetwornika dźwięku użyłem głośnika z laptopa bo mam całą masę różnych starych laptopów na części a te głośniki są małe i mają obudowy.
By nie używać wzmacniacza głośnik podłączyłem na wzór D-CLASS amplifier :D

Mój odstraszacz losuje nową częstotliwość, nowy czas długości dźwięku i nowy czas przerwy. Tak by kret się nie przyzwyczaił :D
Z wartościami można poeksperymentować.

Zużycie prądu baterii jest następujące : Podczas odtwarzania dźwięku ~24mA a podczas przerwy 9uA

Baterie kiedy je wkładałem zimą miały 1,59V. Po sześciu miesiącach mają 1,48V
Niemniej rozważam wbudowanie takiego odstraszacza w lampkę solarną z akumulatorem ;)

Teraz skuteczność. Krety się wyprowadziły do sąsiadów :D
  1. 'Electronic Mole Scare Device  by BARTek
  2. $regfile = "attiny2313.dat"                                 ' the used chip
  3. $crystal = 1000000                                          ' frequency used
  4. $hwstack = 40
  5. $swstack = 0
  6. $framesize = 24
  7. $baud = 38400
  8.  
  9. Config Portd = &B0000_1100 : Portd = 255                    'D2 &D3
  10.  Sw Alias Pinb.0 : Portb = 255
  11.  
  12.  
  13. Dim Period As Word , Adc_val As Word
  14. Dim On_off As Byte , Sound_on As Byte , Sound_time As Byte , Idle_time As Byte
  15. Dim T0_ticks As Byte , 100ms As Byte
  16.  
  17. Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  18.  Compare0a = 96                                             '100ms @1MHz/1024
  19.   On Compare0a Timer0_isr
  20.    Enable Compare0a
  21.  
  22.  
  23.  Set Acsr.acd                                               'disable AD
  24.  Stop Watchdog
  25.  
  26.  Enable Interrupts
  27.  
  28. Do
  29.  
  30.  If 100ms = 0 Then
  31.   100ms = 9
  32.      If Idle_time = 0 Then                                  'we reboot or its time
  33.       Sound_on = 1                                          'sound will be played
  34.       T0_ticks = 0                                          'reset time counter to be compared
  35.       Do                                                    'draw new time for pause
  36.        Idle_time = Rnd(99)                                  '99 maximum
  37.       Loop Until Idle_time > 9                              '9  minimum
  38.  
  39.      Else
  40.       Decr Idle_time                                        'countdown
  41.      End If
  42.  End If
  43.  
  44.  Do                                                         'draw freq everytime for better randomness
  45.   Period = Rnd(60)
  46.  Loop Until Period > 3
  47.  
  48.  Do
  49.   Sound_time = Rnd(30)                                      'draw period for sound
  50.  Loop Until Sound_time > 15
  51.  
  52.  
  53.  '-------[PLAYING HERE]--- (24mA)
  54.  While Sound_on = 1                                         'this flag will be cleared in ISR
  55.   Portd = &B0000_1000
  56.   Waitus Period
  57.   Portd = &B0000_0100
  58.   Waitus Period
  59.  Wend
  60.  '------------------------
  61.  Portd = 255                                                'playing end
  62.  
  63.  Config Powermode = Idle                                    'go to sleep (~9uA)
  64.  
  65. Loop
  66. End
  67.  
  68. 'ISR is needed to jump from While-Wend to measure time
  69. Timer0_isr:                                                 '100ms
  70.   If Sound_on = 1 Then
  71.     Incr T0_ticks
  72.     If T0_ticks = Sound_time Then                           'compare with drawn time
  73.      Sound_on = 0
  74.  
  75.     End If
  76.   Else
  77.      If 100ms > 0 Then Decr 100ms
  78.   End If
  79. Return
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
marekszy
Posty: 100
Rejestracja: 20 lis 2016, 20:21

Re: Elektroniczny odstraszacz kretów :D

Post autor: marekszy » 20 maja 2024, 21:51

Właśnie walczę z kretami :P
Bartek da się to wcisnąć do Attiny13 (przy kompilacji krzyczy "brak miejsca SRAM")
Awatar użytkownika
niveasoft
Posty: 1219
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Elektroniczny odstraszacz kretów :D

Post autor: niveasoft » 20 maja 2024, 22:31

Nie testowałem czy działa. Może coś trzeba jeszcze poprawić.
Tam było dużo więcej do zmiany. Tiny13 ma tylko 64B SRAM więc trzeba kombinować z Nosave żeby nie odkładał 32 rejestrów w przerwaniu. Do tego ten Tiny nie ma USART a tam pisało $baud. Do tego zmieniłem PORTD na PORTB, ale musisz sprawdzić piny.
Tny13 chodzi nie na 1MHz a na 1,2MHz albo nie na 8MHz tylko na 9,6MHz więc trzeba było przeliczyć Timer...
Zrobiłbym to szybciej, ale mi telefonami nie dają żyć nawet o tej godzinie :D
  1.     'Electronic Mole Scare Device  by BARTek
  2.     $regfile = "attiny13.dat"                               ' the used chip
  3.     $crystal = 1200000                                      ' frequency used
  4.     $hwstack = 8
  5.     $swstack = 0
  6.     $framesize = 14
  7.  
  8.     Config Portb = &B0000_1100 : Portb = 255                    'D2 &D3
  9.      'Sw Alias Pinb.0 : Portb = 255
  10.  
  11.  
  12.     Dim Period As Word , Adc_val As Word
  13.     Dim On_off As Byte , Sound_on As Byte , Sound_time As Byte , Idle_time As Byte
  14.     Dim T0_ticks As Byte , 100ms As Byte
  15.  
  16.     Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  17.      Compare0a = 116                                        '100ms @1,2MHz/1024
  18.       On Compare0a Timer0_isr Nosave
  19.        Enable Compare0a
  20.  
  21.  
  22.      'Set Acsr.acd                                           'disable AD
  23.      Stop Watchdog
  24.  
  25.      Enable Interrupts
  26.  
  27.     Do
  28.  
  29.      If 100ms = 0 Then
  30.       100ms = 9
  31.          If Idle_time = 0 Then                              'we reboot or its time
  32.           Sound_on = 1                                      'sound will be played
  33.           T0_ticks = 0                                          'reset time counter to be compared
  34.           Do                                                    'draw new time for pause
  35.            Idle_time = Rnd(99)                                  '99 maximum
  36.           Loop Until Idle_time > 9                          '9  minimum
  37.  
  38.          Else
  39.           Decr Idle_time                                        'countdown
  40.          End If
  41.      End If
  42.  
  43.      Do                                                         'draw freq everytime for better randomness
  44.       Period = Rnd(60)
  45.      Loop Until Period > 3
  46.  
  47.      Do
  48.       Sound_time = Rnd(30)                                      'draw period for sound
  49.      Loop Until Sound_time > 15
  50.  
  51.  
  52.      '-------[PLAYING HERE]--- (24mA)
  53.      While Sound_on = 1                                         'this flag will be cleared in ISR
  54.       Portb = &B0000_1000
  55.       Waitus Period
  56.       Portb = &B0000_0100
  57.       Waitus Period
  58.      Wend
  59.      '------------------------
  60.      Portb = 255                                            'playing end
  61.  
  62.      Config Powermode = Idle                                    'go to sleep (~9uA)
  63.  
  64.     Loop
  65.     End
  66.  
  67.     'ISR is needed to jump from While-Wend to measure time
  68.    Timer0_isr:                                              '100ms
  69.   $asm
  70.   !PUSH R16
  71.   !PUSH R20
  72.   !PUSH R24
  73.   !PUSH R26
  74.   !IN R24, SREG
  75.   !PUSH  R24
  76.   $end asm
  77.  
  78.   '#  PUT YOUR ISR ROUTINES HERE   #
  79.   '          Tuned with NoSave Tool 1.14
  80.  
  81.       If Sound_on = 1 Then
  82.         Incr T0_ticks
  83.         If T0_ticks = Sound_time Then                           'compare with drawn time
  84.          Sound_on = 0
  85.  
  86.         End If
  87.       Else
  88.          If 100ms > 0 Then Decr 100ms
  89.       End If
  90.  
  91.   $asm
  92.   !POP  R24
  93.   !OUT SREG, R24
  94.   !POP R26
  95.   !POP R24
  96.   !POP R20
  97.   !POP R16
  98.   $end asm
  99.  
  100.  Return
ODPOWIEDZ