sterowanie GPIO Raspberry Pi z poziomu przeglądarki internetowej (strony www)

Raspberry Pi posiada 8 dowolnie programowalnych linii I/O + UART (port szeregowy) + I2C + SPI (do wykorzystania również jako zwykłe piny IO). Wszystko (wraz z liniami zasilającymi oraz masy) wyprowadzone na złącze P1 (jest jeszcze kilka linii I/O na innych portach, ale o nich kiedy indziej + nie do wszystkich jest łatwy dostęp).

Ponieważ dostęp do w/w linii jest bezpośredni, to można (i jest nawet wskazane) podłączać różne urządzenia do tego portu, zaś sterowanie rozwiązać np.: poprzez stronę internetową.

Oczywiście dla wytrawnych programistów dostępnych jest cała gama języków programowania + biblioteki umożliwiające prosty dostęp do I/O. Zaś dla osób mniej obeznanych (oraz takich jak ja, czyli dopiero wchodzących w świat języków wysokiego poziomu) na początek zaleca się skorzystanie z gotowych lub pół-gotowych rozwiązań.

I tutaj przychodzi na ratunek WEBIOPI, czyli framework oraz aplikacja webowa pozwalająca na kontrolowanie liniami GPIO z poziomu przeglądarki internetowej.

Instalacja jest bardzo prosta. Konfiguracja również. Pozostaje tylko ustawienie własnego portu, na którym można apkę wypuścić na świat + przekierowanie na routerze i można się bawić.

Bardziej rozbudowany opis webiapi można znaleźć na stronie: http://pccode.pl/raspberry-pi-i-zestaw-duzego-masterkowicza/, gdzie jest przy okazji opis jak podłączyć diody LED poprzez układ ULN.

Pełen opis portów oraz przykłady kodów sterujących nimi dostępny jest tutaj: http://elinux.org/Rpi_Low-level_peripherals. Co ciekawe, przykładowe kody rozpisane są na języki (i powłokę) sh, C, Perl, C#, Ruby i Basic.

Kolejnym ciekawym rozwiązaniem jest podłączenie RPi i zarządzanie nim poprzez port szeregowy. Opis można znaleźć tutaj: http://elinux.org/Rpi_Low-level_peripherals. W sumie port RS można wykorzystać również w drugą stronę (i o ile nie mamy innego portu RS w domu), to przy pomocy tego z RPi odratować na przykład router, który po „update” przestał odpowiadać po protokole http.

RPi to nie tylko 3 w/w interfejsy. Wystarczy chwilę pokombinować i już mamy 1Wire, a na nim zegary RTC, pamięci eeprom, czujniki temperatury i inne gadżety od Dallas… tfu… Maxim Integrated. W projekcie: http://techfreak.pl/nettemp/ wykorzystanych zostało kilka czujników DS18B20, które nie wymagają kalibrowania i posiadają względnie dobrą dokładność.

Na koniec jeszcze opis kolegi Spychalskiego: http://www.spychalski.info/2013/01/12/obsluga-magistrali-i2c-raspberry-pi z manualem do obsługi magistrali I2C. Co prawda w projekcie wykorzystany jest jakiś przetwornik A/C, ale nic nie stoi na przeszkodzie, żeby podłączyć kilka PCF8574, który da nam n x 8 (każdy układ to expander i2c na 8bit) portów I/O dodatkowo.

Arduino pod Ubuntu i dostęp do portu szeregowego (RS) przez zwykłego użytkownika

Wydawałoby się, że dostęp do dowiązania portu szeregowego przez zwykłego użytkownika (nie root’a lub przy użyciu sudo) jest najbardziej oczywistym rozwiązaniem przy pracy z Arduino. Niestety na kilku różnych instancjach Ubuntu miałem z tym problem – na szczęście naprawa tego defektu jest szalenie prosta.

Na wielu forach dyskusyjnych można znaleźć pytania użytkowników odnośnie portu szeregowego w Arduino pod Ubuntu. Po pobieżnej lekturze okazuje się jednak, że społeczność przeważnie miewa problem z zupełnym brakiem dowiązania do portu, co jest zupełnie odrębnym problemem.

Na stronie: http://blog.markloiseau.com/2012/05/install-arduino-ubuntu/ znalazłem arcy-proste rozwiązanie:

I added my user to the dialout group with the command  sudo usermod -a -G dialout mark . Usually, that would have fixed it but iserial port was still grayed out.

Changing the permissions on /dev/ttyACM0 to world readable and writeable fixed the grayed out serial port. I ran  sudo chmod a+rw /dev/ttyACM0 and the serial port menu worked again.

U mnie drugie rozwiązanie zawsze skutkuje sukcesem i umożliwia dalszą zabawę z zestawem.

Miłego programowania:)

lutowanie lpc2103 w obudowie qfp48 z rastrem 0,5mm (i specyfikacja ARMa)

Przy okazji jakiegoś zamówienia na części elektroniczne postanowiłem spróbować przygody z mikrokontrolerem opartym o rdzeń ARM7 – padło na jeden z podstawowych modeli, czyli LPC2103. W sumie zamawiając nie zwróciłem uwagi na obudowę i to był mój dość duży błąd – lekko się przeraziłem widząc scalak SMD z rastrem nóżek 0,5mm. Na pająka nie było szans. Poszukałem w sieci i znalazłem jedną firmę z dostępnymi płytkami do zrobienia przelotki na goldpiny.

Firmy chwalić nie będę, bo mają super nieintuicyjny sklep – jak ktoś bardzo chce, to proszę o kontakt PW.

Zamówiłem płytki, po kilku dniach przyjechały, a po kolejnych 2-3 tygodniach zabrałem się do lutowania. Użyłem grotu do lutownicy (Elwik) o wyjściowej średnicy końcówki 0,4mm (jednak lekko zużyty, co dawało około 0,6-0,7mm), spoiwa lutowniczego (cyny) o grubości 0,25mm. Próbowałem każdą nóżkę osobno przylutować, ale nawet szkło powiększające wysiadało. Przejechałem więc większą ilością cyny po wszystkich nóżkach, a następnie odessałem nadmiar narzędziem. Następnie sprawdziłem miernikiem czy nóżki obok siebie nie są zwarte (wymagało 3 poprawek) i czy wszystkie nóżki łączą się z polem lutowniczym goldpinu (wymagało dwóch poprawek).

Niedługo będę podpinać ARMa do większego układu – zobaczymy jak działa:)

Specyfikacja LPC2103:

– 32-bitowy rdzeń ARM7
– 32kB pamięci Flash programowanej ISP (do 100k zapisów)
– 8kB pamięci RAM
– 8 wejść przetwornika AC (10 bitów)
– wbudowany zegar RTC
– 2 timery/liczniki 16 bitowe i 32 bitowe (z PWM na każdym z czterech timerów)
– 2 UARTy (pełne!)
– 2 osobne interfejsy I2C (fast I2C)
– SPI i SPP
– 32 piny I/O z tolerancją 5V (3,3V)
– wbudowany zegar RTC
– programowanie ISP/IAP przez oprogramowanie bootloadera
– maksymalne taktowanie rdzenia 70MHz poprzez wewnętrzną pętlę PLL (zewnętrzne taktowanie 10-25MHz) / wbudowany wewnętrzny oscylator z programowanym zegarem 1-25MHz

Rdzeń układu to ARM7-TDMI (ARM7-Thumb+Debug+Multiplier+ICE) – 32-bitowy porocesor oparty na architekturze RISC (ARM). Obsługuje jednocześnie 3 potoki, co daje (piszę z głowy) w okolicy 160-170MIPSów przy pełnym wysterowaniu. Zobaczymy za jakiś czas jak się sprawuje, choć nie sądzę, żebym wymyślił sposób na pełne obciążenie (nie będę uruchamiał na nim dedykowanego systemu operacyjnego, raczej sam będę pisać kod). Na takim procku liczenie FFT to czysta przyjemność.

cube3d_led – rozwiązania elektroniki

Skoro już piszę tego bloga, to może warto też popisać o tematach wokół samej elektroniki, a nie tylko arduino.

Zanim zacząłem projekt CUBE3D_LED zacząłem się zastanawiać nad tym, w jaki sposób skonstruuję elektronikę. Niby koncepcję mam już opracowaną, ale gdzieś tam z tyłu głowy jeszcze tlą się nowe pomysły. Zrobiłem research w sieci i znalazłem kilka ciekawych rzeczy. Poniżej pokrótce postaram się je opisać.

Multipleksowanie portu z zatrzaskami 74HC574:

Rozwiązanie polega na tym, że wykorzystuje się 20 linii sygnałowych mikroprocesora. 8 obsługuje dane wyprowadzane do zatrzasków, 1 złącze OE zatrzasków i 3 na demultiplekser 74HC138 do adresowania poszczególnych zatrzasków. Kolejne 8 do sterowania tranzystorami poszczególnych „pięter” diod w CUBE.

Więcej na temat tego rozwiązania można znaleźć tutaj: http://www.instructables.com/id/Led-Cube-8x8x8/?ALLSTEPS

Podobne rozwiązanie BORG3D: http://www.das-labor.org/wiki/Borg3d

Dedykowany driver LEDowy CAT4016 i STP16CP:

Nie zagłębiałem się za bardzo w to rozwiązanie, gdyż po pierwsze nie mogłem znaleźć układu CAT4016 oraz STP16CP w polskiej dystrybucji, a po drugie jest to sterowanie szeregowe, do którego nie mam przekonania.

Więcej możecie poczytać tutaj (o CAT4016): http://picprojects.org.uk/projects/lc/

Również tutaj (o STP16CP): http://www.hownottoengineer.com/index.php?option=com_content&view=article&id=70&Itemid=77

Wykorzystanie dekoderów 3to8 (74HCT238):

Dość specyficzne, ale pewnie i skuteczne rozwiązanie (wg wymaga dość szybkiego multipleksowania) oparte na układach 74HCT238. Dla mniejszych kostek na pewno oszczędzające porty mikrokontrolera.

Więcej na: http://courses.cit.cornell.edu/ee476/FinalProjects/s2008/pae26_rwc28/pae26_rwc28/index.html

Sterowanie poprzez rejestr przesuwny (w pełni szeregowe) oparte na 74HCT595:

Jak w poniższym przykładzie umożliwia sterowanie całkiem dużą ilością diod, ale przy wykorzystaniu Xilinx Spartan-3.

Więcej na: http://no8hacks.com/blog/2011/7/11/3d-led-cube

Wykorzystanie driverów TLC5940:

Też dość ciekawy projekt na układach TI – przy budowie kostki RGB na pewno się nimi zainteresuję ze względu na PWM, które supportuje.

Więcej tutaj: http://vespine.com/p/8x8x8-rgb-led-cube.html

 

Mój projekt prawdopodobnie oparty będzie na 74HC574 – jeszcze myślę:)

cube 3d led – dzień 2 (lutowanie drugiej warstwy diod) + estymacja czasu projektu

Projekt cube3d_led to chyba jeden z najbardziej pracochłonnych projektów w mojej karierze elektronika-amatora (choć i technika elektroniki). Zbudowanie jednej warstwy to około 2-3h pracy. Połączenie pierwszej warstwy do uniwersalnych płytek drukowanych (zlutowanych ze sobą), to około 2h. Przy drugim podejściu udało mi się przylutować do płytek pierwszą warstwę, polutować drugą warstwę, przylutować drugą warstwę do pierwszej. Wyszło nawet równo. Łącznie zajęło mi to ponad 5h. A to dopiero 1/4 lutowania samego cube. Nie mówiąc o całej elektronice i programowaniu.

Szacunki dla całego projektu:

polutowanie pozostałych 6-ciu warstw i połączenie ich razem: 20-25h
zaprojektowanie elektroniki sterującej: 5-10h
polutowanie elektroniki sterującej: 10-15h
programowanie podstawowe (core programu): 10h
programowanie obsługi algorytmów: 20-30h
programowanie interface (lan, ired): 10h
programowanie i tworzenie algorytmów: 10-30h
stworzenie obudowy: 10h

suma minimum: 95h
suma maksimum: 130h

Licząc maksymalnie 5h tygodniowo (a pewnie wyjdzie połowa, bo nie każdy tydzień poświęcam na zabawę), to wychodzi  20-40 tygodni. Oj – aż mi się słabo zrobiło:) Ale coś za coś – nie jestem w stanie więcej czasu na niego poświęcać – szczególnie, gdy robię kilka projektów naraz.

Zdjęcia z drugiego dnia lutowania:

[nggallery id=5]

1/4 stolika matrix-led by IKEA sklejona

Jednym z projektów, do których chcę podpiąć arduino jest stół led, a dokładnie matryca 64×64 diody led wmontowana w stolik z IKEA – tego typu: http://www.ikea.com/pl/pl/catalog/products/80104268/#/80193735. To czy uda się na arduino zależy od wydajności. Do wysterowania będzie 4096 diod LED (nie liczyłem wymaganych czasów/częstotliwości jeszcze). W razie czego będę kombinował z 2-3 AVRami lub pojedynczymi AMR7.

Stolik ma blat o długości boku wynoszącym 55cm, zaś matrix_led będzie w okolicy 50cm. Ponieważ w stoliku blat jest w środku pusty, to w górnej powierzchni wytnę otwór umożliwiający osadzenie matrix_led i całość przykryję matowioną szybą. Dzięki temu będzie można napić się  kawy na stoliku, który wyświetli nam grafikę w rozdzielczośc 64 x 64 px. Ewentualnie można zdemontować nogi, a całość powiesić na ścianie.

Poniżej znajdują się zdjęcia montowania 1/4 wyświetlaczy led (czerwone). Cała konstrukcja będzie się składać z 4 identycznych bloków sklejonych w kwadrat.

[nggallery id=3]

narzędzia (kilka kabelków) też trzeba mieć

W wolnej chwili postanowiłem zmontować trochę kabelków, które niewątpliwie przy uruchamianiu mi się przydadzą. Ponieważ jakiś czas temu zaopatrzyłem się w uniwersalne płytki stykowe, to i dokupiłem do nich odpowiednie przewody. Problem jednak miałem z tymi (płytkami), które kiedyś sam robiłem „starą” metodą, czyli z goldpinami. Ten sam problem pojawił się przy wyświetlaczach LCD mających złącze goldpinowe (część dwurzędowe, część jednorzędowe). Skoro włączyłem lutownicę i wyjąłem wszystkie akcesoria, to zmontowałem z lekkim zapasem różne kombinacje. W zasadzie na zdjęciach wszystko widać.

Ale nie samymi kabelkami człowiek żyje. Gdy lutowanie tego samego zestawu: kabelek-złączka stawało się usypiające, to przepinałem się na arduino i IDE. Pod ręką miałem kilka DS18B20 (laserowo kalibrowany cyfrowy czujnik temperatury na magistralę 1Wire). Podłączyłem, trochę poprogramowałem i… wszystko działało.

Z ciekawszych komend:

LiquidCrystal lcd(5, 6, 7, 9, 10, 11, 12); – konfiguracja podłączenia LCD

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS); – definicja i konfiguracja interfejsu 1Wire

cała reszta to proste funkcje i instrukcje, żeby śmigało. Program przy okazji napisałem tak, że jednocześnie śle info na LCD (temperatura w st. C) i RS232 (temperatura w st. C i F, info o ilości czujników oraz ich adresach 1Wire). Jakby ktoś bardzo chciał, to mogę udostępnić kod – jest tak paskudny, że publicznie raczej pokazywać go nie chcę:)

[nggallery id=2]

cube 3d led – dzień 1 (lutowanie pierwszej warstwy diod)

Pierwszy dzień pracy nad cube3d_led minął na przygotowaniu szablonu dla LEDów oraz zlutowaniu pierwszej warstwy. Pierwszą koncepcją było kupienie szerokiej deski i wywiercenie 64 otworów, jednak udało mi się znaleźć na składzie (domowym) deskę węższą i wygrała opcja 4×8 (która wymaga lutowania dwóch bloków na warstwę i łączenia ich razem).

Poniżej załączam zdjęcia z prac, a przy nich opisy.

Wyjaśnienia wymaga tylko kilka pierwszych zdjęć, gdzie zrobiłem wiercenie w desce 7×4 (zapomniałem o jednym rzędzie). Na ostatnich zdjęciach widać już uzupełnione przeoczenie.

[nggallery id=1]

projekt „arduino w domu”

Chyba mogę powiedzieć, że jestem fanboyem platformy arduino. Jasne, ma wiele mankamentów – jednak do prostej zabawy w zupełności wystarcza. Szczególnie, gdy ktoś ma uczulenie na lutownicę i nie chce wiedzieć jaki oscylator dobrać do swojego AVRa, żeby współgrał idealnie z portem RS232.

Oczywiście jestem szczęśliwym posiadaczem odpowiedniego zestawu (mega2560 – o czym wkrótce napiszę) i wymyślam kolejne zastosowania. Pierwsze dwa to: cube3d led oraz stolik z matrycą led.

Produkcja tego pierwszego trwa – oto przykład takiego rozwiązania zilustrowany na filmiku (nie mój projekt):

Stół z matrycą LED działać ma mniej więcej tak na filmie (na razie czeka w kolejce – strasznie dużo lutowania). Z tym, że moja ma mieć 64 takie moduły, czyli rozdzielczość 64×64 diody. W cube3d_led jest do wysterowania 512 ledów, w stole 4096 – będzie co robić: