Le système Arduino

L’espace pour parler de tout ce qui concerne l’électronique embarquée
Avatar de l’utilisateur
laurent0091
Messages : 188
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonjour à tous,
pour commencer cette nouvelle année, voici un nouveau post autour du système Arduino.
cette fois-ci je vais vous présenter un module complémentaire qu'il est très facile de mettre en oeuvre, un accéléromètre 3 axes.
Ce module a été acheté chez Lextronic sour la référence SEN-09269.
http://www.lextronic.fr/P5722-module-ac ... -axes.html

Ce module basé sur l'accéléromètre d'Analog Device, est mis en oeuvre et directement exploitable par la société Sparkfun. Vous trouverez toutes les données techniques sur le lien ci-dessous
https://www.sparkfun.com/products/9269

Image

Comme le montre les données techniques, son alimentation est normalement de 3,3V. Après avoir consulter certains forums, je me suis permis de l'alimenter en 5V pour avoir une meilleure sensibilité. Libre à vous de faire ce que vous voulez.

D'une surface inférieure à 2 cm² sa mise en oeuvre est extrêmement simple puisque dans cet exemple, seulement trois fil sont nécessaires, +vcc, la masse, le signal (celui de coordonnée X).
C'est la carte Arduino elle même qui va alimenter la capteur qui , elle-même sera alimentée par le câble USB.

Image

Pour mettre en oeuvre la carte Arduino, le programme n'a besoin que de 6 lignes actives, on ne peut pas dire que c'est beaucoup. Pour visualiser les informations, il suffit d'utiliser le terminal série du logiciel de programmation.
C'est très pratique pour le débogage, et personnellement je l'utilise pour voir les valeurs de variables et ainsi déterminer les seuils de déclenchement par exemple.

Image

Voyons de plus prêt le programme, tout ce qui est précédé de "//" ne sert que de commentaire.

Définition du programme :

Pour cette partie, aucune ligne active, ce n'est que du commentaire.

Code : Tout sélectionner

// --- Programme Arduino ---
// par Laurent H. - 04/08/2012
// --- Le programme ---
// adxl335 --> Arduino --> Terminal serie

// --- Fonctionnalités ---
// Utilise 1 entree analog pour adxl335
// Utilise le terminal série pour retour information

// --- Connexions du circuit ---
// ADXL335 sur A0 
Entête déclarative :

Code : Tout sélectionner

//**************** Entête déclarative *******
// --- Librairies utilisées ---

// --- Déclaration des constantes ---


// --- constantes des broches ---
const int VA0 = 0;// declaration constante de broche adxl335

// --- Déclaration des variables globales ---
int ANL_ADXL = 0; // variable pour angle adxl

// --- Déclaration des objets ---
ici, deux lignes actives, VA0 détermine le port analogique utilisé pour raccorder le capteur.
La variable ANL_ADXL est déclarée pour "capturer" l'angle du capteur.

Code d'initialisation :

Code : Tout sélectionner

//**************** FONCTION SETUP = Code d'initialisation *****
// Exécutée en premier et 1 seule fois, au démarrage du programme
void setup() { // debut de la fonction setup()
// --------Attachement des objets--------

// ------- Broches en entrée -------

// ------- Broches en sortie -------

// ------- Activation d'état initial des sorties numériques -------

// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------

// ------- Activation du terminal serie ------
Serial.begin(9600);

} // fin de la fonction setup()
// ********************************************************************************
Une seule ligne active, l'activation du port série.

Boucle du programme principal :

Code : Tout sélectionner

void loop(){ // debut de la fonction loop()
// --- Programme principal --- 
// acquisition conversion analogique numérique (100µs env.) 
//sur broche analogique indiquée - résultat 10bits (0-1023)
ANL_ADXL = analogRead(VA0);// capture de la variable mesuré sur  l'adxl335
Serial.print("Valeur brute = ");// Affichage de l'intitulé "Valeur brute"
Serial.println(ANL_ADXL);// Affichage de la variable mesurée
delay(2000); // temps entre chaque affichage de 2 secondes
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************
// --- Fin programme ---
La boucle principale ne comporte que 4 ligne actives :
- la capture de l'angle dans la variable.
- Affichage sur le terminal série "Valeur brute"
- Affichage de la valeur de la variable.
- Temporisation de 2 seconde

Et voilà... le programme est finie et on recommence...

Comme on peut le voir sur le terminal série, trois valeurs "sortent du lot" :

Capteur à 0° = 512
Capteur à -90° = 395
Capteur à +90° = 623

Voilà pour cette petite présentation, maintenant il faut faire évoluer le programme pour y intégrer un servomoteur et voir ce que ça donne au niveau sensibilité.
Vous pouvez retrouver un article complet de ce module sur mon site :

http://diopter.fr/index.php/technique/s ... et-arduino

Laurent
Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Le système Arduino

Message par Geeks »

Plop Laurent,

Bonne année 2013 :fete:

Pour commencer, je te félicite pour ton post clair. Beaucoup plus limpide que je ne l'aurais fait !
Moi qui hésitais à utilisé un tel capteur, tu m'a convaincu de ses possibilités. J'espère voir l'évolution avec le rattrapage des commandes d'un servo.

Voie radio -> montage (modification par capteur) -> servo

En gros est-il possible de rectifier le tir avec un tel montage. Voila, je n'étant pas plus ma demande, je suppose que d'autre avait, comme moi, compris l'intérêt de cette présentation. :Up:

Amitiés.
Alex.
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Avatar de l’utilisateur
laurent0091
Messages : 188
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonjour à tous et bonne année,
Bonjour Alex.

L'objectif final de ce composant est bien sur de l'utiliser pour un correcteur d'assiette.
Actuellement j'utilise une masse en plomb avec des contacts de chaque côté, c'est rustique mais très efficace, la correction n'est pas proportionnelle mais je ne pense pas que ça soit nécessaire si le modèle a une vitesse d'avance modérée dit de patrouille. C'est une autre histoire pour les modèles de vitesse. Je vais vérifier l'angle de déclenchement de mon système actuel et je vais intégrer au programme un servomoteur...

Laurent
Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Le système Arduino

Message par Geeks »

Ok, je comprends.

N'hésite pas à nous indiquer ton avancé.

Moi, pour le moment, question Arduino, il faudrait que je trouve le temps de travaillé un peu sur ma radio. Hélas, un autre projet de très longue halène est entrain de prendre le pas.

Malgré ça, je continu à espéré continuer le mini 02, la radio... enfin bon voila, vie très occupée.
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Zool
Messages : 4
Inscription : 04 févr. 2013 00:15

Re: Le système Arduino

Message par Zool »

J'ai droit à une question conne ?
Bah, tant pis je la pose, au moins j'augmente mes chances d'avoir une réponse claire...
Concernant les cartes multiwii qu'on peut voir sur : http://www.multiwii.com/

Il semble que tout est rassemblé sur cette petite carte (ou presque) gyro, magneto, accélrometer et baromètre...
Ne serait-il pas possible de l'adapter à nos soums ?

j'ai un peu cherché déjà sur google, j'ai juste eu une réponse dans un topic, disant que c'est trop compliqué... :frust:
Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Le système Arduino

Message par Geeks »

Si j'ai bien lue, Multiwii est un éditeur logiciel. C'est donc pas la partie hardware (la carte, les composants), mais un soft générique à adapter en fonction des paramètres de la carte.

Ceci étant, l'idée suivante peut-être concidéré:
Si on sait de quoi on va avoir besoin dans une application, si on sait la géré, on peut se créer une carte générique avec accéléro, relais, servo etc et une librairie. Je saurais faire le schéma, la librairie. éventuelement le montage électronique et sa programmation générale sous arduino.

mais avons-nous besoin de ce concept dans tous nos soums ?
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Avatar de l’utilisateur
papy94
Messages : 654
Inscription : 23 janv. 2010 14:31
Localisation : Champigny sur marne
Contact :

Re: Le système Arduino

Message par papy94 »

salut

j'aurais besoin de vos lumières, je n'arrive pas a trouver (surement parce que je n'y connait rien ) un capteur de pression asses precis pour fonctionner avec ARDUINO

il me faut de 0 a environ 1bar, tension alimentation 5v maxi, pour aller avec l'arduino (un minimum de composants a rajouter) , mais avec une sensibilité de l'ordre 1 a 2 centimètres maxi,ceux que j'ai essayé ne sont pas assez précis

ce que je veux faire avec, c'est : (exemple)
En surface il donne l'ordre a mon périscope de rentrer
En dessous de 0 et au dessus de 5 cm mon périscope est sortie
En dessous de 5 cm mon périscope est rentré
En dessous de 2 mètres il donnera l’ordre a mon servo de ballaster
ect....

j'ai bien trouvé sur cette page des capteurs , mais quand je lit la documentation ,je suis perdu avec toutes ces données

il y a aussi cette page et le catalogue

donc si vous avez une référence de capteur qui irait bien, ce serait cool

merci d avance


PS: Quand je dis 1 bars, c'est énorme, 0.3bars suffirait, mais il ne faut pas que le capteur se détériore si le soum allait plus profond en cas de panne
Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Le système Arduino

Message par Geeks »

Je pense qu'il ne faut pas s'emballer trop vite.

Il te faut déjà une interface entre le capteur et la carte pour avoir une mesure correcte. Tu peux t'appuyer sur ce type de montage : Nautile 1/8 > Électronique > Capteurs. Descend dans la page, il y a un montage autour du MPX 2200 je crois.

bon à partir de là, il te faut faire un essai in-situe. Ce n'est pas la chose la plus facile. Commence par te faire un caisson étanche, tu y mettras ta carte électronique et ton capteur. Tu ressors avec les fils (+), (-) et (signal). A ce stade c'est de l'analogique.

Bien sûr ton capteur est relié avec l'eau. Comme dans un soum quoi.

Ensuite, tu fais tes tests d’immersion. Tu essaies de relever les valeurs au travers de ton bus série type USB. C'est à dire la valeur numérique d'une des pins d'un des ports analogique. C'est une valeur qui devra évoluer entre 0 et 1023. Parce qu'on utilise le CAN (Convertisseur Analogique Numérique) de la carte arduino. A ce moment là, en surface tu auras par exemple 10. A 5 cm tu auras 15, à 2 mètres tu auras 70... Bon et bien tu te fais un petit tableau de valeur et quand tu as quelque-chose de cohérent on verra comment adapter tout ça.

Je rappelle les points suivants.
1/ Quand tu testeras le montage capteur + arduino. Pense à faire le test hors d'eau et surtout déconnecter du PC. Si t'as un court-circuit ça évitera de casser ton pc inutilement.
2/ En présence d'eau fais attention à ton matériel. Prévois de travailler au sec sur ton pc. C'est aussi pour ça que si tu peux, essaie de prévoir un minima contre les éclaboussures.
3/ Toujours vérifier en dehors de l'eau que le capteur et le montage fonctionne. En soufflant dans un tube raccordé sur le capteur par exemple.
4/ Si ton capteur avait été 100% numérique, je t'aurais dit de rajouter des isolations galvaniques (4n25 ça le fait bien). mais là, c'est de l'analogique donc t'en a pas besoin.

Voila déjà je pense avoir fait le tour théorique de la chose. Il faut voir maintenant par y aller par petit bout. Essaie hors d'eau, si ça marche, go le tube et les essais in situ. :Up:
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Avatar de l’utilisateur
papy94
Messages : 654
Inscription : 23 janv. 2010 14:31
Localisation : Champigny sur marne
Contact :

Re: Le système Arduino

Message par papy94 »

merci GEEK
je n'ai pas bien compris; il me faut amplifier le signal, ou stabiliser l'alimentation, car j'arrive très bien sans composants a faire fonctionner un capteur sur l'arduino, mais il n'est pas asses précis

je te met ici une copie de mon post ,c'est ce que j'ai fait ,cela fonctionne très bien,juste un manque de précision ,et c'est pour cela que je recherche un autre capteur


-----------------------------------------------
je bricole un peu avec l' arduino, et en me servant d'exemples trouvés a droite et a gauche sur le web, j'ai fait un petit système de sécurité
le principe, si une entrée d'eau ou une profondeur trop importante, le servo du presse durite, se met en position relâché et donc le soum devrait remonter
_ tant qu'il n'y a pas d'entrée d'eau ou de profondeur max atteinte la radio commande le servo
_Si une entrée d'eau, le servo se met en position vidange ballast, et la radio n'a plus d'effet sur le servo
_Si la profondeur max est dépassée, le servo se met en position vidange ballast, et la radio n'a plus d'effet sur le servo, si la profondeur repasse au dessus de la profondeur max, la télécommande reprend le contrôle

Une petite vidéo :


Le câblage :
Image
Les composants :
Image
Le code du programme :

Code : Tout sélectionner

/*=========================================================================
                           CAPTEUR PRESSION + DETECTEUR D EAU 
Commande un servo à l’aide d’un capteur de pression MPX10GP et d un detecteur d eau
La profondeur Max pourra être modifiée en faisant varier le 5  de la ligne:
"Profondeur_Max = ((pression_Max-((pression_Max-pression_Min)/2))) + 5 ;// défini la profondeur max (valeur capteur de pression + 5 
(Valeur théorique du Signal_Capteur =495 à 525)
 =========================================================================*/
#include <SoftwareServo.h>            // Appel de la librairie servo
SoftwareServo servo_1;                // Déclare le servo 
const int Led = 0;                    // Déclare la sortie LED sur le pin 0 (Pin 0 pour AtTyni85)
const int Signal_Capteur = 1;         // Déclare la variable (Signal_Capteur) sur le pin 2. Le Capteur sera branché ici (Pin 2 pour AtTyni85)
const int Signal_Recepteur = 3;       // Déclare la variable (Signal_Recepteur) sur le pin 3. Le récepteur voie 6 sera branché ici  (Pin 3 pour AtTyni85)
const int Signal_Detecteur = 1;       // Déclare le fil du détecteur (Signal_eau) sur le pin 1 (Pin 1 pour AtTyni85)

int Val_SignalCapteur;                // Variable pour stocker la valeur lue sur le capteur de pression
int Val_SignalRecepteur;              // Variable pour stocker la valeur lue sur le Récepteur voie 6
int Angle_Servo = 0;                  // Déclare la variable (Angle_Servo)
int Angle_Servo_vidange = 90;         // Déclare la variable (Angle_Servo_vidange)
int Profondeur_Max = 0;               // Déclare la variable (Profondeur_Max)
int pression_Max = 0;                 // Déclare la variable pression Max lue par le capteur de pression
int pression_Min = 0;                 // Déclare la variable pression Min lue par le capteur de pression


//=========================================================================
void setup() 
{ 
  pinMode(Signal_Capteur, INPUT);         // Déclare la variable Signal Capteur en entree
  pinMode(Signal_Recepteur, INPUT);       // Déclare la variable Signal Recepteur en entrée
  servo_1.attach(4);                      // Attache le servo au pin 4   (Pin 4 pour AtTyni85)
  
  pinMode(Signal_Detecteur, INPUT);       // Déclare la variable Signal detecteur eau en entrée
  pinMode(Led, OUTPUT);                   // Déclare le pin "Led" en sortie  
  digitalWrite(Signal_Detecteur, HIGH);   // Activation du pull-up interne pour le detecteur d eau


 // calibration du capteur de pression pendant les 5 premieres secondes
  while (millis() < 5000) { 
     Val_SignalCapteur = analogRead(Signal_Capteur);            // Lit la valeur du Capteur de pression
    // Enregistre la valeur Max lue par le capteur de pression 
    if (Val_SignalCapteur > pression_Max) {pression_Max = Val_SignalCapteur;}
 
    // Enregistre la valeur Mini lue par le capteur de pression 
    if (Val_SignalCapteur < pression_Min) {pression_Min = Val_SignalCapteur;}
  }  //---fin calibration capteur de pression
  Profondeur_Max = ((pression_Max-((pression_Max-pression_Min)/2))) + 5 ;// défini la profondeur max (valeur capteur de pression + 5
} 

//=========================================================================
void loop() 
{ 
  noInterrupts();  
  //-----------------test Detection eau-----------------
   if (digitalRead(Signal_Detecteur)){  //------------ si pas de contact-----------
               
          //-----------------test profondeur---------------- 
          noInterrupts();                                            // Désactive les interruptions
          Val_SignalCapteur = analogRead(Signal_Capteur);            // Lit la valeur du Capteur de pression
          if (Val_SignalCapteur  < Profondeur_Max) //--------si pression capteur < Profondeur_Max défini-------------- 
           { //lire Val_SignalR du Recepteur
            Val_SignalRecepteur = pulseIn(Signal_Recepteur, HIGH, 30000);  // Donne à la variable (Val_SignalR) la valeur de (Signal_Recepteur) lue sur le pin 3
            interrupts();                                                  // Réactive les interruptions
            Angle_Servo = map(Val_SignalRecepteur, 1100, 1800, 45, 135);   // Calibre des valeurs de pour le servo de 0 à 180°  
            Angle_Servo = constrain(Angle_Servo, 45, 135);                 // Fixe les valeurs minimum et maximum en degré de monservo
            servo_1.write(Angle_Servo);                            // Positionne le servo   
            delay(15);                                             // Délai pour que le servo atteigne sa position
            digitalWrite(Led, LOW);                                // Eteindre la Led sur le pin 0 (Pin 0 pour AtTyni85)
            SoftwareServo::refresh();                              // Rafraîchissement bibliothèque servo
           
         }else{     //-------------si pression capteur > Profondeur_Max ------------------
            interrupts();                                          // Réactive les interruptions
            servo_1.write(Angle_Servo_vidange);                    // Positionne le servo en vidange
            digitalWrite(Led, HIGH);                               // Allume la Led sur le pin 0 (Pin 0 pour AtTyni85)
            delay(15);                                             // Délai pour que le servo atteigne sa position
            SoftwareServo::refresh();                              // Rafraîchissement bibliothèque servo
           } //-----------------fin test profondeur----------------    


  }else{  //----------- si contact-------------------------
      interrupts();                                          // Réactive les interruptions
      servo_1.write(Angle_Servo_vidange);                    // Positionne le servo en vidange
      digitalWrite(Led, HIGH);                               // Allume la Led sur le pin 0 (Pin 0 pour AtTyni85)
      delay(15);                                             // Délai pour que le servo atteigne sa position
      SoftwareServo::refresh();                              // Rafraîchissement bibliothèque servo
      }  //-----------------Fin Detection eau-----------------

//========================== FIN DU PROGRAMME=============================
 }
------------------------------------------------------------------------------------------------------------------------------

j'ai modifié mon truc et maintenant avec une voie ,je peux régler la profondeur désirée
voie 6 (inter 3 positions sur émetteur) ,je commande mon servo ballast
voie 7 (potentiomètre rotatif sur émetteur), je commande la profondeur sous laquelle je ne veux pas descendre

Le nouveau câblage : j'ai retiré la led, déplacé la prise du servo et rajouté l’entrée voie 7 (cela m'a pris 5 secondes)
Image

Les composants :
ce sont les mêmes

Le code du programme : modifié

Code : Tout sélectionner

/*=========================================================================
                           CAPTEUR PRESSION reglabe avec emetteur + DETECTEUR D EAU 
Commande un servo à l’aide d’un capteur de pression MPX10GP et d un detecteur d eau
La profondeur Max pourra être modifiée en faisant varier la valeur profondeur maxi avec la voie 7:
(Valeur théorique du Signal_Capteur =495 à 525)
 =========================================================================*/
#include <SoftwareServo.h>            // Appel de la librairie servo
SoftwareServo servo_1;                // Declare le servo (Pin 0 pour AtTyni85)
const int Signal_Reglage = 4;         // Declare la variable (Signal_Reglage profondeur) sur le pin 4. Le récepteur voie 7 sera branche ici (Pin 4 pour AtTyni85)
const int Signal_Capteur = 1;         // Declare la variable (Signal_Capteur) sur le pin 2. Le Capteur sera branche ici (Pin 2 pour AtTyni85)
const int Signal_Recepteur = 3;       // Declare la variable (Signal_Recepteur) sur le pin 3. Le récepteur voie 6 sera branche ici (Pin 3 pour AtTyni85)
const int Signal_Detecteur = 1;       // Declare le fil du detecteur (Signal_eau) sur le pin 1 (Pin 1 pour AtTyni85)

int Val_SignalReglage;                // Variable pour stocker la valeur lue sur le Recepteur voie 7
int Val_SignalCapteur;                // Variable pour stocker la valeur lue sur le capteur de pression
int Val_SignalRecepteur;              // Variable pour stocker la valeur lue sur le Recepteur voie 6
int angle_potar = 0;                  // Declare la variable (Angle_potar emetteur)
int Angle_Servo = 0;                  // Declare la variable (Angle_Servo)
int Angle_Servo_vidange = 90;         // Declare la variable (Angle_Servo_vidange)
int Pression_Surface = 0;             // Declare la variable (pression en Surface)
int Profondeur_Max = 0;               // Declare la variable (Profondeur_Max)
int pression_Max = 0;                 // Declare la variable pression Max lue par le capteur de pression
int pression_Min = 0;                 // Declare la variable pression Min lue par le capteur de pression

// Valeur théorique du Signal_Recepteur voie 6 = 1073 à 2110 avec emetteur Futaba
int Max_voie6 = 2110;                 // Declare la variable valeur max de la voie 6
int Min_voie6 = 1073;                 // Declare la variable valeur min de la voie 6
// Valeur théorique du Signal_Reglage voie 7 = 960 à 2060  avec emetteur Futaba
int Max_voie7 = 2060;                 // Declare la variable valeur max de la voie 7
int Min_voie7 = 960;                  // Declare la variable valeur min de la voie 7
//=========================================================================
void setup() 
{ 
  pinMode(Signal_Reglage, INPUT);         // Declare la variable Signal Reglage en entree
  pinMode(Signal_Capteur, INPUT);         // Declare la variable Signal Capteur en entree
  pinMode(Signal_Recepteur, INPUT);       // Declare la variable Signal Recepteur en entrée
  servo_1.attach(0);                      // Attache le servo au pin 0   (Pin 0 pour AtTyni85)
  
  pinMode(Signal_Detecteur, INPUT);       // Declare la variable Signal detecteur eau en entrée
  digitalWrite(Signal_Detecteur, HIGH);   // Activation du pull-up interne pour le detecteur d eau


 // calibration du capteur de pression pendant les 5 premieres secondes pour definir la pression en surface
  pression_Max = analogRead(Signal_Capteur);            // pression Max = valeur lue par le capteur de pression (definir une valeur)
  pression_Min = pression_Max;                          // pression Min = pression Max (definir une valeur)
  while (millis() < 5000) { 
   Val_SignalCapteur = analogRead(Signal_Capteur);                           //Stocker la valeur du CAPTEUR dans la variable "Val_SignalCapteur"
   if (Val_SignalCapteur > pression_Max) {pression_Max = Val_SignalCapteur;} // Enregistre la valeur Max lue par le capteur de pression   
   if (Val_SignalCapteur < pression_Min) {pression_Min = Val_SignalCapteur;} // Enregistre la valeur Mini lue par le capteur de pression 
    //---fin calibration capteur de pression
  }
  if (pression_Max > pression_Min) {Pression_Surface = pression_Max-((pression_Max-pression_Min)/2);}  // defini la pression moyenne en surface
  if (pression_Max == pression_Min) {Pression_Surface = pression_Max;}                                 //si pas d ecart prendre la valeur maxi en reference
}

//=========================================================================
void loop() 
{ 
  noInterrupts();  
  //-----------------test Detection eau -----------------
   if (digitalRead(Signal_Detecteur)){  //------------ si pas de contact eau-----------
               
          //-----------------definir la profondeur maxi avec la telecommande---------------- 
            Val_SignalReglage = pulseIn(Signal_Reglage, HIGH, 30000);    // Donne à la variable (Val_SignalReglage) la valeur de (Signal_Reglage) lue sur le pin 4
            interrupts();                                                // Reactive les interruptions
            angle_potar = map(Val_SignalReglage, Min_voie7, Max_voie7, 0, 30);      // Calibre des valeurs du potar voie 7 de 0 à 30  
            angle_potar = constrain(angle_potar, 0, 30);                 // Fixe les valeurs minimum et maximum du potar
            Profondeur_Max = Pression_Surface + angle_potar;             // definir la profondeur maxi demandee avec la voie 7
            if ((Profondeur_Max > 550) or (Profondeur_Max < Pression_Surface))  {Profondeur_Max = Pression_Surface;}
          
          //-----------------test profondeur---------------- 
          Val_SignalCapteur = analogRead(Signal_Capteur);                  // Lit la valeur du Capteur de pression
               if (Val_SignalCapteur  <= Profondeur_Max) {     //--------si pression capteur < Profondeur_Max défini-------------- 
                  Val_SignalRecepteur = pulseIn(Signal_Recepteur, HIGH, 30000);  // Donne à la variable (Val_SignalRecepteur) la valeur de (Signal_Recepteur) lue sur le pin 3
                  interrupts();                                                  // Reactive les interruptions
                  Angle_Servo = map(Val_SignalRecepteur, Min_voie6, Max_voie6, 45, 135);   // Calibre des valeurs de pour le servo de 0 à 180  
                  Angle_Servo = constrain(Angle_Servo, 45, 135);                 // Fixe les valeurs minimum et maximum en degré de monservo
                  servo_1.write(Angle_Servo);                            // Positionne le servo suivant les ordes de la radiocommande  
                  delay(15);                                             // Delai pour que le servo atteigne sa position
                  SoftwareServo::refresh();                              // Rafraichissement bibliotheque servo
                 
               }else{     //-------------si pression capteur > Profondeur_Max ------------------
                  interrupts();                                          // Reactive les interruptions
                  servo_1.write(Angle_Servo_vidange);                    // Positionne le servo en vidange
                  delay(15);                                             // Delai pour que le servo atteigne sa position
                  SoftwareServo::refresh();                              // Rafraichissement bibliothèque servo
               } //-----------------fin test profondeur----------------    

  }else{  //----------- si Detection eau -------------------------
      interrupts();                                          // Reactive les interruptions
      servo_1.write(Angle_Servo_vidange);                    // Positionne le servo en vidange
      delay(15);                                             // Délai pour que le servo atteigne sa position
      SoftwareServo::refresh();                              // Rafraichissement bibliotheque servo
      }  //-----------------Fin Detection eau-----------------
 } //========================== FIN DU PROGRAMME=============================

Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Le système Arduino

Message par Geeks »

Ok pour ton montage.

Je pense que le comparateur offrirais une fenêtre et c'est pas ce que tu cherche !!

Bon, donc out ma réponse d'en haut.

Tu fais varier donc entre 0 et 1023 mais t'a pas assez de précision.

Je te propose de prendre un CAN avec un échantillonnement plus important et de passé par un port série tel que l'I2C. Un exemple ici -> NXP

Pour l'i2c je peux fournir un petit exemple de code tout bête. Tu n'aura plus qu'à adapter avec les valeurs fourni avec le composant. Je veux parler de la séquence de départ tel que "S0110xxx[0/1]...". C'est pour appeler ton composant sur le bus. Chaque composant à un début de séquence souvent relevé 0x63.... Enfin bon on adaptera !
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Répondre