now I can read :) this script works
import smbus # General i2c device class so that other devices can be added easily class i2c_device: def __init__(self, addr, port): self.addr = addr self.bus = smbus.SMBus(port) def write_i2c_block_data(self, byte, array): self.bus.write_i2c_block_data(self.addr, byte, array) def read_nbytes_data(self, data, n): # For sequential reads > 1 byte return self.bus.read_i2c_block_data(self.addr, data, n) ph = i2c_device(0x65, 2) ph.write_i2c_block_data(0x05,[0x00]) // off LED print(ph.read_nbytes_data(0x00, 25)) // read all registers On Friday, June 16, 2017 at 1:34:04 PM UTC-4, Sebastián Sáez wrote: > > This are the value in hexadecimal of the 25 registers in the sensor, check > with datasheet and it's ok > > 1,4,1,65,0,1,0,1,0,0,0,0,0,0,0,0,9,C4,0,0,9,C4,0,0,16 > > > I used arduino to read this, I discovered that what I read with python is > garbage > > On Friday, June 16, 2017 at 12:43:14 PM UTC-4, Sebastián Sáez wrote: >> >> Hi Graham, thanks >> >> here more info >> >> HW: Beaglebone seeedstudio green wireless >>> OS: Debian GNU/Linux 8.8 (jessie) >>> Kernel: Linux beaglebone 4.4.30-ti-r64 >>> Python: Python 2.7.9 >> >> >> I made a custom cape, the sensor it's power with 3.3v and conected to >> I2C_2 through an isolator >> >> SDA -> P9.20 >> SCL -> P9.19 >> >> >> <https://lh3.googleusercontent.com/-LQRB-CkLTZo/WUQGKC1Q1bI/AAAAAAAADKA/bTmen-ZCt0gd_AsHUnmU78UUmiNiZ3-9wCLcBGAs/s1600/Untitled.png> >> >> The HW it's OK, I check with an arduino and example code and I can write >> registers with my python script on the beaglebone. >> >> The ph sensor is in 0x65 address and other Atlas sensor in 0x64 >> >> debian@beaglebone:~$ i2cdetect -y -r 2 >> 0 1 2 3 4 5 6 7 8 9 a b c d e f >> 00: -- -- -- -- -- -- -- -- -- -- -- -- -- >> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >> 50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- >> 60: -- -- -- -- 64 65 -- -- -- -- -- -- -- -- -- -- >> 70: -- -- -- -- -- -- -- -- >> >> Now I can write register with this script (can on/off onboard LED) but >> when I try to read all 25 register I get this >> >> >>> 1, 1, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 >> >> >> The first 2 bytes are the ID and FW, but I expect the rest to have values >> such as the pH (registers 0x16, 0x17, 0x18, 0x19) but I am getting only 0 >> (garbage) >> >> Python script >> import smbus >> import time >> >> class i2c_device: >> def __init__(self, addr, port): >> self.addr = addr >> self.bus = smbus.SMBus(port) >> >> def write(self, byte): >> self.bus.write_byte(self.addr, byte) >> >> def write_i2c_block_data(self, byte, array): >> self.bus.write_i2c_block_data(self.addr, byte, array) >> >> def read(self): >> return self.bus.read_byte(self.addr) >> >> def read_nbytes_data(self, data, n): # For sequential reads > 1 byte >> return self.bus.read_i2c_block_data(self.addr, data, n) >> >> ph = i2c_device(0x65, 2) >> ph.write(0x00) >> i=0 >> while (i <= 25): >> print(ph.read()) >> time.sleep(0.5) >> i+=1 >> >> >> >> >> On Thursday, June 15, 2017 at 10:38:28 PM UTC-4, Graham wrote: >>> >>> OK. >>> Let's start with some background information. >>> What model of Beaglebone? >>> What version of OS, kernel? >>> Which version of Python? >>> How is the pH sensor hooked to the Beaglebone? >>> What Voltage are you using to power the pH sensor? >>> >>> Now some basics to see if the I2C bus is running >>> >>> sudo apt-get install i2c-tools >>> >>> now run >>> i2cdetect -y -r 1 >>> what do you get? >>> >>> now run >>> i2cdetect -y -r 2 >>> what do you get? >>> >>> When you say that you get "garbage" what do you mean? >>> What do you actually get? errors? tracebacks? obviously wrong data, but >>> no reported errors? >>> >>> --- Graham >>> >>> == >>> >>> On Thursday, June 15, 2017 at 5:38:58 PM UTC-5, Sebastián Sáez wrote: >>>> >>>> >>>> Hi, >>>> >>>> I'm writing a python script to communicate via i2c with the ph oem >>>> sensor from Atlas Scientific. >>>> >>>> https://www.atlas-scientific.com/product_pages/oem/oem_ph.html >>>> >>>> https://www.atlas-scientific.com/_files/_datasheets/_oem/pH_oem_datasheet.pdf >>>> >>>> I already tried with the i2c module of mraa and smbus without luck. >>>> Now I am trying to translate this arduino example from Atlas to python >>>> but I read garbage >>>> >>>> >>>> Any suggestions?, attached the full example arduino code >>>> >>>> >>>> *Atlas arduino code* >>>> byte i2c_device_address=0x65; >>>> byte starting_register=0x00 >>>> byte device_type; >>>> byte version_number; >>>> Wire.beginTransmission(i2c_device_address); >>>> Wire.write(staring_register); >>>> Wire.endTransmission(); >>>> Wire.requestFrom(i2c_device_address,(byte)2); >>>> device_type = Wire.read(); >>>> version_number = Wire.read(); >>>> Wire.endTransmission(); >>>> >>>> >>>> *My python script* >>>> import smbus >>>> >>>> # General i2c device class so that other devices can be added easily >>>> class i2c_device: >>>> def __init__(self, addr, port): >>>> self.addr = addr >>>> self.bus = smbus.SMBus(port) >>>> >>>> def write(self, byte): >>>> self.bus.write_byte(self.addr, byte) >>>> >>>> def read(self): >>>> return self.bus.read_byte(self.addr) >>>> >>>> def read_nbytes_data(self, data, n): # For sequential reads > 1 byte >>>> return self.bus.read_i2c_block_data(self.addr, data, n) >>>> >>>> ph = i2c_device(0x65, 2) >>>> ph.write(0x00) >>>> device_type = ph.read() >>>> version_number = ph.read() >>>> print(device_type) >>>> print(version_number) >>>> >>>> >>>> -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/beagleboard/8d476212-153b-4816-aae1-7216e00e8994%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
