Portál AbcLinuxu, 7. května 2025 19:58

Dotaz: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)

16.12.2015 09:14 cvp | skóre: 18
Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Přečteno: 985×
Odpovědět | Admin
Koupil jsem si světelný senzor, který komunikuje za pomocí I2C rozhranní na Raspberry PI2.

Přesné znění je: spojení s Raspberry Pi zajišuje I2C rozhraní, kde čidlo má neměnnou 7-bitovou adresu 0x29.

Jak získám data z této adresy? (7-bitovou adresu 0x29) Potřebuji takové data vložit do souboru senzor.sh, který chci spouštět přes CRON. Jde mně hlavně o to, co dát do souboru senzor.sh, abych data ze světelného senzoru získal.

Data budu mít pro fotoaparát, abych mohl lépe nastavovat ISO, expozici apod., což zatím nevím jak budu provádět - LUX -> iso,expozice...
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.12.2015 10:09 NN
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podival bych se na tutorial, ktery je primo v tvem odkaze a zaroven si neco nastudoval o konfiguraci i2c na Rpi.

Tak adresa slouzi jen pro identifikaci zarizeni.
16.12.2015 13:11 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Našel jsem python script, kterým lze získavat lux hodnotu.

Pro focení s kamerou však používat bash (camera.sh). Jak mohu dostat lux hodnotu získanou z python souboru přímo do bash, kde s touto hodnout mohu dál pracovat?
16.12.2015 13:41 NN
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Napis si Python skript, ktery bude vyuzivat uvedeny modul a vypisovat hodnotu na vystup:
#!/usr/sbin/python

import tsl2591

tsl = tsl2591.Tsl2591()  # initialize
full, ir = tsl.get_full_luminosity()
lux = tsl.calculate_lux(full, ir)
print lux
Se skriptem budes v Bash zachazet jako s prikazem:
#!/bin/sh

LUX = `/root/lux'
17.12.2015 18:58 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Na I2C mně to detekuje na busu 0 a zařízení 29 = 0x29.

Zkoušel jsem přes sudo i2cget -y 1 0X29 přečíst data ze senzoru světla, ale vrací mně to Error: Read failed

Mám vůbec i2cget příkaz správně? Abych vyloučil vadu na senzoru.
17.12.2015 20:01 NN
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Melo by to byt pro 'ir':
i2cget -y 1 0x29 0xb4
a pro 'full':
i2cget -y 1 0x29 0xb6
Zbytek si musis dopocitat, nebo pouzit python skript ktery uz mas. Nebo si precit originalni arduino knihovnu podle ktere byl prepsan..
17.12.2015 20:18 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Tak snad senzor není KO. Error: Read failed
18.12.2015 00:48 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Funguje i2cdump?
19.12.2015 15:13 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Naštěstí funguje.

pi@raspberrypi:~ $ i2cdump -y 1 0x29 w
     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f
00: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
08: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
10: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
18: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
20: XXXX XXXX 0022 0023 0024 0025 0026 0027
28: 0028 0029 002a 002b 002c 002d 002e 002f
30: 0030 0031 0032 0033 0034 0035 0036 0037
38: 0038 0039 003a 003b 003c 003d 003e 003f
40: 0040 0041 0042 0043 0044 0045 0046 0047
48: 0048 0049 004a 004b 004c 004d 004e 004f
50: 0050 0051 0052 0053 0054 0055 0056 0057
58: 0058 0059 005a 005b 005c 005d 005e 005f
60: 0060 0061 0062 0063 0064 0065 0066 0067
68: 0068 0069 006a 006b 006c 006d 006e 006f
70: 0070 0071 0072 0073 0074 0075 0076 0077
78: 0078 0079 007a 007b 007c 007d 007e 007f
80: 007f 0000 0000 0000 0000 0000 0000 0000
88: 0000 0000 0000 0000 0000 0000 0000 0000
90: 0100 5001 0050 0000 0000 0000 0000 1a00
98: e01a c0e0 41c0 0041 0000 0000 0000 0000
a0: 007f 0000 0000 0000 0000 0000 0000 0000
a8: 0000 0000 0000 0000 0000 0000 0000 0000
b0: 0100 5001 0050 0000 0000 0000 0000 1a00
b8: e01a c0e0 41c0 0041 0000 0000 0000 0000
c0: 0000 0000 0000 0000 7f00 007f 0000 0000
c8: 0000 0000 0000 0000 0000 0000 4400 0044
d0: 0000 0000 0000 0000 0000 0000 0000 0000
d8: 0000 0000 0000 0000 0000 0000 0000 7f00
e0: 7f00 7f00 7f00 7f00 7f00 7f00 7f00 7f00
e8: 7f00 7f00 7f00 7f00 7f00 7f00 7f00 7f00
f0: 7f00 7f00 7f00 7f00 7f00 7f00 7f00 7f00
f8: 7f00 7f00 7f00 7f00 7f00 7f00 7f00 7f00
19.12.2015 16:52 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
A čtení pořád nejde? BTW proč používáš šířku 16bit? Ty registry jsou určitě 8bit. Teda pokud používáš stejnej datasheet jako já. Co dělá dump s 'b'?

Moc jsem to nestudoval, rpí ani senzor nemám. A ten datasheet vypadá vícevýznamově. Osobně bych bit CMD (7) v Command registru nenastavoval, pokud bych přistupoval k normálním registrům (na i2c adresa registru není definovaná, takže si je výrobci implementují třeba jako temp registry). Takže adresa registru by měla být:
(0 << 7) | (1 << 5) | (reg_addr & 0x1f)
Ještě bych možná bylo dobrý zapnout ten čip PON. Takže já bych to zkusil nějak takle:
i2cset -y 1 0x29 $(( (0 << 7) | (1 << 5) | 0 )) $(( (1 << 1) | ( 1 << 0 ) ))   #power on, ALS enable
i2cget -y 1 0x29 $(( (0 << 7) | (1 << 5) | 0x12 ))     #ID registr, mel by vratit 0x50
20.12.2015 21:44 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
i2cdump -y 1 0x29 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f     !"#$%&'()*+,-./
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f    0123456789:;<=>?
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f    @ABCDEFGHIJKLMNO
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f    PQRSTUVWXYZ[\]^_
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f    `abcdefghijklmno
70: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f    pqrstuvwxyz{|}~?
80: 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ?...............
90: 00 01 50 00 00 00 00 00 1a e0 c0 41 00 00 00 00    .?P.....???A....
a0: 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ?...............
b0: 00 01 50 00 00 00 00 00 1a e0 c0 41 00 00 00 00    .?P.....???A....
c0: 00 00 00 00 00 7f 00 00 00 00 00 00 00 00 00 44    .....?.........D
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
Chtěl jsem načíst jen status ze senzoru, který jsem vyčetl v datasheet jako:
Address | Register | Name | R/W | Register Function | Reset Value
0x13 | STATUS | R | Device | status | 0x00
S příkazem: i2cget -y 1 0x29 0x13

Bohužel jsem dostal opět Error: Read failed
20.12.2015 22:02 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Ještě jsem vyzkoušel tento příkaz:
pi@raspberrypi ~ $ dmesg|grep i2c
[    3.982111] bcm2708_i2c 3f804000.i2c: BSC1 Controller at 0x3f804000 (irq 79) (baudrate 100000)
[    6.420761] i2c /dev entries driver
20.12.2015 22:37 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Error: Write failed
i2cset -y 1 0x29 $(( (0 << 7) | (1 << 5) | 0 )) $(( (1 << 1) | ( 1 << 0 ) ))
20.12.2015 23:42 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
A když teď zkusíš ty samé dva příkazy (poweron a ID read) s bitem 7 nastaveným do "1" ?

P.S. Můžeš odoznačit komentář označený jako řešení (první koment)? Vzhledem k tomu, že to furt nejede a lidi na odfajfkovaný link v poradně spíš nekliknou.
21.12.2015 09:52 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Na power ON je tedy příkaz jak jsi psal:
i2cset -y 1 0x29 $(( (0 << 7) | (1 << 5) | 0 )) $(( (1 << 1) | ( 1 << 0 ) ))
Aby byl příkaz se 7 bity, tak co mám přesně udělat? Bohužel I2C není moje parketa a už tak tápu nad tím senzorem.

Je pravda, že možná senzor nekomunikuje, protože mu chybí power ON. Každopádně jsem zkusil i2cdump 2x po sobě, kdy na podruhé jsem senzor zakryl hadrou pro vytvoření tmy. i2cdump výsledek byl různý. Tak že nevím, jestli power ON bude stačit.
21.12.2015 15:25 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Bitem 7 myslím změnit
(0 << 7)
Na
(1 << 7)
Takže oba příkazy takhle:
i2cset -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0 )) $(( (1 << 1) | ( 1 << 0 ) ))   #power on, ALS enable
i2cget -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0x12 ))     #ID registr, mel by vratit 0x50
21.12.2015 23:19 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Nevím, je to nějaké divné :/ Na druhý pokus jsem vložil ještě k tomu sudo, ale stále stejná chyba.

pi@raspberrypi ~ $ i2cset -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0 )) $(( (1 << 1) | ( 1 << 0 ) ))
Error: Write failed
pi@raspberrypi ~ $ i2cget -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0x12 ))
Error: Read failed
22.12.2015 00:33 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Hmm ono je možný, že to používá jinej přenos dat než podporuje i2ctools (jak jsem psal, tak si každej může po adrese přenášet data jak se mu zachce).

Ale když se koukám na ten i2cdump ještě jednou, tak je dost možný, že to funguje, na adrese 0xb2 je 0x50, což by odpovídalo ID registru. V nejhorším bys to musel vyparsovat :-D.

Když pustíš po těch selhaných i2cget a i2cset znova i2cdump, pojede, nebo selže taky (stav kdy by chybnej příkaz zablokoval sběrnici/senzor)?

Po úspěšném i2cdump (nebo prostě ve výchozím stavu), co ohlásí tenhle samotnej příkaz?
i2cset -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0 ))
Pokud by prošel, tak zkus:
i2cset -y 1 0x29 $(( (1 << 7) | (1 << 5) | 0x12 ))
i2cget -y 1 0x29 
P.S. jinak ten odkazovanej python skript ti funguje nebo ne?
22.12.2015 10:40 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Všechno to hlásí Write nebo Read failed. Vypadá to, že komunikace přes i2cset či get nepřipadá v úvahu. Na internetu jsem našel ovládací knihovnu pro tento senzor. Bohužel je to ale pro Adafruit, tak že z toho se asi nic použít nedá. Jedině udělat script s parsováním z dump. Strýček google ale takový parser nenašel, tak že budu asi první blázen :)
22.12.2015 10:54 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Python script nefunguje. Leč jeden uživatel psal, že mu to na RPI2 funguje. Nemám fakt ponětí, v čem dělám případnou chybu, když detekce i dump funguje.
22.12.2015 13:36 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Dokázal bys napsat script, kterým bych získal data z i2cdump? Tzv. vyparsovat je? Já bohužel vůbec nemám ponětí, jak bych to udělal :/
22.12.2015 16:25 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Tak dokázal, ale není to čistý řešení a navíc ti to nepomůže pokud budeš potřebovat nastavit nějaké vnitřní parametry (přerušení, zisk apod.).

I2C tools mají ještě nějaké další parametry, tak je můžeš vyzkoušet (všechny možné kombinace).

Nejjednodušší by bylo udělat vlastní C program a ideálně vycházet z i2cdump. Bez reálného HW by se ale vývojový cyklus dost protáhl (takhle přes abc). Můžeme to zkusit, ale na to bys měl být schopen rozumět (a programovat) v Céčku a musíš mít kompilátor pro Rpí. Hlavně to bude ještě úmornější než všechny kombinace parametrů i2ctools.

Jestli to někomu ale prý na RPí fungovalo, tak bych se ho určitě zkusil zeptat (i kdyby jeho odpověď trvala týden, tak to klidně může být rychlejší než vlastní program z i2ctools :-D).

BTW různé verze rpí můžou mít různé konfigurace I2C. Teoreticky může něco to zařízení blokovat. Jsi si jistý, že to je správná adresa a adaptér? (to spíš jo, viz i2cdump, ale radši bych to ověřil) Máš správné zapojené piny, napájecí a datové napěťové úrovně? Kompletní dmesg, lsmod, apod.
22.12.2015 17:46 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Nakonec jsem našel člověka, co vlastní sice jiný typ senzoru, ale je funkční. Senzor jsem našel i na aukro.cz a dle obrázku je shodný s tímto.

Komunikace s čidlem je pak jednoduchá.
22.12.2015 23:54 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Ale ten současnej nejspíš funguje taky, akorát má divnej protokol (když ti funguje přes dump ale už ne přes set/get)
28.12.2015 14:23 cvp | skóre: 18
Rozbalit Rozbalit vše Re: Jak dostat data z I2C rozhraní se 7-bit adresou 0x29 (nemění se)
Ale zbytečně se s tím čtvu už tolik hodin. Čidlo jsem nabídnul k prodeji.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.