Dzisiaj jest 27 kwie 2025, 03:56

Strefa czasowa UTC+1godz.




Nowy temat Odpowiedz w temacie  [ Posty: 16 ] 
Autor Wiadomość
 Tytuł: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 10 maja 2011, 18:29 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 12:13
Posty: 1942
Lokalizacja: Suwałki
Wstęp
Czasami zachodzi konieczność pomiarów wielkości analogowych jak napięcie, prąd. Chciałbym przedstawić na kilku praktycznych przykładach wykorzystania przetwornika analogowo-cyfrowego w routerze z zainstalowanym firmware OpenWrt. W tym artykule wykorzystano przetwornik NXP PCF8591P komunikujący się z routerem po szynie danych I2C. Do poprawności działania potrzebujemy dwa wolne punkty GPIO lub (niepotwierdzone) konwerter USB- I2C ze strony http://www.harbaum.org/till/i2c_tiny_usb/index.shtml

UWAGA:
Na początku chciałbym poinformować, że przetwornik PCF8591P według dokumentacji wymaga napięcia zasilania w zakresie 2.5V – 6V. Z do końca nie wiadomych mi jak dotąd przyczyn moje egzemplarze działają poprawnie tylko przy +5V, niższego nie akceptują. Ciężko mi stwierdzić czy trafiłem na taką partię czy tak powinno być, a dokumentacja “kłamie”. Jeżeli w przyszłości trafie na egzemplarze akceptujące niższe napięcie( w tym preferowane 3.3V) zmodyfikuje opis. W takiej sytuacji musimy albo skorzystać z zasilania +5V z USB, lub zasilacza (po zastosowaniu stabilizatora 5V jeżeli to konieczne).

Trochę teorii
Przetwornik analogowo-cyfrowy pomijając wszelkie matematyczne aspekty zamienia wielkość analogową(ciągłą) w postać cyfrową (zerojedynkową). Jednym z istotnych parametrów takiego przetwornika jest rozdzielczość, która określa dokładność mierzonych wielkości.
Przetwornik PCF8591P jest przetwornikiem 8-bitowym, oznacza to, że potrafi przetworzyć próbkę na jedną z 256 wartości liczbowych. Do zastosowań jakie niżej zostaną przedstawione jest wystarczająca.

Podstawowy schemat połączeń jakie będzie obowiązywał dla wszystkich przedstawionych przykładów znajduje się poniżej.

Obrazek

Wyjaśnienia wymagają piny A0-A2, które w zależności jaki stan wpiszemy(0-masa, 1- plus) ustawią adres pod jakim nasz przetwornik będzie widoczny w systemie. Domyślnie ustawiamy wszystkie na zera, więc nasz przetwornik w OpenWrt będzie widoczny pod adresem 0x48. Innymi słowy możemy ustawić jeden z 8 adresów.
Pin VREF stanowi napięcia odniesienia w stosunku do którego nasze pomiary będą robione, u nas 5V. Zastosowany przetwornik wyposażony jest w cztery kanały do pomiaru wielkości analogowych.

PCF8591 w OpenWrt

Do poprawnej pracy potrzebujemy moduł kernela kmod-i2c-gpio-custom, który jest domyślnie dostępny w repozytorium OpenWrt. Moduł kmod-hwmon-pcf8591 jest opcjonalny, gdyż można posiłkować się narzędziami i2c-tools i odwoływać się do konkretnych rejestrów. Jednak w opisie decyduje się korzystać z tego modułu, gdyż praca z nim jest przyjemniejsza.

# opkg update
# opkg install kmod-i2c-gpio-custom
# opkg install http://openwrt.pl/dl/pakiety/kmod-hwmon-pcf8591_2.6.32.27-1_ar71xx.ipk

ustawiamy punkty GPIO jako SDA i SCL
# insmod i2c-gpio-custom bus0=0,6,7

lub
# echo "i2c-gpio-custom bus0=0,6,7" > /etc/modules.d/i2c-gpio-custom

Po chwili lub restarcie przetwornik jest widoczny w sysfs pod /sys/class/i2c-dev/i2c-0/device/0-0048/
# ls  /sys/class/i2c-dev/i2c-0/device/0-0048/
driver       in1_input    in3_input    name         out0_output  uevent
in0_input    in2_input    modalias     out0_enable  subsystem


Prosty skrypt odczytujący co sekundę w niskończoność wartość na wyjściu 0 przetwornika A/D:
#!/bin/sh
while true
do
  raw=`cat /sys/class/i2c-dev/i2c-0/device/0-0048/in0_input`
  echo $raw
  sleep 1
done

W/w skrypt będzie rozszerzany w konkretnych zastosowaniach.

Pomiar napięcia baterii/akumulatora

Pierwszy przykład to pomiar napięcia baterii. Wykorzystano tutaj dwie baterie paluszki NiMH połączone szeregowo.
Do przetwornika podłączamy po prostu – masa baterii do masy oraz plus do A0 przetwornika.

Skrypt mierzący napięcie może wyglądać:
#!/bin/sh

while true
do
  raw=`cat /sys/class/i2c-dev/i2c-0/device/0-0048/in0_input`
  echo $raw | awk '{printf "%.2fV\n", $1*5/2560}'
  sleep 1
done

Wynik:
2.60V
2.60V
2.60V


Tą samą baterię pomierzyłem zwykłym multimetrem i wskazania były bardzo zbliżone.

Może zajść konieczność pomiaru napięcia większego niż 5V, wówczas musimy zrobić prosty dzielnik napięcia z dwóch rezystorów, tak aby dostosować do napięcia referencyjnego (5V). Schemat pomiaru napięcia do 20V będzie wyglądał następująco:

Obrazek

Modyfikujemy skrypt:
#!/bin/sh

while true
do
  raw=`cat /sys/class/i2c-dev/i2c-0/device/0-0048/in0_input`
  echo $raw | awk '{printf "%.2fV\n", $1*5/2550/0.25}'
  sleep 1
done

Wyniki:
13.73V
13.73V
13.73V


Cały wynik dzielimy dodatkowo przez 0.25, gdyż tyle wynosi stosunek zastosowanych rezystorów (R2/R1+R2). Więcej o dzielnikach napięcia na Wikipedii

Zastosowanie: pomiar baterii zasilania routera, pomiar baterii słonecznej.

Pomiar temperatury czujnikiem LM35

Czujnik LM35 jest analogowym czujnikiem temperatury firmy National Semiconductors. Zakres mierzonych temperatur -55 do +150*C. Na wyjściu czujnika otrzymujemy 10mV na każdy stopień Celsiusza. Z powodu niedostępności napięcia ujemnego, przykład będzie dotyczył pomiaru temperatur dodatnich.

Obrazek

Zmodyfikowany skrypt:
#!/bin/sh

while true
do
  raw=`cat /sys/class/i2c-dev/i2c-0/device/0-0048/in0_input`
  echo $raw | awk '{printf "%.f*C\n", ($1*5*100)/2550}'
  sleep 2
done


Wynik:
27*C
27*C
27*C


Pomiar nasłonecznienia

Fotorezystor to taki element, który w zależności od światła przyjmuje odpowiednia rezystancję. W połączeniu w rezystorem tworzy dynamiczny dzielnik napięcia. Na wyjściu otrzymujemy napięcie, które po kalibracji można przypisać do tekstowego opisu pory dnia. Duże nasłonecznienie powoduje ze napięcie spada do wartości bliskich zera.

Obrazek

Skrypt:
#!/bin/sh

while true
do
  raw=`cat /sys/class/i2c-dev/i2c-0/device/0-0048/in0_input`
  echo $raw | awk '{printf "%.2fV\n", $1*5/2550}'
  sleep 1
done

Wynik:
2.73V
2.75V
3.37V
3.31V
2.78V


Zastosowanie: Uzależnienie pracy aplikacji od pory dnia, pomiar nasłonecznienia.

Podsumowanie
Przykłady można mnożyć, dlatego też temat nie został całkowicie wyczerpany. Na rynku jest szereg czujników, urządzeń analogowych, które można w ten sposób "badać".

_________________
Pozdrawiam, Artur
http://digi-led.pl


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 10 maja 2011, 19:06 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 20:28
Posty: 699
Jak dla mnie temat na czasie.
Szukam czegoś z I2C minimum 12bit. No i aby obudowa nadawała się do ręcznego lutowania :)
bo dostępny na aukcjach ADS1110 z powodu małej obudowy odpuściłem.

Podobnie na I2C może by ktoś chciał klawiaturę do routera https://sites.google.com/site/angelitodeb/Home/i2ckeypad_example_schema.png
http://img.elecena.pl/e/6/7/e679d88ffb66af8ed25daadad86db1c1.jpg
Problemem może być częstotliwość odczytów ale na arduino sprawuje się idealnie.

_________________
WRT160NL, WNDR3700v2 i OpenWRT, Funbox ;), WRT1200AC


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 10 maja 2011, 19:08 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 21:31
Posty: 226
Lokalizacja: Wrocław
tytan ty lepiej zrob cos z tymi porannymi spikami temepratury u siebie :P

_________________
Gdy trwoga to do LOG'a
TP-Link TL-WDR3600 OpenWrt/TP-Link W8970/


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 18:14 
Offline
Użytkownik

Rejestracja: 21 cze 2011, 20:56
Posty: 136
A czy takiego czegos nie mozna zrobic za pomoca np Atmega8?

Temat mnie zaciekawil, mozna dodac ogniwo sloneczne i mamy piekny miernik naslonecznienia.
Mikrofon + wzmacniacz i mamy pomiar halasu.
Mala pradnice i miernik wiatru...


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 18:24 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 12:13
Posty: 1942
Lokalizacja: Suwałki
ad1) można

ad2) to już po za tematem, chcesz wiedzieć więcej załóż wątek. Gdyż ostatnio wiele tematów prowadzi donikąd... od jakiegoś czasu pracuje na takim "kombo" - http://lab.digi-led.pl/sensnode/ i wiele wpisów na moim blogu http://artekw.net/

_________________
Pozdrawiam, Artur
http://digi-led.pl


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 18:29 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 20:28
Posty: 699
atmega też 8bit to za słabo jak dla mnie

_________________
WRT160NL, WNDR3700v2 i OpenWRT, Funbox ;), WRT1200AC


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 18:33 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 12:13
Posty: 1942
Lokalizacja: Suwałki
@tytan odpowiedz była dla @zgf1 :)

_________________
Pozdrawiam, Artur
http://digi-led.pl


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 18:40 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 20:28
Posty: 699
moja również dla niego :)

_________________
WRT160NL, WNDR3700v2 i OpenWRT, Funbox ;), WRT1200AC


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 13 lis 2011, 20:03 
Offline
Użytkownik

Rejestracja: 8 sie 2011, 19:01
Posty: 32
tytan pisze:
atmega też 8bit to za słabo jak dla mnie

10 bit jak już, no i zawsze można zrobić nadpróbkowanie (patrz nota aplikacyjna Atmela: AVR121: Enhancing ADC resolution by oversampling)


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 14 gru 2011, 17:47 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 20:28
Posty: 699
Panowie wróciłem do mojego zamysłu użycia ADS1110.

Przełamałem opory i testowo zrobiłem przelotkę na PCB z SOT23-6 na DIL6.
Scalak dał się wlutować - ta czynność raczej dla koneserów sztuki ;)

Odczyt pomiarów po I2C jest prosty. Programować rejestrów przy podstawowym sposobie użycia (pomiar 16bit w zakresie do 2,048V) nie trzeba wcale.

Scalak ma parę ciekawych możliwości konfiguracji ale tu odsyłam do manuala.
W każdym razie z arduino działa bez problemu.
Zaletą jest to że szeroki zakres dopuszczalnego zasilania scalaka
pozwoli na zastosowanie w routerach z dowolnym napięciem od 2,7 do 5,5V.

_________________
WRT160NL, WNDR3700v2 i OpenWRT, Funbox ;), WRT1200AC


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 23 lut 2012, 12:23 
Offline
Użytkownik
Awatar użytkownika

Rejestracja: 10 kwie 2010, 20:28
Posty: 699
Ciągnąc dalej poboczny temat przetestowałem też inny przetwornik 16bit w drugą stronę D/A: DAC8571.
Napięcie zasilania również 2,7 do 5,5V a sterowanie przez I2C jest bardzo proste (sprawdziłem na Arduino).
Jedyny problem z jakim należało się zmierzyć to rozmiary scalaka :).

Scalak ma wejscie referencyjne gdzie podajemy napięcie źródłowe -jest to maksymalne jakie możemy ustawiać na wyjściu z rozdzielczością 16bit.

Może ktoś podrzuci jakiś luźny pomysł zastosowania ... bo ja mam na razie jedno czyli zasilacz cyfrowy.

_________________
WRT160NL, WNDR3700v2 i OpenWRT, Funbox ;), WRT1200AC


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 23 lut 2012, 12:32 
Offline
Administrator
Awatar użytkownika

Rejestracja: 9 kwie 2010, 23:28
Posty: 14176
Lokalizacja: Warszawa
Sterowanie przyciemnianiem szyb jeżeli masz je sterowane analogowo poziomem napięcia...

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 8 paź 2014, 08:42 
Offline
Użytkownik

Rejestracja: 8 paź 2014, 08:41
Posty: 1
Ja musiałem dodatkowo wykonać:
echo pcf8591 0x48 > /sys/class/i2c-dev/i2c-0/device/new_device

Aby moduł pcf8591 wykrył urządzenie


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 2 mar 2016, 20:19 
Offline
Użytkownik

Rejestracja: 2 mar 2016, 20:11
Posty: 1
Czy jest ktoś w stanie podać aktualne repo dla tego pakietu
Cytuj:
http://openwrt.pl/dl/pakiety/kmod-hwmon-pcf8591_2.6.32.27-1_ar71xx.ipk
Jeśli nie ma to czy mogę go z jakiś źródeł skompilować?


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [howto] Przetwornik analogowo-cyfrowy w routerze
Post: 2 mar 2016, 20:42 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 12:13
Posty: 1942
Lokalizacja: Suwałki
Niestety nie mam już tego pliku ani źródeł.

Musisz dodać nowy moduł. W przypadku trunka to jest ten plik https://dev.openwrt.org/browser/trunk/p ... s/hwmon.mk. Trzeba dodać definicję dla pcf8591 i potem skompilować go. Piece a cake ;-)

EDIT:
Chyba to tak będzie wyglądać:

define KernelPackage/hwmon-pcf8591
     TITLE:=PCF8591 ADC Converter
     KCONFIG:=CONFIG_SENSORS_PCF8591
     FILES:=$(LINUX_DIR)/drivers/hwmon/pcf8591.ko
     AUTOLOAD:=$(call AutoProbe,pcf8591)
     $(call AddDepends/hwmon,+kmod-i2c-core)
endef   
define KernelPackage/hwmon-pcf8591/description
Kernel module for PCF8591
endef

$(eval $(call KernelPackage,hwmon-pcf8591))

_________________
Pozdrawiam, Artur
http://digi-led.pl


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
Wyświetl posty nie starsze niż:  Sortuj wg  
Nowy temat Odpowiedz w temacie  [ Posty: 16 ] 

Strefa czasowa UTC+1godz.


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów

Szukaj:
Przejdź do:  
cron
designed by digi-led.pl
...Copyright © 2010-2013, Ekipa openrouter.info