---
title: 'ZAP sprawozdanie z projektu'
# subtitle: 'dokumentacja końcowa'
to: latex+footnotes
standalone: true
output: zap_dokumentacja.pdf
lang: pl-PL
date: \today{}
author:
- "Igor Kaźmierczak 293118"
- "Tymoteusz Perka"
geometry:
- bottom=2cm
- top=2cm
- left=1cm
- right=1cm
footnotes: true
toc: true
...
# ZAP projekt sprawozdanie
## Treść zadania:
Sterowanie jasnością oświetlenia ze smartfona przez BLE przy użyciu modułu z
mikrokontrolerem nRF51822.
## Środowisko
W celu wytworzenia oprogramowania na płytkę nRF52840 użyta została wtyczka `nRD Connect for VS CODE` wraz ze współpracujacymi z nią innymi rozszerzeniami znajdującymi się w pakiecie `nRF Connect Extension Pack` - rozszerzeniu do edytora `Visual Studio Code`. Proces instalacji rozszerzenia oraz pisania programów był wspomagany [serią poradników w serwisie YouTube.](https://www.youtube.com/watch?v=2cv_jjqk5hg&list=PLx_tBuQ_KSqEt7NK-H7Lu78lT2OijwIMl)
Aplikacja na telefon, która została wykorzystana przy testowaniu, to `nRF Connect`, dostępna do pobrania w sklepie `Google Play`.
## Modyfikacja plików konfiguracyjnych płytki nRF52840dk
Podczas próby obsłużenia wszystkich (czterech) modułów PWM znajdujących się na płytce, został napotkany problem z jej konfiguracją: pliki konfiguracyjne przewidywały występowanie tylko jednej diody PWM, podczas gdy w rzeczywistości było ich cztery. W celu eliminacji wspomnianego problemu zmodyfikowane zostały następujące pliki:
### `nrf52840dk_nrf52840.dts`
znajduje się w folderze `{INSTALATION_DIR}\v1.8.0\zephyr\boards\arm\nrf52840dk_nrf52840\`
-
```c=
pwmleds {
compatible = "pwm-leds";
pwm_led0: pwm_led_0 {
pwms = <&pwm0 13>;
};
};
```
zostało zamienione na:
```c=
pwmleds {
compatible = "pwm-leds";
pwm_led0: pwm_led_0 {
pwms = <&pwm0 13>;
};
pwm_led1: pwm_led_1 {
pwms = <&pwm1 14>;
};
pwm_led2: pwm_led_2 {
pwms = <&pwm2 15>;
};
pwm_led3: pwm_led_3 {
pwms = <&pwm3 16>;
};
};
```
-
```c=
aliases {
led0 = &led0;
led1 = &led1;
led2 = &led2;
led3 = &led3;
pwm-led0 = &pwm_led0;
sw0 = &button0;
sw1 = &button1;
sw2 = &button2;
sw3 = &button3;
bootloader-led0 = &led0;
};
```
zostało zamienione na:
```c=
aliases {
led0 = &led0;
led1 = &led1;
led2 = &led2;
led3 = &led3;
pwm-led0 = &pwm_led0;
pwm-led1 = &pwm_led1;
pwm-led2 = &pwm_led2;
pwm-led3 = &pwm_led3;
sw0 = &button0;
sw1 = &button1;
sw2 = &button2;
sw3 = &button3;
bootloader-led0 = &led0;
};
```
-
```c=
&pwm0 {
status = "okay";
ch0-pin = <13>;
ch0-inverted;
};
```
zostało zamienione na:
```c=
&pwm0 {
status = "okay";
ch0-pin = <13>;
ch0-inverted;
};
&pwm1 {
status = "okay";
ch0-pin = <14>;
ch0-inverted;
};
&pwm2 {
status = "okay";
ch0-pin = <15>;
ch0-inverted;
};
&pwm3 {
status = "okay";
ch0-pin = <16>;
ch0-inverted;
};
```
### `nordic,nrf-sw-pwm.yaml`
znajduje się w folderze `{INSTALATION_DIR}\v1.8.0\zephyr\dts\bindings\pwm\`
-
```c=
"#pwm-cells":
const: 1
```
zostało zamienione na:
```c=
"#pwm-cells":
const: 4
```
Powyższe modyfikacje pozwoliły wykrywać jak i korzystać ze wszystkich czterech modułów PWM znajdujących się na płytce.
## Przygotowanie programu
W celu przygotowania plików źródłowych oraz nagłówkowych niezbędne jest wygenerowanie tzw. *buildu*, informacje o którym zawarte są w pliku `prj.conf`. W przedstawianym projekcie wspomniany plik miał następującą zawartość:
```
CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="PROJEKT_ZAP"
CONFIG_BT_LBS=y
CONFIG_BT_LBS_POLL_BUTTON=y
CONFIG_DK_LIBRARY=y
CONFIG_LOG=y
CONFIG_PWM=y
CONFIG_LED=y
CONFIG_LED_PWM=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
```
Generowanie *buildu* opartego na powyższym pliku konfiguracyjnym wystawiało do dyspozycji programisty biblioteki opdowiedzialne za moduł ble oraz moduł odpowiedzialny za sterowanie PWM. Proces generowania jest opisany w [załączonym wcześniej poradniku](https://www.youtube.com/watch?v=2cv_jjqk5hg&list=PLx_tBuQ_KSqEt7NK-H7Lu78lT2OijwIMl).
## Struktura programu
Wytworzony program korzysta z trzech specjalnie przygotowanych plików:
- `main.c`
- `svc.h`
- `svc.c`
### `svc.h` i `svc.c`
Pliki te zawierają definicję naszego serwisu Bluetooth Low Energy. Serwis ten wystawia 4 charakterystyki typu *Write*. Każda z tych charakterystyk odpowiada za pojedynczą diodę PWM na płytce, patrząc kolejnością po UUID.
W celu dostosowania obsługi każdej charakterystyki, należy użyć instancji struktury `bt_led_svc_cbs`, która posiada 4 pola przyjmujące wskaźnik na funkcje zwracającą `void`, przyjmującą jeden argument typu `uint8t`.
Następnie należy użyć funkcji `int bt_led_svc_init(struct bt_led_svc_cbs *callbacks)` w celu zarejestrowania własnych funkcji obsługujących poszczególne charakterystyki.
### `main.c`
W pliku `main.c` został pokazany przykład użycia napisanego przez nas serwisu bluetooth. Po jego inicjalizacji program działa w pętli, oczekując na przesyłanie danych poprzez wystawione charakterystyki. W naszym przypadku do obsługi charakterystyk napisaliśmy funkcję, która na podstawie otrzymanej wartości zmienia intensywność świecenia diody LED odpowiadającej danej charakterystyce, w skali od 0-100. Odbywa się to za pomocą zawołania funkcji bibliotecznej `led_set_brightness(struct device *dev, uint32_t led, uint8_t value)`.
Zakres 0-100 został wybrany, ponieważ większe wartości i tak nie skutkują zintensyfikowaniem światła. Została dodana także specjalną wartość 200, po otrzymaniu której, wybrana dioda rozjaśni się i zgaśnie:
1. zmiana intensywności od wartości `0` do `100` przez sekundę (krok 10 ms)
2. sekunda świecenia z maksymalną jasnością,
3. stopniowa zmiana intensywności od wartości `100` do wartości `0` (krok 10 ms)
Pozostałe wartości większe od 100 zostaną sprowadzone do 100.
## Użytkowanie
Po kompilacji oraz sflashowaniu programu na płytkę należy oprogramowania do precyzyjnego sterowania połączeniami BLE. My użyliśmy do tego aplikacji nRf Connect. Należy połączyć się z płytką, która nosi nazwę **ZAP_PROJEKT**. Zostanie wyświetlonych kilka standardowych serwisów oraz nasz o UUID `00000001-1212-efde-1523-785feabcd123`. Posiada on 4 charakterystyki, które kolejno oznaczają sterowanie daną diodą. Po wybraniu jednej z nich należy zadbać o to, żeby przesyłana informacja miała typ `UINT8`, w przeciwnym wypadku serwis odrzuci naszą wiadomość. Po poprawnym przesłaniu żądania zobaczymy efekt zależny od wartości, opisany w poprzednim podrozdziale.