Niedawno na mym biurku wylądowała nowiutka Malinka. Pomysłów na wykorzystanie jej miałem już w głowie mnóstwo. Jednym z nich było kontrolowanie jej z poziomu przeglądarki internetowej, a konkretniej – sterowanie PWM. Z góry zastrzegam, że nie jest to profesjonalna implementacja tego zagadnienia i wiem, że można to zrobić lepiej, jednak chciałbym zaprezentować mój sposób rozwiązania tego problemu.
Cały proces odbywał się w systemie Raspbian i tak też będę go przedstawiał. Na początek zainstalujmy wiringPi – bibliotekę do obsługi GPIO. Instalujemy GIT:
1 |
sudo apt-get install git-core |
Następnie pobieramy wiringPi z oficjalnej strony autora:
1 |
git clone git://git.drogon.net/wiringPi |
później kolejno
1 2 3 4 |
cd wiringPi git pull origin cd wiringPi ./build |
Aby móc sterować naszą Maliną z przeglądarki potrzebny nam będzie serwer Apache:
1 |
sudo apt-get install apache2 |
Należy również zainstalować PHP5, dzięki któremu będziemy mogli interpretować skrypt dla przeglądarki:
1 2 |
sudo apt-get install php5 sudo apt-get install libapache2-mod-php5 |
Tworzymy nowy plik w katalogu /var/www o nazwie index.php (jeżeli w katalogu www/ znajduje się plik index.html należy go usunąć poleceniem sudo rm index.html)
1 |
sudo nano /var/www/index.php |
i w edytorze wklejamy kod php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Zdalne PWM RPi</title> <style> body {font-family: arial;} td {text-align: center;} </style> </head> <body> <br> <br> <center> <form action="index.php" method="post"> Podaj wartość PWM: <input type="text" name="pwm" /> <input type="submit" value="Zatwierdź" /> </form> <?php echo shell_exec('echo '.$_POST['pwm'].' > /home/pi/war.txt') ?> </center> </body> </html> |
A teraz nieco wyjaśnień: dane z formularza są zapisywane do tablicy POST w komórce [pwm] (linia 16), a następnie wykonuje się polecenie echo, które zapisuje wartość z tablicy w pliku war.txt (linia 20). W przeglądarce pod adresem IP naszej Malinki (jeżeli pracujesz na RPi w polu adresu strony możesz wpisać localhost), który można sprawdzić poleceniem ifconfig, powinniśmy zobaczyć taki widok:
Teraz czas na program uruchamiany na RaspberryPi. w katalogu /home/pi tworzymy nowy plik o nazwie pwm.c
1 |
sudo nano pwm.c |
i w edytorze wklejamy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <stdio.h> #include <wiringPi.h> int i=50; int n,moc; FILE *war; int main (void) { wiringPiSetup(); pinMode(0,OUTPUT); while(1) {war=fopen("war.txt", "r"); fscanf(war,"%d",&moc); if(i==moc){ digitalWrite(0,HIGH); delayMicroseconds(i*10); digitalWrite(0,LOW); delayMicroseconds(1000-i*10);}else i=moc; fclose(war); } return 0; } |
Program jak widać jest bardzo prosty. Odczytuje wartość z pliku war.txt i zapisuje ją do zmiennej moc i porównuje ją z poprzednią wartością z pliku. Jeżeli są takie same, program kontynuuje swoje działanie i ustawia stan wysoki na pinie 0 na czas określony przez wartość z pliku, a następnie ustawia stan niski na resztę czasu okresu. Okres trwa 1ms i w tym czasie wypełnienie stanem wysokim jest procentowo równe wartości z pliku war.txt. Tak właśnie działa software PWM według mojego przepisu :).
Następnie kompilujemy (musimy pamiętać o dodaniu w komendzie dyrektywy -lwiringPi):
1 |
sudo gcc pwm.c -o pwm -lwiringPi |
i uruchamiamy program w tle:
1 |
sudo ./pwm & |
W tzw. międzyczasie budujemy sobie prosty układzik, żeby sprawdzić czy nasze software PWM działa
Łączymy jak na obrazku. Wartość rezystora to 220Ω. Wszystko powinno ładnie działać i dioda powinna świecić adekwatnie do tego jaką liczbę wprowadziliśmy w przeglądarce :)
Jest to mój pierwszy wpis na Majsterkowie, dlatego liczę na Wasze przychylne oko i obiektywne komentarze oraz oceny. W tym projekcie korzystałem z poradnika zamieszczonego na stronie http://mikrokontroler.pl/.
Dziękuję serdecznie i pozdrawiam
Maciej Tycner
Użycie PHP do tego celu to jak sięganie lewą ręką do prawej kieszeni przekładając ją pod kolanem.
http://flask.pocoo.org/ – wszystko można zrobić z poziomu jednej aplikacji, www i obsługę gpio
Z przykładami tak już jest, że to tylko przykłady. Jak będziesz chciał zintegrować jakieś swoje rozwiązanie z użyciem gotowego oprogramowania napisanego w PHP to co zrobisz? Będziesz sięgał lewą ręką w rękawicy bokserskiej, pod kroczem, do tylnej kieszeni spodni?
Oj tam, oj tam. Chłopak zrobił jak umiał. Chwali się że zrobił, a jak mu się zachce to dopracuje. Sam mam zrobiony NAS na bazie WYSE S10, w którym brak wsparcia dla DMA (o UDMA nawet nie wspomnę) co przypomina wystawianie portalu z pornografią przez modem analogowy :P. Ale jest i działa i daje się z niego odtwarzać filmy przez sieć i na tą chwilę więcej mi nie trzeba mimo że wrzucanie na niego trawa wieki. Dla niektórych obsługa GPIO to już nie lada wyzwanie.
A tak z innej beczki – jakie jest zurzycie procesora przy takim programowym PWM’ie??? I jeżeli będą jakieś upgrade’y to proponuję zamienić apache’a czym lżejszym (nginx, lighttpd), a i php możnaby zamienić skryptem cgi ale to tylko luźne hint’y.
dziękuję za podpowiedzi ;)
Skorzystałem z tego, o czym każdy słyszał. Apache i PHP to chyba najpopularniejsze opcje, więc uczyniłem tak jak uczyniłem :)
A co do zużycia CPU, to szczerze nie sprawdzałem, ale przy najbliższej okazji sprawdzę :)
Pytałem bo jak ja się bawiłem RPi to skrypt który w pętli sprawdzał jedno GPIO i zapalał diodę na drugim jak się zmienił stan (wszystko w bashu :P) to mi top pokazywał zurzycie procesora na poziomie ~15% dla tego jednego procesu.
W programie napisanym w C wystarczy przepisać odczyt z czystych plików na nazwane potoki i wykorzystać standardowy mechanizm blokowania na odczycie kiedy potok jest pusty. Teraz pewnie jest w stanie zjeść i 100% kiedy nic się nie dzieje.
proponowałbym jakiś inny serwerek zamiast Apache np.mini-httpd (w klasycznym debianie jest w repo, nie wiem jak z Rasp
Tylko, jeżeli to jedyny sposób na opróżnienie kieszeni, o którym słyszałem, bądź jedyny, który znam i dzięki niemu opróżniam skutecznie tę kieszeń, to czemu mam robić to inaczej? Kiedy dowiem się, że można to zrobić drugą ręką, bez użycia kolana to chętnie spróbuję ;) dlatego też zamieściłem ten wpis – żeby dowiedzieć się od bardziej doświadczonych osób jak można zrobić to łatwiej/lepiej.
Co do obsługi gpio: nie wiem dlaczego, ale nie działa mi załączone w gpio opcja pwm, dlatego napisałem własny nieskomplikowany program.
A co jeśli w formularzu wpisze: ” & rm -Rf ./
;p
Można się domyślić ;) to jest tylko szkielet, który nie jest “idiotoodporny” jak to mawiał mój nauczyciel informatyki. Bez problemu można dać takie zabezpieczenia, ale po co, skoro zakładam, że nie jestem idiotą ;)
Jestem początkującym …
Jobię tak jak autor napisał ;acz wywala mi błąd przy instalacji wiringpi macie może jakiś pomysł co z tym zrobić ?
pozdrawiam :P