Temat: Czytanie z ADS 1015 - NanoPi NEO

System: OpenWrt 19.07.10
Platforma: NanoPi NEO

Dograne moduły:
kmod-hwmon-ads1015

Próbuję czytać wartość napięcia z potencjometru na pokładzie SparkFun Qwiic 12 Bit ADC ADS1015, ale dostaję rozbieżne wartości (widać związek z przekręceniem potencjometru, odczyty wtedy oscylują wokół innej wartości, ale kiedy potencjometr jest nieruszany, wahania są dziwnie duże). Przykład:

root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1302
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1371
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1369
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1354
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1322
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1299
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1277
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1266

To co robię po kolei:

root@OpenWrt:~# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] Y
     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: -- -- -- -- -- -- -- --            

root@OpenWrt:~# echo ads1015 0x48 > /sys/class/i2c-dev/i2c-0/device/new_device

root@OpenWrt:~# ls /sys/class/hwmon/hwmon0/device/
driver     in0_input  in2_input  in4_input  in6_input  modalias   power      uevent
hwmon      in1_input  in3_input  in5_input  in7_input  name       subsystem

root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1370
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1335
root@OpenWrt:~# cat /sys/class/hwmon/hwmon0/device/in3_input 
-1278

2

Odp: Czytanie z ADS 1015 - NanoPi NEO

Z cyfrowego punktu widzenia masz odczyt, więc różne wyniki sugerowały by szwankowanie czujnika. Nie googlowałem za nim: masz tam jakieś napięcie referencyjne czy coś takiego? Może ono pływa?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Czytanie z ADS 1015 - NanoPi NEO

Zmierzyłem multimetrem co leci z potencjometru i jest sztywno, nic nie pływa.

4

Odp: Czytanie z ADS 1015 - NanoPi NEO

Więc problem masz z samym przetwornikiem.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Czytanie z ADS 1015 - NanoPi NEO

Zainstalowałem sobie to narzędzie: https://github.com/chandrawi/ADS1x15-ADC

Musiałem zmienić w libce numer SMBus, u mnie jest to i2c-0, a tutaj ustawiało na sztywno na 1

>>> import ADS1x15
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.7/site-packages/ADS1x15/__init__.py", line 5, in <module>
    from .ADS1x15 import ADS1x15
  File "/usr/lib/python3.7/site-packages/ADS1x15/ADS1x15.py", line 7, in <module>
    class ADS1x15:
  File "/usr/lib/python3.7/site-packages/ADS1x15/ADS1x15.py", line 69, in ADS1x15
    i2c = SMBus(1)
  File "/usr/lib/python3.7/site-packages/smbus2/smbus2.py", line 280, in __init__
    self.open(bus)
  File "/usr/lib/python3.7/site-packages/smbus2/smbus2.py", line 310, in open
    self.fd = os.open(filepath, os.O_RDWR)
FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'

Napisałem na szybko taki skrypt

import ADS1x15

ADS = ADS1x15.ADS1015(0)
ADS.setGain(ADS.PGA_4_096V)
print(ADS.toVoltage(ADS.readADC(3)))

Jego wyniki pokrywają się ze wskazaniami multimetru

root@OpenWrt:~# while true; do python3 adc_read.py ; sleep 1; done;
2.7233297508549095
2.7233297508549095
2.7233297508549095
2.7213287738153396
2.8573952125061064
3.0514899853444066
3.093510503175379
3.219572056668295
3.2475857352222763
3.2455847581827064
3.2475857352222763

Czyli w tym pliku /sys/class/hwmon/hwmon0/device/in3_input oprócz wartości napięcia lecą też binarnie jakieś ruchome flagi które powodują falowanie odczytów (i dodatkowo cat konwertuje je z binary na int?)? Czy jestem w stanie jakoś osiągnąć takie odczyty napięcia jak ze skryptu na poziomie samego OpenWRT bez zaprzęgania do tego pythona?

6

Odp: Czytanie z ADS 1015 - NanoPi NEO

Tak, czytasz bezpośrednio z rejestrów po i2c i piszesz sobie regułkę która konwertuje to na czytelną postać. Pewnie w dokumnetacji ADS'a to znajdziesz.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.