Praktyczne eksperymenty z Raspberry...

22
1 Praktyczne eksperymenty z Raspberry Pi Jerzy Witkowski Na prawach rękopisu WROCLAW wrzesień 2014

Transcript of Praktyczne eksperymenty z Raspberry...

1

Praktyczne eksperymenty z Raspberry Pi

Jerzy Witkowski

Na prawach r ękopisu

WROCŁAW wrzesie ń 2014

2

Spis treści 1 Przedmiot ........................................................................................................................................ 4

2 Konfiguracja systemu ...................................................................................................................... 4

3 Podłączenie Raspberry Pi do Internetu ........................................................................................... 4

3.1 Połączenie kablowe. ................................................................................................................ 4

3.2 Instalacja połączenia WiFi z modułem EDUP. ......................................................................... 4

3.3 Instalacja połączenia WiFi z modułem TP-WN725N................................................................ 5

3.4 Statyczny adres IP na łączu WiFi .............................................................................................. 6

3.5 Połączenie z udostępnianiem Internetu poprzez komputer z systemem Windows ............... 7

3.6 Udostępnienie Internetu z komputera/laptopa przez stworzenie punktu dostępu. .............. 9

4 Praca zdalna z modułem Raspberry ................................................................................................ 9

5 Serwer w języku PYTHON ................................................................................................................ 9

6 Autologowanie .............................................................................................................................. 12

7 Autostart programu Python. ......................................................................................................... 12

8 Podłączanie urządzeń peryferyjnych ............................................................................................. 12

8.1 Obsługa wejść wyjść cyfrowych............................................................................................. 14

8.2 Uruchamianie I2C na Raspberry Pi ........................................................................................ 15

8.2.1 Funkcje SMBus (System Management Bus) – ............................................................... 16

8.3 Uruchamianie RS232 na Raspberry Pi ................................................................................... 17

9 Praca z modułem BlueTooth i obsługą SSP (opis zaczerpnięto z http://www.fritz-

hut.com/2012/09/14/raspberrypi-bluetooth-with-bluesmirf/ ). ......................................................... 20

10 Klonowanie systemu ................................................................................................................. 21

11 Uwagi inne ................................................................................................................................. 22

12 Literatura: .................................................................................................................................. 22

3

Spis ilustracji:

Rys. 1. Ustawienia karty sieciowej połączenia lokalnego komputera udostepniającego połączenie

internetowe. ............................................................................................................................................ 8

Rys. 2. Właściwości karty połączenia internetowego. ............................................................................. 8

Rys. 3.Aplikacja połączenia zdalnego Windows 7. .................................................................................. 9

Rys. 4. Skrypt prostego serwera w języku Python. ................................................................................ 10

Rys. 5. Działanie serwera w przeglądarce Midori uruchomionej lokalnie na RPi.................................. 11

Rys. 6. Działanie serwera na przeglądarce IE na komputerze zdalnym................................................. 11

Rys. 7. Opis złącza sygnałów cyfrowych RPi. ......................................................................................... 13

Rys. 8. Odpowiedź Rpi na komendę „sudo i2cdetect -y 1”, gdy do linii I2C podłączono urządzenie o

adresie 0x68 (7 bitów) = 0xC0 (8 bitów) oraz 0x77 (7 bitów) = 0xEE (8 bitów)..................................... 16

Rys. 9.Lista dostępnych portów szeregowych (fizyczny port szeregowy dostępny na złączu to

ttyAMA0). .............................................................................................................................................. 19

Rys. 10. Lista dostępnych portów szeregowych (fizyczny port szeregowy dostępny na złącz to

ttyAMA0 i nowy port ttyUSB0). ............................................................................................................. 19

Rys. 11. Widok programu Win32diskimager. ........................................................................................ 22

4

1 Przedmiot

W opracowaniu zebrano podstawowe wskazówki pozwalające wykorzystać moduł Raspberry Pi, jako

układ kontrolno-pomiarowy. Opisano czynności które pozwalają wykorzystać podstawowe peryferia ,

jak interfejsy RS232, I2C itp., oraz uruchomić serwer www prezentujący dane pomiarowe.

Do eksperymentów zastosowano moduł Rspberry Pi, model B, wersja 2 z systemem RASPBIAN

(wersja 3.6.11+ #538) dostarczone przez firmę KAMAMI.

Wszystkie informacje zawarte w tym opracowaniu pochodzą z Internetu, przy czym, opisano

wyłącznie procedury praktycznie sprawdzone w czasie eksperymentów.

2 Konfiguracja systemu Po pierwszym załączeniu układu pokazuj się menu z konfiguracją. Później do konfiguracji możemy

wchodzić używając komendy sudo raspi-config.

Wykonano następujące zmiany:

• Udostępnienie całej karty do wykorzystania przez system (pozycja: Expand Filesystem),

• Zmienioino hasło na bardziej wygodne (pozycja: Change User Password),

• Umożliwiono bezpośrednie logowanie (jak kto lubi ?) do środowiska graficznego (pozycja:

Enable Boot to Desktop…). - inną możliwość opisano jest w rozdz.6

• Zmieniono klawiaturę, czas, polskie znaki (pozycja: Internationalisation…):

o Czas - Europe/Warsaw,

o Język – dodano te zaczynające się z „pl”, ale zostawić domyślny „en”,

o Klawiatura – zostawiono „Generic….”, ale zmieniono „English(UK)” na „English (US)”;

(istotne jest, aby klawisze 2,3 miały @,#, bo najczęściej posiadają „brytyjski funt” i „już

nie pamiętam co?”)

3 Podłączenie Raspberry Pi do Internetu

3.1 Połączenie kablowe.

Po połączeniu komputera Raspberry Pi za pomocą kabla sieciowego do prawidłowo

skonfigurowanego routera z dynamicznym przydzielaniem adresów IP (dhcp) połączenie internetowe

powinno działać bez problemów.

3.2 Instalacja połączenia WiFi z modułem EDUP.

Drivery tego modułu firmy EDUP typu EP-N8508 opartego o układ Realtek RTL8192C, są

zainstalowane w systemie RASBIAN (przynajmniej w wersji – 3.6.11+ #538). RPi wykrył to urządzenie

bez konieczności jakichkolwiek interwencji.

5

3.3 Instalacja połączenia WiFi z modułem TP-WN725N

W powszechnym użyciu w modułach Raspberry Pi wykorzystuje się również karty Wi-Fi typu TP-

WN725N. Jej zainstalowanie wymaga ingerencji w oprogramowanie.

Pierwszym krokiem jest zainstalowanie sterownika karty w systemie Raspberry. Ponieważ wersja

sterownika zależy od wersji zainstalowanego systemu, należy ją sprawdzić za pomocą polecenia:

sudo uname –a

Przykładowa odpowiedź wygląda tak:

linux raspberry 3.6.11+ #538 PREEMPT Fri Aug 30……………….

W odpowiedzi tej istotny jest numer 3.6.11+ #538. W Internecie można znaleźć odpowiednie

sterowniki dla konkretnych wersji. Na przykład:

3.6.11+ #538, #541, #545, #551 oraz #557 8188eu-20130830.tar.gz

3.6.11+ #524, #528 lub #532 8188eu-20130815.tar.gz

3.6.11+ #371 do #520 8188eu-20130209.tar.gz

Należy teraz wykonać następujące komendy z odpowiednim numerem sterownika (komputer

Raspberry powinien mieć połączenie z Internetem np. połączenie kablowe):

wget https://dl.dropboxusercontent.com/u/80256631/8188eu-201300830.tar.gz

#ładuje sterownik

tar -zxvf 8188eu-20130209.tar.gz

#rozpakowujemy sterownik

sudo install -p -m 644 8188eu.ko /lib/modules/3.6.11+/kernel/drivers/net/wireless

#instalujemy sterownik

sudo depmod –a

#uaktualniamy jądro

sudo modprobe 8188eu

#ładujemy sterownik

W przypadku autora wersja ta nie zadziałała, ale z publikacji internetowych wiadomo, że w wielu

przypadkach taki sposób instalacji jest skuteczny. W przypadku naszego eksperymentu konieczne

okazało się skopiowanie z Internetu (http://www.mendrugox.net/2013/08/tp-link-tl-wn725n-v2-

working-on-raspberry-raspbian/) innego sterownika w wersji skompilowanej i rozpakowanej. Po

skopiowaniu go za pomocą „file managera” systemu Raspberry do katalogu:

/lib/modules/3.6.11+/kernel/drivers/net/wireless

oraz wykonaniu powtórnie komend:

sudo depmod –a

sudo modprobe 8188eu

połączenie internetowe udało się nawiązać. W poprzednim przykładzie po połączeniu radiowym nie

udawało się uzyskać z routera (Edimax) adresu IP.

6

3.4 Statyczny adres IP na łączu WiFi

Czasem istotne jest, by połączenie WiFi miało stały numer IP. W tym celu należy edytować zbiór:

sudo nano /etc/network/interfaces

linia

iface default inet dhcp

powinna być zastąpiona liniami (przykład):

iface default inet static

address 192.168.1.102

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

gateway 192.168.1.1

Parametry potrzebne do wpisania można uzyskać stosując komendy

netstat –nr

oraz

ifconfig

Oczywiście wpisany adres IP powinien być nie taki jak podają wyniki powyższych komend. Zanim

edytujemy zbiór interfaces będzie wyświetlany numer IP nadany dynamicznie. Do zbioru interfaces

należy wpisać numer wybrany z zakresu statycznego naszego routera.

W celu automatycznego połączenia z siecią bezprzewodową moduł Raspberry musi znać parametry sieci. Można je podać modyfikując zbiór:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Opcja network powinna przykładowo wyglądać tak:

network={

ssid=”nazwa sieci”

scan_ssid=0 #1 dla sieci bez rozgłaszania ssid

psk=”haslo do sieci”

proto=WPA # RSN dla WPA2

key_mgmt=WPA-PSK # lub WPA-EAP

pairwise=TKIP #dla WPA1 lub CCMP dla WPA2

auth_alg=OPEN #dla WPA i WPA2 lub SHARED&LEAP dla pozostałych

}

Wpisów tego typu może być kilka, jeśli będziemy łączyć się z kilkoma sieciami. Innym sposobem edycji tego zbioru jest włączenie trybu graficznego (startx) i posłużenie się programem WiFi_conf, gdzie można wpisać parametry dostępnych sieci.

7

3.5 Połączenie z udostępnianiem Internetu poprzez komputer z systemem Windows

W celu udostepnienia Internetu z komputera pracującego w systemie Winows należy edytować, jak

poprzednio zbiór /etc/network/interfaces za pomocą komendy:

sudo nano /etc/network/interfaces

W zbiorze tym linię:

iface eth0 inet dhcp

należy zastąpić następującymi liniami (Uwaga ważne: w linach address do gateway pierwszym znakiem jest znak tabulacji):

iface eth0 inet static

address 10.0.0.20

netmask 255.255.255.0

network 10.0.0.0

broadcast 10.0.0.255

gateway 10.0.0.10

W powyższym przykładzie stworzono sieć o arbitralnie przyjętych adresach. Mogą one być oczywiście inne. Uwaga: zauważono, że po załączeniu kabla i ustanowieniu połączenia istniejące połączenie WiFi jest przerywane. ?????

W następnej kolejności należy edytować (lub utworzyć) zbiór /etc/resolv.conf. Po jego otwarciu:

sudo nano /etc/resolv.conf

Należy usunąć wszystkie linie i wpisać adres IP DNS’ów na przykład (jeden wiersz wystarczy; to są DNS’y Googla):

nameserver 8.8.8.8

nameserver 8.8.4.4

Jeśli pracujemy przez router można dodać DNS w nim zapisane. Po tych czynnościach można zrestartować komputer:

sudo reboot

W systemie Widdows należy dojść do karty sieciowej połączenia lokalnego (karty kablowej) i we

właściwościach protokołu IP4 należy ustawić parametry jak na Rys. 1 (numery DNS mogą być inne

byle działały).

8

Rys. 1. Ustawienia karty sieciowej połączenia lokalnego komputera udostepniającego połączenie

internetowe.

Następnie należy przejść do właściwości karty, przez którą nasz komputer PC (laptop) łączy się z

Internetem. Należy zaznaczyć opcje udostępniania i interfejs (kartę), przez którą to udostępnianie

ma przebiegać (w przykładzie na Rys. 2 jest to Połączenie lokalne 2 – właściwości tej karty

pokazano na Rys. 1)

Rys. 2. Właściwości karty połączenia internetowego.

9

3.6 Udostępnienie Internetu z komputera/laptopa przez stworzenie punktu dostępu.

Tego zagadnienia nie sprawdzono praktycznie, ale można go znaleźć np. w

http://www.connectify.me/

4 Praca zdalna z modułem Raspberry

Do pracy z systemem Raspberry potrzebne są dodatkowe klawiatura i mysz. Aby tego uniknąć można

stosować połączenie konsoli (nie wykorzystamy programowo portu szeregowego) lub zdalnego

połączenia sieciowego.

Jedna z możliwości jest zainstalowanie programu XRDR (oczywiście Raspberry musi mieć połączenie

do Internetu):

sudo apt-get install xrdp

Po instalacji i zresetowaniu (sudo reboot) można pracować zdalnie z komputera PC lub laptopa. Nasz

komputer musi być w tej samej sieci, co Raspberry. Można wykorzystać połączenie lokalne opisane w

rozdziale 3.5 lub połączenie WiFi opisane w rozdziale 3.2.

Przykładowo w systemie Windows należy przejść do > Wszystkie programy > Akcesoria > Połączenie

Pulpitu Zdalnego oraz wprowadzić numer IP Raspberry (Rys. 3). W przypadku opisu z rozdziału 3.1

będzie to 10.0.0.20, w przypadku rozdziału 3.4 – 192.168.1.102 (numer statyczny) lub z routera

odczytać nadany dynamicznie numer IP.

W przypadku zwykłego połączenia kablowego z routerem (rozdział 4.1) trzeba skonfigurować

statyczny adres IP podobnie jak w rozdz. 3.1/3.4 dla WiFi lub znaleźć numer nadany dynamicznie.

Rys. 3.Aplikacja połączenia zdalnego Windows 7.

5 Serwer w języku PYTHON

Serwer sieciowy na komputerze RPi uruchomiono posługując się biblioteką Flask o dużych

możliwościach aplikacyjnych. Wcześniej zainstalowano narzędzie instalacyjne pip:

sudo apt-get install python-pip

i następnie bibliotekę Flask:

10

sudo pip install flask

Z poziomu IDE Pythona napisany został skrypt (Rys. 4) zawierający kod wyświetlanej strony w języku

HTLM odświeżanej, co około 5 sekund i podającej czas systemowy.

Poprawność pracy serwera można śledzić lokalnie na RPi podając adres 0.0.0.0 (jak w skrypcie

Python, domyślny adres RPi 127.0.0.1 lub adres RPi w sieci lokalnej - Rys. 5). Z poziomu komputera

zdalnego działa oczywiści tylko adres sieci lokalnej - Rys. 6.

Rys. 4. Skrypt prostego serwera w języku Python.

11

Rys. 5. Działanie serwera w przeglądarce Midori uruchomionej lokalnie na RPi.

Rys. 6. Działanie serwera na przeglądarce IE na komputerze zdalnym.

Wed Mar 12 14:53:55 2014

Wed Mar 12 13:33:33 2014

Wed Mar 12 12:50:03 2014

Wed Mar 12 15 :37:42 2014

12

6 Autologowanie

W przewidywanym zastosowaniu moduł Raspberry Pi powinien sam restartować po wyłączeniu i

ponownym włączeniu zasilania. Dlatego konieczne jest zaprogramowanie go w sposób pomijający

logowanie użytkownika. W tym celu należy edytować plik /etc/inittab:

sudo nano /etc/inittab

Następnie należy zaremować wiersz:

1:2345:respanw: /sbin/getty --noclear 38400 tty1

i dodać wiersz:

1:2345:respanw: /bin/login –f pi tty1 </dev/tty1 >/dev/tty1 2>&1

Następnie uruchomić RPi ponownie (sudo reboot). Efektem powinno być pominiecie logowania do

systemu i start środowiska graficznego.

Podobny efekt można uzyskać prze wybranie opcji Enable Boot to Desktop w programie

konfiguracyjnym (sudo raspi-config).

7 Autostart programu Python.

W celu uruchomienia automatycznego napisanego przez nas programu serwera w Python’ie należy

edytować zbiór:

sudo nano /etc/rc.local

Przed linią exit 0

Należy wpisać, co trzeba uruchomić, np.:

cd /home/pi #przejscie do kartoteki gdzie jest program

python helloweb.py #wykonanie programu jako super user

Ale jak znaleźć i zabić proces serwera ???????

8 Podłączanie urządzeń peryferyjnych

Głównym sposobem podłączenia urządzeń peryferyjnych w RPi jest wykorzystanie złącza IDE26, na

którym dostępne są sygnały cyfrowe GPIO (pojedyncze sygnały wejść lub wyjść), port szeregowy

AMA0, I2C0 oraz SPI0 (Rys. 7Rys. 7. Opis złącza sygnałów cyfrowych RPi.). W rozdziale tym opiszemy

sposób wykorzystania GPIO, portu szeregowego i magistrali I2C oraz ograniczymy się do sterownia

portami z programu Python.

Pamiętać należy, ze sygnały cyfrowe w RPi pracuje w standardzie 3.3V. Przy wykorzystaniu urządzeń

zewnętrznych z innym napięciem zasilania konieczne jest zastosowanie odpowiednich układów

dopasowujących.

13

Praca z sygnałami GPIO wymaga uprawnień administratora (inna biblioteka – „pigpio” nie wymaga

takich uprawnień. Najprostszym sposobem jest uruchomienie programu Python (odpowiednio dla

wersji konsoli lub idle) komendami:

sudo python

sudo idle

Program w Pythonie wykorzystujący GPIO również musi być utuchamiany z uprawnieniami:

sudo nazwa_programu.py

Raspberry Pi rev.2

3V3 1 2 5V

GPIO02

I2C1_SDA 3 4 5V

GPIO03

I2C1_SCL 5 6 GND

GPIO04

GPCLK0 7 8

GPIO14

TX

GND 9 10 GPIO15

RX

GPIO17 11 12 GPIO18

PCM_CKL

GPIO27 13 14 GND

GPIO22 15 16 GPIO23

3V3 17 18 GPIO24

GPIO10

SPI0_MOSI 19 20 GND

GPIO09

SPI0_MISO 21 22 GPIO25

GPIO11

SPI0_SCLK 23 24

GPIO08

SPI0_CE0_N

GND 25 26 GPIO07

SPI0_CE1_N

Rys. 7. Opis złącza sygnałów cyfrowych RPi.

14

8.1 Obsługa wejść wyjść cyfrowych

W opisach wejść i wyjść cyfrowych RPi istnieją przynajmniej da standardy ich numerowania. Jeden

odnosi się do numeru pinu złącza (1 do 26), drugi do numeru logicznego (GPIOxx). Np. na Rys. 7 pin

15 to GPIO22, co powoduje, ze możemy się do tego sygnału odwołać jako sygnału 22 lub 15 w

zależności od stosowanego sposobu numeracji.

Sygnały o podwójnym opisie na Rys. 7 mogą być wykorzystane jako GPIO, pod warunkiem, że nie

zainstalowano obsługi sygnałów alternatywnych. Np. jeśli zainstalowano moduł I2C, to nie możemy

wykorzystać GPIO02 i GPIO03.

W pierwszej kolejności (oczywiście musimy mieć dostęp do Internetu ) należy zaktualizować system i

zainstalować pakiet obsługi GPIO:

sudo apt-get update

sudo apt-get install python-rpi.gpio

Przykładowy program włączający i wyłączający sygnał GPIO22 może wyglądać następująco.

Importujemy bibliotekę GPIO:

import RPi.GPIO as GPIO

Ustawiamy numeracje wg opisu GPIO??

GPIO.setmode(GPIO.BCM)

lub alternatywnie (numeracja wg numeru pinu GPIO22=pin 15):

GPIO.setmode(GPIO.BOARD)

Ustawiamy port GPIO22 jako wyjściowy:

GPIO.setup(22,GPIO.OUT) #przy wyborze GPIO.setmode(GPIO.BCM)

lub:

GPIO.setup(15,GPIO.OUT) #przy wyborze GPIO.setmode(GPIO.BOARD)

Załączenie lub wyłączenie sygnału (napięcie wysokie i niskie) odbywa się odpowiednio, za pomocą

instrukcji:

GPIO.output(22,GPIO.HIGH)

GPIO.output(22,GPIO.LOW)

Analogicznie, przy wyborze numeracji „BOARD” zamiast liczby 22 należy wpisać 15.

Czytanie sygnału wejściowego (numeracja „BCM”) wymaga ustawienia portu jako wejścia:

GPIO.setup(22,GPIO.IN)

oraz odczytania wartości z ewentualnym przypisaniem do zmiennej x (True = stan wysoki, False= stan

niski):

x = GPIO.input(22)

15

Jeśli czytany będzie pin skonfigurowany jako wyjściowy, to odczytana wartość będzie odpowiadała

ostatnio wpisanej. Jeśli natomiast wystąpi próba zapisania wartości do portu otwartego jako

wejściowy, system zgłosi błąd.

8.2 Uruchamianie I2C na Raspberry Pi

Uruchomienie modułu I2C przydatnego do współpracy z układami czujnikowymi na komputerze RPi

wymaga edycji zbioru:

sudo nano /etc/modules

Wpisać należy tam wiersze (pierwszy zazwyczaj wystarcza):

i2c-bcm2708

i2c-dev

Po zapisaniu tego zbioru należy edytować zbiór:.

sudo nano /etc/modprobe.d/raspi-blacklist.conf

Należy zaremować linie dotyczącą I2C wpisując znak '#' na jej początku (jednocześnie można włączyć

moduł SPI):

#blacklist i2c-bcm2708

#blacklist spi-bmc2708

Tak zmodyfikowany zbiór należy zapisać.

W następnej kolejności należy zainstalować moduł I2C (trzeba mieć połączenie do Internetu):

sudo apt-get install python-smbus i2c-tools

Po pomyślnym załadowaniu sterowników należy restartować system:

sudo reboot

Sprawdzenie działania interfejsu można przeprowadzić podłączając dowolny układ I2C i wykonać

komendę:

sudo i2cdetect -y 0

lub

sudo i2cdetect -y 1

w zależności, czy uruchamiamy port „0” czy „1” (w wersji 2 na złączu dostępny jest port „1”, w wersji

1 był „0”).

16

W odpowiedzi wyświetlone zostaną adresy (7 bitowe) podłączonych urządzeń Rys. 8.

Rys. 8. Odpowiedź Rpi na komendę „sudo i2cdetect -y 1”, gdy do linii I2C podłączono urządzenie o adresie

0x68 (7 bitów) = 0xC0 (8 bitów) oraz 0x77 (7 bitów) = 0xEE (8 bitów)

Do pracy w Pythonie należy zaimportować bibliotekę:

import smbus

oraz utworzyć obiekt smbus „0” lub „1”:

i2c = smbus.SMBus(1)

Teraz można pracować z biblioteką. Na Przykład dla pamięci 24C16 o adresie 0x50 do zerowego bajtu

wpisujemy liczbę 0x65:

i2c.write_byte_data(0x50,0x00,0x65)

Odczyt tej pamięci wygląda następująco:

i2c.write_byte(0x50,0x00)

x = i2c.read_byte(0x50)

print hex(x)

Program powinien wyświetlić 0x65. Biblioteka obsługująca i2c jest szersza i zawiera obsługę

magistrali SMBus. Opisano ja poniżej.

8.2.1 Funkcje SMBus (System Management Bus) –

Rozdział ten został zaczerpnięty z http://www.raspberry-projects.com/pi/programming-in-

python/i2c-programming-in-python/using-the-i2c-interface-2

SMBus (System Management Bus) protokołem niższego rzędu niż protokół I2C. Pisząc program dla

urządzenia I2C, gdy użyjemy komend SMBus, program będzie pracował dla urządzeń I2C i SMBus.

17

Należy podkreślić, że adres w poniższych instrukcjach to adres 7 bitowy bez bitu zapis/odczyt (w

instrukcjach będzie on przesunięty o jeden bit w lewo I dodany do niego bit odczyt/zapis).

Znaczenie funkcji:

long write_quick(int addr)

wyślij bit odczytu/zapisu.

long read_byte(int addr)

odczytaj pojedynczy bajt z urządzenia bez podania adresu rejestru.

long write_byte(int addr,char val)

wyślij bajt do urządzenia.

long read_byte_data(int addr,char cmd)

odczytaj bajt.

long write_byte_data(int addr,char cmd,char val)

wpisz bajt .

long read_word_data(int addr,char cmd)

odczytaj słowo (dwa bajty).

long write_word_data(int addr,char cmd,int val)

wpisz słowo (dwa bajty).

Funkcje odcztytu/zapisu blokowego I2C:

long[] read_i2c_block_data(int addr,char cmd)

czytanie bloku danych.

write_i2c_block_data(int addr,char cmd,long vals[])

wpisywanie bloku danych

8.3 Uruchamianie RS232 na Raspberry Pi

Opis ten opracowano na podstawie strony Clayton Smiths .

18

Port szeregowy domyślnie obsługuje w Raspberry konsolę. Ustawienie to należy wyłączyć poprzez edycję zbioru /boot/cmdline.txt. Wcześniej można stary zbiór zachować na wszelki wypadek:

sudo cp /boot/cmdline.txt /boot/cmdline_old.txt

Edytujemy zbiór:

sudo nano /boot/cmdline.txt

Oryginalnie zbiór ten wygląda następująco:

dwc_otg.lpm_enable=0 rpitestmode=1 console=ttyAMA0,115200

kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4

rootwait

Wyrzucić należy zapisy z parametrami ttyAMA0, tj.:

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

Co da końcowy efekt:

dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2

rootfstype=ext4 rootwait

Zmiany należy zapisać i wyjść z edytora.

W następnej kolejności należy poprawić zbiór /etc/inittab :

sudo nano /etc/inittab

Należy w nim znaleźć ciąg ttyAMA0 ( CTRL+W i wpisać ttyAMA0).

Zazwyczaj jest to ostatnia linia:

2:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Należy ją “zaremować” przez wpisanie na początku znaku ‘#’

Po tych czynnościach należy system zrestartować:

sudo reboot

W celu połączenia portu z oprogramowaniem w języku Python należy zainstalować bibliotekę (należy mieć połączenie internetowe):

sudo apt-get install python-serial

Przykładowy program obsługi portu szeregowego wygląda następująco:

19

import serial

sport = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.5) txt = raw_input(“>>>> “) #czyta z shela Pythona sport.write(">>>: "+txt) #wypisuje na port

sport.close()

Istotne jest również, że sygnały portu szeregowego dostępne na złączu Raspberry pracują w

standardzie TTL 3,3V. Należy wiec zastosować odpowiedni dla danych potrzeb adapter.

W wierszu poleceń można wylistować wszystkie dostępne porty szeregowe:

ls /dev/tty*

Wynik może wyglądać tak:

Rys. 9.Lista dostępnych portów szeregowych (fizyczny port szeregowy dostępny na złączu to ttyAMA0).

Albo tak, po dołączeniu przejściówki USB na port szeregowy. Zamiast pracować przez port ttyAMA0

można uruchomić procedura Serial() port ttyUSB0.

Rys. 10. Lista dostępnych portów szeregowych (fizyczny port szeregowy dostępny na złącz to ttyAMA0 i nowy

port ttyUSB0).

20

9 Praca z modułem BlueTooth i obsługą SSP (opis zaczerpnięto z http://www.fritz-

hut.com/2012/09/14/raspberrypi-bluetooth-with-bluesmirf/ ).

W celu uruchomienia portu szeregowego poprzez moduł BT, musimy zainstalować bibliotekę obsługi

BlueTooth:

sudo apt-get install bluetooth bluez-utils

W jednym z eksperymentów musiano wykonać jeszcze instalacji:

sudo apt-get install bluetooth bluez-utils blueman

gdyż nie załadował się program graficzny do obsługi BT.

Lista podłączonych interfejsów może zostać wyświetlona komendą:

sudo hcitool dev

Lista ta będzie miała następującą postać:

Devices:

hci0 00:11:67:8f:5b:43

Inną metodą jest użycie polecenia lsusb , co spowoduje wylistowanie urządzeń USB, a między innymi

modułu BT. Np.:

Bus 001 Device 005: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth

Adapter

Poszukiwanie urządzeń znajdujących się w pobliżu można wykonać komendą:

sudo hcitool scan

Przykładowa odpowiedź:

Scanning…

D4:5d:42:1e:c3:c7 Nokia C3-01

00:12:6f:23:8b:ad fall #nazwa nadana modułowi BTM222

Pokazywane są urządzenia nieskojarzone !

Konfiguracja portu szeregowego rfcomm jest wykonywana poprzez edycję zbioru:

sudo nano /etc/bluetooth/rfcomm.conf

# RFCOMM configuration file.

#

rfcomm0 {

# Automatically bind the device at startup

bind yes;

# Bluetooth address of the device #to moduł BTM 222 o nazwie “fall”

device 00:12:6f:23:8b:ad;

21

# RFCOMM channel for the connection

channel 1;

# Description of the connection

comment "BTM222_fall";

}

W celu nawiązania połączenia z urządzeniem wymagającym PIN’u należy użyć komendy:

sudo bluez-simple-agent hci0 00:12:6f:23:8b:ad

po czym należy w terminalu RPi podać numer PIN I powtórzyć na urządzeniu. Automatyczne

wysyłanie pinu jest możliwe po uruchomieniu „agenta” (1234 to PIN):

sudo bluetooth-agent 1234 &

Aby dodać urządzenie do zaufanych należy wydać komendę:

sudo bluez-test-device trusted 00:12:6f:23:8b:ad yes

Połączenie uzyskujemy po wydaniu rozkazu:

sudo bluez-test-input connect 00:12:6f:23:8b:ad

Port szeregowy otworzyć można poleceniem:

sudo rfcomm bind rfcomm0

Po tej komendzie możliwe jest przesyłanie danych za pomocą poleceń cat lub echo.

Można pracować w Pythonie otwierając port /dev/rfcomm0 !!!!!! tak jak z ttyAMA0, czy ttyUSB0.

Uwaga: po otwarciu portu rfcomm0 procedurą Serial() i zamknięciu komendą close() powtórne

otwarcie wykazuje błąd z którego wynika, że port jest w użyciu ???????

10 Klonowanie systemu

Zapamiętanie obrazu systemu operacyjnego w systemie Windows możliwe jest poprzez zastosowanie

programu Win32diskmanager. Program ten jest całkowicie darmowy i można go pozyskać z sieci. Za

pomocą tego programu można zarówno zgrać obraz systemu z karty SD, jak i zapisać na karcie

(zostanie całkowicie skasowana) zapamiętany wcześniej obraz. Widok okna programu pokazano na

Rys. 11.

Uwaga: Niektóre karty SD o tej samej objętości nominalnej mogą różnić się objętością rzeczywistą.

Wtedy obraz odczytany z karty „większej” nie będzie mógł być zgrany do karty „mniejszej” !?

Dotychczas nie umiem zmniejszyć już zgranego obrazu, mimo że duża część tego obrazu jest

zazwyczaj pusta ?!

22

11 Uwagi inne

Moduł Raspberry Pi okazał się bardzo czuły na nawet krótkie spadki napięcia zasilania. Resetowanie

następowało nawet w czasie włączania pewnych urządzeń USB (np. portu szeregowego, dołączaniu

do zasilania 5V układu czujników itp.).

Zasilacze dostarczane przez firmy i dedykowane do RPi mogą okazać się niewystarczające. Pomimo

deklaracji o wysokim prądzie wyjściowym, zaobserwowano duże spadki napięcia wyjściowego po

obciążeniu ich stosunkowo małym (n. 0,5A) prądem. Spowodowane to było dużą opornością

wyjściową samego zasilacza i duża opornością kabki USB. Szczególnie dużą oporność mają kable z

wtyczka USB-mikro (zakupione „nie firmowe” kable miały całkowita oporność 2Ω !!!!!).

Duży spadek napięcia zaobserwowano również korzystając z dodatkowego gniazda USB w zasilaczu

sieciowym laptopa.

W związku z powyższym, pobieranie z RPi zasilania 5V do układów zewnętrznych wymagających dużej

precyzji napięcia zasilającego jest niecelowe. Należy raczej wykonać dodatkowy zasilacz o dużej

stabilności i dużym prądzie wyjściowym (np. 1 do 2A) i z niego zasilić RPi.

12 Literatura: Pisząc powyższy tekst korzystano głównie z Internetu. Odnośniki do odpowiednich stron zawarto w

samym tekście. Dla rozszerzenia wiedzy i możliwości wykorzystania modułu Raspberry Pi można

polecić liczne wydawnictwa książkowe. Niektóre z nich to:

[1] Matt Richardson, Wallace Shawn, Wprowadzenie do Raspberry Pi, APN Promise, 2013

[2] Eben Upton, Gareth Halfacree, Raspberry Pi – przewodnik użytkownika, Helion, 2013

[3] Andrew Robinson, Mike Cook, Raspberry Pi. Najlepsze projekty , Helion, 2013

[4] Simon Monk, Raspberry Pi. Receptury, Helion, 2013

[5] Simon MonkRaspberry Pi. Przewodnik dla programistów Pythona, Helion, 2014

[6] Donald Norris, Raspberry Pi. Niesamowite projekty. Szalony Geniusz, Helion, 2013

Rys. 11. Widok programu Win32diskimager.