Vitesse Bus I2C et Bus SPI

Bonjour,

J'ai des questions sur la vitesse du bus I2C et du bus SPI.

Pour le Bus I2C:
Quelle est la vitesse maximale que le bus I2C de l'Arduino peut aller?
Combien de variable 8 bits (1 octet) au maximum peuvent être transféré en une seconde?
Quelle est la vitesse maximal en Hz du bus I2C?

Pour le Bus SPI:
Quelle est la vitesse maximale que le bus SPI de l'Arduino peut aller?
Combien de variable 8 bits (1 octet) au maximum peuvent être transféré en une seconde?
Quelle est la vitesse maximal en Hz du bus SPI?

Merci

Bonjour,

Avec mon accéléromètre LIS3LV02DQ on peut choisir 4 data-rate différent: 40Hz, 160Hz, 640Hz et 2560Hz.

Question 1) L'arduino est t-il suffisamment puissant pour faire fonctionner mon accel sur 2560Hz sur le bus I2C et le bus SPI?
Question 2) Avec un data-rate de 2560Hz on peut transféré combien de variable 8 bits (1 octet) par seconde?

J'ai besoin de le savoir car j'ai besoin de calculer les axes XYZ 60 fois par secondes.
Les axes XYZ sont = 48 bits = (16 * 3)
Alors j'ai besoin d'une capacité de transfère de 2880 bits par seconde.

Si je veux mettre 3 capteurs sur le même bus I2C.
Alors j'ai besoin d'une capacité de transfère de 8640 bits par seconde.

Question 3) Puis-je transférer au moins 8640 bits par seconde sur le bus I2C et le bus SPI de l'Arduino?

Merci

2560Hz c'est la fréquence à laquelle les données sont mises à jours dans les registres.
Une séquence de lecture des donnée c'est plus que 48 octets
1 octets de start
1 octet de status (pour savoir si les données sont pertinentes , overrun)
2 octets pour l'axe X
2 octets pour l'axe Y
2 octets pour l'axe Z
total 8 octets
débit nécessaire 2560 x 8 x 8 = 164 kbit/s

Maintenant si tu n'as besoin que de faire 60 mesures par seconde
débit nécessaire 60 x 8 x 8 = 3840 bit/s

Dans les deux cas l'arduino est assez rapide pour lire les données. Maintenant cela dépend aussi de ce que tu en fais. Car il faut ajouter le temps de traitement des données à la charge du processeur pour savoir si l'arduino est assez puissant.

Merci beaucoup pour tes explications fdufnews! :slight_smile:

Le but de l'arduino va être de fournir les axes XYZ à l'ordinateur par le port Sériel.
Tout les calcules complexe vont être exécuté sur le processeur du PC.
Alors le processeur de l'Arduino va avoir presque rien à calculer.

Le temps de traitement à ajouter va être le temps de transfère sur le port Sériel vers l'ordinateur.
Le baud rate le plus rapide est = 115200 bits/s.

débit nécessaire 2560 x 8 x 8 = 164 kbit/s

Puis-je transférer aussi 164 kbit/s sur le bus I2C et le bus SPI de l'Arduino?

Merci

Bonjour Demss,

Quand tu dis :

l'Arduino va avoir presque rien à calculer

, va t-il servir à quelque chose ?

Si cela n'est pas le cas, fait directement l'acquisition des données du bus sur le PC, tu gagneras en débit. La liaison RS232/USB entre l'arduino et le PC va constitué un goulet d'étranglement au transfert des infos.
Nota : c'est très facile de réaliser une interface //-I2C pour PC --> 1 CI + 6 ou 7 resistances ...

A+

Bonjour Bidouille,

oui c'est une bonne idée de pas utiliser l'Arduino. :slight_smile:

Si je communique avec le PC ça va être avec bluetooth.

Les modules bluetooth communique sur le bus Serial avec les broches TX et RX.
Alors si je branche le capteur I2C sur un convertisseur "Serial à I2C" et "I2C à Serial" et que ce convertisseur soit brancher sur le module bluetooth on peut faire une connection I2C à PC.

Pour le convertisseur j'ai trouvé ça:
http://www.eletronica.org/modules.php?name=News&file=print&sid=139

Je sais pas combien de capteur on peut brancher sur un bus I2C?
Car je veux utiliser plusieurs capteurs 2 accéléromètres, 2 gyroscopes et 2 magnétomètres pour calculer des mouvements plus complexe.
ça fait 6 capteurs. Et même après si ça fonctionne je veux mettre encore plus de capteur pour calculer des mouvements encore plus complexe.

Je pensais utiliser 2 ATmega328 et mettre 3 capteurs sur chacun des bus I2C des ATmegas.
Ensuite l'ATmega qui est pas relier au module bluetooth va communiqué sur le bus Serial ces données sur l'autre ATmega et l'ATmega qui est relier au module bluetooth va communiqué sur le bus Serial ces données au module bluetooth.

Je me base un peu sur cette carte car il y a 2 capteurs brancher sur le bus I2C d'un ATmega.

Combien de capteur on peut brancher sur un bus I2C de PC et sur le bus I2C de l'arduino?

Puis-je transférer 164 kbit/s sur le bus I2C et le bus SPI de l'Arduino?

Merci

I2C n'est pas limité en terme de périphérique, juste en terme d'adresse : codée sur 7 bits donc je te laisse faire le calcul ...
Pour SPI, je ne sais pas.

Le premier problème, c'est que tout le monde ne peut pas causer en même temps donc, plus tu mets de périphérique, moins il reste de temps à l'arduino pour consulter les autres.

Le second, c'est qu' il faudrait regarder en détail la librairie wire ( et celle pour SPI ) afin de voir s'il n'y a pas une limite "logicielle" du débit...

Ensuite, il y a le reste du programme que l'arduino doit executer comme cela a déjà été dit : des traitements ( limités d'après ce que tu écris ) et surtout, le transfert vers le PC ...

Avec tout ça,tu peux peut être faire un calcul de la limite mais ça me semble plutot audacieux.

Comme tu as déjà un accélérateur, le plus simple, c'est peut être de faire une routine de lecture-traitement-transfert et de la faire tourner en permanence. Sur ton PC, tu fais une routine pour regarder en combien de temps tu reçois X données et tu auras ainsi un ordre d'idée de ce que ça peut donner.
Il faudra cependant mettre un bémol car un montage en volant avec des liaisons courtes ne sera peut être pas représentatif de l'utilisation finale et de grandes longueurs de cable ( peripherique-arduino ) risquent d'obliger à baisser le débit des échanges.

A+

Merci Bidouille pour tes commentaires! :slight_smile:

Si j'ai bien comprit.
Alors un bus I2C peut avoir 128 adresses différente.
Alors je peux avoir 128 périphériques différent si ces périphériques on pas la même adresse I2C.
Ce qui veut dire que je ne peux pas mettre 2 capteurs pareille car leur adresse I2C serait la même.

Pour le problème 1) J'ai pensé utiliser 2 ATmega328 et mettre 3 capteurs sur chacun des bus I2C des ATmegas.
Comme ça on va avoir 2 capteur qui vont causer en même temps.

Pour le problème 2) Pour le bus I2C, j'ai vue que la limite logicielle du data-rate est de 100kHz.

Si on veut avoir limite du data-rate encore plus rapide (400kHz) on peut faire ça:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241668644

the atmega-hardware can do 400 KHz, but you have to tweak the Wire-library in file hardware/libraries/Wire/utility/twi.h.
Near the top of the file you see : Code:

#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

If you change that to
Code:

#ifndef TWI_FREQ
#define TWI_FREQ 400000L
#endif

The I²C bus should run at 400kHz
But you also have to the delete the files
hardware/libraries/Wire/Wire.o
hardware/libraries/Wire/utility/twi.o
because the library must be re-compiled before it uses the new speed.
(This is done automaticaly when you open the Arduino-IDE)

Pour le bus SPI, j'ai vue que la limite logicielle du data-rate est de 4MHz.

SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230552568

If you look at the SPIEEPROM tutorial, it says the setting the SPCR to max gives you 4Mhz comm speed.

16 bit is actually pretty easy, its in the SPI EEPROM tut as well in these lines of code

spi_transfer((char)(EEPROM_address>>8)); //send MSByte address first
spi_transfer((char)(EEPROM_address)); //send LSByte address

you'll have define the spi_transfer() function (surprise its in the tutorial as well)

Je pense bien que le transfère de données du bus I2C est suffisamment rapide pour transmettre les données au PC.

Pour les calcules précis je vais regarder ça.

Merci
A+

Bonjour,

"Chapeau" pour tes recherches sur ce sujet : c'est vraiment interessant !

Pour I2C :

Ce qui veut dire que je ne peux pas mettre 2 capteurs pareille car leur adresse I2C serait la même

Pour le LIS3LV02DQ en I2C, j'ai bien peur qu'il n'ait qu'une adresse fixe ( pas tout lu la datasheet ...) contrairement à beaucoup de périphériques qui ont entre 1 et 3 bits qui peuvent être connectés comme on veut. Par exemple, le PCF8574 ( 8 I/O ) a les bits A0, A1 et A2 qui peuvent être reliés à la masse ou au +5V. Ca permet d'en mettre 8 en service sans "bricolage".
Si tu veux tourner avec I2C, il faut rajouter un "pavé" pour adresser le périphérique que tu veux mais ça va ralentir ton système puisqu'il faudra gèrer cet "aiguillage".

Bon courage pour la suite de ton projet.

Bonjour Bidouille et merci pour tes encouragement! :slight_smile:

Si tu veux tourner avec I2C, il faut rajouter un "pavé" pour adresser le périphérique que tu veux mais ça va ralentir ton système puisqu'il faudra gérer cet "aiguillage".

C'est pour quand on a 2 capteurs qui ont la même adresse I2C?

Je me cherche un régulateur de tension 3.3V et un régulateur de tension 5V pour le soudage en surface mount.

Je cherche à avoir des régulateur en surface mount qui font la même chose que c'est 2 régulateurs.

J'ai trouver c'est 2 là, sont t-il correcte?

Je veux que le régulateur 3.3V puisse convertir une tension de 5V à 9V en 3.3V. pour alimenter mes capteurs.
Et je veux que le régulateur 5V puisse convertir une tension de 7V à 9V en 5V. pour alimenter mes ATmega328.

Merci

Bonjour,

C'est pour quand on a 2 capteurs qui ont la même adresse I2C?

Oui. Une autre solution consiste à utiliser les sorties libres de l'arduino pour "connecter" le composant à adresser. Je vais regarder la datasheet pour voir si c'est faisable.

Pour les régulateurs, pas de problème, ça convient ( voir en détail les datasheet ) par contre, fait gaffe car les regulateurs pour montage en surface sont limités à 250mA.

A+

Si tu es sous 5V et que tu veux passer sous 3,3V, tu risque d'être une peu court, à cause du dropout du régulateur 3,3V, l'idéal serait de convertir une tension de 7V en 3,3V

Même chose si tu es sous 7V et que tu veux passer sous 5V, il vaut mieux partir d'une tension mini de 8V.

Ou alors trouver des régulateur low-dropout, mais c'est cher et l'intensité est faible.

Pour le 3.3V j'utilise ça :

BA033

Autrement toute la série des 780Xxx est bien.

Merci beaucoup pour ton aide Bidouille! :slight_smile:

J'ai hâte de voir si c'est faisable!

Merci à toi aussi Jean-François pour ton aide! :slight_smile:

Sur ce tutorial, j'ai vue que pour mon MCP1702 3.3V Regulator j'ai seulement besoin de 3.85V en input pour avoir 3.3V en output.
http://core.st/projects/AVR32_Starter_Kit/3_3_V_power_cheap.html

3.85V to 13.2V input

Alors je me demande si 7V en input serait suffisant pour mon MCP1702 5V Regulator pour avoir 5V en output?

Souvent dans les sites que j'ai lu, le monde disent que pour un régulateur 5V ont doit mettre 7V ou autour de 7V.

Il faudrait surement faire le test pour savoir si 7V c'est suffisant pour un output de 5V.

Moi je veux utiliser une batterie 7.4V.
Le voltage de la batterie ira pas sous les 7V.
Alors ma batterie va être entre 7V à ~8.6V.
https://duraliteflightsystems.com/index.php?route=product/product&product_id=168

Merci

Bon, à la lecture de la datasheet, en mettre plusieurs n'est pas très simple car il n'y a pas de "Chip Select" à proprement parler.
Celui qui éxiste sert à définir le type de bus utilisé : I2C ou SPI.

Regardes ce liens : http://www.embeddedrelated.com/usenet/embedded/show/104020-1.php

Certains propose en fait de travailler en SPI uniquement et dans ce cas, d'activer le CS de l'accéléromètre qui t'interesses.

L'autre grande tendance, est "d'aiguiller" une des ligne du bus avec un circuit genre 4051 ( 1 vers 8 ) ou autre ... ils parlent de 74*138 mais ça doit être du TTL et donc ça ne doit pas fonctionner en 3,3v.

A+

Merci Bidouille pour ta recherche! :slight_smile:

Je pense qu'avec le PCA9547 ça pourrait fonctionner pour mettre 8 capteurs avec la même adresse. Le voltage qu'il supporte est entre 2.3V à 5.5V.

Oui la solution de mettre les capteurs sur le bus SPI est aussi une bonne solution (mais à tester).
On branche la broche CS de 2 capteurs sur 2 entrées digital de l'arduino et quand on veut parler au capteur 2 on met l'option CS du capteur 1 sur l'option I2C et on met le capteur 2 sur l'option SPI.

Ou la solution de mettre les capteurs sur le bus I2C est aussi une bonne solution (mais à tester).
On branche la broche CS de 2 capteurs sur 2 entrées digital de l'arduino et quand on veut parler au capteur 2 on met l'option CS du capteur 1 sur l'option SPI et on met le capteur 2 sur l'option I2C.

Et bien sure on peut brancher un capteur sur le bus I2C et brancher le deuxième capteur sur le bus SPI.
Les 2 capteur vont pouvoir causer en même temps.
Mais cette technique fonctionne seulement pour 2 capteurs avec la même adresse.

Pour les régulateurs de voltage, j'ai regarder les datasheet mais je sais pas où on peut lire entre quel et quel voltage on peut avoir l'output désiré (3.3V et 5V).
Cela est t-il écrit dans les datasheet?
Car je veux pas être obligé d'acheter tous les régulateurs et de tous les tester pour le savoir.

Merci