Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

communication i2c
#1

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 Sad 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
Répondre
#2

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
Répondre
#3

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?
Répondre
#4

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
Répondre
#5

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?
Répondre
#6

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.
Répondre
#7

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.
Répondre
#8

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..
Répondre
#9

bon j'ai trouvé une solution, j'enverrai le code prochainement pour les curieux Wink
Répondre
#10

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!
Répondre
#11

alors voici mon code mais il y a des problemes encore Sad
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 Sad y a peut etre un deplacement des bits a faire, j'ai essayé tension=(tension & 0xFF) << 8 | (tension >> 8) mais non...
une idée?
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)