Sygnały analogowe i cyfrowe.
W świecie elektroniki powszechnie mamy do czynienia z sygnałami analogowymi i cyfrowymi. W internecie oczywiście możemy znaleźć masę informacji na ten temat. Ja tylko napiszę pokrótce, że sygnał cyfrowy przyjmuje wartość typu HIGH lub LOW, 1 lub 0, włączony lub wyłączony - czyli są 2 rodzaje wartości i nic pomiędzy nimi. Natomiast analogowe sygnały mogą przyjmować dowolną wartość w wybranym zakresie.
Przykładem (cyfrowym) jest tu np włącznik światła (który jest włączony lub wyłączony), czy np pokrętło głośności w radio (analogowy). Dobry do wyjaśnień jest również wspomniany już tu kiedyś kontroler PS3, który ma przyciski działające z sygnałem cyfrowym (wciśnięty, niewciśnięty), czy też analogową gałkę - mogącą przyjąć różne wartości.
Które są lepsze/bardziej przydatne? Oczywiście zależy od zastosowań.
Przykładem (cyfrowym) jest tu np włącznik światła (który jest włączony lub wyłączony), czy np pokrętło głośności w radio (analogowy). Dobry do wyjaśnień jest również wspomniany już tu kiedyś kontroler PS3, który ma przyciski działające z sygnałem cyfrowym (wciśnięty, niewciśnięty), czy też analogową gałkę - mogącą przyjąć różne wartości.
Które są lepsze/bardziej przydatne? Oczywiście zależy od zastosowań.
Dlaczego o tym wspominam?
Do tej pory mieliśmy tu do czynienia z elementami cyfrowymi. I było to stosunkowo proste. Raspberry Pi samodzielnie nie potrafi jednak w żaden sposób "zrozumieć" sygnałów analogowych. A co - jeśli będziemy chcieli (musieli) wykorzystać "coś" analogowego? (a nie chcemy korzystać np. z Arduino)
Wtedy przyda się nam dekoder analogowo - cyfrowy i właśnie tym się zajmiemy w tym poście.
Ja zakupiłem model PCF8591P. Koszt to niecałe 12zł.
Dane techniczne.
PCF8591P - Przetwornik A/C i C/A 8-bit DIP16
- Zasilanie: 2.5V - 6V
- Interfejs: I2C
- Obudowa: DIP16
Dokładniejsza dokumentacja TUTAJ
Opis slotów:
Przetwornik jest 8-bitowy, więc maksymalna wartość to 255.
Zakupiłem też potencjometr obrotowy, który jest dobrym generatorem sygnałów analogowych :) Wraz z nakładką kosztował niecałe 2 zł.
Dane techniczne.
Potencjometr obrotowy 10K:
- Długość osi: 15mm
- Średnica osi: 6mm
- Kąt obrotu: 300°
- charakterystyka: liniowa
- tolerancja: +/- 20%
- moc: 0,125W
- temp. pracy: -10°C ÷ +70°C
środkowy pin to OUT - czyli podłączamy do dekodera (tu mała uwaga - niektóre potencjometry mają dwie nóżki po jednej stronie i jedną nóżkę po drugiej stronie - wtedy "samotna" to OUT)
lewy pin do GND
prawy pin do 5V
dekoder:
AIN1 - analog input 1 - tu podłączamy środkowy pin potencjometru
AIN2 , 3, 4 - możemy podłączyć inne analogowe urządzenia - teraz nieużywane, więc do GND
A0-A2 - hardware address - też GND
VSS - negative supply - czyli też GND
Vdd - +5V
Aout - nie używany (nie podłączamy nigdzie)
Vref - + 5V
Agnd - analog ground - oczywiście GND
EXT - GND
OSC - nie używany (nie podłączamy nigdzie)
SCL - clock line - pin 5 w RPI GPIO 1 (I2C SCL)
SDA - data line - pin 3 w RPI GPIO 0 (I2C SDA)
Następnie musimy załadować odpowiednie moduły. W standardzie Raspbiana potrzebne nam moduły są "banowane", czyli nie można ich załadować. Tak więc edytujemy plik:
/etc/modprobe.d/raspi-blacklist.conf
i hashujemy:
#blacklist spi-bcm2708 #blacklist i2c-bcm2708
Następnie ładujemy moduły:
sudo modprobe spi-bcm2708 sudo modprobe i2c-bcm2708 sudo modprobe i2c-dev
W dmesg powinno pojawić się coś w tym stylu:
[270822.607823] bcm2708_spi bcm2708_spi.0: SPI Controller at 0x20204000 (irq 80) [270828.657896] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79) (baudrate 100k) [270828.658130] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79) (baudrate 100k) [270875.242767] i2c /dev entries driver
Powinny pojawić się też 2 nowe urządzenia:
crw------- 1 root root 89, 0 Jan 14 23:32 /dev/i2c-0 crw------- 1 root root 89, 1 Jan 14 23:32 /dev/i2c-1
Kolejnym krokiem jest instalacja pakietów:
apt-get install python-smbus i2c-tools
I możemy przetestować czy wszystko jest w porządku. Sprawdzanie wykrycia urządzenia:
# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
czy też sprawdzenie aktualnej wartości (na potencjometrze)
# i2cget -y 1 0x48 0x4c
Kod
Tu skorzystałem z zasobów forum LINK i pracy Grumpy Mike-a. Pozdrowienia :) Jako że dekoder pracuje przez interfejs i2c - kod wygląda nieco inaczej niż w poprzednich przypadkach.
Tu skorzystałem z zasobów forum LINK i pracy Grumpy Mike-a. Pozdrowienia :) Jako że dekoder pracuje przez interfejs i2c - kod wygląda nieco inaczej niż w poprzednich przypadkach.
#Read a value from analogue input 0 #in A/D in the PCF8591P @ address 0x48 from smbus import SMBus import time bus = SMBus(1) print("Read the A/D") print("Ctrl C to stop") bus.write_byte(0x48, 0) # set control register to read channel 0 last_reading =-1 while(0 == 0): # do forever reading = bus.read_byte(0x48) # read A/D if(abs(last_reading - reading) > 2): print(last_reading - reading) last_reading = reading