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
Dzięki, właśnie czegoś takiego szukałem. Zamówiłem już przetwornik i za kilka dni w praktyce poćwiczę to co opisujesz. Pozdrawiam.
OdpowiedzUsuńCześć! Cieszę się, że pomogłem. Jak będziesz mieć jakiś problem - daj znać.
UsuńPozdrawiam
Wczoraj przyszły zabawki i poskładałem to do kupy - Działa:) Dzięki za ten tutorial bo sam na początku pewnie bym miał problem żeby to uruchomić.
OdpowiedzUsuńPozdrawiam.
Cieszę się, że pomogło :)
Usuńpozdrawiam
Potrzebuje stworzyć coś w rodzaju miernika napięcia które będzie odczytywać aktualną wartość w interwałach czasowych. Chce to zrobić w oparciu o raspberry z modułem przetwornika analogowo - cyfrowego.
OdpowiedzUsuńCzy mażecie coś podpowiedzieć?
Super wpis. Wszystkie informacje jak najbardziej przydatne
OdpowiedzUsuńBardzo pomocna wiedza. Warto było tutaj zajrzeć. Pozdrawiam
OdpowiedzUsuńCiekawy artykuł.
OdpowiedzUsuńInteresujący ten wpis!
OdpowiedzUsuńSuper artykuł
OdpowiedzUsuńŚwietny post
OdpowiedzUsuńświetny ten blog i ciekawe treści
OdpowiedzUsuńWpis bardzo ciekawy
OdpowiedzUsuńTe informacje są bardzo interesujące. Bardzo podoba mi się ten wpis.
OdpowiedzUsuńWpis zawiera bardzo ciekawe informacje
OdpowiedzUsuńWiele tutaj interesujących i ważnych informacji.
OdpowiedzUsuńŚwietny artykuł! Pomocne informacje
OdpowiedzUsuńWpis zawiera bardzo ciekawe informacje
OdpowiedzUsuńWszystko zostało dokładnie opisane.
OdpowiedzUsuńTakie informacje są niezwykle cenne.
OdpowiedzUsuńBardzo lubię tak interesujące i jednocześnie ciekawe wpisy.
OdpowiedzUsuń