elektronika, chemie, pokusy, hammer, lockpicking
Nadpis whitebear

elektronika, chemie, pokusy, hammer, lockpicking

Bezdrátové pohybové čidlo s attiny85 a 433MHz modulem

20. Srpna 2024

Venkovní vysílač a přijímač
Venkovní vysílač a přijímač

Zde je návod na konverzi levného, bateriového, venkovního, solárního osvětlení na bezdrátový PIR senzor.

Antény

Vysílač i přijímač se prodávají bez antény, buď si ji můžete vyrobit, nebo koupit. Komerční 433MHz anténa tvaru pružinky není moc dobrá.
Doporučuji použít obyčejný, rovný kousek drátu o délce 17.3 cm pro vysílač i přijímač. S tím jsem dosáhl spojení na vzdálenost asi 30 metrů v obydleném prostoru, přes zdi a s napájením vysílače přibližně 3.7V. Vysílací výkon poroste s vyšším napětím, ale pozor na zákony.
K vysílači se anténa připojuje do pravého horního rohu při pohledu ze strany součástek.
Potisk na modulu může být špatně. Proto se radši podívejte zespodu, který pin vede kam.
U přijímače se anténa připojuje do spodního levého rohu.

Vysílač

Vysílač je vyrobený z levného čínského světýlka za asi 250 Kč. Z něj potřebujeme pouze krabičku, solární panel, baterku a nabíjecí část plošného spoje.
Zbytek obvodu jsem z desky odpájel. Nechal jsem pouze součástky, které se starají o nabíjení a hlídání 18650 baterie, kterou použijeme na napájení zařízení.
Na původní desce je i PIR senzor. V některých případech by šel použít, pokud by na výstupu poskytoval logickou hodnotu.
Já jsem ho nahradil stejně velkým samostatným modulem AM312.
PIR modul je připojený k mikrokontroléru ATTINY85-20PU, který obsluhuje 433MHz vysílač FS1000A.
Fólie pro výrobu plošného spoje.

Ovladač vysílače
Deska ovladače vysílače

Úprava vysílacího modulu

FS1000A modul se prodává v několika různých variantách, jak postupně čínští výrobci šetřili centy za součástky. Některé mají dvě cívky, některé jednu, některé žádnou. Na kondenzátorech se také šetřilo. Hodnoty rezistorů se také liší. Napájecí napětí se udává v rozmezí 3.5V - 12V.
V případě napájení 5 nebo méně volty je nutné nahradit rezistor R2 (v mém případě 15k) na destičce modulu propojkou a použít rezistor R2 3k3 viz schéma ovladače vysílače nahoře. Mikrokontrolér bude mít na výstupu přibližně 2V, což by s 15k rezistorem nestačilo.

venkovní senzor

Program

Attiny85 naprogramujeme pomocí Arduino IDE, protože ke komunikaci použijeme knihovnu VirtualWire pro Arduino, která je kompatibilní s Attiny85.
Do attiny je nutné nahrát bootloader/jádro přes IDE před vlastním programem. Jádro obsahuje základní funkce jako digitalWrite a nastaví v mikrokontroléru hodiny na 8MHz. K vypálení použijeme ISP programátor.

Pro attiny procesory existují různá jádra. Jejich kompatibilita s knihovnami je různá.
Tento projekt používá jádro ATTinyCore od Spencer Konde. Je nutné ho do Arduino IDE přidat v Preferences -> Additional boards Manager URLs, kam vložíte odkaz: http://drazzy.com/package_drazzy.com_index.json
Poté lze v Tools -> Board: -> Board Manager jádro nainstalovat.
Následně zvolíte nastavení podle obrázku níže. Je nutné správně nastavit Čip, 8MHz interní oscilátor a USBasp programátor.
Po nastavení můžete vypálit na attiny čip bootloader pomocí Tools -> Burn Bootloader.
Knihovnu VirtualWire stáhnete zde a přidáte do Arduino IDE v Sketch -> Include Library -> Add .ZIP Library.

Arduino IDE setup

Program vysílače pro Arduino IDE stáhnete zde.
FS1000A je velmi jednoduchý vysílač. Sám o sobě data nijak nekóduje. Používá modulaci ASK/OOK, vysílač je buď zapnutý a nebo vypnutý. O kódování se musí starat mikrokontrolér.

Soubor začíná importováním knihovny VirtualWire a definicí několika hodnot. Komentáře na začátku vysvětlují, jaký fyzický pin na čipu odpovídá jakému číslu pinu v programu, kde je číslování podle portu B viz schéma.
PIR_PIN - pin, kam je připojený PIR modul.
TX_PIN - pin ovládající vysílací modul.
TX_SPEED - rychlost vysílání (musí být stejná u přijímače).
COUNTER_TOP - používá se k vytvoření zpoždění mezi vysíláními.

Funkce setup() nastavuje PIR_PIN jako vstup a parametry VirtualWire pro fungování s vysílačem FS100A.
Funkce loop() se spustí po setup() opakuje se do vypnutí mikrokontroléru.
Na začátku se přečte hodnota od PIR senzoru, pokud je 1, senzor zaznamenal pohyb a odešle se jeden paket obsahující konstantní zprávu "1". Funkce vw_wait_tx() zajistí, že procesor nebude dělat nic jiného, než vysílání skončí.
Skutečná odeslaná zpráva je delší, protože VirtualWire odesílá rámec složený z hlavičky, startovního symbolu, kontrolní sekvence pro korekci chyb, zprávy a další kontrolní sekvence.
VirtualWire interně používá timer0, který bohužel používají i funkce delay() a millis(), které se obvykle používají k čekání. Proto se v programu k vytvoření zpoždění mezi jednotlivými vysíláními používá funkce wait(), která opakuje 4 prázdné operace COUNTER_TOP * 800 pro vytvoření přibližně 1s čekání. PIR modul podrží na výstupu logickou hodnotu 1 přibližně 2 vteřiny, tudíž se odešlou 2 zprávy.

Přijímač

Prodává se několik různých typů modulů 433MHz přijímačů. Obrázek vpravo ukazuje dva. Nahoře přijímač s krystalem RXB60 a pod ním přijímač se zelenou cívkou uprostřed.
Doporučuji koupit přijímač s krystalem, protože je mnohem citlivější a přesnější. Modul je potřeba připojit k dalšímu attiny85, který bude data dekódovat.
Moje schéma obsahuje 2 LED diody, jedna ukazuje přímý výstup z přijímacího modulu, druhá se rozsvítí, pokud attiny dekóduje a rozpozná zprávu. V tom případě se na výstupní pin 6 krátce odešle logická hodnota 1. Modul i attiny85 se napájí 5 V z USB.
Fólie pro výrobu plošného spoje.

Attiny85 přijímač
Pošlý spoj přijímače

Program

Program vysílače pro Arduino IDE stáhnete zde.
RXB60 opět sám o sobě data nijak nezpracovává, tudíž o dekódování se stará attiny85. Nastavení Arduino IDE je stejné jako u vysílače.

Soubor začíná importováním knihovny VirtualWire a definicí několika hodnot.
OUT_PIN - výstupní pin, kam se odešle logická hodnota 1 po přijetí správy.
RX_PIN - pin připojený na výstup přijímacího modulu.
TX_SPEED - rychlost vysílání (musí být stejná u přijímače).
COUNTER_TOP - používá se k vytvoření zpoždění, aby výstupní pin hodnotu 1 chvíli podržel.

Funkce setup() nastavuje OUT_PIN jako výstup, nastaví jej do vypnutého stavu a nastaví a parametry VirtualWire pro příjem.
Funkce loop() se spustí po setup() opakuje se do vypnutí mikrokontroléru. Funkce vw_wait_rx_max(1000) čeká maximálně 1 sekundu na příjem zprávy a poté nechá proběhnout další cyklus. Pokud je zpráva přijata, porovná se s řetězcem "1" a v případě úspěchu se na výstupní pin pošle logická hodnota 1.
Samozřejmě je možné odeslat i složitější data a přijímací program může reagovat mnohem sofistikovanějším způsobem.

Testování

K ověření fungování není nutné mít připojený 433MHz vysílač a přijímač. Místo toho lze vysílací pin prvního attiny připojit přímo drátkem na přijímací pin druhého attiny.