Soucis avec Arduino Uno et l'inclinomètre de Murata SCA103-D04 en SPI

Bonjour à tous,

je travaille actuelement sur un petit projet qui consiste à determiner un angle d'inclinaison à l'aide du capteur SCA103T-D04 de Murata.

J'utilise l'arduino comme micocontrolleur et j'tulise l'interface SPI pour lire les données.

J'ai fait les connections suivantes :

  • la broche 13 de Arduino avec la broche 1 de l'inclinometre.

  • la broche 12 de Arduino avec la broche 3 de l'inclinometre.

  • la broche 11 de Arduino avec la broche 4 de l'inclinometre.

  • la broche 10 de Arduino avec la broche 7 de l'inclinometre.

  • la broche 12 de l'inclinometre à la broche 5v de Arduino.

  • la broche 6 de l'inclinometre à la broche GND de Arduino.

En piece jointe une image du cablage et le Data sheet du capteur que j'utilise

J'utilise le code suivant pour établir la communication entre Arduino et le capteur :

/*
Programme de lecture des données
Alimentation de 5 V via Aruino
Dout=RDAX-RDAY
Angle  = arcsin((Dout-Dout0)/Sens)
Dout0=0
Sens=6554(Pour le SCA103T-D04)

Serial communication, data output program
* CS - to digital pin 10 (SS pin)
* SDI - to digital pin 11 (MOSI pin)
* SDI - to digital pin 12 (MISO pin)
* CLK - to digital pin 13 (SCK pin)
*/

#include <SPI.h>
#include <math.h>

const int csbPin = 10;

void setup() 
{
// Defini la broche 10 en sortie 
pinMode (csbPin, OUTPUT);
// initialise le  SPI:
Serial.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
delay(1000);
}

void loop() {
int RDAX,RDAY;   // Valeurs en X et en Y données par l'inclinometre
double angle;      // Variable de l'angle
digitalWrite(csbPin,LOW);
RDAX=SPI.transfer(0x10); // Lecture de la valeur en X
RDAY=SPI.transfer(0x11); // Lecture de la valeur en Y
Serial.print("Valeur de X : ");
Serial.println(RDAX);  // Affichage de la valeur de X
Serial.print("Valeur de Y : ");
Serial.println(RDAY);  // Affichage de la valeur de Y
angle=asin(((RDAX-RDAY)-0)/6554);
Serial.print("Valeur de l'angle : ");
Serial.print(angle);
digitalWrite(csbPin,HIGH);
delay(1000);
}

Le code s'execute sans probleme mais j'obtiens pour 4 Cycles ces Valeurs :

Valeur de X : [0 0 0 0]

Valeur de Y : [123 124 125 126 ]

Valeur de l'angle : [0 0 0 0 ].

Le soucis est que en position horizontale j'aurais du Obtenir :

Valeur de X : 1024

Valeur de Y : 1024

Valeur de l'angle : 0.

je ne sais pas si c'est parce que je n'ai pas mis le condensateur de 100nF à la broche 12 (Vcc) de l'inclinometre ou si il y'a une erreur dans mon code.

A l'aide d'un multimètre j'ai vérifié que l'alimentation etait bien de 5v mais elle est environ 4,9 V . je ne sais pas si cela peut aussi etre source de problèmes.

Lorsque je déplace le capteur il ya une variation de la valeur en Y mais toujours pas de l'ordre souhaité.

Comment puis je déterminer d'ou provient l'erreur ou éffectuer un test sur mon capteur ?

Merci à tous de bien vouloir m'aider.
naturox

Img01.png

sca103t_inclinometer_datasheet__8261700a3_0.pdf (582 KB)

euh... j'ai quelques doutes....

  • la broche 13 de Arduino avec la broche 1 de l'inclinometre.
  • la broche 12 de Arduino avec la broche 1 de l'inclinometre.
  • la broche 11 de Arduino avec la broche 1 de l'inclinometre.
  • la broche 10 de Arduino avec la broche 1 de l'inclinometre.

Bonjour et Merci,

C'est juste une erreur du au copier coller que j'ai fait en saisissant.

J'ai corriger le post.

Merci pour la remarque.

envisagez de mettre c1 très près du composant plutôt que de votre arduino - quasiment au contact

Salut J-M-L

vu que j'ai pas encore le condensateur sous la main (J'ai dabord effectué un cablage sans le condensateur de 100nF ), doit je sous entendre que c'est lui qui est source du problème ?.

Merci
naturox

A l'aide d'un multimètre j'ai vérifié que l'alimentation etait bien de 5v mais elle est environ 4,9 V . je ne sais pas si cela peut aussi etre source de problèmes.

Cette variation de 2% n'a pas lieu de vous inquiéter.

Pour le condensateur de découplage, c'est un "must", suivant la note d'application.

Pour la trigo: vous avez des problèmes de conversion, que je peux reproduire sur mon PC (avec la solution si vous voulez qu'il ne sorte pas des angles toujours nuls -c'est rasant-

sh-4.1$ cat  trigo.cpp
#include <math.h>
#include <stdio.h>
#include <stdint.h>

int16_t RDAX=0, RDAY= 125;
int main() {
float angle=asin(((RDAX-RDAY)-0)/6554);
printf("%f\n", angle);
//   avec des conversions, ça va mieux
float nangle = asin((float (RDAX-RDAY)-0.0)/6554.0);
printf("%f\n", nangle);
}
sh-4.1$  g++ trigo.cpp && ./a.exe
0.000000
-0.019073

Merci a toi dbrion06 pour tes éclaircissements.

J'integre la conversion au code.

Reste à aussi savoir pourquoi la valeur en x et celle en Y tres loin de 1024 attendu pour une postion a l'horizontale.

Cordialement
Naturox.

"Reste à aussi savoir pourquoi la valeur en x et celle en Y tres loin de 1024 attendu pour une postion a l'horizontale. "

JML et moi (sans concertation) pointions le condensateur de découplage.
Reste une horreur ayant échappé à deux paires d'yeux: laisssez faire le temps et relisez vous tranquillement...

dbrion06:
Reste une horreur ayant échappé à deux paires d'yeux: laisssez faire le temps et relisez vous tranquillement...

j'ai arrêté de lire quand l'OP modifie sans cesse son premier post... ce fil devient incompréhensible

Salut à tous

Je m'excuse pour l' erreur dans mon post. Si je m'y prends mal priere de m'orienter. J'ai modifié mon post juste au départ après que l'on m'ai fait la remarque que j'avais mis des "1" partout au niveau de la saisie des broches connectées du capteur.

ensuite je repondais en cliquant sur "Reply". je sais pas si c'est a cause de cela que vous considerez que je modifie le post sans cesse.

Je vais relire tout les post

En attendant je vais me signaler a nouveau aprés avoir mis le condensateur de 100nF. pour clore le sujet.

Merci bien à tous ceux qui m'ont aidé.