---
# System prepended metadata

title: 'subtitle: ''dokumentacja końcowa'''

---

---
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.