Messages : 39
Sujets : 6
Inscription : Apr 2015
bonjour à tous,
voila je veux lire la tension analogique de mon capteur ultrason, j'ai donc acheté un ADC qui utilise le protocole de communication i2c :
http://boutique.semageek.com/fr/423-ads1...c-pga.html
j'ai ensuite configuré i2c sur ma raspberry et ca c'est bon,
mais quand je fais sudo i2cdetect -y 1
la raspberry me renvoie un tableau vide

pourtant j'alimente bien en 3.3 v, j'ai relié SDA et SDL a la rasp et j'ai mis la tension analog de mon ultrason à A0
avez vous une idée de pourquoi le tableau renvoyé est vide? normalement je devrais voir mon ultrason dans ce tableau....
merci d'avance pour votre aide
Messages : 100
Sujets : 24
Inscription : Aug 2014
Hello, perso je n'utilise pas la liaison i2c directement du raspberry. Par contre maintenant que tu sais communiquer avec un Microcontroleur tu peux passer par lui.
je m'explique, si ton microcontrôleur a des entrées analogique tu peux t'en servir pour lire la tension de ton capteur Ultrason et puis ton microcontrôleur te les envoient sur ton port série( uart).
Pour la communication i2c je passe aussi par un Microcontrôleur type PIC16F ou 18F. Voici mon projet en cour :
http://forum.raspfr.org/viewtopic.php?id=1089
Voila une piste
Messages : 39
Sujets : 6
Inscription : Apr 2015
salut david84,
en faite j'utilise déja le port UART de ma raspberry a cause d'un autre périphérique qui utilise uniquemment la communication UART.
j'ai donc besoin d'utiliser un autre système de communication et je me suis penché vers l ' I2C.
la configuration est faite et j'arrive a même a lire mon ADC sur le port 0x48
le probleme maintenant c'est mon code :
Code :
[== Indéfini ==]
#! usr/bin/python
import time
import smbus
Bus_I2C = smbus.SMBus(1)
Adresse_I2C_US = 0x48
while True:
time.sleep(1)
try:
tension=Bus_I2C.read_word_data(Adresse_I2C_US,0)
print(tension)
except IOError:
print("Erreur de connexion i2c")
il me retourne toujours la valeur "0" peu importe si ma tension varie ou non, et je ne comprend pas trop pourquoi...
j'ai meme essayé avant le boucle de mettre la variable tension = 5, il me renvoie quand meme 0 .
quelqu'un a une idée?
Messages : 100
Sujets : 24
Inscription : Aug 2014
Salut, as tu lu le Datasheet de ton ADC car tu doit au minimum pointer ton registre pour sélectionner ton canal ou est connecter ton capteur ultrason et ensuite repointer pour lire la valeur qui est coder sur 16 bit donc deux octets.
Donc tu dois d'abord l'appeler avec son adresse, puis lui envoyer les commandes et puis seulement lire les données.
Regarde a partir de la page 18 du datasheet
A plus
(Modification du message : 05-05-2015, 16:37:11 par
david84.)
Messages : 39
Sujets : 6
Inscription : Apr 2015
re,
j'ai regardé la doc technique p18 et j'ai essayé de configuré mais ca ne marche pas j'ai toujours des 0 ecrit dans le terminal
voici mon code:
Code :
[== Indéfini ==]
#! usr/bin/python
import time
import smbus
Bus_I2C = smbus.SMBus(1)#peripherique i2c 1 choisie
Address_I2C_US = 0x48
Bus_I2C.write_byte_data(Address_I2C_US,1,0xFF) # on config le registre:1 et on on le regle sur 16bits:0xFF
Bus_I2C.write_byte(Address_I2C_US,0)# on pointe vers A0:0 qui est l'entré de notre capteur US
while True:
time.sleep(1)
try:
tension=Bus_I2C.read_word_data(Address_I2C_US,0)
print(tension)
except IOError:
print("Erreur de connexion i2c")
le probleme vient de la configuration mais je coince un peu car j'ai pas l'habitude de faire ca.. as tu une idée d'ou vient le probleme?
Messages : 100
Sujets : 24
Inscription : Aug 2014
Bonjour,
Je ne comprend pas d'ou tu sort ton 0xFF = b1111 1111 = 255 dec.
Ton registre pointer est codé sur 2 bits seulement. Donc max 0x03 = b00000011
Pour faire simple sans devoir toucher au Config Register et ton capteur ultrason connecter sur AIN1 car il est active par défaut.
1- tu envoi l'adresse en écriture
2- tu envoi 0x00 pour positionner ton pointeur sur Conversion register
3- tu envoi l'adresse en lecture
4- tu lis tes deux octets
Je ne peut pas t'aider pour le code car comme je l'ai déjà écris pour la communication I2C je passe par un Microcontrôleur.
J'ai déja lu a plusieurs reprise que le SMBUS i2c posais des problème pour l'envoie ou lecture de plusieurs octet de suite. Mais fonctionne très bien sur des composant simple comme un extender de port du style PCF8574. Fais une recherche sur le SMBUS tu auras plus d'info que moi la dessus.
Messages : 57
Sujets : 2
Inscription : Oct 2014
Bonjour
Citation :j'ai ensuite configuré i2c sur ma raspberry et ca c'est bon,
mais quand je fais sudo i2cdetect -y 1
la raspberry me renvoie un tableau vide
Pas de communication avec i2c, problème avec la soudure ou mauvais montage.
Messages : 39
Sujets : 6
Inscription : Apr 2015
j'ai essayé de faire ce que tu as dit david84, mais ca coince encore.
Code :
[== Indéfini ==]
import time
import smbus
Bus_I2C = smbus.SMBus(1)
Adresse_I2C_US = 0x48 # slave address donné via i2cdetect -y 1
Bus_I2C.write_quick(Address_I2C_US) #j'envoie slave address
Bus_I2C.write_byte(Address_I2C_US,0x00) #je positionne le pointeur sur Conversion Register
while True:
time.sleep(1)# attente d'une seconde
try:
tension=Bus_I2C.read_word_data(Address_I2C_US,0) #on lit la tension
print(tension)
except IOError:
print("Erreur de connexion i2c")
je sais que tu peux pas m'aider sur le code david84 mais peut etre quelqu'un d'autre j'espere..
Messages : 39
Sujets : 6
Inscription : Apr 2015
bon j'ai trouvé une solution, j'enverrai le code prochainement pour les curieux
Messages : 100
Sujets : 24
Inscription : Aug 2014
Hello,
Je te conseil de lire de la docs sur i2c, ex:
http://www.aurel32.net/elec/i2c.php
Les séquences d'adresse en ecriture ou de lecture, le start, les Ack NoAkc ou stp sont à bien comprendre dans i2c. Exemple l'adresse de ton composant change si il est en écriture ou en lecture, je ne sais pas si le SMBUS le fais automatiquement.
As tu su lire les deux octets de ton adc?
Mais tant mieux si tu as trouvé!
Pour le code i2c oui je suis assez curieux, à l'occasion si tu peux nous en faire part.
A plus!
Messages : 39
Sujets : 6
Inscription : Apr 2015
alors voici mon code mais il y a des problemes encore
Code :
[== Indéfini ==]
import time
import smbus
Bus_I2C = smbus.SMBus(1)
Adresse_I2C_US = 0x48 #
Bus_I2C.write_word_data(Address_I2C_US,0x01,0x8384) #j'indique que je prendrai l'entre A0 de mon ADC
Bus_I2C.write_byte(Address_I2C_US,0x00) #je pointe en conversion register
while True:
time.sleep(1)# attente d'une seconde
try:
tension=Bus_I2C.read_word_data(Address_I2C_US,0) #je lis la tension sur 2 octets
print(tension)
except IOError:
print("Erreur de connexion i2c")
mais voila les tensions analogiques qui sont ecrit sur mon terminal ne sont pas correct ca tourne autour de 62500 sur le terminal alors que sur mon oscilloscope je vois 100 mv

y a peut etre un deplacement des bits a faire, j'ai essayé tension=(tension & 0xFF) << 8 | (tension >> 8) mais non...
une idée?