J'ai un problème de fonctionnement de l'AD5272 en utilisant Python 3 sur Raspberry Pi 3 B +. AD5272 est le rhéostat à commande numérique avec interface I2C (ma pièce a une résistance de 20 kOhm).Utilisation de l'AD5272 avec Python 3 et smbus2 sur Raspberry Pi 3 B +
Le problème est le suivant:
La résistance entre bornes A et W ne change pas la position que je suis en train de mettre en place et reste autour 10KOhm. (Par défaut, lorsque AD5272 est activé, la moitié de la résistance complète y est définie). Quand je lis la résistance de RDAC - est lu zéro résistance.
Voici mon code:
#!/usr/bin/python3
import smbus2
import time, os
class AD527x():
# command bits which are dependant on I2C address of device
def __init__ (self, bus=1, address=0x2E, resistance = 20000, positions = 1023, reset = False):
self.bus = smbus2.SMBus(bus)
self.positions = positions
self.address = address
self.resistance = resistance
def write_position (self, position):
# sets the rheostat to certain position
# if wiper position is higher than maximal
if position > self.positions:
position = self.positions
# approximate resistance of rheostat
resistance = self.resistance*position/self.positions
# for AD5274 needs to be shifted for 2 digits left
if self.positions == 256:
position = position << 2
print ("Binary representation of position for RDAC : " + bin (position))
# Writing position is sneding 2 bytes one by one
# MSB Data: 0 0 C3 C2 C1 C0 D9 D8
# For writing command bytes: C3 = 0; C2 = 0; C1 = 0; C0 = 1
# 0 0 0 0 0 1 ? ?
# ? ? - MSB of 10-digit binary representation of wiper position between 0 and 1023
# two first positions : D9_8 = (position & 0b1100000000) >> 8
MSB = (1 << 3) | ((position & 0b1100000000) >> 8)
print ("MSB : " + bin(MSB))
# take last 8 bits
LSB = position & 0b11111111
print ("LSB : " + bin(LSB))
print ("All Bytes : " + bin((MSB << 8) +LSB))
print ("Value : " + str(resistance))
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
self.read_position()
def read_position (self):
# reads current position of rheostat
# prepare the circuit to send data
# MSB Data: 0 0 C3 C2 C1 C0 D9 D8
# For reading command bytes: C3 = 0; C2 = 0; C1 = 1; C0 = 0
# 0 0 0 0 1 0 ? ?
# ? ? - Doen't matter - Just use zeros
# LSB - doesn't matter, just using 0b00000000
MSB = 0b00001000
LSB = 0b00000000
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
#read 2 bytes from RDAC
a = self.bus.read_byte(self.address)
time.sleep (0.005)
b = self.bus.read_byte(self.address)
value = ((a << 8) | b)
print (value)
# take 10 lats bits only
value = value & 0b1111111111
print (value)
def main():
device = AD527x()
device.write_position(1023)
if __name__ == "__main__":
main()
La sortie est:
Binary representation of position for RDAC : 0b1111111111
MSB : 0b1011
LSB : 0b11111111
All Bytes : 0b101111111111
Value : 20000.0
4096
0
Ordinateur: Rapberry Pi 3, modèle B +
OS: Raspbian 9
Version Python: 3.5.3
package I2C: smbus2
Référence: AD5272BRMZ-20
Fiche technique: http://www.farnell.com/datasheets/1706490.pdf
Qu'est-ce que je fais mal et comment y remédier?
Le câblage de la pièce a été vérifié trois fois. Les lectures de RDAC sont toujours les mêmes, quelle que soit la valeur que j'essaie d'écrire ici. J'ai essayé deux commandes:
self.bus.write_i2c_block_data(self.address, 0, [MSB, LSB])
et
self.bus.write_byte (self.address, MSB)
self.bus.write_byte (self.address, LSB)
résultat était toujours le même: la résistance ne change pas. La résistance a été vérifiée avec un ohmmètre externe.
S'il vous plaît, aidez!
Je vais essayer de faire cela. Maintenant, je pense que le problème pourrait être dans l'implémentation python de l'interface I2C. J'ai remarqué que certains composants requièrent une vitesse d'horloge I2C spécifique. – Iegor