====== Raspberry PI GPIO ======
* existuje více revizí raspberry s rozdílným rozložením vývodů
* vývody bývají označovány podle BCM nebo raspberry značení
* následující přehled obsahuje popisy pinů podle BCM pro různé revize
{{:raspberry-pi-gpio-pinouts.png?direct&600|}}
===== Raspbery PI B =====
* já mám model B, revizi 2.0
* revizi lze identifikovat například podle ''/proc/cpuinfo''
cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 2.00
Features : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7
Hardware : BCM2708
Revision : 000f <---------- revize 2.0
Serial : 00000000a2fe0aff
* následující přehled obsahuje popis pro revizi 2.0 podle BCM
* některé vývody mají speciální použití (bílou barvou raspberry značení)
{{:raspberry-pi-rev2-gpio-pinout.jpg?direct&600|}}
===== Raspberry PI zero W =====
{{:raspi_zero_w_header.jpg?direct&700|}}
===== Upozornění =====
* pozor na napětí a proud
* na GPIO IN pin nesmí přijít napětí vyšší než 3.3V
* 3.3V VCC piny lze použít na napájení externího zařízení, proud by neměl ale překročit 50 mA (hodnota s plnou zátěží raspi, jinak může být prý vyšší, 50 mA je ale jistota)
* GPIO OUT pin může poskytovat maximálně proud 16 mA
====== Knihovny ======
* [[http://wiringpi.com/download-and-install/|Wiring PI pro C/C++, shell]]
apt-get install git-core gcc sudo
mkdir gpiotest
cd gpiotest
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
* [[https://pypi.python.org/pypi/RPi.GPIO|RPi.GPIO pro python]]
* podle INSTALL souboru stačí na raspbian pouze
apt-get install python-rpi.gpio python3-rpi.gpio
====== Blikání LED ======
* [[electro_intro|základy k LED]]
* proud, který je na GPIO raspberry pi povoleno používat je 2-**16mA**!! při překročení dojde ke spálení
* výpočet odporu
* na pinu máme 3.3V
* ledka nám odebere 0.7V
* zůstává 2.6V, kterých se chceme zbavit
* chceme, aby procházel proud například 5mA
* podle ohmova zákona: 2.6 / 0.005 = 520 ohm
* já jsem použil odpor 330 ohm, to znamená proud 7.88mA, což je ok
* LED diodu mám připojenou k BCM 18
* tento triviální program má i praktické použití. Reálně jsem ho použil pro záchranu AVR mikroprocesoru jako externí generátor hodinového signálu :) Použil jsem Wiring C verzi s usleep(1) místo delay().
===== Python RPi.GPIO =====
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
while True:
GPIO.output(18, GPIO.HIGH)
time.sleep(.5)
GPIO.output(18, GPIO.LOW)
time.sleep(.5)
===== Wiring =====
* u wiring se používá raspberry značení pinů
* pro zjištění raspberry značení lze využít tabulku aktuálního stavu
* LED diodu mám připojenou k BCM 18, což odpovídá wPI 1
root@piAP:/tmp# gpio readall
+-----+-----+---------+------+---+-Model B2-+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| 28 | 17 | GPIO.17 | IN | 0 | 51 || 52 | 0 | IN | GPIO.18 | 18 | 29 |
| 30 | 19 | GPIO.19 | IN | 0 | 53 || 54 | 0 | IN | GPIO.20 | 20 | 31 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
==== C ====
* lze použít přímo příklad z archívu knihovny ''wiringPi/examples/blink.c''
* pouze jsem přepsal číslo pinu
#include
#include
#define LED 1 // pin 1 is BCM_GPIO 18.
int main (void)
{
printf ("Raspberry Pi blink\n") ;
wiringPiSetup () ;
pinMode (LED, OUTPUT) ;
for (;;)
{
digitalWrite (LED, HIGH) ; // On
delay (500) ; // mS
digitalWrite (LED, LOW) ; // Off
delay (500) ;
}
return 0 ;
}
* zkompilovat lze pomoci ''make blink''
==== Shell ====
* lze použít přímo příklad z archívu knihovny ''wiringPi/examples/blink.sh''
* pouze jsem přepsal číslo pinu
PIN=1 # pin 1 is BCM_GPIO 18.
gpio mode $PIN out
while true; do
gpio write $PIN 1
sleep 0.5
gpio write $PIN 0
sleep 0.5
done
====== DHT22/AM2302 ======
* senzor teploty a vlhkosti DHT22/AM2302 ([[https://zabbix.tips/monitor-temperature-and-humidity-zabbix/|návod]])
* zakoupen na ebay (včetně desky plošných spojů s odporem a káblíkem)
* destička má tří vývody
* ''+'' napájení, 3.3V, libovolný pin s tímto napájením
* ''out'' data, libovolný GPIO
* ''-'' GND, libovolná zem
* zkoušel jsem instalaci přes pip, ale to skončilo chybou
apt-get install pip
pip install adafruit_python_dht
Collecting adafruit_python_dht
Downloading Adafruit_Python_DHT-1.1.2.tar.gz
Complete output from command python setup.py egg_info:
Could not detect if running on the Raspberry Pi or Beaglebone Black. If this failure is unexpected, you can run again with --force-pi or --force-bbb parameter to force using the Raspberry Pi or Beaglebone Black respectively.
* instalace přes git se povedla, dokonce je tam i novější verze
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT/
python setup.py install
* pro otestování jsem použil ukázkový python skript
examples/AdafruitDHT.py 2302 4
Temp=21.8* Humidity=73.1%
* první měření dopadlo o dost jinak než následující, možná nějaká inicializace
====== MP3/radio přehrávač ======
* inspirováno projektem mp3 přehrávač z knížky
* cílem je přehrávání internetových rádií, přepínání tlačítkem :D
* mpg321 místo mpg123 .. navíc podporuje streaming
* ''apt-get install alsa-mixer''
* ''modprobe snd-bcm2835''
* ''speaker-test -f 80 -t sine''
* jak ochránit repro před rány při on/off?
* soft start - ale to chrání jen před on/off zesilovače ne zdroje signálu :)
====== UART ======
* stačí tři vodiče RX (zelená), TX (bílá), zem (černá)
* používá napěťové úrovně 3.3V (lze sehnat přímo sériový kabel USB-TTL)
* napájení z USB-TTL kabelu (červený drát) pro raspberry nestačí, neutáhne to
* sériová linka se používá pro zobrazení boot zpráv kernelu a login prompt.
* vlastní init proces (po kernelu a před login prompt) vidět nejde (a asi ani nijak zapnout?)
* pokd chceme používat UART na něco jiného, musíme jej uvolnit (a naopak)
* login prompt je zapsán:
/etc/initab
T0:23:respawn:/sbin/getty -L ttyAMA0115200 VT100
* kernel serial konzole je zapsána:
/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p5 rootfstype=ext2 rootwait
* klientů pro sériovou linku je víc
* cutecom
* s GUI klikací, jako terminál asi nic moc
* screen
* skutečný terminál :)
* spouští se např ''screen /dev/ttyUSB0 112500''
* cu
* další terminálového typu
* příklad spuštění: ''cu -l /dev/ttyUSB0 -s 115200''
====== SPI ======
* 4 vodiče
* **SCLK** (master) / **CLK** (slave) .. Clock (hodinový signál)
* **MOSI** (master) / **Din** (slave) .. Master Out Slave In
* **MISO** (master) / **Dout** (slave) .. Master In Slave Out
* **CS/SHDN** (master) / **SS** (slave) .. Slave Select
* princip komunikace
* master řídí komunikaci, generuje hodinové impulzy, bez hodin se nic neděje
* nastavením SS na LOW se vybere cílové zařízení (pokud je po zapnutí už na LOW, nastaví se nejdřív na HIGH)
* první bit (MOSI) bývá HIGH (tzv. startovací bit)
* komunikace je full duplex, s každým tikem pošle Master (na MOSI) a Slave (na MISO) bit současně
* počet a pořadí zaslaných bitů si zařízení určují sami
* přenos se ukončuje nastavením SS na HIGH
* příklad komunikace
* MCP3008 - AD převodník 8x 10Bit s SPI rozhraním
* po start bitu se zašle SGL/DIFF (single nebo diferenciální) příznak
* následuje číslo požadovaného kanálu (8 kanálů, tj 3 bity: D2, D1, D0)
* ukázka komunikace z [[https://www.adafruit.com/datasheets/MCP3008.pdf|datasheet MCP3008]]
{{::mcp3008-spi-comm.gif|}}
* komunikaci lze provést i bez speciálního SPI rozhraní pomocí techniky bit-bang
def adc(chan, clock, mosi, miso, cs):
if((chan < 0) or (chan > 7)):
return -1
GPIO.output(cs, True) # preventivně
GPIO.output(clock, False)
GPIO.output(cs, False) # aktivujeme slave
cmd = chan
cmd |= 0x18 # nastavíme start bit + SGL bit
cmd <<= 3
for i in range(5): # pošleme start, SGL, channel
if(cmd & 0x80):
GPIO.output(mosi, True)
else:
GPIO.output(mosi, False)
cmd <<= 1
GPIO.output(clock, True)
GPIO.output(clock, False)
result = 0
for i in range(12): # načteme mezeru (čas pro čtení hodnoty) + nulový bit + 10 bitů
GPIO.output(clock, True)
GPIO.output(clock, False)
result <<= 1
if(GPIO.input(miso)):
result |= 0x1
GPIO.output(cs, True)
result >>=
return result
* jak využít rozhraní nativně?
* raspi má dva chip select porty (CE0, CE1) - tj. SS vývod
* spi je default vypnuté, je třeba načíst kernel modul ''spi-bcm2708''
* jako sw lze použít: [[http://wiringpi.com|wiringpi]], [[http://www.airspayce.com/mikem/bcm2835/|C knihovna BCM2835]], ''spidev'' (v C nebo dokonce přímo v shell)
* zdroje
* [[https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md|Vše SPI na raspi, oficiální stránka]]
* [[http://www.hertaville.com/interfacing-an-spi-adc-mcp3008-chip-to-the-raspberry-pi-using-c.html|C++ třída pro komunikaci s MCP3008 SPI využívající spidev s moc pěkným úvodem k MCP3008 SPI]]
* [[http://www.brianhensley.net/2012/07/getting-spi-working-on-raspberry-pi.html|Ukázka využití demo příkladu spidev_test.c z linux kernelu (spidev)]]
* [[http://www.raspberry-projects.com/pi/programming-in-c/spi/using-the-spi-interface|Ukázka s využitím knihovny BCM2835 a bez (spidev)]]
* [[http://wiringpi.com/reference/spi-library|Ukázka ve wiringPI]]
* lze použít ke komunikaci více zařízení (slave)
* možnost 1
* SCLK, MOSI a MISO se propojí se všemi Slave
* SS je pro každého Slave zvlášť
* možnost 2
* SCLK, SS se propojí se všemi Slave,
* MOSI se připojí do prvního Slave, jeho Dout se použije pro Din druhého Slave, .. , poslední Dout se použije jako MISO
* více [[https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi|zde]]
====== 433 Mhz ======
* TODO
* http://www.instructables.com/id/Super-Simple-Raspberry-Pi-433MHz-Home-Automation/