#!/usr/bin/python # -*- encoding: utf-8 -*- # Michal Kandrac 2017 - 2019 # Posledni zmena 21.2.2019 # Popis: # Ovladani tercu na strelnici v Pribrami. Verze 02 - s tlacitky # Program je spousten pri startu prikazem v rc.local # Ovladani pohybu tercu je mozne tlacitky na krabici zarizeni nebo programem MyPi pro telefon s Androidem, ke stazeni na Google Play # Navod k instalaci serveru programu Mypi je v napovede programu, spousteni rovnez pres rc.local. # ToDo # Doprogramovat vypinani pomoci stisku dvou tlacitek? Asi neni duvod. # Jak stabilni to je kdyz vypnu kontrolu disku pri startu? /etc/fstab - na konci radku s diskem ...0 0 (kontrola = 0 1) # Zapojeni Raspi # Dratove propojeni vystupnich pinu ovladanych programem MyPi, resp. jeho serverem v Raspi a vstupnich pinu definovanych programem terce: # Pin ovladany telefonem Propojeny dratem na vstupni Poradove cislo Spusteny # MyPi + server v Raspi pin programu terce serveru MyPi program # 36 (GPIO16) 33 (GPIO13) 1 5x3/7 # 31 (GPIO06) 35 (GPIO19) 2 1x10 # 18 (GPIO24) 19 (GPIO10) 3 Ukazat # 23 (GPIO11) 24 (GPIO08) 4 Skryt # 21 (GPIO09) 22 (GPIO25) 5 Rezerva # Zapojeni GPIO konektoru Raspi - neuvedene piny nejsou vyuzity: # Pin Funkce Zapojeni # 2 5 V Napajeni Rele 1 - LED # 17 3 V Napajeni tlacitek ovladani programu # 18 GPIO24 Vystup MyPi - program 3 - propojeno s 19 - vstup ukazat # 19 GPIO10 Vstup tlacitko 3 + MyPi ukazat - propojeno s 18 a tlacitkem Ukazat - zelene # 21 GPIO9 Vystup MyPi - program 5 - propojeno s 22 - vstup rezerva # 22 GPIO25 Vstup tlacitko 5 + MyPi rezerva - propojeno s 21 a tlacitkem Rezerva - bile # 23 GPIO11 Vystup MyPi - program 4 - propojeno s 24 - vstup skryt # 24 GPIO8 Vstup tlacitko 4 + MyPi skryt - propojeno s 23 a tlacitkem Skryt - cervene # 31 GPIO6 Vystup MyPi - program 2 - propojeno s 35 - vstup 1x10 # 33 GPIO13 Vstup tlacitko 1 + MyPi 5x3/7 - propojeno s 36 a tlacitkem 5x3/7 - bile # 34 GND Zem pro signalizacni LED # 35 GPIO19 Vstup tlacitko 2 + MyPi 1x10 - propojeno s 31 a tlacitkem 1x10 - bile # 36 GPIO16 Vystup MyPi - program 1 - propojeno s 33 - vstup 5x3/7 # 37 GPIO26 Rele 1 - signalizacni LED # 38 GPIO20 Rele 2 - ovladani motoru - skryt - hneda # 40 GPIO21 Rele 3 - ovladani motoru - ukazat - seda # Pripojeni k zastrcce rozvadece motoru: # Zastrcka Barva Funkce Zapojeni # 1 cerna 230 V pres hlavni vypinac zarizeni na USB napajec pocitace # 2 modra nulak primo na USB napajec # 3 seda ukazat spinany kontakt rele 3 # 1 hneda skryt spinany kontakt rele 2 # Nastaveni serveru MyPi # TCP_PORT = 5000 # PASSWORD = cinema # INIT_LEVEL = 0 # Output pins index # OUT1 = 36 # OUT2 = 31 # OUT3 = 18 # OUT4 = 23 # OUT5 = 21 # OUT6 = 7 # OUT7 = 7 # OUT8 = 7 # Output mode: M - pro vsechny vystupy # Momentary delay # DELAY = 0.3 # Pin 28 ma specialni funkci a nelze v programu pouzit jako vstupni ani nastavit v serveru mypi jako vystupni # Nastaveni aplikace MyPi v telefonu: # IP adresa v zavislosti na konfuguraci site do niz je zarizeni pripojeno, resp. kterou vytvari. Port default 5000, # nejake heslo, Auto Connect = Yes, Invert on State = Yes. # Titulky tlacitek: # Output 1 5x3/7 # Output 2 1x10 # Output 3 Ukázat # Output 4 Skrýt # Output 5 Rezerva # ...nebo nejak jinak podle nalady :-) # Konfigurace Wifi AP # Pokud ma zarizeni vytvaret vlastni Wifi sit pro pripojeni telefonu s programem MyPi, je nutne nainstalovat balíčky # dnsmasq a hostapd - DNS, DHCP a AP - a radne je nakonfigurovat. # V rezimu klient samozrejme staci v programu Mypi spravne nastavit IP adresu, port a heslo. # Tak to by snad mohlo byt vsechno - dokumentace delsi nez program :-( import RPi.GPIO as GPIO import time import os GPIO.setwarnings(False) # Nastaveni chybovych hlaseni GPIO.setmode(GPIO.BOARD) # Nastaveni modu cislovani pinu - Board GPIO.setup(38, GPIO.OUT) # Nastaveni pinu jako vystupni GPIO20 - ovladani motoru - skryt GPIO.setup(40, GPIO.OUT) # Nastaveni pinu jako vystupni GPIO21 - ovladani motoru - ukazat GPIO.setup(37, GPIO.OUT) # Nastaveni pinu jako vystupni GPIO26 - spinani napajeni LED Z/C GPIO.output(38, True) # Nastaveni vychoziho stavu - vypnuto GPIO.output(40, True) GPIO.output(37, True) GPIO.setup(36, GPIO.OUT) # Nastaveni vystupnich pinu programu MyPi - pokud se toto neudela, pocitac nektere piny nekontrolovane GPIO.setup(31, GPIO.OUT) # nahodi a muze zpusobit podivne chovani po zapnuti napajeni GPIO.setup(18, GPIO.OUT) GPIO.setup(23, GPIO.OUT) GPIO.setup(21, GPIO.OUT) GPIO.output(36, 0) GPIO.output(31, 0) GPIO.output(18, 0) GPIO.output(23, 0) GPIO.output(21, 0) GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # Nastaveni pinu jako vstup a pripojeni vnitrniho pull-up odporu GPIO.setup(35, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # ... GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) cas_spusteni_motoru = 0.4 # Cas sepnuti rele, ktere svym vystupem spina rele pro otaceni motoru. Cim mene, tim lepe, ale musi to spolehlive otocit terce az do krajnich poloh GPIO.output(37, 0) # Rozsviceni zelene LED - Pripraven def otacej(): # Funkce pro otaceni tercu podle parametru zadanych v podminkach nize GPIO.output(37, 1) # Zhasnuti zelene a rozsviceni cervene LED - bezi program GPIO.output(38, 0) # Otoceni tercu od strelcu time.sleep(cas_spusteni_motoru) GPIO.output(38, 1) time.sleep(cas_uvodni_prodlevy) # Cekani pred prvnim natocenim tercu ke strelcum for x in range(0,kolikrat): # Otaceni tercu podle zadanych parametru GPIO.output(40, 0) # Ke mne celem.... time.sleep(cas_spusteni_motoru) GPIO.output(40, 1) time.sleep(cas_ukazani - cas_spusteni_motoru) GPIO.output(38, 0) # ... k lesu zady! :-) time.sleep(cas_spusteni_motoru) GPIO.output(38, 1) time.sleep(cas_skryti - cas_spusteni_motoru) # A znova... time.sleep(cas_koncove_prodlevy) # Po poslednim otoceni ceka.... GPIO.output(40, 0) # ...a otoci terce celem ke strelcum time.sleep(cas_spusteni_motoru) GPIO.output(40, 1) GPIO.output(37, 0) # Zhasnuti cervene a rozsviceni zelene LED - pripraven na stisk tlacitka # nekonecna smycka pro cteni vstupu while True: if (GPIO.input(33) ==1): # Program 1: 5 x 3/7 kolikrat = 5 # Nastaveni parametru pro funkci otacej() cas_uvodni_prodlevy = 5 cas_ukazani = 3 cas_skryti = 7 cas_koncove_prodlevy = 0 otacej() if (GPIO.input(35) ==1): # Program 2: 1 x 10 kolikrat = 1 cas_uvodni_prodlevy = 5 cas_ukazani = 10 cas_skryti = cas_spusteni_motoru cas_koncove_prodlevy = 7 # Tady je sedm aby prodleva po skonceni programu byla stejna jako u programu 5x3/7 otacej() if (GPIO.input(22) ==1): # Program 4: Rezerva #kolikrat = 2 #cas_uvodni_prodlevy = 5 #cas_ukazani = 5 #cas_skryti = 10 #cas_koncove_prodlevy = 7 #otacej() pass if (GPIO.input(19) ==1): # Program 5: Ke mne celem, k lesu zady GPIO.output(37, 1) # Zhasnuti zelene a rozsviceni cervene LED - bezi program GPIO.output(40, 0) time.sleep(cas_spusteni_motoru) GPIO.output(40, 1) GPIO.output(37, 0) # Zhasnuti cervene a rozsviceni zelene LED - pripraven na stisk tlacitka time.sleep(0.5) # Kdyby obsluha usnula s prstem na tlačítku - aby se zbytecne nepoustel motor znova if (GPIO.input(24) ==1): # Program 6: Ke mne zady, k lesu celem GPIO.output(37, 1) # Zhasnuti zelene a rozsviceni cervene LED - bezi program GPIO.output(38, 0) time.sleep(cas_spusteni_motoru) GPIO.output(38, 1) GPIO.output(37, 0) # Zhasnuti cervene a rozsviceni zelene LED - pripraven na stisk tlacitka time.sleep(0.5) # Kdyby obsluha usnula s prstem na tlačítku - aby se zbytecne nepoustel motor znova time.sleep(0.2) GPIO.cleanup() # Smaze nastaveni pinu - zde je zbytecne protoze sem program nikdy nedojde, # ale kdybych dodelal to vypinani tak se to muze uplatnit.