SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

W dzisiejszym odcinku na temat Iteaduino Plus zajmiemy się interfejsem GPIO, który udostępnia 123 piny I/O. Większość pinów jest wielofunkcyjnych, oferując między innymi: I2C, SPI, UART, RGB/LVDS oraz CSI/TS. Na spodzie znajdziemy również 4 gniazda Grove oraz w pełni zgodny z Raspberry Pi interfejs.

Mapa pinów GPIO

Mapa pinów Grove oraz RaspberryPI

Jestem Arduino

System IteadOS pozwala na pisanie  programów w języku C /  C++, udostępniając dobrze znane funkcje z Arduino, takie jak: digitalRead, digitalWrite, analogWrite, delay itp. SDK umożliwia również z korzystania z szyn danych 8- i 16 bitowych.

Pełną listę funkcji można znaleźć w dokumentacji SDK 0.1b 20130823. My zaczniemy jednak klasycznie - od mrugania diodą LED, którą podłączyłem do pinu 59. Tworzymy sobie w edytorze plik o nazwie blink.c, do którego wpisujemy taki oto programik:

  1. #include <itead.h>
  2.  
  3. int main()
  4. {
  5.     pinMode(59,OUTPUT);
  6.  
  7.     while(1)
  8.     {
  9.         digitalWrite(59, HIGH);
  10.         delay(250);
  11.         digitalWrite(59, LOW);
  12.         delay(250);
  13.     }
  14. }

Kiedy mamy już nasz program, musimy go skompilować za pomocą polecenia iteadcompile:

# sudo iteadcompile blink blink.c

[/bash]

Jeśli wszystko przebiegnie prawidłowo, możemy przystąpić do uruchomienia programu wynikowego blink, a dioda powinna radośnie mrugać w odstępach 250ms.

  1. # sudo blink

Pojawia się pytanie - jak szybkie jest GPIO w Iteaduino Plus. Możemy zmierzyć czas, jaki jest potrzebny na wystawienie na wyjściu dwóch milionów przełączeń, pomiędzy stanem wysokim, a stanem niskim. Po krótkim teście można stwierdzić, że prędkość GPIO sięga jedynie do 967 kHZ, podczas gdy Raspberry Pi potrafi rozpędzić się do 4.7 MHz. Zakładam, że jest to problem optymalizacji biblioteki libiteadIO, która nie do końca została dopracowana w wersji beta systemu.

GPIO via Python

Do GPIO również mamy dostęp z poziomu Pythona, który również korzysta z biblioteki libiteadIO. Dzięki Pythonowi możliwe jest tworzenie aplikacji graficznych, które mają dostęp do interfejsu GPIO. Tutaj sprawdzimy działanie funkcji analogWrite, która posłuży nam jako PWM dla diody RGB.

  1. from ctypes import *
  2. from Tkinter import *
  3.  
  4. def pwm(ev=None):
  5.     clib.analogWrite(c_int(59), c_int(scale.get()))
  6.  
  7. clib = cdll.LoadLibrary("/usr/local/lib/libiteadIO.so")
  8.  
  9. root=Tk()
  10. scale = Scale(root, from_ = 0, to = 255, resolution = 1, orient = HORIZONTAL, command = pwm)
  11. scale.pack()
  12.  
  13. root.mainloop()

Po uruchmieniu otrzymujemy suwak, którym regulujemy wypełnienie PWM.

Tutaj pojawia się przeszkoda. PWM realizowane jest w sposób symulacji, poprzez dodanie wątka thread przez bibliotekę libiteadIO. Problem polega na tym, że biblioteka nie radzi sobie z więcej niż jednym pinem w trybie PWM, ponieważ wątki są nadpisywane :) Ale, że jest to wersja beta - wybaczam. Na szczęście, źródła biblioteki libiteadIO są ogólnie dostępne i z chęcią wcisnę z tego więcej możliwości. Póki co, aby wysterować np.: diodę RGB, musimy przygotować trzy skrypty :) każdy z własnym wątkiem symulacji PWM.

Jest to o tyle pocieszające, że nie jest to problem sprzętowy, a jedynie programowy, który można poprawić w przyszłości.


Sprzęt do testu dostarczył sklep
ArduinoSolutions.