Obraz z RaspberrPi w oknie przeglądarki + sterowanie pozycją + oświetlenie
Witam,
Od jakiegoś czasu tworze system do łatwego łączenia ze sobą rządzeń takich jak RaspberrPi, arduino, i sterowanie nimi przez strony internetowe. Projekt jest całkowicie darmowy ( i jak narazie w wersji Beta).
Planuje przygotować serie artykułów które będą pokazywać możliwości systemu i jego używanie.
Na początek wyświetlanie obrazu kamery w oknie przeglądarki z kamerki RaspberryPi, sterowanie tą kamerką i załączanie dodatkowego oświetlenia.
Ten kurs będzie się składał z trzech części:
- instalacja remoteme.org na raspberryPi
- podłączenie i podgląd kamery w komórce, tablecie ogólnie wszędzie tam gdzie jest nowoczesna przeglądarka
- sterowanie pozycją kamery, podświetleniem
Wersja video tego kursu:
Co potrzebujemy:
- Podgląd
- Raspberry PI Zero W
- Dedykowanej kamery
- Sterowanie
- Podświetlenie
- Konwerter stanów logicznych 4.5zł
- power led 3.5zł
- tranzystor Mosfet typu N np IRF540N MOSFET 2zł
- opornik 220 om
- mocne oporniki do podłączenia diody( do wyliczenia wartości oporników polecam użyć gotowego kalkulatora )
Czego NIE potrzebujemy:
- Publicznego IP
- Własnego serwera
- Zaawansowanych umiejętności programistycznych ( w zasadzie to będzie kopiuj wklej )
- Pluginów do przeglądarki, flasha, specjalnych programów do odbioru obrazu
Jak to będzie działać:
Na RaspberryPi będzie uruchomiony program „remoteme” jego zadanie to zarejestrowanie się w systemie remoteme.org, uruchomienie sesji WebRTC przez którą nasze RPi będzie wysyłało obraz z kamery do przeglądarki, a przeglądarka będzie wysyłała wiadomości (sterowanie kamerką i diodą).
Na stronie internetowej ( hostowana na remoteme.org ale z pełną możliwością zmian) będzie Javascript będzie on przechwytywał muśnięcia palcem (ruch myszki) i wysyłał wiadomości do pozycji kamery. Drugim zadaniem JS będzie spięcie sesji WebRTC (video)
Skrypt pythonowy – sterowanie serwami i diodą led
System Remoteme.org umożliwi komunikację pomiędzy javascriptem, RaspberryPi, skryptem pythonowym
Co to jest remoteme.org:
Jest to DARMOWE środowisko składające się z:
- System webowego app.remoteme.org
- programu na RaspberryPi
- opensourcowy zestaw bilbiotek (C++, python, javascript ) )
- w przyszłości aplikacja na Androida
Całe środowisko umożliwia w łatwy sposób komunikacje przez internet różnych urządzeń, i sterowanie nimi przez stronę internetową (hostowane na remoteme.org lub nie), restowe API.
Instalacja programu na raspberryPi:
Uzyskanie podglądu video na stronie internetowej.
https://app.remoteme.org/ rejestrujemy się w zakładce SingUp – bardzo ważne nie podajecie swojego adresu email więc jak zapomnicie hasła to nie ma możliwości jego odzyskania !.
Zarejestrowanie RasbperryPi w systemie. Do tego potrzebujemy poprzez konsolę wgrac i uruchomić program remoteme ( jak skonfigurowąć nasze RPI – wgranie systemu jak sie łączyć konsolą, skonfigurować komunikacje I2C i kamerkę)
W katalogu gdzie chcemy żeby nasz program się znajdował (potem możemy zmienić po prostu przenosząc cały katalog remoteme w inne miejsce)
1 |
git clone git://github.com/remoteme/remoteme.git |
Polecenie ściąga program, pliki konfiguracyjne itd.
przechodzimy do nowo utworzonego katalogu
1 |
cd remoteme |
instalujemy remoteme
1 |
python3.5 install.py |
Co instalacja robi z Waszym RaspberryPi:
- instaluje biblioteki pythona https://pypi.python.org/pypi/psutil
- isntaluje biblioteki pythona https://github.com/adafruit/Adafruit_Python_PCA9685
- zmienia wpisy w pliku conf.json w nowo utworzonym katalogu remoteme
Gdy system pyta nas o instalacje bibliotek pythonowych [ y Enter ]
następnie program skonfiguruje połaczenie z systemem app.remoteme.org
System pyta o „Provide Token and press enter” na stronie https://app.remoteme.org w zakładce Token klikamy „New Token” wprowdzamy nazwe token1 i klikamy OK
—————————————–
Czym są tokeny:
Do zalogowania się do systemu potrzebujemy login i hasło użytkownika, tak samo same urządzenia muszą sie uwierzytelnić z systemem, ale w ich przypadku nie podajemy naszego usera i hasła ale właśnie tokeny. Token ma nazwę którą podajemy tworząc token – możemy podać cokolwiek nazwa jest używana tylko do wyświetlenia naszego tokenu w zakładce Tokens i dzięki niej wiemy który token nam do czego służy. Token posiada też wartość jest to losowy ciąg znaków trudny do złamania metoda brutalforce. Tokeny są powiązane z naszym kontem, wiec mamy pewność że używając danego tokenu powiążemy urządzenia właśnie z naszym kontem
Gdzie są używane tokeny:
- uwierzytelnianie urządzeń
- tworzenia linków do naszych stron które po prostu otwierają stronę bez konieczności logowania się – np dodajemy taki link do naszych zakładek w komórce
- uwierzytelniania komunikacji REST
- logowania się do systemu używając nazwy użytkownika „token” i jako hasła wartość tokenu ( ale mamy dostęp tylko do niektórych funkcji systemu, dlatego nie zobaczymy np listy naszych urządzeń)
kopiujemy token:
i wklejamy (shift + Insert) do puttego, potem podajemy nazwe naszego Rasbperry pI np [Rpi] i deviceId np [1]:
uruchamiamy program remoteme
a w zakładce Devices w systemie :
https://app.remoteme.org/en/#/app/devices
zielona ikonka: wskazuje ze urządzenie jest aktualnie podłączone.
Zresetujmy program na RPi i obserwujmy ikonkę i konsolę,
Podląd kamerki na stronie internetowej.
Dodamy stronę internetową z gotowych szablonów i będziemy się cieszyć podglądem kamery:
W zakładce devices klikamy New:
następnie „New Web Page” i ustawiamy wszytko jak na screnie poniżej:
nie zapomnijcie zaznaczyć active i templatu „justVideo”
————————————–
Co oznaczają pola
Każde urządzenie w remoteme posiada nazwę, typ, deviceId:
- Nazwa – ułatwia rozróżnienie urządzenia i jest wykorzystywana na liście naszych urządzeń, musi być niepowtarzalna
- deviceId- jest to adres urządzenia który będziemy wykorzystywać wysyłając do niego wiadomośći (przykłąd w podłączeniu serw niżej w tym kursie)
- typ – np strona internetowa, RaspberryPI, skrypt pythonowy itd
w okienku wybraliśmy też szablon , po prostu po stworzeniu strony internetowej kopiowane są do niej skrypty html javascript css w tym przypadku do przechwycenia obrazu RPI. Wszystkie szablony są open source i możecie je znaleźć tutaj z tego miejsca też są pobierane do RemoteMe
————————————–
po kliknięciu „Submit”:
Pojawiło sie nowe urządzenie – strona internetowa. rozwińmy ją:
Wybraliśmy gotowy szablon, dlatego system od razu dodał nam pliki ze stroną internetową gdzie zobaczymy podgląd widoku kamerki:
kliknijmy na index.html i otwórzmy stronę w nowej zakładce:
UWAGA korzystajcie z najnowszego Firefox’a albo chrome’a.
I dostajemy piękny obraz z kamerki (a dioda na kamerce Rpi będzie się świeciła):
Oczywiście tylko wy macie do niej dostep i jak sie wylogujecie i odświeżycie podgląd to nic się nie wyświetli.
Teraz otworzymy tą samą stronę ale w komórce. Na komórce nie chcemy się logować tylko skorzystamy z linka który otworzy nam podgląd do naszego Rpi (wcześniej musimy zamknąć podląd kamery na komputerze (dioda na kamerce zgaśnie – Rpi transmituje obraz tylko do jednego odbiorcy naraz)):
Klikamy na Index.html ale tym razem wybieramy „Get anonymous link …”:
I mamy:
linków będzie tyle ile mamy wygenerowanych tokenów, gdy powiązany z linkiem token usuniemy po jakimś czasie używanie tego konkretnego adresu nie będzie możliwe. Zamiast żmudnego przepisywanie adresu do komórki otwórzmy kod QR
i zeskanujmy go (Otwórzmy link w najnowszym Firefoxie, chrome i inne na razie nie wspierają w pełni Webrtc)
Jeżeli jesteśmy w tej samej sieci Wifi co Rpi na pewno otrzymamy podgląd jeżeli natomiast korzystamy z internetu mobilnego to możliwe, że będziemy musieli dodać serwer Turn ( prawdopodobnie nasze ustawienia firewall nie pozwalają na bezpośrednie połączenia, albo nasz dostawa internetu umieścił nas za NATem):
Dodawanie serwera turn:
Przetestowanym przeze mnie serwer Turn oferuje firma XIRSYS (darmowy do użytku deweloperskiego 500mb w miesiącu) i to na jej podstawie pokaże jak taki serwer skonfigurować:
rejestrujemy się:
https://global.xirsys.net/dashboard/signup
dodajemy aplikacje
a Tutaj mamy wszystkie potrzebne dane.
przedzimy do remoteme https://app.remoteme.org/en/#/app/devices
otwieramy plik webrtc_streamer.conf
i dodajemy wpisy:
1 2 3 |
turn_server= turn_username= turn_credential= |
kopiując z xirsys
1 2 3 |
turn Username Credential |
po wklejeniu:
[Save] [Close] i resetujemy program na Rpi:
po restarcie odświeżamy stronę na komórce
i dostajemy obraz z kamerki :)
Jak widzicie mam tylko internet mobilny włączony
Podpięcie Serwo Mechanizmów:
Do sterowania servo mechanizmów użyjemy 12-kanałowego sterownika LED 16-bit PWM I2C zgodnego z Adafruit. Komunikuje się on z Rpi poprzez interfejs I2C. Adafruit udostępnia bibliotekę pythona która działa out-of-the-box, Jeżeli w drugim kroku instalacji remoteme na RPi wybraliście opcje [Tak] macie tą bibliotekę już zainstalowaną ;).
Podłączenia:
Pin SDA, SCL, i ground podłączamy do tak samo oznaczonych pinów w RPI:
oznaczenie pinów w RPI wygląda tak:
(czerwone oznaczenia pinów ułatwią Wam liczenie pinów na samym urządzeniu)
Tutaj znajdziecie pełny obrazek z wyprowadeniami Pinów Rpi
Do pinu V+ i Vcc na sterowniku podłączamy napięcie +5V, Vcc służy do zasilania samego układu zaś V+ do zasilania serwo mechanizmów, a same serwa przypinamy zgodnie z kolorami na kablu i na układzie. Szczegóły samego układu tutaj
Przed złożeniem podstawki na kamerkę musimy ustawić serwa w pozycji środkowej – ułatwi to w znacznym stopniu kalibracje samej podstawki. Nie musimy pisać programu do obsługi serw prosty przykład który nam wystarczy znajduje się w szablonie servo. W zakładce Devices wybieramy [New] -> [New Web Page] i uzupełniamy okienko :
[Submit]
Pokaże nam się nowe urządzenie Servo WWW. Ale jak ja otworzymy w nowej zakładce i spróbujemy poruszać suwakami to nie będzie działać w konsoli htmlowej ([F12] w chromie) mamy odpowiedź:
Dlaczego ?
Strona internetowa wysyła wiadomośći do skryptu który steruje serwo mechanizmami, my takiego skryptu jeszcze nie mamy dlatego strona nie wie gdzie wysyłać wiadomośći.
Dodajmy skrypt. Skrypt oczywiście będzie sie znajdował na RaspberryPi dodajmy go:
zakładka Devices
z menu wybieramy [Add external script]
pojawia sie okienko które uzupełniamy:
[Submit]
po restarcie pliki do skryptu są dodane i nasz skrypt jest podłączony:
—————————-
- Zostało dodane nowe urządzenie
- Po stronie RaspberryPI
- został uaktualniony plik ustawień
1mcedit conf.jsonten sam plik możemy podglądnąć z poziomu systemu
- został utowrzony folder urządzenia na RPi
1/leafDevices/10pliki te są też widoczne z poziomu systemu:
- Rasbperry pi zostało zresetowane
- po Restacie bazując na pliku conf.json program uruchomił skrypt runme.sh który uruchamia skrypt pythonowy, a ten po socketach połączył sie z programem remoteme, a ten odświeżył połączenie w systemie
- został uaktualniony plik ustawień
Teraz możemy już wysyłać wiadomości ze strony “WWW servo” do skryput pythonowego, no prawie bo strona jeszcze nie zna adresu skryptu pythonowego.
kliamy [Open] i edytujemy:
10 dlatego ze nasz srkypt pythonowy ma deviceId 10:
otwieramy plik index.html w nowej zakladce:
i jak poruszamy sliderami to poruszają się też serwa:
Teraz musimy metodą prób i błedów odnaleść maksylalne wychylenia serw w moim przypadku to 225 i 880 wiec oba serwa ustawiam w pozycji 552 ( bo (225+880)=552.5), i ustawione serwa w pozycji centrlanej odłączamy od sterownika.
teraz zmontowanie serw do uchwytu kamerki:
i gotowa podstawka razem z diodą LED (możecie narazie diode pominąć)
Wracamy do strony sterowania kamerą i suwakami ustawiamy pozycje centralną kamery ( to ważne żeby było dokładnie)
w moim przypadku wyśrodkowana kamera dla osi X=568 dla osi Y = 506, zakres ruchu kamery dla osi X wynosi 312 w obie strony, a dla osi Y 237 także w obie strony, Ważne, żeby kamera obracała się swobodnie w całym obszarze, przykład w filmie
Podsumowując pozycje kamery:
1 2 3 |
min delta center delta max X 256 312 568 312 880 Y 269 237 506 237 743 |
Programowanie :
Musimy zmodyfikować skrypty najpierw zmodyfikujemy skrypt WWW żęby zczytywał muśnięcia placa, i wysyłał współrzędne do zmodyfkowanego skryptu z serwami.
Na pierwszy ogień idzie skrypt WWW, zmodyfikujemy nasze urządzenie “video”
index.html
Dodajemy stałą która reprezentuje adres skryptu pythonowego:
1 2 3 4 5 |
<script> var thisDeviceId =####deviceId#; var raspberryPiDeviceId =####raspberryPiDeviceId#; var servoPythonScriptDeviceId=10; // <--- added </script> |
miejsce gdzie będziemy wyświetlać pozycję kamery:
1 2 |
<body> <div id="output" style="position:absolute"> Here will come camera position </div> <!-- added --> |
i eventy to poruszania myszką i muśniecia palcem:
przed zmianą:
1 |
<video id="remoteVideo" autoplay="autoplay" ondblclick="fullscreen()" ></video> |
po zmianie:
1 |
<video id="remoteVideo" style="width:100%;height:100%" autoplay="autoplay" onMouseMove="onMouseMove(event)" onTouchMove="onTouchMove(event)" ondblclick="fullscreen()" ></video> |
Klikamy [Save], zamykamy edycje index.html
script.js
dodajemy funkcje które przechwycą ruch myszki i palca:
1 2 3 4 5 6 7 |
function onMouseMove(event){ positionChange(event.x ,event.y); } function onTouchMove(event){ positionChange(event.touches[0].clientX , event.touches[0].clientY); } |
obie funkcje wywołują tą samą funckje positionChange z parametreami [x,y]
sama funkcja positionChange:
1 2 3 4 5 6 7 |
function positionChange(x,y){ x=(x/$("#remoteVideo").width()-0.5)*2; y=(y/$("#remoteVideo").height()-0.5)*2; sendCameraNow(x,y); } |
na podstawie rozmiaru komponentu remotemeVideo wywołuje funkcje sendCameraNow z parametrami x,y ale tym razem x i y są z przedziału -1,1, czyli sendCameraNow (-1,-1) oznacza ze chcemy spojrzeć kamerą na skrajny róg sendCameraNow (0,0) wysrodkowanie kamery, itd
i funkcja sendCameraNow(x,y):
1 2 3 4 5 6 7 8 9 10 11 12 |
function sendCameraNow(x,y){ $("#output").html(x+" - "+y); var ret = new Uint8Array(5); var pos=0; pos=putByte(ret, pos ,1 ); pos=putShort(ret, pos ,568-x*312 ); pos=putShort(ret, pos ,506+y*237 ); remoteme.sendUserMessageByFasterChannel(servoPythonScriptDeviceId, ret); } |
na początku wyświetlamy pozycje kamery w naszym divie, ułatwi to debugowanie, potem tworzymy wiadomość będzie ona miała 5 bajtów długości:
- bajt pierwszy to 1 zeby skrypt pythonowy wiedział ze chcemy sterować pozycja kamery
- dwa kolejne bajty to pozycja kamery w osi X ( wysyłane jako dwu-bajtowy integer)
- i kolejne dwa bajty to pozycja kamery w osi Y ( również wysyłane jako dwu-bajtowy integer)
bazując na naszych obliczeniach pozycji kamery i wychyleń, do skryptu wysyłamy pozycje do wysterowania serw, porownajcie stałe:
1 2 |
pos=putShort(ret, pos ,568-x*312 ); pos=putShort(ret, pos ,506+y*237 ); |
z pozycjami i wychyleniami jakie obliczyliśmy wyżej, jak centrowaliśmy kamerę i ustawialiśmy jej maksymalne wychylenia
opis funkcji putShort i putBayte jak i innych które sie przydają tutaj
tak przygotowaną wiadomość wysyłamy do naszego skryptu pythonowego:
1 |
remoteme.sendUserMessageByFasterChannel(servoPythonScriptDeviceId, ret); |
opis obiektu remoteme tutaj
wszystkie zmiany jakie dokonaliśmy w pliku script.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function onMouseMove(event){ positionChange(event.x ,event.y); } function onTouchMove(event){ positionChange(event.touches[0].clientX , event.touches[0].clientY); } function positionChange(x,y){ x=(x/$("#remoteVideo").width()-0.5)*2; y=(y/$("#remoteVideo").height()-0.5)*2; sendCameraNow(x,y); } function sendCameraNow(x,y){ $("#output").html(x+" - "+y); var ret = new Uint8Array(5); var pos=0; pos=putByte(ret, pos ,1 ); pos=putShort(ret, pos ,568-x*312 ); pos=putShort(ret, pos ,506+y*237 ); remoteme.sendUserMessageByFasterChannel(servoPythonScriptDeviceId, ret); } |
sprawdzmy jak strona działa. index.html -> [open at new tab]
jak poruszamy myszką, albo palcem na komórce na górze zmienia się wysyłana pozycja kamery
Sama kamera sie nie rusza. Co gorsze nasz skrypt o deviceid10 sie rozłączył.
Dlaczego ? zmieniliśmy format wysyłanej wiadomości, i nasz skrypt pythonowy spodziewał się czegoś innego i rzucił błędem. Sprawdźmy logi
klik -> open
Mamy winowajce, zmieniliśmy format wiadomości i teraz wysyłamy wiadomość o rozmiarze 5 python spodziewał się długości 3 nie wiedział jak sobie poradzić i się wysypał.
zmodyfikujmy wiec skrypt pythonowy żeby poprawnie odbierał wiadomości:
python.py
funkcja która odbiera wiadomości jest taka:
1 2 3 4 5 6 |
def onUserMessage(senderDeviceId,data): global pwm data=struct.unpack('>Bh', data) print("on setting servo {} with value {}".format(data[0],data[1])) pwm.set_pwm(data[0], 0,data[1] ) |
1 |
data=struct.unpack('>Bh', data) |
do zmiennej data zapisujemy dwie wartości integerowe pierwsza jest jedno-bajtowa druga 2 bajtowa. Pamiętamy ze javascript wysyła wiadomości 5 bajtowe , 1 bajtowy integer i dwa dwa batjtowe integery, zczytajmy je:
1 |
data=struct.unpack('>Bhh', data) |
pierwszy bajt oznacza czym chcemy sterować na razie mamy tylko kamerkę i wtedy pierwszy bajt to 1 a następne dwie liczby do pozycja serw do wysterowania wiec po modyfikacji mamy:
1 2 3 4 5 6 7 8 |
def onUserMessage(senderDeviceId,data): global pwm data=struct.unpack('>Bhh', data) if data[0]==1: pwm.set_pwm(0, 0,data[1] ) pwm.set_pwm(1, 0,data[2] ) |
- data[0] – ==1 dla pozycji kamery
- data[1] – pozycja kamery w osi x
- data[2] – pozycja kamery w osi y
Jak nie pamiętajcie wróćcie do funkcji sendCameraNow w javascripcie.
zapisujemy zmienioną funkcje, program na Rpi się zresetuje.
gdy teraz otworzymy stronę do sterowania kamera
https://app.remoteme.org/wp/100/index.html
jak poruszamy myszką to zmienia się pozycja kamery. Ale jest jeden problem wysyłamy za dużo wiadomości naraz, bo za kazdym ruchem myszki wysyłamy wiadomość. Musimy to ograniczyć.
wracamy do index.html importujemy potrzebny plik z funkcjami:
1 |
<script src="https://cdn.rawgit.com/remoteme/webPageTemplates/master/base/operationTimer.js"></script> |
opis Klasy tutaj
a w script.js:
na samej górze:
1 |
var ot=new OperationTimer(150); |
150 oznacza – nie wysyłaj wiadmości częsciej niż co 150ms
Modfikujemy funkcje positionChange
1 2 3 4 5 6 7 |
function positionChange(x,y){ x=(x/$("#remoteVideo").width()-0.5)*2; y=(y/$("#remoteVideo").height()-0.5)*2; ot.execute(sendCameraNow,x,y); // tutaj modyfikacja } |
zapisujemy, i odświeżamy stronę z podglądem video. Teraz działa znakomicie :D. Na komórce też będzie działać super.
Świecenie diodą:
Ogólnie przez stronę javascript wyślemy wiadomość która ustawi pin na Rpi w stan niski lub wysoki, pin przez konwerter napięć wysteruje tranzystor mosfet, a ten załączy/ rozłączy diodę.
schemat połączeń:
Programowanie:
index.html
1 |
<body onKeyPress="diodeClick()"> |
jak wcisniemy na klawiaturze dowolny klawisz dioda sie zapali albo zgasnie.
1 |
<div class="diode" id="diode" onClick="diodeClick()"></div> |
komponent ktory pokazuje stan diody i umozliwia jej włączanie wyłączanie.
style.css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
.diode{ width: 100px; height: 100px; position: absolute; right: 0; top: 0px; margin: 10px; border-radius: 100px; cursor: pointer; border: 2px solid #ffc107; opacity:0.5; cursor: pointer; z-index: 100; } .diodeOn{ background-color: #ffc107; } |
komponent jest okrągły i ma zółte wypełnienie jak dioda jest włączona.
script.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function diodeClick(){ var nextState; if ($("#diode").hasClass("diodeOn")){ $("#diode").removeClass( "diodeOn" ); nextState=0; }else{ $("#diode").addClass( "diodeOn" ); nextState=1; } var ret = new Uint8Array(5); var pos=0; pos=putByte(ret, pos ,2 ); pos=putShort(ret, pos ,nextState ); remoteme.sendUserMessageByFasterChannel(servoPythonScriptDeviceId,ret); } |
i tą funkcje dodajemy.
tak samo jak pozycja kamery jest to 5 bajtowa wiadomość tym razem pierwszy bajt to 2, a następny dwubajtowy integer to 1 dla diody zapalonej i 0 gdy ma zgasnąć.
python.py
1 2 |
import RPi.GPIO as GPIO LED_PIN=19 |
importujemy biblioteke do obslugi wyjść. i definiujemy pod jakim pinem będziemy sterować diodą.
1 2 3 4 |
def setupPins(): GPIO.setmode(GPIO.BCM) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, GPIO.LOW) |
funckja do ustawień pinów.
wołana w głównym bloku programu
1 2 |
setupServo() setupPins() # o tutaj |
i zmodfykowana funkcja do odbioru wiadmości:
1 2 3 4 5 6 7 8 |
def onUserMessage(senderDeviceId,data): global pwm data=struct.unpack('>Bhh', data) if data[0]==1: pwm.set_pwm(0, 0,data[1] ) pwm.set_pwm(1, 0,data[2] ) elif data[0]==2: GPIO.output(LED_PIN, GPIO.HIGH if data[1] == 1 else GPIO.LOW) |
Gotowe :)
Wszystko działa jak to sobie zaplanowaliśmy :)
kompletne kody źródłowe tutaj
Mam nadzieje, że Kurs wam się spodobał, jeżeli coś jest niejasne piszcie w komentarzach.
Jak pisałem wyżej następnym projektem będzie sterowany samochód z użyciem kamerki z tego kursu ;)
Pozdrawiam,
Maciek
Piąteczka i główna :) Świetny projekt!
:) dzieki :)
Stosowanie rezystora 5W do diody w takim projekcie to nieporozumienie – proponowałbym użycie drivera stałoprądowego, np. PT4115 lub jakieś prostej przetwornicy step-down.
Dlaczego nieporozumienie serio pytam ?
Dlaczego diodę PowerLED zasilileś prądem mniejszym niż 20mA? Jeżeli to dioda 1W to zasilasz ją prądem 300-350mA w przypadku 3W 600-700mA. Trochę na partyzanta dorobiłeś to “doświetlenie”.
Skad Ci wyszlo, że zasililem ją prądem 20mA ?