Skip to content
Snippets Groups Projects
user avatar
authored
Name Last commit Last update
..
lab01/img
lab01/README.md

Utworzenie roboczego środowiska dla programów w pythonie

W tym ćwiczeniu należy stworzyć prosty program do obsługi portów GPIO, a następnie skonfigurować serwer "message brokera MQTT" do sterowania GPIO. Ponadto należy utworzyć skrypt startowy dla własnych aplikacji.

Instalacja wirtualnego/lokalnego środowiska python:

  • Przejście do katalogu z utworzonym repozytorium git (repozytorium danej grupy laboratoryjnej utworzone np. na git.pg.edu.pl lub github) dla tej części laboratorium:
cd <sciezka_do_katalogu_repozytorium>
  • Utworzenie lokalnego środowiska:
virtualenv -p python3.6 virtenv

gdzie: virtenv -to nazwa katalogu, w którym zostanie utworzone lokalne środowisko python

  • katalog virtenv należy dodać do pliku .gitignore
touch .gitignore
echo "virtenv" >> .gitignore
git add .gitignore

Aktywacja lokalnego środowiska python:

source virtenv/bin/activate
  • Test poprawnej instalacji środowiska lokalnego:
pip -V

Instalacja lokalnego środowiska python

Sterowanie diodą LED

Instalacja biblioteki GPIO w lokalnym środowisku python:

pip install gpio

Zapisanie używanych bibliotek w pliku:

pip freeze > requirements.txt

Instalacja wymaganych bibliotek (w przypadku instalacji w nowym środowisku):

pip install -r requirements.txt

Instalacja biblioteki gpio

Utworzenie skryptu sterującego dioda LED:

  • Podłączenie DIODY LED do devKit Opis pinów devKit breadboardLab1
  • Przykładowa aplikacja
#!/usr/bin/env python3.6
import time
import gpio
print( "Test LED@PWM0\n")
gpio.setup(504, gpio.OUT)
while(True):
    gpio.set(504, 1)
    time.sleep(0.5)
    gpio.set(504, 0)
    time.sleep(0.5)

Odczyt stanu przycisku:

  • gpio.setup(488, gpio.IN)
  • gpio.read(488) # I2C0_DATA@GPIO488
  • zmiana ustawień poziomu loggera z gpio:
gpio.log.setLevel(logging.INFO)

Zadanie:

  • Wyświetlić informacje na terminalu, tyko wtedy gdy zmieni sie stan przycisku (narastające lub opadające zbocze)
  • Zaświecić diodę kiedy wykryto narastające zbocze, wygasić diodę gdy wykryto opadające zbocze na przycisku.

Uruchomienie kontenera z MQTT

  • Usuniecie starego:
docker rm mosquitto
  • Pobranie aktualnego obrazu kontenera:
docker pull eclipse-mosquitto
  • Utworzenie nowego z domyślną konfiguracją (porty 1883, 9001):
docker create -p 1883:1883 -p 9001:9001 --name mosquitto eclipse-mosquitto
  • Uruchomienie kontenera:
docker start mosquitto
  • Sprawdzenie działania:
    • Sprawdzenie otwartych portów w systemie
lsof -i | grep 1883
lsof -i | grep 9001
docker ps
  • Podłączenie do log'ów dockera:
docker attach mosquitto
  • odłączenie do log'ów dockera : UWAGA: to nie działa w VSC: ^P^Q (hold the Ctrl, press P, press Q, release Ctrl), workaround: lnik Tworzenie/uruchomienie kontenera Mosquitto

Komunikacja przez MQTT

  • Instalacja biblioteki do MQTT w lokalnym środowisku python:
    pip install paho-mqtt
  • odbiorca wiadomości z MQTT:
 import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe("led/#")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
  • nadawca wiadomości w MQTT:
import paho.mqtt.client as mqtt
import time

flag_connected = 0
def on_connect(client, userdata, flags, rc):
   global flag_connected
   flag_connected = 1

def on_disconnect(client, userdata, rc):
   global flag_connected
   flag_connected = 0

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("localhost", 1883, 60)



while(True):
    if flag_connected == 1:
        # Publish message
        client.publish("led/504", "1")
        time.sleep(1)
        client.publish("led/504", "0")
        time.sleep(1)
    else:
        # Wait to reconnect
        client.reconnect()
  • Zadanie: Należy napisać oprogramowanie wg poniższego schamatu, które za pomocą serwera MQTT bedzie odbierac wiadomości z aplikacji button.py oraz odpowiednio nadwać wiadmosci do aplikacji led.py. Schamat zadania z MQTT

Autostart aplikacji

Cron -scheduler systemowy

  • Edycja uruchamianych skryptów:
crontab -e
  • Zawartość crontab
SHELL=/bin/bash
@reboot        /root/ztb/tmux_script.sh

Skrypt tmux_script.sh

#!/bin/bash
MY_PATH=$(dirname $(realpath -s $0))
# Create a new tmux session named pmk
SESSION_NAME="pmk"
/usr/bin/tmux new-session -d -s $SESSION_NAME}
/usr/bin/tmux set-option -t ${SESSION_NAME} remain-on-exit on
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source /root/.bashrc" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source /root/.profile" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "date" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "source virtenv/bin/active" C-m
/usr/bin/tmux send-keys -t ${SESSION_NAME} "echo 'tutaj uruchom swoja app1'" C-m
/usr/bin/tmux split-window -t ${SESSION_NAME}
/usr/bin/tmux send-keys -t ${SESSION_NAME} "echo 'tutaj uruchom swoja app2 w drugim panelu'" C-m
  • Podłączenie do sesji tmux uruchomionej podczas startu systemu
tmux a
  • Skróty tmux:
    • podział pionowy okna: CTR+B "
    • podział poziomy okna: CTR+B %
    • nowe okno: CTR+B c
    • następne okno: CTR+B n
    • wyjście bez zamykania okna: CTR+B d
    • zamknięcie panelu: CTR+d
    • zmiana panelu: CTR+b strzalki

Zadania:

  • Połączenie z MQTT z innego NUC (odczyt stanu przycisku)

  • Sterowanie LED na innym NUC

  • Sterowanie krzyżowe Button@NUC1->LED@NUC2, Button@NUC2->LED@NUC1

  • Uruchomienie skryptów podczas startu systemu

  • Dodatkowe: Sterowanie wieloma LED@NUCX...NUCY