4. R2D2 z Raspberry Pi na pokładzie
● Rozpoznawanie mowy (Angielski, Chiński)
● Rozpoznawanie twarzy
● Wykrywanie ruchu
● Ultradźwiękowy czujnik odległości
● Nagrywanie i odtwarzanie wiadomości audio
http://www.youtube.com/watch?v=znuUm5vbSpI
5. Dlaczego Python?
➔ Prościej i łatwiej
➔ Unikamy programowania w C, albo ASM
➔ Nie jesteśmy uzależnieni od jednego specyficznego
SDK/IDE (np. takiego pod Windows 98)
➔ Większa przenośność kodu, niezależność od systemu
operacyjnego
9. Kontrolery
Raspberry Pi
● Komputer na małej płytce
● GPIO (3.3V) obsługiwane z
poziomu Linuksa uruchomionego
na Raspberry
● Silne wsparcie dla Pythona
● Wiele płytek rozszerzających
(Gertboard, PiFace) również
wspiera Pythona
● Dość duża społeczność
10. Kontrolery
Arduino
● Liczne złącza GPIO i wiele płytek
rozszerzających
● Duża popularność i duża
społeczność (sporo kodu)
● Programowalny głównie w C
● Python (PyFirmata, pyserial)
pozwala „tylko” na komunikację z
mikrokontrolerem na Arduino
15. Gdzie to kupić?
● http://kamami.pl
● http://nettigo.pl
● http://sklep.avt.pl/
● Allegro, ebay i wiele sklepów z elektroniką
● https://www.sparkfun.com
● https://www.adafruit.com
● http://dx.com
16. Hello world – miganie diodą LED
import pymcu
mb = pymcu.mcuModule()
for x in range(1,25):
mb.pinHigh(1)
mb.pausems(500)
mb.pinLow(1)
mb.pausems(500)
17. Odczyt wartości z sensorów
import pymcu
mb = pymcu.mcuModule()
while True:
print mb.analogRead(1)
18. Odczyt wartości z sensorów
Ultradźwiękowy „miernik” odległości
● Impuls na pinie Trig wyzwala serię impulsów ultradźwiękowych
● Pin Echo przejdzie w stan wysoki (1) gdy będzie odbierał odbity sygnał z tych
impulsów
● Czas trwania stanu wysokiego pozwala wyliczyć odległość do przeszkody
19. ..
mb.digitalState(2, 'input') # Echo
mb.pinHigh(1) # Trig
mb.pauseus(10)
mb.pinLow(1)
response_start = None
response_end = None
for i in range(0, 500):
ret = mb.digitalRead(2)
if ret == 1:
end = datetime.now()
response_end = end
if not response_start:
response_start = end
if response_end and response_start:
echo_delta = response_end - response_start
delta = echo_delta.total_seconds()
print (delta * 340) / 2, ' m'
else:
print 'no echo captured'
20. Przerwania (interrupts)
● Pozwalają oczekiwać na zdarzenia (event) zmiany stanu pinu
● Znacznie bardziej wydajne niż ciągłe sprawdzanie jego stanu
● Obsługiwane m.in. w Raspberry Pi (Rpi.GPIO w wersji 0.5.2
lub nowszej)
GPIO.add_event_detect(24, GPIO.RISING,
callback=my_callback)
http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-3
http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-2
http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio
21. I2C oraz SPI
● Interfejsy do komunikowania się pomiędzy urządzeniami
● Stosowane w bardziej złożonych układach, płytkach
● Urządzenie dostępne jest pod określonym adresem, z którego
można czytać lub do którego można pisać dane.
● Potrzebna jest dokładna dokumentacja opisująca interfejs (co i
jak pisać albo odczytywać)
● Arduino, a także Raspberry mają zazwyczaj gotowe biblioteki
dla wielu urządzeń (np.. LiquidCrystal dla LCD)
23. Komunikacja szeregowa
● Adapter USB-UART tworzy wirtualny port szeregowy na
komputerze
● Moduł pyserial pozwala pisać i czytać z takiego portu
● Zazwyczaj powinno być to prostsze niż I2C/SPI
● Mogą być wbudowane w niektóre urządzenia USB
● Dostępne są też same adaptery – używane zazwyczaj do
komunikacji komputer-mikrokontroler
24. USB
● https:// github.com/walac/pyusb
● Jeżeli dobrze znamy urządzenie USB i sam protokół to
możemy przejąć nad nim kontrolę poprzez pyusb
● Można to np. zrobić z wyrzutniami rakiet na USB :)
25. COM, .NET i MS Windows
import win32com.client
tel = win32com.client.Dispatch("Celestron.Telescope")
if tel.Connected:
print " ->Telescope was already connected"
else:
tel.Connected = True
if tel.Connected:
print " Connected to telescope now"
else:
print " Unable to connect to telescope, expect exception"
tel.Tracking = True
tel.SlewToCoordinates(12.34, 86.7)
tel.Connected = False
import clr
clr.AddReference("ASCOM.DriverAccess.dll")
from ASCOM.DriverAccess import *
a = Telescope('Celestron.Telescope')
a.Connected = True
a.SlewToCoordinates(11.11, 11.11)
a.TrackingRate = 0
a.Tracking = True
a.Connected = False
28. SparkFun SerIO
● Obsługa urządzeń podłączonych do pinów analogowych i cyfrowych
poprzez port szeregowy z poziomu komputera
● W przypadku Pythona potrzebny jest tylko PySerial i dokumentacja
SerIO
https://www.sparkfun.com/products/9521
29. SparkFun SerIO
https://www.sparkfun.com/products/9521
mySerial = serial.Serial(8, 57600, serial.EIGHTBITS,
serial.PARITY_NONE, serial.STOPBITS_ONE, 5);
#Wait for the 'Ready' response from the SerIO
response = mySerial.readline();
#Send SerIO command to turn off the command echo
size = mySerial.write("E,0r");
time.sleep(0.1);
#Configure pin D2 as an output
mySerial.write("C,2,1r");
response = mySerial.readline();
30. Phidgets
http://www.phidgets.com
● Płyty-kontrolery i liczne płytki dodatkowe (sensory, motory, przełączniki)
● Wysokopoziomowe API dla Pythona jaki dla... Android Java, Applescript, C/C++,
C#, Cocoa, Delphi, Flash AS3, Java, LabVIEW, MATLAB, Max/MSP, Ruby, Visual Basic.NET, Visual
Basic 6.0, Visual Basic for Applications, Visual Basic Script, and Visual C/C++/Borland.NET.
32. mbed
● Platforma prototypowania dla układów z mikrokontrolerami ARM
● Posiada wsparcie dla Pythona (ale nie „pierwszoplanowe”)
● http://mbed.org/cookbook/Interfacing-with-Python
● Programowalny przez webowy interfejs i przerzucanie gotowych plików