Quantcast
Channel: Vaše projekty – Bastlírna HWKITCHEN
Viewing all 29 articles
Browse latest View live

Chytrý termostat ovladatelný přes internet

$
0
0

Na blogu Petra Stehlíka, českého nadšence do open hardware i software, se nedávno objevil článek o velmi zajímavém projektu. Jeho cílem bylo postavit termostat založený na Arduinu, který bude řídit vytápění domácnosti v závislosti na informacích z několika čidel.

Hlavní komponenty projektu jsou:

  • deska Arduino Pro Mini
  • malý Ethernet shield (čip Wiznet 5100)
  • teploměry DS18B20
  • dotykový barevný TFT displej 220×176
  • vlhkoměr DHT11

Samotný termostat je umístěn v obývacím pokoji, kde zobrazuje informace naměřené jednotlivými čidly. Zde termostat přežil již dvě topné sezóny a autor si jej nemůže vynachválit. Teplota v bytě prý tolik nekolísá a účet za plyn se také snížil.

Vnitřek termostatu

Vnitřek termostatu

Graf teplot

Graf teplot na jednotlivých čidlech

Program využívá celou  řadu různých knihoven pro obsluhu displeje, teploměrů, ethernet shieldu, synchronizaci času se serverem a podobné. To sice přináší mnoho užitečných funkcí, na druhou stranu je to trochu kámen úrazu celého projektu. Knihovny totiž zabírají velkou část paměti procesoru ATmega328, který Arduino Pro Mini obsahuje. Nelze tak například využít celý potenciál displeje, protože na nějakou hezkou grafiku prostě nezbylo místo.

Cílem autora je nyní, po dvou letech činnosti termostatu, upravit kód tak, aby uvolnil prostor i na nějaké přívětivější uživatelské rozhraní. Druhou možností je použití procesoru s větší pamětí, jako například v článku zmiňovanou desku Maple Mini s 32-bitovým čipem se čtyřnásobnou pamětí, která snad už bude pro projekt po kapacitní stránce dostačující.

Petru Stehlíkovi děkujeme za svolení publikovat jeho fotografie a přejeme hodně úspěchů při další tvorbě. Více informací o projektu a spoustu dalších zajímavých článků naleznete na blogu autora Joysfera.


Stavba meteo stanice WeatherDuino Pro2

$
0
0

Autorem tohoto článku je náš čtenář Ing. Zdeněk Hornych. Tímto mu za sdílení s námi děkujeme.

WeatherDuino

Tato DIY meteo-stanice je vyvíjena autorem Werk_AG (A. Caneira) z Portugalska a komunitou kolem webu Meteocercal.info.

Meteo stanice je koncipována modulárně a ve svém finálním provedení je schopna v určitých parametrech zastat i některé profesionální funkce. Stavba není určena pro začátečníky, mezi jinými dovednostmi je třeba zvládat i pájení SMD součástek na desky s plošnými spoji.

Článek není stavebním návodem ani podrobným popisem zařízení, zájemce odkazuji na původní zdroje informací, jejichž rozsah je obrovský (viz v závěru článku). Navíc celá řada informací podléhá autorské ochraně a je dostupná až po registraci, byť zdarma.

Blokové schéma WeatherDuino Pro 2 je principiálně toto:

WeatherDuino blokové schéma

WeatherDuino blokové schéma

Aktuální softwarová výbava je verzi 1.4, před finálním release je v1.5.

Popis jednotlivých komponent

TX – vysílací jednotka

Je zařízení, umístěné v blízkosti meteo sensorů, zpravidla ve venkovním prostředí. Srdcem jednotky je Arduino Nano, napájení je zajištěno Pb akumulátorem, dobíjeným solárním panelem.

Jednotka TX může být instalována v 1 nebo maximálně až 3 kusech v jednom systému. Standardně je vybavena sensory větru, tedy anemometrem a ukazatelem směru větru (wind vane), několika teploměry, vlhkoměry, srážkoměrem a solárními čidly (intenzita slunečního záření ve W/m2 a UV index).

Hlavní teploměr systému spolu s čidlem vlhkosti vzduchu by měl být umístěn ve volném prostoru nad stříhaným trávníkem a uložen v radiačním štítu s nuceným prouděním vzduchu podle přednastavených povětrnostních podmínek. Mezi ty patří i intenzita proudění vzduchu (vítr), proto by tato jednotka měla být vybavena vlastním anemometrem.

Měření větru se však provádí ve výšce 10 m nad volným terénem, proto je vhodné do systému vložit i druhou TX jednotku. Ta bývá umísťována na vyvýšeném místě (stožár, v nezbytném případě střecha).

Příklad provedení autorem článku:

Příklad umístění WeatherDuino

Příklad umístění WeatherDuino

Detail umístění senzorů WeatherDuino

Umístění druhé jednotky

RX – přijímací jednotka

Na rozdíl od TX jednotky je RX v systému vždy pouze jedna. Přijímá a detekuje signály 433 MHz z jednotek TX, případně z dalších připojených bezdrátových čidel (např. srážkoměr Auriol). Srdcem jednotky je opět Arduino Nano, napájení je zabezpečeno externím zdrojem 12 V.

Jednotka zpracovává signály a pomocí USB kabelu je předává počítači s meteo softwarem. Současně však slouží pro retranslaci vybraných hodnot na jednu nebo více jednotek WD pomocí signálů 433 MHz.

Jednotka sama je vybavena displejem LCD 20×4 a základní naměřené hodnoty tedy přímo zobrazuje. Aktuální PCB jsou vybaveny polovodičovou pamětí v roli cache pro případy výpadku meteo počítače. Jednotka disponuje vlastním měřením tlaku, lokální teploty a vlhkosti a je také osazena časovým normálem.

Opět příklad provedení autorem článku:

Přijímací RX jednotka WeatherDuino

Přijímací RX jednotka

WD – Bezdrátový displej

Slouží pro rychlou informaci o základních povětrnostních hodnotách, umístění je na každém místě v domě, kde jsou tyto informace třeba.

Připojení k RX pomocí signálů 433 MHz, napájení externím zdrojem 12 V. Běh softwaru opět zajišťuje Arduino Nano, WD – Bezdrátový displej je vybaven TFT dotykovým displejem 2,8“ i vlastním měřením lokální teploty a vlhkosti. Běžně zobrazované parametry: tlak, teplota vně i uvnitř, rychlost a směr větru, nárazy, vodní srážky a jejich intenzita, úroveň slunečního záření a UV index. Současně umožňuje zobrazení i tzv. externích sensorů, např. stavu Aku v TX jednotkách.

Informace na bezdrátovém displeji jsou zobrazeny alfanumericky, v případě potřeby grafického vyjádření je vhodné systém doplnit odpovídajícím tabletem, který je pomocí WiFi připojen k systému a zobrazuje grafické výstupy webového rozhraní.

Příklad provedení:

Bezdrátový display WeatherDuino

Bezdrátový displej

Meteo počítač

Touto komponentou se již projekt WeatherDuino Pro2 zabývá pouze okrajově. V tuto chvíli je zřejmě nejperspektivnější variantou využití počítače Raspberry Pi 2, Model B, s nainstalovaným systémem Raspbian. Počítač nemusí být vybaven displejem, pokud je stejně umístěn v technologickém celku, kde nemá displej využití, nebo může být naopak vybaven např. 7“ dotykovým TFT displejem s dálkovým ovládáním, apod.

Počítač je umístěn v blízkosti RX modulu – propojen USB kabelem. Pomocí meteo software zpracovává dodaná data a zobrazuje je na vlastním webu. Současně je např. přes Ethernet ukládá na web server v Internetu, případně odesílá na jeden nebo více komunitních serverů v rámci amatérských sítí meteostanic.
V roli meteo software lze s výhodou využít např. komunitního systému CumulusMX, který je ještě stále ve verzi beta, nicméně velmi stabilní.

Raspberry PI jako mozek pro WeatherDuino

Raspberry PI jako mozek pro WeatherDuino

Web

Pokud nemá meteo stanice sloužit pouze pro osobní potřebu, je vhodné umístění web serveru v nějakém „solidním“ hostingu, nároky na výpočetní mohutnost nejsou velké. Výhodné využití je např. virtualizovaného systému CentOS. Web má rozsáhlé možnosti customizace a napojení mnoha další internetových zdrojů, toto je však již zcela mimo rozsah tohoto článku.

Webová stránka s výstupem Weatherduino

Webová stránka s výstupem

Závěr

Jak jsem uvedl již na začátku článku, stavba není vhodná pro začátečníky. Znalosti programování Arduina sice nejsou zpočátku nezbytné, později však, při ladění případných problémů, velmi vhodné. Naprosto nezbytná je však určitá mechanická zručnost, řadu dílů je třeba si vyrobit sám. Současně je podmínkou i zkušenost s pájením elektronických součástek a to včetně jejich SMD varianty.

Projekt má základní výhodu, že je „totálně“ modulární a do nekonečna rozšířitelný. Proto můžeme začít pouze s minimálním objemem dílů a řekněme „levnějšího“ provedení, ale postupným rozvíjením se dostat až na poloprofesionální úroveň.

Systém je otevřen i vlastnímu vývoji, případně testování, a to jak v oblasti HW, tak SW. Celkově se dá říct, že tento projekt vlastně nikdy nekončí a může být doživotním koníčkem.

Zdroje

Upozornění: některé výše zmíněné názvy mohou být chráněnými názvy svých majitelů.
Projekt WeatherDuino Pro2: http://www.meteocercal.info/forum/
Projekt CumulusMX: http://sandaysoft.com/forum/
Podpůrné skripty a šablony: https://www.tnetweather.com/projects/
Mezinárodní síť meteo stanic: http://www.wunderground.com/
Web autora článku (ve vývoji): http://meteo.brandysnl.cz/

Autorovi článku ještě jednou děkujeme!

Máte podobný projekt, se kterým byste se chtěli pochlubit? Napište nám na info@arduino.cz!

[wp_objects_pdf]

CanSat #1: Studenti z Prahy staví satelit v plechovce!

$
0
0

Jsme čtveřice studentů 4. ročníku česko-francouzské sekce Gymnázia Jana Nerudy v Praze a vítáme vás u série článků, která mapuje náš postup v soutěži CanSat a samozřejmě i soutěží samotnou. V tomto úvodním textu bychom vás rádi seznámili s konceptem celého projektu a s jeho záměrem. Ve článcích následujících se pak budeme zabývat naším přístupem ke konkrétním výzvám, které tato soutěž svým účastníkům předkládá.

Kompletní CanSat

Kompletní CanSat – zdroj: cansat.eu

Pro úvod nám dovolte nejdříve představit trochu historie, která stojí za konceptem satelitu v plechovce. Idea takzvaných nanosatelitů vznikla v roce 1998 na prvním “University Space System Symposium” (Univerzitní sympozium vesmírných systémů) na Havaji. Představil ji profesor Bob Twiggs ze Stanfordské univerzity. Byl to týž Twiggs, který ve spolupráci s profesorem Jordi Puig-Suari, přišel rok poté s velmi úspěšnou myšlenkou CubeSatů. Soutěže v konstrukci CanSatů mají největší tradici v Japonsku, kde se také konala ta vůbec první. Později se tento fenomén rozšířil téměř po celém světě a vlastní verzi má i Evropská kosmická agentura (ESA). Ta je na rozdíl od soutěží v ostatních zemích zaměřena na studenty středních škol a je rozdělena na kolo národní a pro jejich vítěze pak kolo evropské.

Smysl soutěže ve stavění malých sond snášejících se z výšky mnoha set metrů je nasnadě. Konstrukce „satelitů“ této velikosti je finančně velmi nenáročná, a přitom stále slouží jako skvělá simulace skutečného procesu stavby satelitů, či jim podobných zařízení. Specifikace pro sondu jsou jasné: musí se vejít do malého kontejneru o velikosti plechovky od sodovky, nesmí vážit více než 350g, musí sbírat a vysílat předem určené údaje (teplota a atmosférický tlak) a musí se snášet rychlostí mezi 6 až 12 m/s. Týmy jsou povinny vymyslet si ještě vlastní vedlejší misi (sbírat fotografické snímky, údaje o radiaci, autonomně řídit svůj sestup, atd.) A samozřejmě, sonda musí přežít výstup do výšky 600 a 1000 metrů relativně od povrchu (600 m pro národní a 1000 m pro evropské kolo). Pro vynesení sondy je používána kvadrokoptéra u nás a speciální raketa v evropském kole.

Padák pro CanSat

Padák pro CanSat

My jsme se rozhodli pro CanSat snášející se na paraglidu, který se bude snažit přistát na zvolených souřadnicích GPS. Dále bude na základě pokynu z pozemní stanice sbírat fotografické snímky a ukládat je na vloženou SD kartu. A konečně výsledná měření budeme přijímat a zpracovávat prostřednictvím námi naprogramované UWP (Universal Windows Platform) aplikace (teoreticky pak bude možné veškerou obsluhu provádět na telefonu).

CanSat - deska s SD slotem, bezdrátovým přenosem a senzory

CanSat – deska s SD slotem, bezdrátovým přenosem a senzory – zdroj: flickr.com

Potřebné součástky pro tvorbu satelitu jsme získali přímo od ESA, nicméně ty poslouží pouze pro základní operace. Již zmíněnou čtečku SD karet, fotoaparát nebo senzor GPS (o kompletním seznamu použitých součástek si povíme příště) jsme získali od společnosti HW Kitchen, které tímto děkujeme.

České kolo proběhne 26. března a náš postup můžete sledovat na naší facebookové stránce CanSatCz, na Twitteru CanSatCZ nebo zde, kde postupně uveřejníme články o našem designovém, softwarovém a hardwarovém řešení a samozřejmě i o testování satelitu a závěrečný článek o vypuštění sondy a vyhodnocení údajů.

Dotazy ohledně soutěže a našeho projektu můžete klást na Facebooku, Twitteru nebo zde pod článkem. Na Twitteru nás můžete kontaktovat i přímo přes osobní účty:

Co je ESA?


Držíme palce! Brzy se můžete těšit na pokračování!

Arduino hodiny založené na ESP8266

$
0
0

Náš čtenář Petr zapadlo nám poslal článek o jeho projektu hodin postavených na modulu ESP8266. Přejeme příjemné čtení.


Úvod

Když jsem před rokem objevil modul ESP8266, rozhodl jsem se, že v rámci seznámení s tímto modulem postavím hodiny. Ano, kdyby mi šlo jen o ty hodiny, tak si zajdu do tržnice a mohu vybírat dle libosti, ale na hodinách z tržnice mi dost věcí vadí. A když si je mohu udělat k obrazu svému, tak proč ne.

Jaké by měly mít hodiny vlastnosti:

  • Automatické nastavení času
  • Přepínání zimní/letní čas na přepínači
  • Nastavení budíku na každou číslici samostatně (abych nemusel mačkat tlačítko 59x, když chci o 1 minutu dříve vzbudit)
  • Čas budíku uložený do EEPROM, aby po výpadku napájení budík fungoval, jak má.
  • Jas displeje řízený okolním osvětlením.
  • Budík budí každý den ráno, dokud to explicitně nevypnu a nebudí, když je vypnut
  • Automatická korekce přesnosti interního čítače času

Při úvaze, jak by takové hodiny měli být postaveny,  jsem původně přemýšlel nad Arduinem a Ethernet shieldem, ale jakmile mi dorazili moduly ESP8266 a našel jsem projekt NTP klienta do těchto wifi modulů, tak bylo rozhodnuto.

Schéma hodin s ESP8266

Schéma hodin

Popis zapojení

Arduino

V obvodu Arduina není žádná zvláštnost, jediný HW UART Arduina je použitý pro komunikaci s wifi modulem. Na modul je navázán napěťovým převodníkem z rezistorů R1, R2.  Tx signál z wifi nekonvertujeme – pro Arduino stačí 3,3V pro spolehlivou funkci. Programování Arduina je třeba dělat mimo mimo obvod, tj je třeba ho před programováním vyjmout z patice na plošném spoji. Nedoporučuji nechat připojený seriový programovací převodník na Arduino. Může se stát, že že z tohoto převodníku vnutíme úroveň +5V na TX pin ESP8266. Jak ukazují zkušenosti, tak je sice wifi modul  hodně odolný, ale jelikož datasheet uvádí, že není tolerantní k +5V, tak je lepší neriskovat jeho poškození.

Piny 2, 3 (RX, TX) jsou vyvedeny na pinovou lištu jako SW seriový port, přičemž TX se používá na  vypisování ladících zpráv. Komunikační rychlost na TX pinu je 9600. RX pin není zatím využit.

Na pinu 5 je připojen přepínač, kterým lze rychle přenastavit čas z jedné časové zóny do druhé (GMT+1 a GMT+2), čímž snadno a rychle přepínáme zimní a letní čas.

Arduino hodiny s ESP8266 -Vnitřní zapojení

Vnitřní zapojení

Wifi modul ESP8266

Wifi modul má nahraný firmware, který rozšiřuje funkce o vlastnosti NTP clienta esp8266-ntp_0.9.4. Firmware se skládá ze dvou souborů, které je třeba do ESP nahrát na uvedené adresy:

  • eagle.app.v6.flash.bin -> 0x0000
  • eagle.app.v6.irom0text.bin -> 0x40000

Tento firmware komunikuje ve výchozím nastavení rychlostí 115200Bd, proto je nezbytné připojit wifi modul na HW UART Arduina. NTP Firmware rozšiřuje seznam AT příkazů o další:

  • AT+CIPNTP=<offset from GMT>, tímto příkazem nahodíme uvnitř ESP8266 NTP klienta.
  • AT+CIPNTP? Vrátí odpověď s aktuálním časem. Z této odpovědi potom parsujeme přesný čas do interní implementace času v Arduinu.

Vlastní firmware nahrajeme do modulu pomocí převodníku USB/serial nástrojem esptool.py (opět pozor na převodník úrovní).
Více o NTP firmware: http://www.esp8266.com/viewtopic.php?f=11&t=705

Arduino hodiny s ESP8266 - Zapojení

Zapojení

Displej

Pro řízení displeje je použit integrovaný obvod MAX7219CNG – tento obvod umí řídit sedmisegmentový multiplexovaný displej se společnou katodou až o 8 pozicích. Má seriový vstup, k připojení potřebujeme jen 3 piny a jeho ovládání je velmi jednoduché (není třeba žádné knihovny). Řadič displeje může pracovat ve 2 režimech, včetně sedmisegmentového dekodéru, nebo s přímým ovládáním jednotlivých segmentů. Pro naše hodiny využijeme režim se sedmisegmentovým dekodérem. Dvojtečka mezi hodinami a minutami je připojena jako desetinná tečka páté pozice.

Dále tento integrovaný obvod umí řídit střídu multiplexu a tím i jas displeje v 16 úrovních, čehož s výhodou využijeme. Základní jas řídíme rezistorem R3 – ten vybereme podle použitého displeje dle pokynů v datasheetu. Já jsem použil R3 o hodnotě 47k.

Použitím tohoto řadiče displeje si výrazně zjednodušíme programovou část – obsluha takhle velkého displeje v multiplexním režimu není pro Arduino snadná.

Na vstupu řadiče displeje jsou 3 rezistory R15, R16, R17, které uzemňují řídící vstupy – ty jsou důležité při startu. Stávalo se mi, dokud jsem je nezapojil, že při náběhu se řadič kousnul v nějakém mezistavu, ze kterého jsem ho nebyl schopen řízením z Arduina dostat. IO piny Arduina jsou po resetu ve stavu IN, tedy vysoká impedance a na pinech se může nakmitat cokoliv.  Každopádně osazení rezistorů tento neduh odstranilo.

Jelikož v nabídce místních elektronických obchodů jsem rozumně velký displej nenašel, poohlédl jsem se na Aliexpressu a používám tyto: http://www.aliexpress.com/item/10PCS-LOT-common-cathode-LED-digital-tube-0-8-inches-four-clock-display-red-LED-14PIN/2026750989.html

Arduino hodiny s ESP8266 - Detail displeje

Detail displeje

Obvod řízení jasu

Je tvořen fotodiodou (BPW34, BPW43 apod.) zapojenou jako zdroj proudu v invertujícím zapojení s operačním zesilovačem. V podstatě běžné zapojení. Já jsem použil fotodiodu BPW43. Pokud by dioda měla výrazně jinou citlivost, je třeba upravit zisk zesilovače korekcí rezistoru R4. Při běžném osvětlení by na výstupu operačního zesilovače mělo být kolem 3,5V. Je třeba dodržet použitý typ zesilovače, protože umožňuje práci při nízkém napájecím napětí, ale hlavně jeho vstupy pracují i při nulovém napětí. Případně lze použít jiný rail-to-rail OZ. U LM324 při napájení 5V nepřekročí výstup cca 3,6V (viz datasheet) a nevyužijeme tak plný rozsah AD převodníku, což ale nevadí, protože stejně jas převádíme na šestnáct úrovní. Výstup operačního zesilovače je přiveden přes RC filtr R10, R11,  C11, C12 na vstup AD převodníku. Tento filtr měl odstranit rychlé změny osvětlení, ale nakonec jsem filtraci udělal i v SW a tento filtr je možné neosadit a jen spojit výstup zesilovače se vstupem převodníku. Čtyřnásobný OZ jsem použil jen z důvodu „šuplíkových zásob“.

Arduino hodiny s ESP8266 - Pohled zepředu

Pohled zepředu

Obvod klávesnice

Klávesnice je v analogovém provedení okopírovaném z Arduino shieldu dvouřádkového displeje, tj výstup klávesnice je přiveden na vstup AD převodníku a zmáčknuté tlačítko je reprezentováno hodnotou AD převodu. V klidovém stavu je hodnota 1023. Klávesnice neumí rozpoznat několik zmáčknutých tlačítek naráz – vždy to tlačítko s nižším číslem „maskuje“ to s vyšším číslem. Pro zamýšlené použití to však vůbec ničemu nevadí. Hodnoty po převodu jednotlivých kláves jsou ve zdrojovém souboru. Pokud se budou hodnoty výrazně lišit, je třeba provést korekce mezí v patřičné části programu.

Arduino hodiny s ESP8266 - Upevnění tlačítek

Upevnění tlačítek

Obvod piezoelementu na buzení

Pro buzení je použit běžný samovybuzovací element spínaný tranzistorem Q1. Sériově v kolektoru tranzistoru mám zapojen dodatečný rezistor, kterým jsem nastavil hlasitost. Ve schématu ani na plošném spoji tento rezistor není zakreslen a jeho hodnota závisí na piezo elementu a případně mechanickém provedení. Já jsem použil hodnotu 1k.

Obvod napájení

Pro napájení celých hodin jsem zkoušel několik variant – klasické plechové trafo s usměrňovačem a stabilizátorem, externí spínaný zdroj (adaptér do zásuvky) + interní stabilizátor. Nejvíce (i z hlediska spotřeby) se mi osvědčilo napájení z malého adaptéru s výstupem USB původně určeného k nabíjení smartphonu. Tyto adaptéry jsou dostupné za rozumné peníze. Mechanicky je napájení řešeno ustřiženým USB kabelem, který USB konektorem je zasunut do adaptéru a druhý konec je napevno přidělán na krabičku hodin a propojen s plošným spojem.

Zdrojovou část doplňuje lineární stabilizátor LM1117 stabilizující 3,3V pro účelu wifi modulu ESP8266. Samozřejmě, že by bylo možné využít i nějaký spínaný modul, ale vzhledem k výkonové ztrátě (LM1117 je sotva vlažný) to nemá opodstatnění.

Software

V SW je nastaven poměrně důležitý údaj a to přístup do místní Wifi sítě. Jsou na to 2 parametry: SSID a PASS. Tyto údaje musí být korektně nastaveny a program znovu přeložen a nahrán do Arduina.

Hodiny mají svůj interní časový čítač, který je inkrementován v sekundových intervalech. Tento čítač je synchronizován s NTP přes wifi. V případě poslední úspěšné synchronizace, je další provedena za 1 hodinu (3600000ms), v případě neplatné poslední synchronizace je interval 45 sekund (3600000ms/80). Interval lze ovlivnit nastavením parametru „PRODLEVA“. Rychlost čítání sekund je ovlivňována proměnnou „konstanta“. Tato je uložena v EEPROM a změna její velikosti probíhá v okamžiku úspěšné synchronizace s časem NTP. Toto je realizováno na konci funkce setTime(), kdy podle toho, zda je interní čítač rychlejší či pomalejší než čas z NTP, inkrementujeme nebo dekrementujeme konstantu. Nepřesnost čítání je způsobena především tím, že použité Arduino Pro Mini má místo křemenného krystalu keramický rezonátor s výrazně nižší přesností. Když se nepovede synchronizace s NTP, hodiny jdou normálně dál a pokusí se v krátkém intervalu ověřit čas. Na funkci zobrazeného času ani budíku to vliv nemá.

Komentář si zaslouží i způsob inicializace wifi modulu ESP8266 – je jiná, než jsem viděl u ostatních uživatelů na internetu. Wifi ESP8266 si ukládá parametry pro připojení do interní EEPROM, takže stačí tento modul zapnout a po nějakém čase se automaticky připojí k posledně použité wifi síti. Proto po zapnutí program čeká určitou dobu (min 10s) a pak se začne ptát, zda je připojen k wifi síti. Pokud se automatické připojení povede (je na to 5 dotazů s prodlužujícími se intervaly), nastavíme časovou zónu (při tom dojde k aktivaci NTP klienta uvnitř ESP8266) a opustíme funkci s návratovou hodnotou true. Pokud automatické připojení neklapne, posíláme parametry připojení standardním způsobem. Při psaní komunikace s wifi modulem se mi osvědčilo počkat na příchod očekávaného počtu znaků do seriového bufferu a následně na to zjistit co modul odpověděl.

Uživatelský manuál

Hodiny si nastaví čas automaticky, tento je uživatelsky nenastavitelný. Uživatelsky lze nastavit pouze čas buzení. K tomu slouží 3 tlačítka. První stisk zobrazí čas budíku bez jeho změny, další stisky již mění čas. Pokud nastavený čas vyhovuje, přestaneme tlačítka mačkat a po uplynutí nastaveného času (5s) se hodnota uloží a hodiny se vrátí k zobrazení aktuálního času.
Tlačítko nalevo mění nastavený čas buzení – hodiny. Opakovaným stiskáním přidáváme hodinu cyklicky dokola. Druhé tlačítko z leva přidává desítky minut, další jednotky minut. Další tlačítko zapíná a vypíná buzení. Toto je indikováno desetinou tečkou vpravo – u jednotek minut. Opět první zmáčknutí ukáže čas buzení a nastavení buzení, další stisk přepíná stav buzení.
Poslední tlačítko zobrazí sílu signálu wifi (RSSI) v dBm. Pokud nejsou hodiny synchronizovány s NTP serverem přes wifi, tak je to indikováno desetinou tečkou u čísla nejvíce vlevo (desítky hodin).

Mechanické provedení

První provedení bylo na dvou plošných spojích – deska Arduina a deska displeje. V reálu se pak tato koncepce ukázala jako velká , proto jsem udělal druhou verzi plošného spoje, kde vše je na jednom plošném spoji a jen displej je připevněn v pravém úhlu. V pohledu by tato koncepce neměla být větší než obrys displeje. V původní verzi jsem zkoušel i různé zdroje, proto na fotkách je ještě osazený plošný spoj pro modul spínaného stabilizátoru. Plošný spoj je přišroubován na základové desce z překližky 5mm a krycí krabička je z ceibové překližky 3mm. Přední strana je tvořena červeným polykarbonátem 2mm. Plošné spoje jsou optimalizovány na ruční výrobu (vrstvu TOP používám pro vedení drátových propojek). Pro mou kusovou výrobu se při této složitosti oboustranný spoj nevyplatí.

Návrh plošného spoje hodin s ESP8266 1

Návrh plošného spoje hodin 1

Návrh plošného spoje hodin s ESP8266 2

Návrh plošného spoje hodin 2

Možná vylepšení

Pokud by se použil modul ESP8266 s více GPIO, bylo by teoreticky možné úplně vynechat Arduino a mít pouze wifi modul. Konfigurace wifi parametrů by byla možná přes SW seriál, který se používá pro debug.

Podklady


Za článek děkujeme a držíme palce v dalších projektech!

Máte svůj projekt, který chcete předvést ostatním? Napište na naše fórum, nebo na mail zbysek@arduino.cz.

CANSAT #2: Softwarová řešení a design CanSatu

$
0
0

Další díl ze seriálu o stavbě studentského satelitu CanSat. Dnes něco k hardware i software.


Vítejte u dalšího z článků popisujících náš postup evropskou soutěží CanSat. V této části rozebereme naše řešení po stránce softwarové a hardwarové. Nejdříve nastíníme, jak funguje celý systém dohromady. Potom, již konkrétněji, jak vypadají jednotlivé subsystémy a proč jsme se pro ně rozhodli. Nakonec popíšeme, jaká konstrukční rozhodnutí jsme udělali a proč.

Jak tedy vypadá celý proces od sběru dat až po jejich zpracování? V samotném CanSatu se kromě padáku nachází dvě Arduina, senzory pro sběr údajů o teplotě, tlaku, zrychlení a GPS poloze, kamera, MicroSD karta, radiový vysílač a samozřejmě baterie. CanSat je tak rozdělen na dva okruhy, řekněme okruh A a B. Okruh A je postaven okolo Seeeduina Mega a je zodpovědný za sběr dat ze senzorů, jejich formátování a posílání do pozemní stanice. Okruh B založen na čipu ATMega328 sbírá periodicky fotografické snímky a ukládá je na MicroSD kartu. Zároveň také přijímá data od okruhu A a ukládá je na kartu. Data ze senzorů dále přijímá pozemní stanice tvořená Arduinem Pro Micro, které je připojeno jednak k anténě pro příjem radiového vysílání, dále k počítači/tabletu/mobilu. Na stanici běží naše aplikace, která data příjme a začne zpracovávat. Jak konkrétně uvidíme později.

Nyní k podrobnějšímu popisu. Začněme CanSatem samotným. Jak jsem již zmínil, sonda je rozdělena na dva nezávislé okruhy A, B. Když spustíme A, pošle signál do senzorů a získá z nich potřebné údaje. Ty napřed pošle na zem, poté je předá okruhu B a vrací se na začátek smyčky. GPS lokátor je taktovaný na 1Hz, takže sběr dat začne znovu za přesně jednu sekundu. Okruh B začíná snímkem, potom ve smyčce napřed zjistí, jestli má data od okruhu A. Pokud ano, uloží je do externího úložiště (MicroSD karta) a pokračuje v ukládání dat přijatých z kamery.

Cansat: Diagram systému satelitu

Diagram systému satelitu

Proč jsme použili tento dvouprocesorový systém? Jelikož chceme využívat i snímků z kamery, museli jsme překlenout následující problém. Uložení jednoho obrázku trvá dedikovanému Arduinu přibližně půl minuty. Vzhledem k tomu, že Arduino by muselo zároveň sbírat data a odesílat je, jeden zápis by trval ještě déle, tudíž bychom v odhadované době sestupu padesáti vteřin vyfotili možná jenom jeden snímek, což už se ani nevyplatí, nemluvě o komplikaci kódu a bufferování sériové komunikace s kamerou. Proto máme hlavní obvod časovaný na jednu sekundu a pro asynchronní operace je vyhrazen jiný čip.

Mezitím na zemi přijímá pozemní stanice packety dat. Vzhledem k tomu, že funguje více méně jako vysílačka, není na ní nic skutečně pozoruhodného. Co však je zajímavé, je aplikace zpracovávající data v počítači. Jak jsme již nastínili v předchozím článku, jedná se o aplikaci pro Universal Windows Platform, tedy je spustitelná a plně funkční na jakémkoliv zařízení, které běží na operačním systému Windows 10. To pak teoreticky dává možnost připojit Arduino pozemní stanici k telefonu a vývoj mise sledovat na něm. Připojení vyžaduje USB OTG (Universal Serial Bus On The Go) a podporu připojení periférií (například myš, či klávesnice).

Aplikace se spojí s Arduinem pozemní stanice přes USB a začne číst sériovou komunikaci. Z ní si díky předdefinovanému formátu packetů vytáhne a roztřídí data a začne je zakreslovat do grafů.

Cansat aplikace s grafy

Aplikace s grafy

Nyní k hardwarové části. Ta má velmi přísná pravidla definující jak rozměry a hmotnost CanSatu, tak maximální a minimální sestupovou rychlost. Konkrétně musí být vnější obal sondy 115 mm vysoký a mít průměr 66 mm. Limit se nevztahuje na antény a padák. Na ně se však vztahuje váhové omezení, neboť CanSat se všemi komponentami musí vážit v rozmezí 300 – 350 g. Dalším omezením je stanovená rychlost pádu, která musí být větší 6 m/s, ale nesmí přesahovat 12 m/s. To tedy při stanovené výšce 500 m znamená v průměru 55 vteřin pádu. Tomuto všemu jsme museli přizpůsobit náš návrh a konstrukci CanSatu.

Cansat zapojení satelitu

Zapojení satelitu

Kostrou celého zařízení je kovová konstrukce s háčkem pro uchycení na vynášecím dronu. V hardwaru bylo nejobtížnějším problémem časování otevírání padáku, což jsme vyřešili kapsou na spodní straně CanSatu trojúhelníkového tvaru s jednou stranou přichycenou na plechovce a protilehlý cíp je opatřen vlascem s očkem, které bude navlečené na tyč dronu před hlavní háček, takže kapsa se uvolní společně s vypuštěním.


Utekl vám předchozí článek o CanSat satelitu? Naleznete ho zde!

Zařízení pro pájení kondenzací nasycených par s Arduino Mega

$
0
0

Náš čtenář René Sulyok nám poslal článek o zařízení, které vzniklo v rámci jeho diplomové práce. Přejeme příjemné čtení.


Prečo práve spájkovanie v nasýtených parách?

Trh v dnešnej dobe ponúka rôzne metódy bezolovnatého spájkovania. Kladie sa pritom dôraz na kvalitu a spoľahlivosť spájkovaných spojov. Pri použití bezolovnatých spájok pre spájkovanie pretavením sú značné zmeny v porovnaní so spájkami olovnatými v procese pretavenia spájky. Pre spájkovacie pasty bezolovnaté je nutné navýšiť predhrievaciu teplotu a aj samotný čas pretavenia. Práve tieto faktory môžu spôsobiť prehriatie jednotlivých častí dosky plošných spojov. Poškodiť sa tak môže substrát, spájkovacia pasta ako aj samotné súčiastky určené pre povrchovú montáž. Pri použití konvekčnej metódy spájkovania je teplotu pretavenia možné navýšiť jednoducho zvýšením teploty prúdiacej plynnej látky. Tým sa ale homogénne ohrieva celý plošný spoj vrátane SMD súčiastok, čo môže viesť k prepáleniu substrátu a nepretaveniu spájkovacej pasty. Podobne pri spájkovaní metódou infračerveného žiarenia závisí teplota jednotlivých komponentov od ich povrchovej úpravy a tak skôr môže dôjsť k prepáleniu SMD súčiastok než pretaveniu samotnej spájkovacej pasty. Preto ako najúčinnejšia metóda spájkovania pretavením sa javí spájkovanie v nasýtených parách.

Reflow spájkovacia pec

Toto experimentálne spájkovacie zariadenie bolo navrhnuté a zostrojené v rámci praktickej časti diplomovej práce na Katedre elektrotechniky a mechatroniky, Fakulty elektrotechniky a informatiky na Technickej univerzite v Košiciach. Princíp spájkovania v nasýtených parách spočíva v kondenzácii nasýtených pár spájkovacieho média na spájkovacej paste. Ako spájkovacie média sa používajú perfluóruhlíkové kvapaliny s rôznymi hodnotami bodu varu (155 °C až 260 °C). Pri ohreve kvapaliny na bod varu dôjde k vytvoreniu inertnej atmosféry pár, čo zabezpečí bezoxidačný proces spájkovania, čím sa eliminuje vznik intermetalických zón v spájkovanom spoji.

Pájecí cyklus

Pájecí cyklus

Konštrukcia pece je vyrobená predovšetkým z hliníka s povrchovo práškovanou farbou odolnou voči vysokým teplotám. V spodnej časti sa nachádzajú stabilizované napäťové zdroje pre napájanie riadiacej elektroniky, samotná riadiaca elektronika, chladenie elektroniky, hlavný vačkový spínač, riadiaca jednotka Arduino Mega 2560, driver pre riadenie krokového motora, vzdušník vodného chladenia, čerpadlo vodného chladenia a senzory pre snímanie možného úniku kvapaliny vodného chladenia. V prednej časti zariadenia je ovládací panel s prehľadným podsvieteným 4-riadkovým displejom, ktorý informuje o procese spájkovania, informačná LED dióda upozorňujúca na zmenu stavu riadiaceho programu a potvrdzujúce tlačidlo. Samostatná spájkovacia časť je rozdelená do troch zón. Najnižšie položená je zóna ohrevu, kde sa nachádza spájkovacie médium, špirála pre jeho ohrev a tepelný senzor pre meranie teploty spájkovacieho média. Nad touto zónou sa nachádza zóna spájkovania, kde dochádza k vytvoreniu inertnej atmosféry nasýtených pár. Obsahuje tiež tepelný senzor pre meranie teploty DPS. Najvyššie položená je zóna chladenia. Obsahuje hliníkový chladič vodného chladenia, axiálne ventilátory a tepelný senzor. Pohyb DPS vo zvislom smere zabezpečuje výťahový mechanizmus s krokovým motorom.

Elektronika pájecího zařízení s Arduino Mega 2560

Elektronika pájecího zařízení

Riadiaci algoritmus

Po nanesený spájkovacej pasty na DPS a následnom osadení súčiastkami SMD je možné pristúpiť k procesu spájkovania. DPS sa uloží na pohybujúci sa mechanizmus. Ohrev spájkovacieho média je aktivovaný zatlačením tlačidla na ovládacom panely v stave Ready to start. Výťahový mechanizmus dopraví DPS do spájkovacej zóny. Po nahriatí spájkovacieho média na prednastavenú teplotu 230 °C a po uplynutí prednastaveného času podľa teplotného profilu spájkovania dôjde k pretaveniu spájkovacej pasty. Následne výťahový mechanizmus dopraví DPS do zóny chladenia, aktivuje sa čerpadlo vodného chladenia a laminárne chladenie. Pri procese nahrievania, spájkovania aj chladenia sa na displeji zobrazujú namerané teploty jednotlivých zón spájkovacej pece. Zmena stavu riadiaceho algoritmu je signalizovaná obsluhe akustickým signálom.

Ovládání pájecí stanice s Arduino Mega 2560

Ovládání pájecí stanice

Pohled dovnitř pájecí stanice s Arduino Mega 2560

Pohled dovnitř stanice

Bc. René Sulyok,
Katedra elektrotechniky a mechatroniky
Fakulta elektrotechniky a informatiky
Technická univerzita v Košiciach


Děkujeme za článek a přejeme hodně úspěchů!

Vaše projekty: Projekt „Bombona“

$
0
0

V rámci soutěže ke 4000 fanouškům na naší FB stránce se sešlo spoustu zajímavých projektů. To nás namotivovalo k tomu zde vytvořit rubriku Vaše projekty. Víme totiž, že je super mít možnost nechat se inspirovat od ostatních. Jako první Vám přinášíme článek o projektu, který nám poslal Jan Hons Šuškleb. S ním také vyhrál první cenu.


Vše začalo asi před rokem. Začal jsem na zelené louce a prošlapával si cestu neznámým terénem. Vlastně, abych si ověřil využitelnost internetu jako čistě vzdělávacího média a co vše a jakým způsobem je využitelné. Proto jsem projekt paojal širším způsobem. Vyzkoušel 3D tisk, naučil se základy programování a rozšířil si obzory.

Pokud by měl někdo obdobný zájem si vše vyzkoušet, pokusím se celý proces sumarizovat v tomtlo článku.

Procesy, které je možné zvládnout pomocí návodů na youtube a obdobných serverech:

  • výroba, kompletace, rozchození a naučení se létání s RC modelem, :)
  • RC simulátor Phoenix,
  • Google Sketchup – pro 3D tisk,
  • Netfabb – finish 3D tisku (vystřelovací mechanismus bomby),
  • Visual Studio s pluginem Micro (programování Arduina),
  • Arduino language,
  • pájení a práce s SMD technologií,
  • návrh obvodu a simulace obvodu,
  • Eagle (pro návrh PCB tištěného spoje),
  • domácí výroba PCB,
  • zdokonalení se v anglickém jazyce
  • a nějaké další dovednosti jako soustružení, sváření, řízení auta, odhánění dětí od nedodělané práce atd.

Každý z těchto procesů je pro začátečníka poměrně náročný a cesta k úspěchu, byť jen částečnému, je plná mnohdy zoufalých pokusů a omylů a vyžaduje nesmírnou trpělivost. Odměnou je ale báječný pocit, že je to alespoň částečně možné ve zcela amatérských podmínkách, bez předchozích znalostí či dovedností, a každá takto nově nabitá zkušenost pootvírá dveře do krásných zákoutí technologické říše divů.

V následujícím představení projektu upozadím procesy přímo nesouvisející s Arduinem a pouze bych k tomu podotknul, že naučit se létat pro mne bylo nejtěžší dovedností, kterou je třeba navíc zcela v mozku zautomatizovat. Proto bych doporučil, z úplného kraje, pár dnů potrénovat se simulátorem a až potom se pustit do rozsekávaní modelů na louce. Každý podle svého gusta. Já jsem samozřejmě začal na louce a až s hromádkou kuliček z EPP jsem pořídil simulátor.

Pájení, výroba PCB, 3D tisk už jsou přeci jen méně adrenalinové záležitosti a dají se zmáknout v klidu, po nocích, z křesla u počítače. Nejprve jsem vyzkoušel Arduino IDE, ale po pár nocích hraní si s template projekty mne přestalo bavit bílé prostředí a u složitějšího kódu nemožnost skrývání stromů kódu a nějak jsem intuitivně tušil, že to jde určitě i jinak a třeba třídění proměnných a automatické doplňování kódu by taky bodlo. Proto jsem sjel tutoriály od Microsoftu: Jak na Visual Studio, a naučil se tak základy.

Bylo třeba doinstalovat Plugin Micro. Vše v předcházejícím návodu.

Armstrong

Prvním projektem se stal Armstrong: blikač-pípač- generátor kostky-přehazovač blikacích sekvencí a tak podobně. Doplněno o MP3 přehrávač se tak ze staré krabice na špendlíky stal na několik dnů raketoplán. Děti si s tím chvilku vyhrály, hlavně si to pomohly sestrojit a několikrát letěly za gaučem na Mars i na měsíc.

Armstrong - Arduino Ovladač Raketoplánu

Armstrong – Arduino Ovladač Raketoplánu

Poté jsem sestrojil pípač s rf modulem a nakrmil ho upraveným kódem – odsud: https://www.arduino.cc/en/tutorial/melody.
int speakerPin = 17;
int length = 25; // the number of notes
char notes[] = "CaaggeecCaaggeecoeeee"; // a space represents a rest
int beats[] = { 4, 2, 2, 2, 2, 1, 3, 4, 4, 2, 2, 2, 2, 1, 3, 4, 2, 1, 1, 1, 1, 2, };
int tempo = 150;
void playTone(int tone, int duration) {
    for (long i = 0; i < duration * 1000L; i += tone * 2) {
        digitalWrite(speakerPin, HIGH);
        digitalWrite(13, HIGH);
        delayMicroseconds(tone);
        digitalWrite(speakerPin, LOW);
        digitalWrite(13, LOW);
        delayMicroseconds(tone);
    }
}

void playNote(char note, int duration) {
    char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'o' };
    int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 0 };
    // play the tone corresponding to the note name
    for (int i = 0; i < 8; i++) {
        if (names[i] == note) {
            playTone(tones[i], duration);
        }
    }
}

void setup() {
    pinMode(speakerPin, OUTPUT);
    pinMode(13, OUTPUT);
}

void loop() {
    for (int i = 0; i < length; i++) {
        if (notes[i] == ' ') {
            delay(beats[i] * tempo); // rest
        } else {
            playNote(notes[i], beats[i] * tempo);
        }
        // pause between notes
        delay(tempo / 2);
    }
    for (int i = 0; i < 5; i++) {
        digitalWrite(13, HIGH);
        delay(50);
        digitalWrite(13, LOW);
        delay(100);
    }
    delay(250);
}

Konstrukce je obdobná jako RF vysílač odsud. Má pin ATAD a ten se spojí s Arduino vstupovýstupem a napájení s malou LiPol baterkou. To je celé. Více viz zde.

Následovaly mé chabé pokusy s testováním senzorů, ale posléze jsem přišel na to, že existují již hotová kompletní řešení pro všechny senzory, co jsem si půjčil, a že mne to vlastně nebaví. Chtěl jsem dětem sestrojit robota, ale pak jsem jej našel na Aliexpresu hotového, a tak jsem Arduino odložil do šuplíku na neurčito, přemýšlel o koupi hotových řešení a přišlo první zoufalství. Vše již stejně bylo, je a bude uděláno v Číně, proč objevovat Ameriku, když to stačí objednat.

 

Takže, kdo se s tím vším nechce otravovat a projekt se mu líbí, může si to koupit vše hotové. A Amos Komenský ať se jde zahrabat a dá si oběd v čínském bistru pod bustou pana prezidenta. Vše letělo do kouta, zaprášený ovladač od televize dostal nové baterky a po příchodu z práce jsem se opět resetoval u televize.

Jenže jednoho večera mě tak děsně namíchli s neustálým vymýváním mozku, že ovladač letěl z okna, kutil ve mně se vzepřel a já opět vytáhl Arduino ze šuplíku. Chtěl jsem udělat něco zvláštnějšího a pustit se trošku víc do bastlení, a tak jsem si pořídil řiditelné ledky WS2812B (1, 2).

Jenže NeoPixel kód, teď už vím, že se tomu říká „knihovna“, se mi nelíbil, a tak jsem se naučil používat knihovny a github: https://visualstudio.github.com/. A začal experimentovat s geniální knihovnou FASTLED (G+ komunita).

A zase mě to chytlo. A světlo světa spatřil tento light box:

Video Lightbox

Co umí: spoustu sekvencí, zpomalování, zrychlování a přibral jsem další skill a sice řízení z PC přes serial port. A naučil se psát si primitivní aplikace.


Poznámka pro ty, co s tím třeba ještě nezačali… Byly stavy, kdy jsem mlátil hlavou o klávesnici a naprosto zoufale nechápal, proč to nejede, kde zas chybí nebo přebývá středník a proč programátoři nejsou lidi. A tak jsem objevil komunitu a zjistil, že lidé kolem Arduina jsou poměrně sdílní nadšenci ochotní pomoct a tu a tam se podělit o radu.

A pak už to šlo samo.

Kecám.

Ne nešlo.

Neo se ze mě přes noc nestal, ale osvojil jsem si cyklus neustálého hledání informací v referenčním manuálu, v knihách, fórech a tutoriálech, tedy návodech. Po nějaké době se mi začal jevit kód z internetu jasnější a srozumitelnější a pochopil jsem, že jsou tak asi dva druhy kodérů. Geniální čuňata a shovívaví průvodci neméně tak geniální. A pak taky tak něco mezi a jak kdy.

Čuňáckým kódem nemá vůbec smysl se zabývat a prase, aby se v tom vyznalo. Shovívavý průvodce má kód popsaný, někdy i krásně upravený, a občas je radost se v tom hrabat a člověk se ledacos naučí. A když se k tomu po měsíci vrátí, tak do toho zas nemusí čučet od začátku. To jen tak na okraj, pokud někdo dočetl až sem, čemuž se upřímně divím a v tom případě mi to dělá radost.

if here == ažsem
    potom radost = nějaká hodnota

Pomohlo mi psát si kód takto a až pak jej začít strkat do závorek, středníků a dalších celků. Následovala miniaturizace a s tím spojený přechod na pro mé účely zcela vyhovující „platformu“ Attiny a začal jsem experimentovat s čipy Attiny45 a Attiny85 dle tohoto návodu. Tím jsem potunil bedničku Armstrong, a uvolnil si tak Arduino UNO na další pokusy.

Na jakékoli druhy blikání a na časování nenáročné operace je to podle mě úplně skvělé. Zde je krásně vidět, kolik pinů má který čip k dispozici, a kódování jsem nijak upravovat nemusel.

Historie experimentování - Od 555 po Android

Historie experimentování – Od 555 po Android

A na řadu přišel první FSM. A potřeba multitaskingu a Interrupts a další krásné záhady Arduina. A knihovnička s čudlíkem a knihovnička na servo a první robot na světě. Bohužel nemám dokumentaci, jednalo se o pár pokusů se servama a motorkem. A na řadu přišla potřeba výroby prvního tišťáku. A naprosto frustrující a zničující učení se programu EAGL na kreslení tišťáků.

Pokud někdo začíná, nedělejte stejnou tvrdohlavou chybu jako já a nezačínejte s EAGLEM. Je to mocný nástroj, ale vůbec žádný sluha. Intuitivnost naprosto nulová a to co jsem se před pár měsíci naučil ve sketchupu kvůli 3D tisku, tak v Eaglu jde naprosto proti tomu. Vývojáři toho programu patrně nejsou lidi, ale nějaký druh umělé inteligence. Zlomit ten program mi dalo opravdu děsnou práci. Na druhou stranu v ničem jiném bych už teď nechtěl dělat, protože toho svede opravdu hodně a skvěle. Ale pro začátečníka je to děs. Jistě existují i lehčí programy, na druhou stranu tento je v základu pro domácí kutění zdarma a dá se v něm udělat úplně naprosto vše kolem návrhů elektroniky.

Googloval jsem pojem leptání fotocestou. A postupoval podle návodu z těchto stránek mlab.cz. S tím, že PCB jsem koupil už s fotovrstvou.

První "úspěšně" vyleptaný pokus

První „úspěšně“ vyleptaný pokus

Bombona

Nakonec tedy spíš konečně přišel čas, kdy jsem pocítil potřebu si kód nějak graficky nakreslit, protože jsem se ztrácel v logice, co ze kterého stavu se má pokračovat kam. Můj požadavek na 2CH dvoukanálové ovládání je následující.

  • 1CH (GEARS) z recievru letadla ovládá serva podvozku a s tím rozsvěcuje i přistávací světla (přistávací sekvenci)
  • 2CH (FLAPS) při 1/3 signálu mění sekvence blikání a bomb drop, při plném signálu vysouvá klapky přes zpomalovač.

sekvence blikání:

  • OFF ( Arduino ve sleep modu spotřeba teoretických 6uA, praktických úplně jinde a to teď ladím)
  • ALARM (vše bliká při vybité baterce) – under construction
  • STANDARD
  • TAXI (při pojíždění po runway)
  • BLUE (upozornění před vypuštěním bomby nebo možnost skoku do STD režimu)
  • BOMB DROP

Z toho vyplývá, že jsem začal tvořit jakési stavy nějakého vnitřního stroje a nemohl jsem se v tom vyznat, co má po čem následovat. A tak jsem objevil krásný online nástroj GLIFFY, ve kterém se dají jednotlivé stavy krásně rozkreslit, nebo třeba i jen myšlenková mapa. A kód se pak dá navrhovat snadněji.

A pak už jsem se pustil do finálního programování vlastního blikače a odhazovače. Požadované funkce:

  • Blikání s digitálními ledkami WS2812B
  • Blikání s normálními ledkami
  • Ovládání serva
  • Ovládání dvěma RC kanály – jeden na vysouvání podvozku, ten rozsvítí přistávací sekvenci, druhý na odhazování bomby, vysouvání klapek a přepínání sekvence blikání.
  • Přepínání dotykovým spínačem (když je ero na zemi a pro testování)
  • Přepínání do režimu nízké spotřeby a vypnutí komplet.
  • Monitorování napětí baterky.
  • A příprava na spolupráci s Ardupilotem. (to jsem zatím neimplementoval)

Přikládám i ukázkový kód, ale opatrně s tím, protože jsem tam pomazal hlavičky odkud jsem to polepil, a tak by se autoři oněch řádků mohli čepýřit. Nějak jsem jaksi vůbec nepočítal, že bych to někdy někam dával, ale kamarádovi se to líbilo a přesvědčil mne, tak se s vámi o to dělím!

Zatím jsem nestudoval ty licence a ochrany autorství a takové věci, ale budu se do toho muset brzo pustit. Zde tedy ukázka amatérského kódu. Varuji ale profíky a hnidopichy – „z tohodle vás asi trefí šlak!“ Ale co?! Já mám radost, že to funguje!!! A o to podle mě jde především.

Můj amatérský kód:

/*
 Name:      Navlights_2016_susu_Duben_v9.ino
 Created:   3/29/2016 7:57:36 PM
 Author:    Já + půl internetu  
 docela by mně bodlo, kdyby mně nějaký dobrák vysvětlil jak se to tady s tou hlavičkou dělá.
*/

#include "FastLED.h"
#include "Button.h"

#include "PinChangeInt.h"
#include "Servo.h"

#define NUM_LEDS 2
#define LED_DT 5
#define LED_TYPE WS2812B 
#define COLOR_ORDER GRB 

#define FRAMES_PER_SECOND   100

//*********************_POWERSLEEEP___************************************
#include "LowPower.h"
const int wakeUpPin = 2;
///*********END___INTEGERS POWER SLEEP____********************************************

//uint8_t max_bright = 255;
struct CRGB leds[NUM_LEDS];

int ledMode;                                             // Starting mode is typically 0. Use 99 if no controls available. ###### CHANGE ME #########
int maxMode;
int lastMode;
int multiswitch;

// Pushbutton pin definition
const int buttonled = 11;                                     //LED in power button   já si to prostě občas popisuju anglicky protože mně pak kolegové nečeši rozumí při pomoci                             
int buttonState = 0;
int lastButtonState = 0;
#define BUTTON_PIN 2    // Digital pin used for debounced pushbutton
#define PULLUP true
#define INVERT true  
#define DEBOUNCE_MS 10
#define BLINK_INTERVAL 100
#define LONG_PRESS 3000

Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS);                     // Declare the button
enum { ONOFF, TO_BLINK, BLINK, TO_ONOFF };
uint8_t buttonSTATE;                   //The current state machine state
boolean buttonledState;                //The current LED status
unsigned long ms;                //The current time from millis()
unsigned long msLast;

// Generic variables
uint8_t thisdelay = 0;                                        // Standard delay
uint8_t thishue = 0;                                          // Standard hue
uint8_t thissat = 255;                                        // Standard saturation
int thisbright = 0;                                           // Standard brightness
uint8_t thisfade = 224;                                         // Standard fade rate
bool thisdir = 0;                                             // Standard direction

//___INTEGERS RECIEVER BUS____********************************************
int Gear;
int Flaps;
int alarmmode = 0;

boolean Offmode; //RC swicth ints
boolean Smode;
boolean Tmode;
boolean LLmode;
boolean Amode;
byte Amodecount;

//___INTEGERS SERVO BUS____********************************************
#define GEAR_IN_PIN 4
#define FLAPS_IN_PIN 3
// #define GEAR_OUT_PIN 12
#define FLAPS_OUT_PIN 10 //Bomb
Servo servoGEAR;
Servo servoFLAPS;
#define GEAR_FLAG 2       // These bit flags are set in bUpdateFlagsShared to indicate which
#define FLAPS_FLAG 4        // channels have new signals
volatile uint8_t bUpdateFlagsShared;
volatile uint16_t unGEARInShared;
volatile uint16_t unFLAPSInShared;
uint32_t ulGEARStart;
uint32_t ulFLAPSStart;

//___INTEGERS TAIL STROBO FLASHERU____********************************************
const int ledx = 7;
int stateONOFF = LOW;
int ledx_ONOFF = 1500; //pause time
unsigned long currentMillis = 0;
unsigned long previousONOFF_Millis = 0;
boolean blink = false;

unsigned long currentstrobo = 0;
unsigned long previousstrobo = 0;
long OnTime = 70;     //on step      
long OffTime = 140;  //off step
int ledState = LOW;

int nmbrcount = 4;
int pocitani = 0;

//____WING__INTEGERS_______*******************************************************
//const int ledwing = 8;
int stateONOFF_wing = LOW;
int ledx_ONOFF_wing = 1500; //pause time
unsigned long currentMillis_wing = 0;
unsigned long previousONOFF_Millis_wing = 0;
boolean blink_wing = false;

unsigned long currentstrobo_wing = 0;
unsigned long previousstrobo_wing = 0;
long OnTime_wing = 60;     //on step      
long OffTime_wing = 180;  //off step
int ledState_wing = LOW;

int nmbrcount_wing = 4;
int pocitani_wing = 0;

//______Beacon____***************************************************
int beacon1 = 6;           // the PWM pin the LED is attached to
boolean beac01 = false;
uint8_t xbeacon = 0;
byte xbeaconval = 0;

//______Landning____***************************************************
const int LLled = 13;
boolean ONOFFland = false;
int LLledState;

void setup() {
    //Serial.begin(9600);

    delay(500);

    digitalWrite(buttonled, HIGH);
    servoFLAPS.writeMicroseconds(1800);

    //pinMode(wakeUpPin, INPUT); //sleep wakeup

    pinMode(buttonled, OUTPUT); //Button Led

    pinMode(ledx, OUTPUT); // Tail led. v ocase
    pinMode(beacon1, OUTPUT); // Analog1 - Beacon led. MAJAK A0
    pinMode(LLled, OUTPUT); // Landing led. v křídlech


    LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);     //ws2812 v křídlech 
    //FastLED.setBrightness(max_bright);

    // set_max_power_in_volts_and_milliamps(5, 1000);  // UNDER CONSTRUCTION

    change_mode(ledMode, 0);    // Initialize the first sequence    

                                //********************____RC_READ___**************
//  servoGEAR.attach(GEAR_OUT_PIN);
    servoFLAPS.attach(FLAPS_OUT_PIN);
    PCintPort::attachInterrupt(GEAR_IN_PIN, calcGEAR, CHANGE);
    PCintPort::attachInterrupt(FLAPS_IN_PIN, calcFLAPS, CHANGE);
    
    xbeaconval = 0; //majak initializace 0
}

void loop() {
    detachInterrupt(0);

    ms = millis();
    
    //show_at_max_brightness_for_power();

    RCread();
    RCswitch();
    readbutton();
    change_mode(ledMode, 0);                               // Strobe, don't set it.
}

void change_mode(int newMode, int mc) {                        // mc stands for 'Mode Change', where mc = 0 is strobe the routine, while mc = 1 is change the routine
    maxMode = 6;
    if (mc) Beacon(false);                                           // Set this OFF as default
    if (mc) Landing(false);
    if (mc) fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));              // Clean up the array for the first time through. Don't show display though, so you may have a smooth transition.

    switch (newMode) {                                          // First time through a new mode, so let's initialize the variables for a given display.
        case  0: if (mc) { thisdelay = 20; } Off(); break;              // All off, not animated.
        case  1: if (mc) { thisdelay = 20; } Beacon(true); TailONOFF(1700, 5);  Sinusovac2();  break;                                         //  Standart                           Strobo2(0xff, 0xff, 0xff, 2, 70, 75); 
        case  2: if (mc) { thisdelay = 20; } Landing(true); Beacon(true); TailONOFF(1000, 3); Sinusovac(); break;                                                     //Landing     {thisdelay=20;} SinusovacPIN();
        case  3: if (mc) { thisdelay = 20; } SinusovacLR(); TailONOFF(3500, 2); break;                                     //Standby TAXI Landing
        case  4: if (mc) { thisdelay = 20; } Beacon(true); TailONOFF(500, 4); Wingstrob(800, 3); break;                                            // Full Strobo - ALARM                       Strobo1(0xff, 0xff, 0xff, 5, 70, 75);
        case  5: if (mc) { thisdelay = 20; } Drop(); {fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255)); LEDS.show(); } LEDS.show(); break;           // BLUE on, not animated.
        case  6: if (mc) { thisdelay = 20; } Beacon(true);  break;             //beacon
    } // switch newMode

    ledMode = newMode;
    lastMode = ledMode;
} // change_mode()

  //---------------------- WINGS - křídla - ws2812 ---------------------------------------------

void Standby() {
    /*
    leds[0] = CRGB::Red;
    leds[1] = CRGB::Green;
    LEDS.show();
    */
}

void Wingwhite() {
    leds[0] = CRGB::White;
    leds[1] = CRGB::White;
    LEDS.show();
}

void Wingblack() {
    leds[0] = CRGB::Black;
    leds[1] = CRGB::Black;
    LEDS.show();
}

void Wingstrob(int ledx_ONOFF_wing, int kolikrat_wing) {
    currentMillis_wing = millis();
    currentstrobo_wing = millis();

    if (currentMillis - previousONOFF_Millis_wing >= ledx_ONOFF_wing) {
        blink_wing = !blink_wing;
        previousONOFF_Millis_wing += ledx_ONOFF_wing;
    }
    if ((blink_wing == true) && (stateONOFF_wing == LOW)) {
        stateONOFF_wing = HIGH;

        Wingstrobo();
    }
    else
    {
        stateONOFF_wing = LOW;
    }
    nmbrcount_wing = kolikrat_wing;
    Pocitadlo_wing();
}

void Wingstrobo() {
    if ((ledState_wing == HIGH) && (currentstrobo_wing - previousstrobo_wing >= OnTime_wing))
    {
        ledState_wing = LOW;
        previousstrobo_wing = currentstrobo_wing;
        // digitalWrite(ledwing, ledState);
        Wingblack();
    }
    else if ((ledState_wing == LOW) && (stateONOFF_wing == HIGH) && (currentstrobo_wing - previousstrobo_wing >= OffTime_wing))
    {
        ledState_wing = HIGH;
        previousstrobo_wing = currentstrobo_wing;
        // digitalWrite(ledwing, ledState);
        Wingwhite();
        pocitani_wing = pocitani_wing + 1;
    }
}

void Pocitadlo_wing() {
    if ((pocitani_wing >= nmbrcount_wing) && (blink_wing == true)) {
        pocitani_wing = 0;
        blink_wing = false;
        // digitalWrite(ledwing, LOW);
        Wingblack();
    }
    stateONOFF_wing = LOW;
}

//----------------------Sinusovac WS2812B ---------------------------------------------
void Sinusovac() {
    uint8_t xsin = beatsin8(25, 0, 255); // beatsin16(BPM,min,max);
    leds[0] = CRGB(xsin, 0, 0);
    leds[1] = CRGB(0, xsin, 0);
    LEDS.show();

} // konec sinusovace

  //----------------------Sinusovac  LEFT/RIGHT WS2812B ---------------------------------------------
void SinusovacLR() {

    uint8_t xsinlr = beatsin8(22, 0, 255); // beatsin16(BPM,min,max);
    leds[0] = CRGB(xsinlr, 0, 0);
    byte z = 255 - xsinlr;
    leds[1] = CRGB(0, z, 0);
    LEDS.show();

} // konec sinusovace


  //----------------------Sinusovac2 WS2812B ---------------------------------------------
void Sinusovac2() {
    uint8_t xsin2 = beatsin8(29, 0, 255); // beatsin16(BPM,min,max);
    leds[0] = CRGB(xsin2, 0, 0);
    leds[1] = CRGB(0, xsin2, 0);
    LEDS.show();

    if (xsin2 <= 7) { Wingwhite(); }
    if (xsin2 <= 5) { Wingblack(); }
    if (xsin2 <= 3) { Wingwhite(); }
    if (xsin2 <= 1) { Wingblack(); }
}


// konec sinusovace

//**************************___TAIL STROBO FLASH___**********************************************************************//

///*
void TailONOFF(int ledx_ONOFF, int kolikrat) {
    currentMillis = millis();
    currentstrobo = millis();

    if (currentMillis - previousONOFF_Millis >= ledx_ONOFF) {
        blink = !blink;
        previousONOFF_Millis += ledx_ONOFF;
    }
    if ((blink == true) && (stateONOFF == LOW)) {
        stateONOFF = HIGH;

        Tailstrobo();
    }
    else
    {
        stateONOFF = LOW;
    }
    nmbrcount = kolikrat;
    Pocitadlo();
}

void Tailstrobo() {
    if ((ledState == HIGH) && (currentstrobo - previousstrobo >= OnTime))
    {
        ledState = LOW;
        previousstrobo = currentstrobo;
        digitalWrite(ledx, ledState);
    }
    else if ((ledState == LOW) && (stateONOFF == HIGH) && (currentstrobo - previousstrobo >= OffTime))
    {
        ledState = HIGH;
        previousstrobo = currentstrobo;
        digitalWrite(ledx, ledState);
        pocitani = pocitani + 1;
    }
}

void Pocitadlo() {
    if ((pocitani >= nmbrcount) && (blink == true)) {
        pocitani = 0;
        blink = false;
        digitalWrite(ledx, LOW);
    }
    stateONOFF = LOW;
}
//*/

/*
void TailONOFF(int casovac, int defpocitac) {
    uint8_t zapvyp;
    zapvyp = beat8(25, 0);
    if (zapvyp < 140)
    {
        uint8_t blik;
        blik = beat8(230, 0);
        if (blik >= 230)ledState = HIGH;
        else ledState = LOW;
    }
    else {
        ledState = LOW;
    }
    digitalWrite(ledx, ledState);
}
*/

//KONEC ****************************************************************************************************************
//----------------------Sinusovac pin BEACON---------------------------------------------

void Beacon(boolean beac01) {
    if (beac01 == true) {     
        uint8_t xbeaconval = beatsin8(9, 0, 255, 0, 0);
        //xbeacon = cubicwave8(xbeaconval);
        xbeacon = quadwave8(xbeaconval);
        analogWrite(beacon1, xbeacon);
    }
    else analogWrite(beacon1, 0);
} // konec sinusovace

  //----------------------Landning ---------------------------------------------

void Landing(boolean ONOFFland) {
    if (ONOFFland == true) {
        LLledState = HIGH;
    }
    else {
        LLledState = LOW;
    }
    digitalWrite(LLled, LLledState);
} // konec landing

  //----------------------All PINS OFF---------------------------------------------
void Off() {
    Offmode = true;
    digitalWrite(ledx, LOW);
    digitalWrite(LLled, LOW);
    analogWrite(beacon1, 0);
    fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
    LEDS.show();
}

void Sleep() {
    Off();
    attachInterrupt(0, wakeUp, LOW);
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
//---------------------- Utility Functions ---------------------------------------------


void wakeUp()
{
    // Just a handler for the pin interrupt.
    
}

int wrap(int step) {
    if (step < 0) return NUM_LEDS + step;
    if (step > NUM_LEDS - 1) return step - NUM_LEDS;
    return step;
} // wrap()

void fill_solid_HSV(uint8_t ahue, uint8_t asat, uint8_t abright) {  // Set all LED's to an HSV value.
    for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CHSV(ahue, asat, abright);
    }
}  // fill_solid_HSV()

void setPixel(int Pixel, byte red, byte green, byte blue) {
    leds[Pixel].r = red;
    leds[Pixel].g = green;
    leds[Pixel].b = blue;
}

void readbutton() {                                           // Read the button and increase the mode
    myBtn.read();

    if (myBtn.wasPressed()) {
        switchLED();
    }
    if (myBtn.wasReleased()) {
        switchLED();
        ledMode = ledMode >= maxMode ? 0 : ledMode + 1;              // Reset to 0 only during a mode change
        change_mode(ledMode, 1);
    }
    if (myBtn.pressedFor(3000)) {
        switchLED();
        digitalWrite(buttonled, LOW);
        ledMode = 255;
        change_mode(ledMode, 1);
        Sleep();
    }
} // readbutton()

  //*******************BUTTON signal LED****************************
void switchLED()
{
    msLast = ms;                 //record the last switch time
    buttonledState = !buttonledState;
    digitalWrite(buttonled, buttonledState);
}

//Switch the LED on and off every BLINK_INETERVAL milliseconds.
void fastBlink()
{
    if (ms - msLast >= BLINK_INTERVAL)
        switchLED();
}

//*******************RC Reciever functions****************************

void RCswitch() {
    if (Offmode == true) {
        Smode = true;   //OFF mode
        Tmode = true;
        LLmode = true;
        Smode = true;
        Offmode = !Offmode;
    }

    else {
        if (Gear == 0 & Flaps == 0) {
            if (Smode == false) {
                change_mode(1, 1); // 1 STANDART  
                Smode = true;
            }

            Tmode = false;
            Amode = false;
            LLmode = false;
            servoFLAPS.writeMicroseconds(1800);
            if (Amodecount > 2) {
                Amodecount = 0;
            }
        }

        if (Gear == 1 & Flaps == 0) {
            if (Tmode == false) {
                change_mode(3, 1); // 3 TAXI  
                Tmode = true;
            }

            Smode = false;
            LLmode = false;
            Amode = false;
        }

        if (Gear == 1 & Flaps == 1) {
            if (LLmode == false) {
                change_mode(2, 1);  // 2 LL 
                LLmode = true;
            }

            Tmode = false;
            Smode = false;
            Amode = false;
            servoFLAPS.writeMicroseconds(1800);
            if (Amodecount > 2) {
                Amodecount = 0;
            }

        }
        if (Gear == 0 & Flaps == 1) {

            if (Amode == false) {

                switch (Amodecount)
                {
                case  0: if (1) change_mode(4, 1);   break;  //ALARM
                case  1: if (2) change_mode(5, 1);   break;  // BombDROP BLUE LIGHT
                case  2: if (3) change_mode(6, 1);   break; // Beacon
                }

                Amodecount++;
                Amode = true;
                Serial.println(Amodecount);
            }

            Tmode = false;
            LLmode = false;
            Smode = false;
        }
    }

    //Serial.println(Smode);
}

//****************SERVO Functions*****************************
void Drop() {
    servoFLAPS.writeMicroseconds(800);
}

void RCread() {
    // create local variables to hold a local copies of the channel inputs
    // these are declared static so that thier values will be retained 
    // between calls to loop.

    static uint16_t unGEARIn;
    static uint16_t unFLAPSIn; // local copy of update flags
    static uint8_t bUpdateFlags; // check shared update flags to see if any channels have a new signal

    if (bUpdateFlagsShared)
    {
        noInterrupts(); // turn interrupts off quickly while we take local copies of the shared variables
                        // take a local copy of which channels were updated in case we need to use this in the rest of loop
        bUpdateFlags = bUpdateFlagsShared;

        // in the current code, the shared values are always populated
        // so we could copy them without testing the flags
        // however in the future this could change, so lets
        // only copy when the flags tell us we can.

        if (bUpdateFlags & GEAR_FLAG)
        {
            unGEARIn = unGEARInShared;
        }

        if (bUpdateFlags & FLAPS_FLAG)
        {
            unFLAPSIn = unFLAPSInShared;
        }

        // clear shared copy of updated flags as we have already taken the updates
        // we still have a local copy if we need to use it in bUpdateFlags
        bUpdateFlagsShared = 0;

        interrupts(); // we have local copies of the inputs, so now we can turn interrupts back on
                      // as soon as interrupts are back on, we can no longer use the shared copies, the interrupt
                      // service routines own these and could update them at any time. During the update, the 
                      // shared copies may contain junk. Luckily we have our local copies to work with :-)
    }

    // do any processing from here onwards
    // only use the local values unFLAPSIn, unThrottleIn and unGEARIn, the shared
    // variables unFLAPSInShared, unThrottleInShared, unGEARInShared are always owned by 
    // the interrupt routines and should not be used in loop

    // the following code provides simple pass through 
    // this is a good initial test, the Arduino will pass through
    // receiver input as if the Arduino is not there.
    // This should be used to confirm the circuit and power
    // before attempting any custom processing in a project.

    // we are checking to see if the channel value has changed, this is indicated  
    // by the flags. For the simple pass through we don't really need this check,
    // but for a more complex project where a new signal requires significant processing
    // this allows us to only calculate new values when we have new inputs, rather than
    // on every cycle.

    if (bUpdateFlags & GEAR_FLAG)
    {
        if (servoGEAR.readMicroseconds() != unGEARIn)
        {
            servoGEAR.writeMicroseconds(unGEARIn);
        }
    }

    if (bUpdateFlags & FLAPS_FLAG)
    {
        if (servoFLAPS.readMicroseconds() != unFLAPSIn)
        {

        }
    }

    bUpdateFlags = 0;

    /*
    int printme;
    int printmenew = unFLAPSIn;
    if (printmenew != printme)
    Serial.print("\t");
    Serial.println (printmenew);  // display if it changed
    printme= printmenew;
    */

    if (unFLAPSIn > 1000 && unFLAPSIn < 1700) {
        Flaps = 1;

        //Serial.print("\t");
        //Serial.println("Flaps 1");
    }
    if (unFLAPSIn > 1800 && unFLAPSIn < 2100) {
        Flaps = 0;
        //Serial.print("\t");
        //Serial.println("Flaps 0");
    }
    if (unGEARIn > 1000 && unGEARIn < 1400) {
        Gear = 1;
        //Serial.print("\t");
        //Serial.print("\t");
        //Serial.println("Gear 0");
    }
    if (unGEARIn > 1500 && unGEARIn < 2100) {
        Gear = 0;
        //Serial.print("\t");
        //Serial.print("\t");
        //Serial.println("Gear 1");
    }
    /*
    if (unFLAPSIn < 100 && unGEARIn < 100) {
    ledMode = 5;
    change_mode(ledMode, 1);
    }
    */
}

void calcGEAR()
{
    if (digitalRead(GEAR_IN_PIN) == HIGH)
    {
        ulGEARStart = micros();
    }
    else
    {
        unGEARInShared = (uint16_t)(micros() - ulGEARStart);
        bUpdateFlagsShared |= GEAR_FLAG;
    }
}

void calcFLAPS()
{
    if (digitalRead(FLAPS_IN_PIN) == HIGH)
    {
        ulFLAPSStart = micros();
    }
    else
    {
        unFLAPSInShared = (uint16_t)(micros() - ulFLAPSStart);
        bUpdateFlagsShared |= FLAPS_FLAG;
    }
}

No a protože je dobré vědět kdy skončit, přikládám video toho mála, co mám zdokumentované, a přeji všem nadšeným bastlířům, i skutečným profesionálům, ať je nadšení neopustí a ta práce s Arduinem ať se stane nejen vaším osobním rozvojem, ale třeba i uměleckou tvorbou.

S pozdravem
J.H.Šuškleb

Janovi za projekt moc děkujeme a přejeme hodně úspěchů. Máte projekt, se kterým se chcete pochlubit? Napište na zbysek@arduino.cz!

Meteostanice ovládaná Arduinem

$
0
0

Dalším příspěvkem do rubriky Vaše projekty je projekt meteostanice, kterou do naší soutěže přihlásil Michal Zelenka. Za zpracování článku mu tímto děkujeme.


Byl jsem požádán, abych sepsal něco málo o mém projektu Meteostanice, případně zveřejnil zapojení a kód. Sice nejsem žádný spisovatel, ale souhlasil jsem.

Začátky

Doma mi dlouho ležel ladem programátor USBasp, který jsem stavěl už kdysi dávno a tak jsem se odhodlal, že si zkusím postavit něco svého s mikroprocesorem Atmega. První největší problém byl, že jsem o mikroprocesorech věděl jen to, že bez nahraného programu jsou k ničemu. Programování jsem se naposled trochu věnoval na základce, a to PASCALu a předtím BASICu. První hledání po internetu mě přesvědčilo, že s BASICem se daleko nedostanu, rozblikat LEDku se povedlo, ale s ostatním už by byl problém. Takže slepá cesta a důvod vydat se směrem k jazyku C.

Moje první začátky s programováním popisovat nebudu, první pokusy rozblikat LEDku nebo roztočit motor zná asi každý. Tak začnu rovnou prvním rozumným nápadem, který mi ležel v hlavě už dlouho…udělat vlastní domácí meteostanici, s logováním dat. A tady začal můj příběh o stavbě meteostanice, kde se vyskytlo a stále pořád vyskytuje spousta problému. Zkusím to teď trochu popsat…snad se mi to povede.

Původně všechno začalo na mikroprocesoru Atmega8, běžným LCD displayem HD44780 2×16 znaků a teplotním čidlem DS18B20. Pátrání po internetu jak to všechno rozběhat zabralo nějaký čas, ale nakonec se povedlo.

První radost, kdy se na displayi ukázala teplota :)

Moje začátky s programováním

Moje začátky s programováním

Jenže hned po tom mi začalo docházet, že dvouřádkový display nestačí, jedno teplotní čidlo taky ne a tak proběhla výměna za 4×20 znaků. Následovalo objevení čidla DHT22, které umí i vlhkost vzduchu. Netrpělivé čekání na balíček a opět hledání jak vlastně zajistit, že mi DHT22 řekne teplotu a vlhkost. Chvilku jsem vydržel s kombinací DS18B20 a DHT22 kde jedno čidlo bylo natažené stíněnou dvoulinkou ven za okno jako venkovní teplota/vlhkost a druhé jako vnitřní teploměr, ale brzy to začalo být zase málo. Záhy dorazil další balíček, kde už byl i modul pro zápis dat na SD kartu, modul reálného času DS3231 a hlavně lepší display z Nokie 5110 přizpůsobený pro Arduino.

V této době jsem se ještě Arduinu vyhýbal. Arduino se mi líbilo spíš jen jako pro vývoj než pro použití ve finálním „produktu“ kvůli jeho velikosti a ceně, proto jsem zůstával u obyčejné Atmegy8… chyba, teď už to vím :)

Na nepájivém poli bylo stále dost místa, tak jsem mohl dál koukat, jak mi jeden display hezky ukazuje údaje a na druhé půlce pole si hrát s druhým displayem a RTC modulem.

Pokusy se dvěma displeji

Pokusy se dvěma displeji

Konečně nastala doba vyzkoušet i zápis dat na SD kartu. Chvilku mi to vydrželo, jenže mi tak nějak začal vadit ten ošklivý kabel natažený skrz okno ven. Něco málo hledání a nalezení maličkých a hlavně levných modulů pro komunikaci přes 433MHz. Tady už jsem narazil na problém, že většina návodů pro ty moduly 433MHz byla přímo pro Arduino, takže následovalo přeorientování na vlastní jednoduché Arduino, jen s procesorem Atmega328.

Arduino

První pokusy s 433Mhz a SD kartou

První pokusy s 433Mhz a SD kartou

Fungovalo to nějaký čas skvěle, jenže pořád vyndávat kartu a v počítači kopírovat data nebylo moc pohodlné, tak volba padla na posílání dat na internet a Thingspeak. První verze s internetem obsahovala ethernetový modul s ENC28J60, jenže ten se mi hrozně přehříval (i když podle výrobce prý OK). Malý chladič moc nepomáhal, takže zklamání… ethernet jsem zatím odstranil a odstranil jsem i přenos dat přes 433MHz.

Protože v nepájivém poli začínal být pěkný chaos při tom všem přidávání a odebírání součástek, tak jsem se rozhodl koupit svoje první Arduino. Rozhodl jsem se, že mi stačí Arduino UNO. Hned jsem přikoupil i senzor atmosférického tlaku BMP180 a taky pěkný barevný display. Display je konstruován jen na napětí 3.3V což jsem se dozvěděl až po několika marných pokusech o rozchození. Po několika hodinách jsem konstatoval jeho odchod do křemíkového nebe, ale na poslední chvíli jsem narazil na informaci že display je pouze na 3.3V a připojení na 5V ho zničí… poslední pokus zapojení přes odporový dělič a následoval jásot… LCD ŽIJE!! Rychlé přepsání kódu a meteostanice byla barevná. Bohužel po chvilce se na displayi začaly objevovat podivné chyby ve vykreslování. Byl jsem nucen tedy vyzkoušet několik dostupných knihoven pro obsluhu displaye. Každá měla pro mě určité výhody ale i nevýhody. Nakonec jsem narazil na knihovnu, u které jsem zůstal. Fonty měla sice kostičkované, ale bez chyb ve vykreslování.

Arduino a barevný displej

Arduino a barevný displej

Po čase jsem začal experimentovat s různou velikostí a stylem fontů ale chyby se opět začaly objevovat. Tady mi konečně došlo, že ty chyby jsou způsobené rozdílnou šířkou jednotlivých znaků. Protože u knihovny je přibalený i editor fontů, sjednotil jsem šířky číslic a vše bylo už v pořádku. Knihovna je dostupná na GitHubu.

Konečně meteostanice dostala nějakou rozumnou podobu, tak nastal čas přidat wifi a zápis dat na Thingspeak. ale nastal velký problém… a to s nedostatkem paměti Arduina. Možnost byla buď display nebo wifi…wifi vyhrála. Pár dní to běželo, ale postupem času mi to začalo zase vadit. Byl jsem donucen pořídit Arduino Mega které má paměti víc než dost (zatím si to stále myslím 😀 ).

Než Arduino Mega dorazilo tak jsem přemýšlel nad venkovním vysílačem teploty a vlhkosti. Tady mi naštěstí cestu zkřížila informace, že by se mohlo použít nějaké už hotové čidlo od komerčních meteostanic. V tu chvíli bylo rozhodnutí jasné… než dávat dohromady něco, kde nejspíš baterky dlouho nevydrží, použiju už něco hotového. Možná někdo bude říkat, že se to postavit bez problémů dá… věřím tomu, ale rozhodl jsem se tím dále nezabývat… aspoň zatím.

Doma mám už nějaký čas meteostanici Sencor s externím čidlem SWS-TS tak volba byla jasná. Jenže opět další problém, každá meteostanice každého výrobce používá jiný systém posílání dat pro meteostanici. Naštěstí internet je mocný nástroj se spoustou šikovných lidí a hlavně ochotných se podělit o svou práci, případně poradit. Na tomto webu jsem objevil celkem jednoduchý návod, jak odposlechnout za pomocí zvukové karty a jak dekódovat signál z čidla. Je tam k nalezení i kód pro Arduino, který by měl fungovat, ale u mého čidla nefungoval.

Hledání pokračovalo a našel jsem jedno téma v diskuzi, kde se tím někdo taky zabýval. Po menších úpravách s nastavením časování impulzů konečně Arduino přijalo teplotu z čidla :)

Ale…

První testy ukázaly zásadní problém… a to, že modul přijímače 433MHz je mizerný a bez dvoumetrové antény dosah není větší než 2-3 metry. Zkoušet pohnout cívkou, jak je na internetu někde zmiňováno, nemělo žádný efekt… vlastně mělo, přestalo to přijímat úplně 😀 Na Ebayi jsem objevil pár jiných a snad lepších přijímačů a hned jich několik objednal.

Různé bezdrátové moduly

Různé bezdrátové moduly

Ty úplně vlevo jsou podle mých testů úplně nejhorší varianta a doporučuji se jim vyhnout. Jak postupně docházely balíčky, tak jsem zkoušel jedno po druhém a v současné době se mi jeví jako nejlepší varianta RXB6 připojený na 3.3V (dokáže zaznamenat i vysílač souseda co bydlí o dvě patra níž než já :-) ). Na 5V se trochu zvýší dosah, ale zvýší se i šum a příjem je nespolehlivý. Bohužel se mi zatím nepovedlo vlastní řešení příjmu dat z meteostanice, tak stále používám kód zveřejněný v odkazu výše. Doufám, že se autor nebude zlobit :)

Díky dostatku paměti v novém Arduinu Mega jsem mohl spojit vše dohromady. Příjem externích čidel, WiFi pomocí ESP8266 a display. Aby display nesvítil zbytečně když nepotřebuji, bylo zde zapojeno podsvícení jen na podržení tlačítka…

První zapojení kompletní meteostanice

První zapojení kompletní meteostanice

…což není moc elegantní. Podsvícení jsem přepojil na výstup Arduina s tím, že na stisk tlačítka se na 10 vteřin display rozsvítí a na dvojité stisknutí zůstane svítit trvale. Chvilku se mi to tak líbilo, akorát dvojitý stisk nebyl spolehlivý. Někdy zareagoval na poprvé, a někdy si ze mě dělal akorát tak srandu… ani vzteklé výhrůžky a šílené mačkání tlačítka nezabralo. Kamarád mi poradil proximity senzor. Chvilka googlení odhalila senzor APDS-9930, který funguje i jako senzor osvětlení což by se dalo využít. Přepsání kódu nezabralo moc času a tak jsem hned zkusil i regulaci podsvícení v závislosti na okolním osvětlení. Teď stačí mávnout rukou nad čidlem a display se rozsvítí, když přidržím ruku chvilku nad čidlem tak display zůstane svítit trvale. Knihovnu pro senzor naleznete zde. Existuje i APDS-9960 který umí i navíc rozpoznat směr mávnutí ruky nad čidlem, ale to jsem se dozvěděl pozdě :(

Ještě jsem taky dlouho přemýšlel, jak vyřešit nastavení času. Napadalo mě řešení buď dvě tlačítka pro nastavení, anebo využít přijímač DCF. Nakonec mi to docvaklo… přece to bude připojený k internetu, takže volba padla na synchronizaci přes NTP. Kvůli tomu jsem využil upravený firmware pro ESP8266, který má v sobě implementované AT příkazy pro NTP. Dá se to vyřešit i s původním firmwarem, ale tohle řešení je jednodušší. Firmware je dostupný zde.

Jako poslední jsem nedávno objevil čidlo BMP280, které umí teplotu, vlhkost a i atmosférický tlak, takže jsem s ním nahradil dosud používaný BMP180 a DHT22.

Zatím finální verze meteostanice

Zatím finální verze meteostanice

Během stavby a programování bylo problémů víc než dost… a určitě ještě bude. Nekonečné trápení s chybějící závorkou nebo středníkem a záměna = za ==  mě stály spousty nervů a vlasů. Tady si vždycky nadávám a vzpomínám na PASCAL, kde mi to přišlo logičtější. Vůbec bych se nedivil, že jednou kvůli podobné chybě spadne někde letadlo 😀

Další z problémů jsem měl s příjmem z externích čidel, občas se to prostě přestalo přijímat. Díky kamarádovi se podařilo přijít na to, že je zde hloupá chyba s přetečením proměnných 😀
Taky jsem nechápal proč, když nastavím přes PWM u podsvícení LCD nulu tak pořád lehce svítil. Osciloskop odhalil, že nula u PWM není úplná nula a pořád tam lítal maličký impulz. Do dneška nevím, jestli je to chyba nebo vlastnost Arduina.

Meteostanice má spousty chyb, o některých vím, jen nebyl zatím čas je řešit. Současný největší problém je s wifi, kdy po nějaké době přestane fungovat. Řešení bude testování odpovědi ESP8266 a  HW reset ESPčka. V kódu je spousta nesmyslů nebo zbytečností, které by se daly řešit jinak… na to dojde časem v dalších verzích.

O nějaké elegantnosti v kódu taky mluvit nebudu, postupem času jak se to pořád nabaluje, umazává, přepisuje, se to uhlídat moc nedá. A navíc v programování jsem amatér 😀

Použité součástky

  • Arduino Mega
  • ESP8266
  • APDS-9930 + level shifter!!
  • BMP280(BME280)
  • DS3231
  • LCD display ILI9341 – je na 3.3V – třeba připojit přes odporový dělič nebo použít display na 5V
  • RX modul 433MHz RXB6

Funkce

  • Vnitřní teplota a vlhkost, + výpočet rosného bodu a teplotního indexu.
  • Podporuje tři externí čidla od výrobce Sencor (testováno s SWS-TS a SWS-THS) ze kterých umí zpracovat údaje o teplotě, vlhkosti, číslo kanálu a stav baterie.
  • Příjem jednotlivých kanálů je signalizován symbolem na LCD a také žlutou LED diodou.
  • V případě, že déle jak 90 vteřin nebyl přijat signál z určitého čidla(kanálu) je barva kanálu změněna na žlutou, pokud výpadek trvá déle než 180 vteřin, barva hodnot se změní na červenou a tento kanál je vyloučen ze seznamu odesílaných dat na thingspeak.
  • Čas se synchronizuje pomocí NTP (zatím jen při spuštění, v plánu je každou půlnoc).
  • Atmosférický tlak
  • U těchto hodnot se provádí porovnávání a následné zobrazení zda hodnoty stoupají nebo klesají.
  • Hodnoty se posílají přes Wifi na server Thingspeak. Odesílání dat je prováděno každou pátou minutu a je opět signalizováno symbolem na LCD a zelenou LED diodou.
  • Plynulé rozsvěcování a zhasínání podsvícení LCD díky PWM regulaci
  • Display se rozsvítí na cca. 10 vteřin mávnutím ruky nad proximity senzorem. Přidržením ruky nad senzorem se aktivuje nebo deaktivuje režim stálého podsvícení, který je opět signalizováno malým symbolem žárovky na LCD.
  • Hodnota osvětlení.
  • Regulace jasu v závislosti na okolním osvětlením.

Co bych chtěl ještě dodělat

  • Měření rychlosti větru (z toho počítat pocitovou teplotu), směr větru, srážkoměr.
  • Měření UV záření.
  • Měření atmosférického náboje a detekci blesků (v současné době je to ve stádiu testu a čekám na bouřku, abych zjistil, jestli to vůbec funguje). Existuje malý modul, který umí detekovat bouřku a blesky v okruhu 40km… ale sehnat ji za rozumné peníze nelze :(
  • Vyměnit LCD display za dotykový (už je na cestě).
  • Pokusit se o předpověď počasí dle změn tlaku vzduchu.
  • Minimální a maximální hodnoty.
  • Přidat různé obrazovky s jiným uspořádáním údajů.
  • Posílat data na vlastní WEBové stránky, ale to už je pro mě složité. Navíc jsem teď objevil celkem pěkný widget pro Android na zobrazování dat z ThingSpeaku.
  • IoT ThingSpeak Monitor Widget (viz obrázek)
IoT Thingspeak Widget

IoT Thingspeak Widget

No a ve finále tomu dát nějaký rozumný vzhled, vyrobit plošný spoj a zabudovat do krabičky – ale to je ještě daleká cesta :)

Ještě pořád přemýšlím to celé místo Arduina Mega postavit přímo na ESP8266, ale zatím s ESP nemám zkušenosti a taky netuším, zda to všechno zvládne… přeci jen těch volných pinů má o dost méně než Arduino Mega.

Veškeré rady, nápady nebo i pomoc uvítám…

Zapojení

DS3231          Arduino
VCC               3.3V
GND               GND
SDA               SDA
SCL                SCL

BMP280         Arduino
VCC               3.3V
GND               GND
SDA               SDA
SCL                SCL

APDS             Arduino
INT                 nezapojeno
SDA    -LS-     SDA
SCL    -LS-     SCL
VCC               3.3V
GND               GND
VL                  3.3V
APDS-9930, SCL a SDA je zapojeno do arduina přes Level Shifter, 5V nepřežije!

RXB6             Arduino
VCC               3.3V
GND               GND
DATA             Pin 2

LCD               Arduino
VCC               3.3V
GND               GND
CS                   podle schéma na Pin 10
RESET            podle schéma na Pin 8
D/C                 podle schéma na Pin 9
SDI/MOSI      podle schéma na Pin 51
SCK                podle schéma na Pin 52
LED                přes rezistor 100Ohm na Pin 44
SDO/MISO    nezapojeno

Zapojení LCD

Zapojení LCD

ESP8266
VCC               3.3V
CH_PD           3.3V
TX                  PIN19 (TX1)
RX                  PIN18 (RX1)
GND               GND
RESET           přes tlačítko na GND, občas se zasekne tak je třeba resetovat ESP

Někdo tvrdí že ESP8266 je odolné vůči 5V logice, ale pro jistotu je lepší zapojit také přes level shifter. Já to mám zapojené přímo, ale otázka je jak dlouho to ještě vydrží…

Indikační LEDky přes odpor 220 Ohm
Žlutá               Pin 42
Zelená             Pin 43

A konečně samotný kód, potřebné knihovny lze nalézt v odkazech. Moje upravené fonty jsou přiloženy.

Kód pro Arduino
Font Arial18
Font Arial34
Font Spec18

Na závěr ještě krátké ukázkové video jak se to celé chová v praxi:


Za projekt děkujeme!


Humanoidní robot od Jana Czapka

$
0
0

V soutěži se na třetím místě umístil Jan Czapek s jeho humanoidním robotem. Co umí? To si přečtěte ve článku přímo od autora.


Můj projekt humanoidního robota vznikl do soutěže „Řemeslo má zlaté dno„, ale později se z něj stal robot, který mi nyní řídí celý domov. Ovládá mi všechna světla, měří teplotu a vlhkost v každé místnosti i venku. Tyto zařízení jsou propojeny s robotem přes moduly na 433 MHz, za použití knihovny VirtualVire. Samotného robota řídí dvě desky Arduino (UNO, Mega 2560), které komunikují pomocí RX­TX linek. K Arduino Uno je připojen modul Arduino Voice Control, díky kterému se dá vše ovládat hlasem (porovnává s předlohou). Dále jsou zde připojeny vysílač a přijímač na 433 MHz. Hlavní Arduino tedy Arduino Mega 2560, řídí vše ostatní. Ruce, které se hýbou pomocí servo motorů, jsou napájeny externí baterií (6V), ovládány jsou pomocí knihovny Servo. Jako ovladač slouží buď dálkový ovladač na 433 MHz, nebo ovladač s joystickem, který lze připojit pomocí síťového kabelu k robotu. Pomocí těchto ovladačů lze řídit i podvozek, který je tříbodový (má tři kolečka), dvě kolečka jsou s převodovkou, které ovládám pomocí H­-můstku. Třetí kolečko je kolečko z židle, které se otáčí jen tak, jak chce. Robot má na sobě membránovou klávesnici, kterou se lze proklikat k jednotlivým módům. Mezi módy má např.:

  • MP3 – přehrávání uložených písniček
  • Rádio mód – spuštění vestavěného rádia
  • Sledování – udržuje určitou vzdálenost od objektu
  • Mód jízdy – v tomto módu lze řídit robota pomocí dálkového ovladače
Arduino - Bezdrátový ovladač robota

Bezdrátový ovladač robota

Pro zjišťování překážek využívá tři ultrazvukové senzory a knihovnu NewPing, která nahradí výpočet vzdálenosti z odrazu. Na hlavě má tři fotorezistory, díky kterým umí měnit barvu RGB ledek. Posledním dílem je LCD display, na kterém se zobrazují všechny důležité informace.

Arduino - Ovladač který mám u postele

Ovladač u postele

Ovladač, který mám u postele umí:

  • tlačítko A zhasíná a rozsvěcí světlo v pokoji
  • tlačítko B probouzí nebo uspává robota
  • poslední tlačítko ovládá žaluzie

Honzovi za článek děkujeme a přejeme hodně úspěchů při další tvorbě!

CANSAT #3: Řešení hardwaru

$
0
0

Vítejte u třetího z čtyřdílné série článků sledujících postup týmu čtyř gymnazistů Česko-Evropskou soutěží CanSat. V tomto díle trochu zaktualizujeme softwarovou část a podrobně probereme naše řešení po stránce hardwaru.


Od doby posledního článku se mnoho změnilo a jednou z těchto věcí je řešení vnitřního systému sondy. Z důvodu technických potíží jsme byli nuceni odstoupit od původního plánu mít ve vzduchu dva nezávislé procesory, jeden pro sběr dat a jejich odesílání, druhý pro obstarávání kamery a ukládání fotek a dat. Výsledné řešení má tak v sondě jen Seeeduino Mega2560, které po vyfocení obrázku ve smyčce ukládá jeho části a každou vteřinu (determinovanou časem modulu GPS) provede datosběrnou a odesílací rutinu. Výsledkem bylo celkové zvýšení složitosti kódu a výrazné zpomalení ukládání obrázku, jak může být patrné z přiloženého flowchartu.

Cansat Flowchart

Flowchart

Toto zredukování počtu součástek v satelitu znamenalo také snížení hmotnosti celého zařízení, které jsme museli následně kompenzovat rybářským závažím. Jak tedy vypadá výsledný model? V jeho středu je univerzální plošný spoj, vytvářející jakýsi shield pro Seeeduino spojující ho se všemi ostatními moduly. Pro napájení jsme zvolili standartní 9V baterii, pro její dostupnost a poměr mezi cenou, výkonem a velikostí. Dále pak dobře pokračuje v naší snaze udělat celou sondu co nejmodulárnější a nejjednodušší na opravu a údržbu.

V konečné podobě byla kostra tvořena dvojicí tenkých ocelových šroubovic, na kterých byly po obou stranách připevněny námi navržené a vytisknuté plastové krytky. Krytky jsou samozřejmě vybaveny otvory pro kameru a závěsné očko, použité pro připevnění CanSatu k dronu.

Co se tedy vnitřností týče, pro přenos dat jsme použili rádiový transceiver RFM69HW na frekvenci 433 MHz. Jeho hlavními přednostmi je několikakilometrový dosah při použití Yagi antény a možnost výběru 256 kanálů na dané frekvenci. Modul komunikuje rozhraním SPI s logikou založené na napětí 3.3V, takže byl zapotřebí pro konverzi přidat Low Level Converter pro převod 5V logiky ze Seeeduina.

Teplotu a tlak snímáme barometrickým a teploměrným senzorem BMP180, komunikujícím přes I2C. Tlak měří s přesností zhruba 0.02 hPa, která odpovídá 0.17 metrům výšky a teplotu s přesností +- 2°C. Oba moduly jsme dostali jako startovní kit od pořadatelů soutěže a pro jejich ovládání jsme využili knihovnu qbcan distribuovanou společně s nimi.

Cansat: Schéma zapojení obvodu. pozn.: ve skutečné sondě jsme použili Seeeduino Mega2560, na schématu je reprezentováno Arduinem Mega2560

Schéma zapojení obvodu. (Pozn.: ve skutečné sondě jsme použili Seeeduino Mega2560, na schématu je reprezentováno Arduinem Mega2560.)

Námi přidané komponenty jsou kamera, akcelerometr, GPS a čtečka microSD karet, všechno dodané naším sponzorem HW Kitchen. Jako fotoaparát jsme použili kamerový modul LinkSprite LS-Y201-2MP. Ten nabízí rozlišení až 2 Megapixely a exportuje fotky do formátu JPEG. Komunikuje přes UART, vyžaduje 5V napájení a má rozměry 32.0 * 32.0 mm (více informací).

Pro měření akcelerace jsme použili digitální akcelerometr ADXL345. Jedná se o velmi kompaktní senzor s měřící stupnicí až +- 16 g, s možností komunikace jak přes SPI, tak I2C – my jsme využili druhé možnosti (více informací).

GPS modul pro synchronizaci sběru dat a eventuální lokalizaci přistávšího CanSatu jsme použili model EM-506, poháněný 5V, s vysokou přesností a relativně rychlým časem pro spojení se s družicemi, komunikuje rovněž přes rozhraní UART. Velmi důležité byly i rozměry 30.0 * 30.0 * 10.7 mm (více informací).

Všechna data jsme zároveň s odesíláním také ukládali na microSD kartu přes Breakout Board for microSD Transflash, komunikující přes SPI, jehož hlavní předností jsou miniaturní rozměry 21 * 22 mm.

Padák jsme si zhotovili vlastní z ripstopu (látka obvykle používaná pro stavbu padáků, vyznačující se velkou odolností proti trhání a počasí) o průměru 375 mm a hloubce 185 mm. Pád sondy jsme tak zpomalili na zhruba 9 m/s.

Celkem jsme se tak bez větších potíží vešli do pravidly stanovených rozměrů cylindru o výšce 115 a průměru 66 mm. Jak jsem zmínil výše, sonda měla sama o sobě 241 gramů a bylo jí tak třeba zatížit pro výsledných 322 g s padákem, abychom se vešli do limitu 300 – 350 g.

Cansat: Vyvržené vnitřnosti naší sondy

Vyvržené vnitřnosti naší sondy

 

 

CANSAT #4: Závěrečný článek

$
0
0

Vítáme vás u posledního článku ze seriálu sledujícího postup studentů soutěží CanSat. Letošní ročník skončil a nastává čas pro ohlédnutí se po onom půlroce práce a zhodnocení úspěchů a neúspěchů.


Finále prvního českého ročníku soutěže CanSat se uskutečnilo v pátek a sobotu 31. března a 1. dubna. Odehrávalo se na letišti v Jaroměři, asi 20 km severně od Hradce Králové. Satelity byly vypouštěny v pátek odpoledne, poté co týmy dostaly možnost provést poslední úpravy svých CanSatů a také poté, co dostaly oběd. Počasí bylo vhodné, s čistou oblohou a nepříliš četnými vzdušnými proudy.

Cansat: Vyvržené vnitřnosti naší sondy

Kompletní sonda před vložením do plechovky

Pro nás to byl čas, kdy jsme poprvé objevili chyby, které mohly výrazně ohrozit kompetenci našeho výtvoru soutěžit. Začínalo se ukazovat, že naše volby materiálů a konstrukce samotné mají své výhody, ale v té chvíli také mnohem výraznější nevýhody. Z důvodu pevnosti jsme zvolili jako vnější obal ocelovou plechovku. Avšak jelikož jsme pro přenos dat na pozemní stanici využili rádiového signálu, bylo kritické mít obě antény na sebe správně kalibrované.  Vnější kovový obal a dost možná i přílišná blízkost ostatních komponent ve stísněném prostoru satelitu výrazným způsobem narušila sladěnost obou antén. Bohužel jsme si nevyzkoušeli již dříve před startem metodu napájení a naše volba 9V baterie se ukázala jako nedostačující pro náš energeticky velmi náročný systém. To v kombinaci se závislostí GPS modulu na napětí 5V a závislostí našeho systému na GPS modulu vyústilo v nepříliš přesvědčivou funkčnost celku. Ale jak se ukázalo později, mnohem větší problém představovaly spájené spoje, na které byl vystaven poměrně velký tlak při manipulaci se sondou a jejím pádu. Výsledkem tedy bylo selhání rádiové komunikace mezi satelitem a zemí a částečné poškození souborů nahraných na microSD kartu (nasbíraná data jsou dostupná zde). Vzhledem k tomu, že rádiový přenos je jedno z hlavních kritérií pro postup, náš tým nepostoupil do evropského kola.

Cansat: Připojování sondy ke dronu

Připojování sondy ke dronu

Měli-li bychom zhodnotit projekt jako celek a jeho přínos pro nás, nemůžeme než říci, že to byl půlrok nanejvýš přínosný a prozkoušel naše schopnosti jako jednotlivců, tak i jako týmu. Dal nám příležitost vyzkoušet si práci na něčem skutečném, ve skutečném světě. Sháněli jsme sponzory, možnosti popularizace projektu, seznámili jsme se s problémy realizace něčeho, co přesahuje rámec školního referátu, nebo laboratorní práce. Zejména v posledním týdnu před startem a při startu jsme pracovali v časové tísni a pod tlakem, ale i přes to byla práce na CanSatu zkušenost nanejvýš cenná, která nás učila nejen zacházet s Arduinem a programovat pro něj, ale i jak si efektivně rozdělit práci a srovnat se s porážkou.

Samozřejmě tohle všechno by nebylo možné bez podpory a nutno dodat neskutečné shovívavosti pana Oldřicha Horáčka, firmy HW Kitchen a Microsoft CZ, kterým bychom chtěli poděkovat za jejich sponzorské dary a trpělivost s námi.

Tímto za tým The Almighty Lobsters děkuji také vám, čtenářům serveru Arduino.cz, za podporu a čas, který jste strávili nad našimi články. A jste-li studenty středních škol, neváhejte a zúčastněte se příštího ročníku české soutěže CanSat, jedná se o neopakovatelnou zkušenost.

Vypouštění sondy Cansat

Vypouštění sondy Cansat


I my klukům děkujeme za zajímavé články a přejeme spoustu úspěchů. Doufáme, že se tímto neúspěchem nenechají odradit 🙂

Arduino meteostanice WeatherDuino Pro 2 podrobněji

$
0
0

Před rokem tu vyšel článek o Arduino meteostanici WeatherDuino Pro 2, jejímž autorem je Ing. Zdeněk Hornych. Na základě článků jste pana Hornycha zahrnuli dotazy, proto se rozhodl napsat ke článku pokračování s podrobnějším vysvětlením. Za to mu děkujeme.


Na základě řady dotazů k prvnímu vydání tohoto článku a také 1,5 ročních zkušeností z provozu meteo stanice jsem se rozhodl pro nové rozšířené vydání, doplněné poznatky ze samotného provozu.

WeatherDuino Logo

WeatherDuino Logo

Co je WeatherDuino?

WeatherDuino je DIY meteo stanice, vyvíjená komunitním sdružením kolem původního autora Werk_AG (A. Caneira) z Portugalska. Ten je současně hlavním programátorem, člověkem, rozhodujícím o dalším směru vývoje a koordinujícím poznatky i testy, a současně i hlavní podporou ve fóru http://www.meteocercal.info/forum/.

WeatherDuino už má dávno za sebou dětské krůčky, dnes je to plnohodnotná vyspělá technologie, splňující i poměrně značné kvalitativní požadavky. Od původního AuriolDuina (spojeno s technologiemi sensorů dodavatele Auriol), přes počáteční WeatherDuino Pro2 v1.3 a mnou loni zmiňovanou v1.4 nastal koncem loňského roku velký skok k verzi 1.5 a v letošním roce obrovský posun k v2.0. Vývoj se však i tak stále zrychluje a nyní se již od počátku roku rodí v hlavě a na stole Werk_AG zcela nová technologie WeatherDuino 4Pro. Přes všechna tato vývojová stádia a veliké skoky ve vývoji však zůstává programová výbava zpětně kompatibilní, což samozřejmě dále zvyšuje přitažlivost celého projektu, protože jednou vybudovaný hardware má dlouhou dobu životnosti.

Meteo stanice je koncipována modulárně a je schopna pracovat i profesionálně, vše je závislé jen a pouze na schopnostech a finančních možnostech vlastního stavitele stanice. Sem patří především výběr sensorů, jejich umístění v terénu, kvalita celého provedení, schopnost dlouhodobého bezobslužného provozu atd. atd. Stavba není určena pro začátečníky, mezi jinými dovednostmi je třeba zvládat i pájení SMD součástek na desky s plošnými spoji.

Ani tento článek není stavebním návodem, nebo podrobným popisem zařízení, zájemce odkazuji na původní zdroje informací, jejichž rozsah je obrovský (viz v závěru článku). (Navíc celá řada informací podléhá autorské ochraně a je dostupná až po registraci, byť zdarma.)

Blokové schéma WeatherDuino Pro2 je principiálně toto:

Arduino meteostanice WeatherDuino Pro 2 - Blokové schéma

Blokové schéma

Kde TX jsou vysílací jednotky, v systému bývají obvykle dvě, rozsah počtu je 1 – 3. Zajišťují fyzický sběr dat v terénu a bezdrátové odeslání na jejich zpracování.

RX je přijímací jednotka, která data zpracovává, vyhodnocuje, částečně archivuje, vybraná data i zobrazuje a následně předává pomocí USB spojení na meteo server. RX je současně schopna vybraná data i vysílat na tzv. wireless displeje (WD).

WD je bezdrátový displej, určený pro místní, domácí zobrazení hlavních naměřených dat. Těchto displejů může být neomezené množství a umísťují se všude tam, kde je třeba je číst. WD využívá TFT dotykový displej 2,8“.

Meteo server, nebo také meteo počítač, je zařízení, kde se provádí převod zpracovaných dat na jejich grafickou prezentaci, ale současně i jejich dlouhodobá archivace. V roli serveru obvykle dnes slouží Raspberry Pi s operačním systémem Raspbian a aplikací CumulusMX.

Web server prezentuje data celému světu a to především graficky nebo tabulkově. S výhodou se opět využívá aplikace CumulusMX, její webová část. Provoz často na nějakém Linuxu ve vzdáleném hostingu.

Meteo server však také zajišťuje připojení celé meteo stanice do celosvětových sítí meteo stanic, mé zkušenosti jsou především se sítí Weather Underground (WU), která má dnes již přes 300 tis. členů a přes 200 tis. privátních meteo stanic. Kromě jiného disponuje také pravděpodobně nejpřesnějšími meteo předpověďmi a je založená na dobrovolnosti. Její data nesmí být profesionálně využívána.

Nyní tedy detailněji. Popis jednotlivých komponent:

TX – vysílací jednotka

je zařízení, umístěné v blízkosti meteo sensorů, zpravidla ve venkovním prostředí. Srdcem jednotky je Arduino Nano, napájení je zajištěno akumulátorem, dobíjeným solárním panelem. Nejčastěji je použit klasický Pb akumulátor, autor příspěvku má však vynikající zkušenosti i s akumulátory LiFePo4.

Arduino meteostanice WeatherDuino Pro 2 - TX jednotka

TX jednotka

Jednotka TX může být instalována v 1 nebo maximálně až 3 kusech v jednom systému. Standardně je vybavena sensory větru, tedy anemometrem a ukazatelem směru větru (wind vane), několika teploměry, vlhkoměry, srážkoměrem a solárními čidly (intenzita slunečního záření ve W/m2 a UV index).

Hlavní teploměr systému spolu s čidlem vlhkosti vzduchu by měl být umístěn ve volném prostoru nad stříhaným trávníkem ve výšce 2 metrů a uložen v radiačním štítu s nuceným prouděním vzduchu podle přednastavených povětrnostních podmínek. Mezi ty patří i intenzita proudění vzduchu (vítr), proto by tato jednotka měla být vybavena vlastním anemometrem.

Měření větru se však provádí ve výšce 10 m nad volným terénem, proto je vhodné do systému vložit i druhou TX jednotku. Ta bývá umísťována na stožáru nebo na střeše. Výsledky měření větru nad střechou mohou však být tvarem střechy zkreslené.

Příklad provedení autorem článku pro střešní instalaci:

Arduino meteostanice WeatherDuino Pro 2 - Krabice pro střešní instalaci

Krabice pro střešní instalaci

Arduino meteostanice WeatherDuino Pro 2 - Střešní instalace

Střešní instalace

kde se provádí měření větru dvěma nezávislými systémy (kromě WeatherDuino i původní sensory meteo stanice Auriol). Kromě jiného se zde odečítá i teplota na střeše, sluneční radiace (W/m2) a UV záření (UVI).

Autor článku má další dvě jednotky umístěny na stožáru postaveném v zahradě, zde se měří hlavní měřená teplota a vlhkost (2 m nad zemí), ale ještě celá řada dalších údajů např. teploty ve výškách 2,4 m, 1 m, 5 cm nad zemí a 5 cm, 50 cm a 1 m v zemi. Řada čidel vyhodnocuje podobně i vlhkosti. Pro měření půdních teplot a vlhkosti je použita jednotka extenderu, která zajišťuje přenos dat na vzdálenosti desítek metrů (v mém případě 8 m).

Arduino meteostanice WeatherDuino

Senzory

Ukázka vlastní výroby sensorů – zde sensor UV záření, termo-metr a vlhkoměr v radiačním štítu a detektor slunečního záření:

Arduino meteostanice Weatherduino - Senzor slunečního záření

Senzor ultrafialového (UV) záření

Arduino meteostanice Weatherduino

Elektronika senzoru slunečního záření

Arduino meteostanice weatherduino - Teploměr a vlhkoměr

Teploměr a vlhkoměr

Arduino meteostanice Weatherduino

Sensor sluneční radiace = ozáření země ve W/m2

Arduino meteostanice Weatherduino - Půdní teploměry

Půdní teploměry

Arduino meteostanice Weatherduino - Senzor vlhkosti půdy

Senzor vlhkosti půdy

Arduino meteostanice Weatherduino - Extender

Extender

RX – přijímací jednotka

Na rozdíl od TX jednotky je RX v systému vždy pouze jedna. Přijímá a detekuje signály 433 MHz z jednotek TX, případně z dalších připojených bezdrátových čidel (např. srážkoměr Auriol). Srdcem jednotky je opět Arduino Nano, napájení je zabezpečeno externím zdrojem 12 V.

Jednotka zpracovává signály a pomocí USB kabelu je předává počítači s meteo softwarem. Současně však slouží pro retranslaci vybraných hodnot na jednu nebo více WD jednotek pomocí signálů 433 MHz.

Jednotka sama je vybavena displejem LCD 20×4 a základní naměřené hodnoty tedy přímo zobrazuje. Aktuální PCB jsou vybaveny polovodičovou pamětí v roli cache pro případy výpadku meteo počítače – kdy by neměla komu předávat zpracovaná data. Jednotka disponuje vlastním sensorem pro měření atmosférického tlaku, lokální teploty a vlhkosti a je také osazena časovým normálem.

Arduino meteostanice WeatherDuino - RX jednotka

RX jednotka

Arduino meteostanice WeatherDuino - Celkové provedení přijímací jednotky

Celkové provedení přijímací jednotky

Arduino meteostanice WeatherDuino - Displej RX jednotky

Pohled na displej RX jednotky v době, kdy ještě nebylo osazeno venkovní čidlo teploty a vlhkosti

WD – wireless display

Slouží pro rychlou místní informaci o základních povětrnostních hodnotách a stavu vysílacích jednotek, umístění je na každém místě v domě, kde jsou tyto informace třeba. Ideální je alespoň jednu jednotku WD vlastnit, protože některé údaje jsou dostupné pouze na ní (např. napětí akumulátorů TX jednotek, teplota na jejich deskách PCB apod.).

Připojení k RX pomocí vf signálu 433 MHz, napájení je externím zdrojem 12 V. Běh softwaru opět zajišťuje Arduino Nano, WD je vybaven TFT dotykovým displejem 2,8“ i vlastním měřením lokální teploty a vlhkosti. Běžně zobrazované parametry: tlak, teplota vně i uvnitř, rychlost a směr větru, nárazy, vodní srážky a jejich intenzita, úroveň slunečního záření a UV index. Současně umožňuje zobrazení i tzv. externích sensorů – zemní teploty a vlhkosti, teploty a orosení listů, teploty a vlhkosti na dalších sensorech atd.

Arduino meteostanice WeatherDuino - Bezdrátový displej

Bezdrátový displej

Arduino meteostanice WeatherDuino - Finální provedení displeje

Finální provedení displeje

A další pohledy na displej:

Arduino meteostanice WeatherDuino - Detail displejeArduino meteostanice WeatherDuino - Detail displeje

Meteo server

Touto komponentou se již projekt WeatherDuino Pro2 zabývá pouze okrajově. V tuto chvíli je zřejmě nejperspektivnější variantou využití počítače Raspberry Pi 3, s nainstalovaným systémem Raspbian. Počítač nemusí být vybaven displejem, pokud je stejně umístěn v technologickém celku, kde nemá displej využití, nebo může být naopak vybaven např. 7“ dotykovým TFT displejem s dálkovým ovládáním, apod.

Server je umístěn v blízkosti RX modulu – propojení USB kabelem. Pomocí meteo software zpracovává dodaná data a zobrazuje je na vlastním (lokálním) webu. Současně je např. přes Ethernet ukládá na web server v Internetu, případně odesílá na jeden nebo více komunitních serverů v rámci amatérských sítí meteo stanic.

V roli meteo software lze s výhodou využít např. komunitního systému CumulusMX, který je ještě stále ve verzi beta, nicméně velmi stabilní a se skvělou komunitní podporou. K aplikaci existuje obrovské množství doplňků, grafických šablon, skriptů a dalších „udělátek“. Její obrovskou výhodou je definice tzv. webových tagů, které umožňují kompletní vytvoření vlastního webu nebo doplnění existujících šablon podle svých potřeb. Této výhody využil i autor článku, proto je jeho web výrazně odlišný od defaultových šablon aplikace CumulusMX.

Arduino meteostanice WeatherDuino - Raspberry PI server

Raspberry PI server

K meteo serveru je velmi vhodné připojit i nějaký pevný disk, s výhodou můžeme použít přenosný disk 2,5″ s USB připojením. USB propojení RX jednotky a meteo serveru by mělo být provedeno pomocí USB hubu s vlastním (externím) napájením, jinak se může stát systém nestabilním v důsledku malé proudové výkonnosti USB portů desky Raspberry. K hubu pak připojíme i ostatní zařízení – HDD, klávesnici, myš.

Při své instalaci používám u počítače Raspberry i 7“ displej s dálkovým ovládáním, řada instalací je však tzv. headless. V případě displeje lze spustit i grafické rozhraní X-window a v něm lokální nebo externí web CumulusMX. Sám používám pouze alfanumerické prostředí a v případě potřeby zobrazuji stav meteo stanice pomocí scriptu z fóra Cumulus.

Arduino meteostanice WeatherDuino - Výstup skriptu

Výstup skriptu

Web

Pokud nemá meteo stanice sloužit pouze pro osobní potřebu, je vhodně umístění web serveru v nějakém „solidním“ hostingu, nároky na výpočetní mohutnost nejsou velké. Výhodné využití je např. virtualizovaného systému CentOS. Web má rozsáhlé možnosti customizace a napojení mnoha další internetových zdrojů, toto je však již zcela mimo rozsah tohoto článku.

Zde pouze náhled na některé z webových stránek autora článku:

Arduino meteostanice WeatherDuino - Webová stránkaArduino meteostanice WeatherDuino - Webová stránkaArduino meteostanice WeatherDuino - Webová stránka

Připojením k síti Weather Underground získáme jednak vynikající předpověď počasí pro svou lokalitu, jednak i další velmi pěkné webové stránky:

Arduino meteostanice WeatherDuinoArduino meteostanice WeatherDuino

Ukázka jedné z možných konzolí – s výhodou využitelné na 10“ tabletu apod.:

Arduino meteostanice WeatherDuino - Konzole

Poznámky

Při stavbě meteo stanice je třeba být nejen zručným kutilem, ale velmi dobře chápat i programování počítačů typu Arduino. Zde totiž platí, že nikdy nedostanete úplný popis celé stavby, každý stavitel má jiné podmínky, jiné možnosti, zdroje, finance apod., proto je každá stanice odlišná. Tomu je třeba i programovou výbavu částečně přizpůsobovat a samozřejmě být i schopen najít a odladit případné chyby – jak hardwarové, tak softwarové.

Velmi se hodí dobré znalosti linuxového prostředí, částečné znalosti HTML jazyka, případně programování java skriptů.

Samozřejmým základem je ovládání celého pájecího procesu s miniaturními součástkami (SMD), podmínkou je dobrá výbava – automatická mikropájka, odsávačka, horkovzdušná páječka apod. Pro výrazné zlevnění celé stavby je nanejvýš výhodné nakupovat součástky na různých čínských e-shopech, znamená to tedy zvládnout nákup v angličtině a platbu pomocí účtu PayPal nebo kreditní kartou. Pro prvotní zapojení je vhodné používat zkušební polygon na nepájivých zapojovacích deskách „breadboardech“, zde např. sestava autora článku:

Arduino meteostanice WeatherDuino - Testovací souprava

Testovací souprava

Autor článku si pokládá za velkou čest být součástí vývojového týmu WeatherDuino, proto zde i malá ukázka práce na vývoji.

První obrázek ukazuje výstup RTL-SDR analyzátoru s Raspberry pro kontrolu výkonnosti použitých antén v pásmu 433 MHz.

Arduino meteostanice WeatherDuino - RTL-SDR analyzátor

RTL-SDR analyzátor

A na druhém vidíme „zábavu“ při odhalování zákonitostí propouštění UV záření různými optickými materiály:

Arduino meteostanice WeatherDuino - Analýza materiálů

Analýza materiálů

Při stavbě a provozu stanice se stavitel určitě mnoho a mnoho nového dozví a naučí, Internet je skutečně základním a naprosto nezbytným zdrojem veškerého počínání.

V případě bližšího zájmu o tento projekt doporučuji zájemcům registraci na fóru MeteoCercal, tak se mohou velice snadno dostat ke schématům, seznamům součástek apod. Na fóru lze pořídit i desky PCB.

Závěr

Projekt má základní výhodu, že je „totálně“ modulární a do nekonečna rozvíjitelný. Proto můžeme začít pouze s minimálním objemem dílů a řekněme „levnějšího“ provedení, ale postupným rozvíjením se dostat až na poloprofesionální úroveň.

Systém je otevřen i vlastnímu vývoji, případně testování, a to jak v oblasti HW, tak SW.  Sumárně lze říct, že tento projekt vlastně nikdy nekončí a může být doživotním koníčkem.

Zdroje

Upozornění: některé výše zmíněné názvy mohou být chráněnými názvy svých majitelů.


Děkujeme za skvělý článek a přejeme hodně štěstí při dalším rozvoji.

Arduino docházkový systém

$
0
0

Náš čtenář, pan Janík, si do firmy postavil jednoduchý docházkový systém, který vám v dnešním článku představí.


Projekt vznikl pro potřeby firmy o cca 20 zaměstnancích, a proto byl dimenzován na max. 30 lidí. Je to můj tak desátý Arduino program, a tak se předem omlouvám za neoptimalizovaný a ke konci už i silně chaotický kód :-).

Popis bude taky velmi všeobecný, protože zařízení je už cca 18 měsíců v provozu a od té doby jsem už většinu detailů zapomněl, nicméně případné dotazy se pokusím zodpovědět. Co se týče spolehlivosti, tak za tu dobu asi jednou ztratil připojení do LAN a jednou nebo dvakrát display zobrazil nesmyslné znaky – po odpojení/připojení napájení vše OK.

Komponenty

Skládá se z nástěnného modulu (display, čtečka RFID čipů, Arduino MEGA, Ethernet modul, RTC, PC speaker, EEPROM) a administrace přes LAN – www.

Napájení jsem zkoušel externím zdrojem, ale nakonec se jako nejstabilnější ukázalo napájení kvalitním adaptérem/nabíječkou od mobilu přes USB a tažené kvalitním kabelem Belkin kvůli větší vzdálenosti.

Zapojení

Zapojení jednotlivých komponent je pro případné zájemce možné odvodit z kódu.

Všechny desky a hlavně RFID čtečku jsem osadil filtračními kondenzátory – na chybovost čtení čipů to má dramatický význam!!! Základem je Arduino MEGA, na něm nasazený Ethernet shield (tady pozor!!! – levná verze v odkazu neobsahuje pomocný obvod, který resetuje desku po připojení napájení – musel jsem zbastlit sám – viz. tranzistor s NE555 u tlačítka reset), zvukový výstup tvoří PC speaker + tranzistor coby zesilovač.

Na I2C je zapojeno:

  • display 20×4 s I2C převodníkem
  • RTC s DS1307 (obvod je velmi nepřesný – za týden je schopný se rozejít i o 2 minuty, lépe by asi bylo použít DS3231 a nebo zkusit stabilnější krystal), na desce RTC se využívá i EEPROM 4KB
  • externě další EEPROM 32KB.

Na seriovém portu č. jedna (Serial1: 19,18) je čtečka RFID.

Arduino docházkový systém - Zapojení

Zapojení

Arduino docházkový systém - Zapojení

Zapojení

Arduino docházkový systém - Umístění RFID antény

Umístění RFID antény

Popis funkce a programu

Veškeré nastavování se provádí přes webové stránky v prohlížeči, na základní obrazovce se zadává 3 místný kód pracovníka (v naší firmě), jméno, příjmení, kód čipu (opíše se naražený na čipu).

Pak je možné prohlížet docházku za aktuální a 2 měsíce zpátky. Stažení se provádí do jednoduchého *.csv souboru. Na stránce je také tlačítko nastavení času PC (synchronizovaného z internetu) do zařízení.

Arduino docházkový systém - Přehled zaměstnanců

Přehled zaměstnanců

Časy se třídí tak, že 1 záznam dne je brán jako příchod a další jako odchod, přičemž mohou být celkem 3. Časy načtené čipem nejdou smazat (aby nadřízený nemohl upravovat co se skutečně razilo), ale může čas přidat, např. když si zaměstnanec zapomene narazit odchod. SV a ŘD se vkládají ručně (www).

Arduino docházkový systém - Webové rozhraní

Webové rozhraní

Přesčasy se pro jednoduchost počítají jako že každý započatý den má mít 8 hodin (správnější by asi bylo zadat ručně fond hodin pro každý měsíc). Po odpracovaných 4,5 hodinách se automaticky odečte 30 minut přestávka. Časy se automaticky zaokrouhlují na půlhodiny, příchodem je nejbližší vyšší následující půlhodina a odchodem je nejbližší nižší půlhodina. Toto vše je možné měnit a nastavoval jsem po konzultacích a dle potřeby.

Arduino docházkový systém - Detail zaměstnance

Detail zaměstnance

Zabezpečení jsem nejprve vymyslel pomocí javascriptu heslem, ale to lze velmi jednoduše obejít (v administraci použité většinově) a následně jsem pro ruční zápis příchodu přidal 2 heslo kontrolované na straně Arduina – to zná pouze autor/uploader programu a ten, komu ho předá.

Na displeji se zobrazuje čas, datum, den v týdnu, upozornění na pracovní dobu a přesčasovou dobu. Po sejmutí čipu zobrazí jméno pracovníka, čas který se uložil (bez vteřin) a hlášku zapsáno.

Arduino docházkový systém - Detail displeje

Detail displeje

Arduino docházkový systém - Hotová konstrukce

Hotová konstrukce

V programu jsou také kontrolní funkce, které kontrolují a porovnávají důležité informace (jako pozice zápisu do paměti – ukládá se na několik paměťových pozic současně a na 2 různé EEPROM), v případě chyby se zobrazí.

Program obsahuje i auto-reset (pro zvýšení stability). Paměť EEPROM s časy se zapisuje postupně pořád dokola, paměť SV a ŘD se automaticky smaže po určité době.

Pro získání adres zařízení na  I2C jsem použil program „Scanner I2C sbernice“.

Kód je dostupný na serveru BitBucket.


Panu Janíkovi děkujeme za článek a přejeme hodně štěstí s další tvorbou.

Pochlubte se svým Arduino projektem

$
0
0

V české komunitě se to zajímavými Arduino projekty jenom hemží a i od vás se k nám dostanou pěkné návody a zprávy o projektech. Nyní vám dáváme oficiální možnost a podporu podělit se s ostatními a ukázat jim, co po večerech doma tvoříte. Demonstrace praktických projektů je pro hodně uživatelů Arduina neocenitelná a my si velmi vážíme toho, když se rozhodnete tyto zkušenosti sdílet.

Některé články o vašich projektech jsme již zveřejnili a určitě ještě další zveřejníme. Aby ale byly články kvalitní a čtenáři se dozvěděli vše potřebné, rozhodli jsme se do návodů vnést trochu „štábní kultury“. Díky tomu budou články obsahovat všechny potřebné informace i obrázky.

Ve spolupráci s naším mateřským e-shopem www.hwkitchen.cz jsme se rozhodli vás také v tvoření podpořit, ale to rozebereme až později.

Co všechno má takový článek obsahovat?

Popis projektu

Popis projektu a hlavně jeho rozsah záleží na konkrétním nasazení Arduina. Může se jednat o kratší popis (cca 300+ slov), ale i o podrobný návod na několik tisíc slov. V popisu by ideálně mělo být obsaženo k čemu projekt slouží, jaká byla motivace k jeho vytvoření, popis hardware a mechaniky projektu, postup stavby, jaké byly vaše zkušenosti se stavbou a s provozem, co se nepovedlo, plány do budoucna… Dále je také vhodné připojit seznam použitých komponent. Přehledně zpracovaný popis usnadní hlavně začátečníkům realizaci projektu nebo některé jeho části. Pro řadu z vás jsou realizované Arduino projekty velmi zajímavé.

Kód

Aby byl článek o projektu přínosem pro ostatní uživatele, musí obsahovat řídící kód projektu. Pokud to tedy není zrovna nějaký Arduino Shield :). Kód nám můžete poskytnout v podobě souborů, v textové podobě, nebo jako odkaz na nějaký repozitář (GitHub, Bitbucket…). Výhodou jsou samozřejmě komentáře v kódu. Nejlépe u každého řádku tak, aby i začátečníci mohli uvažovat o realizaci projektu a leccos se tak naučit.

Obrázky a videa

Vždycky je lepší, když si může člověk výsledek prohlédnout, než když o něm pouze čte. Proto prosíme o přidání obrázků v dostatečné kvalitě. Na úvodní obrázek je ideální fotka o rozměrech 1200 x 628 ve formátu JPG. I další obrázky nám prosím posílejte ve formátu JPG, kvalita by měla být co nejvyšší. Maximální počet obrázků je 20 + jeden úvodní. Mějte na paměti, že obrázky jsou jako doplnění textu velmi vhodné. Jednoduše se dá říci, že co větší odstavec textu, to obrázek je ideál :).

Do pořádného článku patří i video vašeho projektu. Preferovaný způsob je odkaz na Youtube, Vimeo, či jiný server.

Formát odevzdání

Vaše návrhy na články nám prosím posílejte pomocí tohoto formuláře. Odevzdat článek je možné tak, že nám přes formulář pošlete odkaz na online úložiště se soubory, nebo ve formuláři nahrajete jednotlivé soubory zvlášť. Máte-li v článku obrázky, pošlete nám je prosím přes formulář zvlášť.

Ocenění pro autory

A teď to hlavní. Sami jsme tady všichni zapálení bastlíři a není potřeba si vysvětlovat, kolik to je práce vytvořit a vymazlit projekt, který ještě nikdo předtím nerealizoval. A to je návrh zapojení, napsání kódu, návrh plošného spoje, osazení desky, zapojení kabeláže, testování, úpravy kódu, realizace mechaniky atd. a ještě k tomu sepsání článku a pořízení fotografií. Prostě je to hodně práce a my to dobře víme.

Ocenění je tedy následující.

Za odevzdaný projekt přísluší autorovi sleva 30% na jednorázový nákup v e-shopu HW Kitchen (objednávka je omezena na max 5000Kč s DPH). Slevu je možné čerpat opakovaně. Můžete tedy ušetřit až 1500Kč za jeden projekt!

Zveřejněním vlastního projektu podpoříte kromě celé Arduino komunity také svůj projekt a osobní značku. Možná navážete i zajímavé kontakty s dalšími spolupracovníky nebo zjistíte, jak váš projekt přijímají ostatní bastlíři. Nyní má portál arduino.cz návštěvnost cca 35000 měsíčně!

Články zpracováváme v pořadí, ve kterém přišly. Slevový kód vám odešleme na zadaný email po vydání článku.

Souhrn

  • Popis – Rozsah (300+ slov)
  • Kód – formou odkazu na online repozitář (GitHub, Bitbucket…), nebo formou souborů
  • Obrázky – jeden titulní obrázek 1200 x 628px, až 20 dalších v co nejlepší kvalitě, vše JPG
  • Videa – odkaz na Vimeo, Youtube…
  • Odevzdání – přes tento formulář

Máte zajímavý projekt? Tak se s ním pochlubte, těšíme se na zprávy.

Chytrý pokojík ovládaný Arduinem

$
0
0

Tento projekt začal jednoduchým ovládáním lustru pomocí malé krabičky umístěné poblíž a dálkového ovládání. Dnes už je systém propracovanější a lze celý řídit pomocí dotykového displeje. Dnešní systém se skládá z několika bezdrátově propojených jednotek, které všechny běží na Arduinu.

Popis projektu

Základní jednotkou je Arduino MEGA s displejem, pomocí něhož se dají řídit ostatní systémy, ale zobrazují se na něm i hodnoty z teploměrů a jiných čidel. Další důležitou jednotkou je malý obvod s Arduino NANO umístěný u lustru. Díky tomuto obvodu lze zhasínat a rozsvěcet na dálku. Nesmím zapomenout ani na bezdotykový panel, který nahradil standardní vypínač na zdi. No a samozřejmě jednotka se senzory teploty a srážek umístěná na parapetu. Toto vše si můžete prohlédnout v následujícím videu.

Náhražka vypínače

Náhražka vypínače je vytištěna na 3D tiskárně. Uvnitř je malý tištěný spoj s čipem ATmega328p-pu, dále je zde umístěn ultrazvukový senzor vzdálenosti, který měří vzdálenost. Pokud je vzdálenost menší než 15cm tak program zareaguje a pomocí dvou ledek rozsvítí malé čtverečky. Zároveň taky vyšle signál přes 433 MHz do lustru, aby se rozsvítil. Toto vše je napájeno starou nabíječkou na mobil.

Bezdotykové ovládání lustru

Bezdotykové ovládání lustru

Lustr

U lustru mám malý DPS, na kterém je nasazeno Arduino NANO. Je zde také samozřejmě komunikační modul na 433MHz, díky kterému mohu rozsvítit i z jiných zařízení než jen z klasického vypínače. Samotné světlo je spínáno pomocí relátka, kterým je přerušena fáze vedoucí do lustru.

Krabička s řídicí jednotkou umístěná u lustru

Krabička s řídicí jednotkou umístěná u lustru

Meteorologická stanice

Na venkovním parapetu u okna mám umístěnou malou meteorologickou stanici. Je řízena čipem ATmega328p-pu, který načítá data z mnoha senzorů, jako například senzor teploty BMP280, který zároveň měří i vlhkost a tlak. Stanice je dále vybavena senzorem srážek a samozřejmě vysílačem na 433MHz, pomocí kterého se vše odesílá do jednotky s displejem. Napájení je zajištěno malým trafem na 9V.

Řídicí jednotka s displejem

Ovládání celého systému umístěné na poličce u postele.

Ovládání celého systému umístěné na poličce u postele.

Hlavní částí celého systému tvoří Arduino MEGA 2560 s 2,8″ dotykovým displejem, na kterém se zobrazují všechna důležitá data, nebo lze využít jako ovládací zařízení.

Obrazovka se základními ovládacími prvky.

Obrazovka se základními ovládacími prvky.

Nejedná se o technicky nic náročného. Jde jen o Arduino MEGA 2560, ke kterému je připojen display, vysílač a přijímač na 433MHz. Mám tam také připojenou lampičku, která se rozsvítí pomocí „ikonky“ na displeji. Na displeji je slot na micro SD kartu, na které jsou nahrány grafické podklady pro vyobrazení na displeji. Všechno je uloženo v krabičce vytištěné na 3D tiskárně z PLA plastu a je napájeno 9V trafem.

Na displeji se na několika jednotlivých obrazovkách ukazují všechna důležitá data a ovládací prvky viz. Obrázky.

Obrazovka s základními informacemi o počasí.

Obrazovka se základními informacemi o počasí.

Plány do budoucna

Do budoucna bych rád přidělal hlavní řídicí jednotku, která by obsahovala Bluetooth, díky kterému by šlo vše ovládat přes aplikaci v chytrém telefonu. Dále bych chtěl využít MP3 shield, pomocí kterého bych naučil celý systém mluvit, ohlašovat základní informace a pouštět písničky. Další možnost je připojit celý systém k internetu, kde by se zobrazovaly informace z celého systému a také by šel odsud ovládat.

Jako další zařízení bych chtěl udělat senzor na kontrolu vlhkosti zeminy květin, který by posílal zprávu, když by byla zem příliš vysušená. Systém by pak dal vědět o stavu vlhkosti přes internet, nebo formou zvukového hlášení.

Také plánuji vydat několik dalších článků, nebo videí, které by popisovaly jednotlivé části celého „systému“ a tak se obracím na Vás čtenáře, abyste se vyjádřili v podobě komentářů, co by se Vám více líbilo/vyhovovalo.


Arduino asistenční jednotka Kisaragi

$
0
0

Náš čtenář Bohumil Tuček nám poslal článek o jeho projektu asistenční jednotky.


Dnes tu pro Vás máme článek o asistenčních jednotkách. To jsou jednotky, které fungují jako samostatný počítač, který je jednoduché ovládat, ale ještě ke všemu se mohou pohybovat, mohou mít na sobě různá robotická ramena apod.

Arduino asistenční robot Kisaragi

Asistenční jednotka Kisaragi

Jedním z nich je i tato asistenční jednotka Kisaragi (衣更着). Dostala jméno od mých japonských kolegů. Kisaragi je pojmenování měsíce února a také v překladu znamená doslova obléci si více vrstev oblečení. Jednotku totiž můžete díky modulům během pár vteřin předělat na něco trochu zábavnějšího, nebo naopak zabavit robotovi přední senzor, aby Vám neutekl. Není totiž nic horšího, než když vám při psaní emailu naštvané šéfové začne zdrhat počítač… Omlouvám se, vlastně je. Když se nepodívá před sebe, spadne ze stolu, vezme s sebou monitor, rozlije vám kafe na koberec a ještě si přerazí přední senzor 😀

Arduino asistenční robot Kisaragi

Hardwarová výbava

Dost vtípků. Teď si Kisaragi představíme i hardwarově. Zatím to je jen prototyp, proto je vše vyrobeno ze stavebnice merkur. Postupem času vytvoříme open source podklady pro 3D tisk, Arduino i Raspberry Pi 🙂

Asistenční robot Kisaragi - Schéma komunikace

Schéma komunikace

Hlavní část je vybavena motory s gumovýmy pásy. Ty zabraňují sklouznutí ze stolu a zároveň umožňují až třicetistupňové stoupání při jízdě. Co se týče elektroniky, je zde zabudované Raspberry Pi s operačním systémem Raspbian. Jednotka se tedy dá použít jako stolní počítač a zároveň má dostatečný výkon, aby v autonomním módu mohla přenášet hlas na server Googlu, tam ho vyhodnotit a stejnou cestou vám odpovědět.

Mluvící roboti sice už dávno nejsou zase takové Sci-Fi, rozhodně jim ale mluvení přidává notnou dávku osobnosti 🙂 Bohužel super výkon s sebou přináší obrovskou energetickou daň. Proto je zde zabudované i staré dobré Arduino UNO. Pokud zrovna netoužíte po IoT, zpracování složitých dat, nebo nepotřebujete ovládat jednotku jako pojízdnou webkameru z Japonska, tak stačí jen přepnout pár vypínačů. Obě tyto jednotky spolu komunikují přes I2C protokol, který zajišťuje možnost připojení i jiných modulů. Takovým může být třeba inteligentní baterie, přední IR senzor, tanková věž pro bojové roboty, manipulační rameno, a nebo jen solární panel pro letní blbnutí venku. U těchto jednotek jsou tedy jen dvě omezení. Prvním je kapacita baterie a druhým je vaše vlastní fantazie.

Já a můj mechanický kamarád se s Vámi loučíme. Přejeme Vám spousty úspěchů nejen při projektech a doufáme, že se brzy uvidíme na nějaké soutěži 🙂 Kdybyste se chtěli do projektu zapojit, dejte mi vědět v komentářích pod článkem.

Krabičky pro Arduino

$
0
0

Asi jste již přemýšleli, kam hotový Arduino projekt schovat. Náš čtenář Martin Benda nám posal své postřehy k hledání krabiček pro Arduino.


Když jsem si už něco pospojoval a k tomu napsal nějaký prográmek, začal jsem přemýšlet jak to „zabalit“, aby mi to neblikalo na stole jako klubko drátů. Na Internetu je spousta návodů jak to, či ono naprogramovat, ale už hůře se hledají nápady do čeho to dát.

Začal jsem tradičně hledat v Číně na ebay.com. Buď jsem se ale špatně ptal, nebo tam prostě žádné vhodné krabičky na Arduino a nějaké věci kolem, včetně průchodů na připojení, nejsou.

Zkoušel jsem obcházet různé OBI, Hornbachy  nebo jiné Bau-blázince, ale jediné co z toho vzniklo, byly elektrikářské krabičky, jednak dost drahé a hlavně nešikovné.

Pokus s elektrikářskou krabičkou pro uložení Arduina

Pokus s elektrikářskou krabičkou

Nakonec jsem našel a koupil v Alze krabičku níže. Krabička mne sice vyšla dráž než Arduino Mega (klon), ale už to alespoň trochu vypadalo, byť se do ní zdaleka vše nevešlo.

Arduino krabička z Alzy

Krabička z Alzy

Protože se blížila zima a do Arduina v garáži se mi začali stěhovat pavouci, začal jsem opět experimentovat a nakonec jsem v Gme.cz pokusně objednal dvě krabičky. Náhodou se obě hodily – jedna na MEGA a nějaké drobnosti kolem, včetně možnosti jednoduše připojovat senzory, druhá na WiFi WeMosD1 a displej 20×4, šlo by do ní i UNO.

Krabička pro Arduino Mega

Krabička pro Arduino Mega

Krabička s displejem a deskou Wemos

Krabička s displejem a deskou Wemos

Zavřená krabička s displejem a deskou Wemos

Zavřená krabička s displejem a deskou Wemos

Chce to pak už jen přesné zaměření, ostrý nožík a trochu trpělivosti 😉

Pro zájemce zde jsou odkazy:

Krabička pro MEGA: https://www.gme.cz/krabicka-plastova-kp03b-z-5b

Krabička pro WeMosD1/UNO: https://www.gme.cz/krabicka-cerna-teroz-t-511-a


Děkujeme za zajímavé postřehy 🙂


Krabičky, které zmiňujete na FB a v komentářích.

Díky za tipy.

Udělejte si domácí sodovku s Arduinem

$
0
0

Náš čtenář, pan Petr, nám poslal informace o jeho Arduino projektu domácího sodobaru jako reakci na tento článek. Pracujete na zajímavém projektu? Dejte nám o tom vědět (více informací ve článku).


Když dostanete chuť na sodu, máte několik možností. Buďto si skočíte do obchodu pro lahvovou, vydáte se do sklepa hledat starý výrobník na sodu, nebo možná sáhnete po řešení typu Sodastream. Druhé dvě možnosti mají docela velkou nevýhodu – musíte mít pořád po ruce náhradní bombičky. Ty navíc nevycházejí úplně levně. O něco lépe na tom jsou velké profesionální výrobníky, například do kanceláří, které připojíte k velké bombě s CO2. U nich ale zase nepotěší jejich vysoká cena. Náš čtenář Petr se proto rozhodl si vyrobit vlastní sodobar, který se funkcemi blíží profesionálním kancelářským přístrojům.

Arduino sodobar - Domácí výrobník sodovky

Arduino sodobar – Domácí výrobník sodovky

Jak se dělá sodovka

Výroba sodovky je založena na rozpouštění CO2 ve vodě za vysokého tlaku. Po snížení tlaku se CO2 z vody opět uvolňuje a výsledkem jsou bublinky v nápoji. V domácích výrobnících výroba probíhá tak, že se CO2 uvolní z bombičky do nádoby s vodou, se kterou pak musíte třepat, aby se plyn dostatečně rozpustil ve vodě. Druhou možností je do vody plyn vstřikovat na vícekrát. V obou případech ale nedochází ke stoprocentnímu využití plynu.

U profesionálních výrobníků je princip opačný. Do nádoby naplněné CO2 se tryskou vstřikuje voda. Díky tomu se ve vodě rozpustí více plynu a nápoj je tak kvalitnější.

Konstrukce sodobaru

K tomu, abyste mohli do natlakované nádoby vstřikovat vodu, potřebujete vysokotlaké čerpadlo, které bohužel Petr neměl. Rozhodl se proto jít cestou vícenásobného vstřikování plynu do vody. Hlavní tělo sodobaru tvoří vysokotlaká nádoba, ve které dochází k rozpouštění CO2 ve vodě. Ta má objem asi 1l a naleznete na ní vývody pro přivádění vody a CO2 a odvádění sodovky. Odvod a přívod sodovky i plynu zajišťuje soustava ventilů, kterou vidíte níže na obrázku.

Arduino sodobar - Schéma toku kapalin a ventilů

Schéma toku kapalin a ventilů

Elektronika

Řízení provádí klon desky Arduino Pro Mini, který ovládá ventily a přijímá vstupy z ovládací konzole. Sodobar obsahuje také chlazení, aby měla sodovka správnou teplotu. K ovládání zařízení slouží jednoduchá konzole se třemi tlačítky – první slouží k výdeji vody, druhé sodovky a třetí umožní vstup do menu s dalším nastavením (sycení, chlazení…).

Arduino sodobar - Odkrytá tlaková nádoba a ventily

Odkrytá tlaková nádoba a ventily

Celé zařízení je zabudované do kuchyňské linky, takže je viditelná pouze plnicí hadička a ovládací tlačítka.

Arduino výrobník sodovky pod kuchyňskou linkou

Sodobar pod linkou

Vývod arduino výrobníku sodovky

Vývod sodobaru

Více informací o tomto Arduino projektu se můžete dočíst na stránkách autora.

Ovládanie (nielen) 7-mi segmentového displeja pomocou 74HC595

$
0
0

Náš čtenář, Ing. Miroslav Tesař, nám poslal článek o ovládání sedmisegmentových displejů pomocí obvodu 74HC595. Děkujeme.


Často sa v schémach na ovládanie 7-mi segmentových displejov používa buď priame prepojenie segmentov s Arduinom, alebo dynamické zobrazovanie displejov pomocou tranzistorov.

V prvom prípade priameho prepojenia Arduina so segmentami potrebujeme na každý displej 7 či 8 výstupov (prvé dva obrázky) . Tento variant spotrebováva veľa digitálnych výstupov, čo predurčuje na realizáciu projektu minimálne Arduino UNO. Prakticky je nemožné ovládať viacmiestny 7-mi segmentový displej pomocou tohto zapojenia.

Schéma propojení hrací kostky

Hrací kostka

Zapojení sedmisegmentového displeje

Zapojení sedmisegmentového displeje

Určité vylepšenie sa ponúka v dynamickom riadení viacmiestneho 7-mi segmentového displeja. V tomto prípade potrebujeme 8 spoločných výstupov pre všetky segmenty displeja a po jednom riadiacom výstupu na každú pozíciu displeja. Pri viac miestom displeji a nízkej frekvencii zobrazovania pozícií môže dochádzať k stroboskopickému efektu, kedy je možné vidieť ako jednotlivé displeje blikajú. Horšie však je, že na zobrazenie informácie spotrebuje Arduino veľa strojového času. Ako náhle program vykonáva inú činnosť, prejaví sa to zlým zobrazením číslic.

Zapojení více sedmisegmentových displejů - zdroj: https://www.mikrocontroller.net/wikifiles/b/bc/Tut_7_Seg_03.gif

Zapojení více sedmisegmentových displejů – zdroj: https://www.mikrocontroller.net/wikifiles/b/bc/Tut_7_Seg_03.gif

O to horšie by bolo ovládanie napr. maticového displeja.

Podstatne lepšie riešenie riadenia výstupov pre ovládanie LED, 7-mi či viac segmentových displejov je použitie obvodu 74HC595. Ide o 8-bitový posuvný register s paralelným výstupom. Funkcia 74HC595 je popísaná v datasheetu a netreba ju v tomto článku rozoberať.

Vnitřní schéma obvodu 74HC595

Vnitřní schéma obvodu 74HC595

Vstup SHCP je taktovací, ktorý posúva bity prichádzajúci na vstup DS naprieč sériovým posuvným registrom, alebo registrami. Pomocou výstupu Q7S, ktorý pripájame na vstup DS ďalšieho obvodu 74HC595 zaistíme, že sériové dáta potečú cez všetky pripojené posuvné registre. Z uvedeného vyplýva, že prvý vyslaný bit sa po ukončení prenosu dostane na 8-mi bit posledného posuvného registra (ako keď tečie voda v rúre). Tento posun sa deje „na pozadí“ a nenarušuje stav paralelného výstupného registra s výstupmi Q0..Q7 – nedochádza k rušivému blikaniu displeja. Informácia sa dostane na výstup obvodu iba v prípade, že táto bude prepísaná na výstup pomocou vstupu STCP. Prepísanie sa deje naraz pre všetky obvody 75HC595. Vstup OE môže poslúžiť pre prípad, kedy chceme výstupy Q0..Q7 odpojiť od displeja. Ak túto možnosť nepotrebujeme, ušetríme jeden výstupný pin Arduina a na vstup OE privedieme mínus pól napájania. Vstup MR resetuje posuvný register (v našom prípade nepoužitý a pripojený na kladný pól napájania).

Pri použití viac LED diód (záťaže) na každom výstupe je vhodné použiť budič ULN2803. Obvod ULN2803 pracuje na výstupoch s napätím až 50V a každý výstup je možné zaťažiť prúdom až 500mA. V takom prípade však odporúčam použiť chladič. Treba ešte podotknúť, že ak použijete ULN2803, na jeho výstupe je inverzné napätia oproti výstupu z 74HC595. Taktiež výstupné LED diódy zapájame tak, že majú spoločnú anódu. Schéma zapojenia je na obrázku.

Zapojení 74HC595, ULN2803 a sedmisegmentových displejů

Zapojení 74HC595, ULN2803 a sedmisegmentových displejů

Ako je vidno na obrázku, na ovládanie n- zobrazovacích obvodov potrebujeme štyri, prípadne iba tri výstupné piny Arduina.

Programové riešenie

/*******************************************************
 * PIN - KONSTANTY PRE 74HC595
 *******************************************************/
 #define clockPin 17    // Vyber vhodnych pinou je na
 #define latchPin 16    // riesitelovi
 #define oePin    15    //      
 #define dataPin  14    // 

 #define dlzkaFronty 14 // Celkovy pocet prenasanych byte

/*******************************************************
 * STRUKTURA FRONTY PRE 7-SEGMENTY
*******************************************************/
 union display_Struct1 {
   struct
   {     
     byte Displ01; //  1. 7-segment
     byte Displ02; //  2. 7-segment
     byte Displ03; //  3. 7-segment
     byte Displ04; //  4. 7-segment
     byte Displ05; //  5. 7-segment
     byte Displ06; //  6. 7-segment
     byte Displ07; //  7. 7-segment
     byte Displ08; //  8. 7-segment
     byte Displ09; //  9. 7-segment
     byte Displ10; // 10. 7-segment
     byte Displ11; // 11. 7-segment
     byte Displ12; // 12. 7-segment
     byte Displ13; // 13. 7-segment
     byte Displ14; // 14. 7-segment
   };
     byte Fronta[dlzkaFronty];
 };

/*******************************************************
 * PREMENNE
 *******************************************************/
byte Export = 0;

Union štruktúra má tú vlastnosť, že Displ01..Displ14 obsadzuje ten istý pamäťový priestor ako pole Fronta (počet byte musí zodpovedať dĺžke poľa Fronta). Takže s výhodou zapíšeme informáciu pre každú pozíciu displeja a Fronta nám poslúži pre výstup do posuvného registra. Treba však rátať s tým, že (v našom príkladu) začína Fronta s pamäťovým priestorom vymedzeným pre Displ14 a končí Displ01.

Ak potrebujeme na displejoch zobraziť aj iné údaje (napr. ich pomocou prepínača zobrazovať bez toho, aby sa prepísali pôvodné dáta v štruktúre), môžeme takých štruktúr vytvoriť viac. Len dávajte pozor, aby bola dĺžka fronty stále rovnaká.

V prípade, že použijeme viac štruktúr, deklarujeme premennú, ktorá určí tú štruktúru, ktorá sa odošle do displejov.

/*******************************************************
 * INSTANCIE
 *******************************************************/
   union display_Struct1      display1;
// union display_Struct2      display2; // Pripad, kedy pouzijeme 
// union display_Struct3      display3; // dalsie struktury

/*******************************************************
 * SAVE FRONTA
 * -----------------------------------------------------
 * Fyzicke odoslanie dat do obvodov 74HCT595
 * Parameter *pole ziskava adresu prvej zlozky Fronta
 * a pomocou shiftout posiela data z adries Fronta
 *******************************************************/

Pre vysielanie dát na obvody 74HC595 použijeme procedúru:

void saveFronta(byte *pole) {        
   for (byte i=0;i<dlzkaFronty;i++) {
     shiftOut(dataPin,clockPin,LSBFIRST,*(pole+i));
   }
   digitalWrite(latchPin,HIGH); // Prepis do displejov po
   digitalWrite(latchPin,LOW ); // zapisu celej fronty
}

A to je všetko! Uvedená procedúra má výhodu, že môže posielať dáta aj z iných štruktúr. Stačí len v daných procedúrach zapísať dáta do štruktúry union a nastaviť premennú Export.

V prípade, že máme len jednu štruktúru union, v hlavnom programe vytvoríme podmienku, za ktorú sa má uskutočniť zápis do posuvných registrov:

void loop(){  // variant s jednou strukturou union
  if (Export == 1){  // pripadne pouzijeme typ bool
    saveFronta(&display1.Fronta[0]);
    Export = 0;
  }
}

V prípade, že máme viac štruktúr union, upravíme hlavný program pre tento variant:

void loop(){ // variant s viacerymi strukturami union
  switch (Export) {
    case 1: saveFronta(&display1.Fronta[0]);
      break;
    case 2: saveFronta(&display2.Fronta[0]);
      break;
    case 3: saveFronta(&display3.Fronta[0]);
      break;
  }
  Export = 0;
}

K aktualizácii displejov príde len vtedy, keď zapíšeme príslušné číslo do premennej Export. Tým šetríme strojový čas Arduina, lebo dáta sa odošlú iba raz za danú udalosť. Celý kód zde.

Riešenie DPS

V DPS som použil smd súčastky. Upozorňujem na to, že keby ste privádzali signál DS, SHCP a STCP pomocou vodičov (Arduino by bolo mimo túto DPS), tak je potrebné vodiče tieniť. Vyhnete sa tým rušeniu a zlým dátam odosielaným do posuvných registrov. Na DPS je dobré si všimnúť, že napájanie ULN2803 je z oboch strán, aby sa predišlo prúdovému preťaženiu vodivej cesty pri veľkom odbere. Prívod napájania pre 74HC595 a Arduino je tiež riešený osobitne, aby prúdové nárazy neovplyvnili činnosť týchto obvodov. Ďalej si všimnite, že na funkciu 14-miestneho displeja postačí najlacnejší variant s Arduino NANO. Samozrejme že Arduino NANO zvládne aj oveľa väčšiu frontu.

Schéma řízení sedmisegmentových displejů s 74HC595 a Arduino Nano

Schéma řízení sedmisegmentových displejů s 74HC595 a Arduino Nano

Schéma ve formátu lay6 – zde.

Autor: Ing. Miroslav Tesař, tesar@imt.eu.sk


Děkujeme za zajímavý článek a přejeme spoustu úspěchů.

Máte zajímavý projekt, se kterým se chcete pochlubit? Přečtěte si tento článek a dejte nám o něm vědět.

Robotická ruka – CCRH MK1

$
0
0

Robotická ruka CCRH (Coordinates Controled Robotic Hand)

Tuto ruku jsme stavěli s kamarádem jako studentský projekt. Nyní chceme, aby se náš projekt rozšířil mezi lidi, kteří by měli zájem na něm dále pracovat a vylepšovat jej.


Popis projektu

Jedná se o robotickou ruku, kterou jsme navrhli a vytiskli na 3D tiskárně.

Robotická ruka - návrh pro 3D tisk

Robotická ruka – návrh pro 3D tisk

Robotická ruka - 3D tisk

Robotická ruka – 3D tisk

Dále jsem pro ní vytvořili ovládací prostředí do PC, pomocí kterého můžete ovládat její základní funkce. Tento program jsme psali v prostředí Processing 3, takže dokonale spolupracuje s naší řídicí jednotkou, která je sestavena ze dvou čipů ATmega328p. Jako převodník pro komunikaci s PC využíváme Arduino UNO bez čipu.

Jako pohon využíváme silné digitální servo motory, podrobnosti najdete na konci článku v soupisce materiálů.

Ruka nyní funguje jako malý pomocník, se kterým je zatím víc práce, než dokáže sama udělat. Nyní pracujeme na ovládání pomocí souřadnicového systému (XYZ) tak, že na SD kartu umístíme soubor, který buď ručně napíšeme, nebo jej vytvoříme pomocí našeho programu.

Ruku lze tedy ovládat pomocí softwaru v PC, nebo z SD karty, kterou umístíte do ovládacího panelu, na kterém je umístěna membránová klávesnice a LCD display.

Popis výroby

Začali jsme tím že jsme vytvořili kompletní 3D model, který jsme pak postupně začali tisknout na 3D tiskárně z PLA plastu. Mezitím jsem si připravili desku 80 x 80 cm, na kterou jsme ruku umístili. Pro demonstraci jsme na desku udělali čtverečkovou síť, která slouží jako pomocník pro určování souřadnic.

Po vytištění jsme začali vše montovat dohromady. Některé díly bylo třeba dočistit, takže jsme je dočistili a pak smontovali dohromady. V ruce jsou dvě kuličková ložiska, která jsme taky navrhovali. Jako kuličky do nich jsme použili kuličky do airsoftových zbraní (průměr 6 mm). Tato ložiska jsme pak ještě promazali silikonový olejem. Jako pohon jsme použili několik druhů servo motorů. Nejsilnější serva (60Kg/m) přišla do spodní části ruky.

Robotická ruka - základna

Robotická ruka – základna

Dále jsme použili už slabší motory (50Kg/m).

Jako řídicí jednotku jsme chtěli původně použít Arduino UNO, ale nakonec jsme se rozhodli že si vyrobíme vlastní. V programu Fritzing jsme navrhli desku PCB, kterou jsme si pak fotocestou i vyrobili. Na této desce jsou umístěné dva řídící čipy ATmega328p, krystaly 16 MHz, několik kondenzátorů, stabilizátor napětí (7805), který napájel celý řídicí obvod. Dále jsou na desce umístěné konektory pro připojení motorů, SD karty, membránové klávesnice atd.

Robotická ruka - PCB

Robotická ruka – PCB

Konec ruky je zakončen jakýmsi “upínacím nástavcem”, kam lze napojit několik možných nástavců. Nástavce které my nyní používáme jsou dva druhy extruderů, např. na palačinkové těsto, dále pak tříbodové úchopové klepeto. Do budoucna máme v plánu i nějaké nástavce s čidly a měřícími systémy.

Robotická ruka - extruder

Robotická ruka – extruder

Pro napájení řídicí desky i ruky samotné jsme použili průmyslový spínaný zdroj 7,4V (20A), který dokáže napájet všechny části ruky, plus je tam i malá rezerva pro připojení něčeho dalšího.

Software

Počítačová část

Pro počítač jsme vytvořili software v prostředí Processing 3. V tomto programu lze ovládat naší ruku pomocí souřadnic. V programu si zvolíte nejprve souřadnice XY (na vodorovné ploše), pak zvolíte hodnotu na ose Z (hodnota na svislé ose). Dále je pak možnost zvolit, co se má stát s nástavcem (uchopit x uvolnit). Nasledují pak dvě možnosti jak do ruky příkaz dostat – buď jej exportujete do souboru a ten pak nahrajete na SD kartu, ze které ho pak spustíte pomocí ovládacího panelu na ruce, nebo PC připojíte k ruce přes USB a posíláte příkazy napřímo.

Řídicí jednotka

Pro řídicí jednotku jsme museli napsat dva programy (pro každý čip zvlášť). K jednomu čipu jsou připojená všechna zařízení z ovládacího terminálu a k druhému jsou připojené všechny motory.

Pro čip, který má na starosti ovládací panel jsme použili několik knihoven a to hlavně pro LCD display (20 x 4), pak pro membránovou klávesnici (4 x 4), také pro SD kartu a operace s ní.

Robotická ruka - ovládací panel

Robotická ruka – ovládací panel

Na druhém čipu je umístěn program, který čte úhly v určitém formátu ze sériové linky a následně je zapisuje do serv, která se do dané pozice otočí. Na sériovou komunikaci (RX, TX) je připojen druhý čip nebo počítač (to záleží na tom, jestli chcete ruku ovládat přes PC, a nebo z SD karty).


Soupis použitých součástek

  • 2x Servo motor 60Kg/m
  • 1x Servo motor 48Kg/m
  • 2x Servo motor 13,56Kg/m
  • 1x Robotické servo 17Kg/m
  • Průmyslový spínaný zdroj
  • Součástky pro osazení PCB řídicí jednotky (čipy ATmega328p)
  • Arduino UNO
  • LCD display 20 x 4
  • Membránová klávesnice 4 x 4
  • Modul pro SD karty

      +Vytištěné plastové díly, které najdete ZDE a taky zde naleznete veškeré programy. Pro montáž jsme použili nějaké M3 šroubky a matky různých délek.
      +K uchycení ruky jsem použil M8 x 50 šroub a matky.


V budoucnu bychom na ruku chtěli umístit infračervenou kalibrační sondu, která by pak ruku zkalibrovala pomocí kalibračních bodů na dané podložce. Další naší myšlenkou by bylo ruku předělat na krokové motory, které by měly být daleko přesnější než dosavadní serva.

Pokud by někdo z vás z řad čtenářů měl nějaký nápad, co by se dalo vylepšit, nebo nějaké další využití, či úkol, který by ruka mohla plnit, nebo nějaký zvídavý dotaz, tak budeme rádi když nám je napíšete do komentářů, nebo na arduino.rady@gmail.com. Budeme také rádi, když vás naše práce inspiruje k vytvoření něčeho dalšího, s čím se pak budete moci pochlubit zase na zpět.

Viewing all 29 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>