2013-01-17

Sygnały analogowe/cyfrowe. Potencjometr.


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ń.

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






Układ

potencjometr:
ś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.

#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


21 komentarzy:

  1. 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ń
    Odpowiedzi
    1. Cześć! Cieszę się, że pomogłem. Jak będziesz mieć jakiś problem - daj znać.

      Pozdrawiam

      Usuń
  2. 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ć.
    Pozdrawiam.

    OdpowiedzUsuń
  3. 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.
    Czy mażecie coś podpowiedzieć?

    OdpowiedzUsuń
  4. Super wpis. Wszystkie informacje jak najbardziej przydatne

    OdpowiedzUsuń
  5. Bardzo pomocna wiedza. Warto było tutaj zajrzeć. Pozdrawiam

    OdpowiedzUsuń
  6. świetny ten blog i ciekawe treści

    OdpowiedzUsuń
  7. Te informacje są bardzo interesujące. Bardzo podoba mi się ten wpis.

    OdpowiedzUsuń
  8. Wpis zawiera bardzo ciekawe informacje

    OdpowiedzUsuń
  9. Wiele tutaj interesujących i ważnych informacji.

    OdpowiedzUsuń
  10. Świetny artykuł! Pomocne informacje

    OdpowiedzUsuń
  11. Wpis zawiera bardzo ciekawe informacje

    OdpowiedzUsuń
  12. Wszystko zostało dokładnie opisane.

    OdpowiedzUsuń
  13. Takie informacje są niezwykle cenne.

    OdpowiedzUsuń
  14. Bardzo lubię tak interesujące i jednocześnie ciekawe wpisy.

    OdpowiedzUsuń