Pierwsze kroki z Raspberry Pi: zdalne (WiFi) sterowanie PWM na przykładzie serwomechanizmu i LED
Generowanie sygnału PWM i sterowanie przez sieć
Teraz wrócimy do sterowania diodą, ale będziemy korzystać z innej ciekawej funkcjonalności pakietu pigpio, czyli możliwości sterowania przez socket (zarówno lokalnie jak i przez sieć). Program pigpiod domyślnie oczekuje na połączenia na porcie 8888, na który należy wysłać cztery 32-bitowe dane, pierwszą jest kod rozkazu, trzy kolejne są jego argumentami, lista rozkazów jest w tabeli poniżej.
Macro | cmd | Function | p1 | p2 | res |
PI_CMD_MODES | 0 | gpioSetMode | gpio | mode value | status |
PI_CMD_MODEG | 1 | gpioGetMode | gpio | – | mode or error |
PI_CMD_PUD | 2 | gpioSetPullUpDown | gpio | pull up down value | status |
PI_CMD_READ | 3 | gpioRead | gpio | – | level or error |
PI_CMD_WRITE | 4 | gpioWrite | user gpio | level | status |
PI_CMD_PWM | 5 | gpioPWM | user gpio | duty cycle | status |
PI_CMD_PRS | 6 | gpioSetPWMrange | user gpio | range | real range or error |
PI_CMD_PFS | 7 | gpioSetPWMfrequency | user gpio | frequency | selected frequency or error |
PI_CMD_SERVO | 8 | gpioServo | user gpio | pulse width | status |
PI_CMD_WDOG | 9 | gpioSetWatchdog | user gpio | timeout | status |
PI_CMD_BR1 | 10 | gpioRead_Bits_0_31 | – | – | levels |
PI_CMD_BR2 | 11 | gpioRead_Bits_32_53 | – | – | levels |
PI_CMD_BC1 | 12 | gpioWrite_Bits_0_31_Clear | bits | – | 0 |
PI_CMD_BC2 | 13 | gpioWrite_Bits_32_53_Clear | bits | – | 0 |
PI_CMD_BS1 | 14 | gpioWrite_Bits_0_31_Set | bits | – | 0 |
PI_CMD_BS2 | 15 | gpioWrite_Bits_32_53_Set | bits | – | 0 |
PI_CMD_TICK | 16 | gpioTick | – | – | tick |
PI_CMD_HWVER | 17 | gpioHardwareRevision | – | – | revision |
PI_CMD_NO | 18 | gpioNotifyOpen | – | – | handle or error |
PI_CMD_NB | 19 | gpioNotifyBegin | handle | bits | status |
PI_CMD_NP | 20 | gpioNotifyPause | handle | – | status |
PI_CMD_NC | 21 | gpioNotifyClose | handle | – | status |
PI_CMD_PRG | 22 | gpioGetPWMrange | user gpio | – | range or error |
PI_CMD_PFG | 23 | gpioGetPWMfrequency | user gpio | – | frequency or error |
PI_CMD_PRRG | 24 | gpioGetPWMrealRange | user gpio | – | real range or error |
PI_CMD_HELP | 25 | N/A, handled by calling program | – | – | 0 |
Po wysłaniu tych czterech wartości pigpiod odeśle nam je z tą różnicą, że czwarty parametr będzie zawierał wynik operacji. Jeśli chcielibyśmy zaświecić diodę z wypełnieniem PWM równym 50% powinniśmy wywołać w konsoli polecenie:
pigs p 15 128
Tutaj p określa operację jaką chcemy wykonać, 15 – numer linii, 128 oznacza wypełnienie (zakres od 0 do 255). Aby tę samą operację wykonać przez socket należy wysłać kolejno:
5 – rozkaz PWM,
15 – numer linii,
128 – wartość wypełnienia PWM,
0 – pusta wartość.
W przykładowym filmie posłużono się aplikacją dla systemu Android, która wykonuje powyższe operacje, artykuł na temat sposobu tworzenia takiej aplikacji zamieścimy wkrótce.