Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Index du Forum



[Résolu] ouverture de 2 trappes


 
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets
Sujet précédent :: Sujet suivant  
Auteur Message
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mer 7 Mai - 22:08 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

PublicitéSupprimer les publicités ?
Bonjour,

Je ne connais pas grand chose à la programmation et je compte sur vous pour m'aider à parfaire mon projet d'ouverture d'une trappe pour un poulailler et de deux glissières sur une trémie.
Pour cela j'ai acheté une carte Arduino Uno qui commande deux moteurs "A" et "B"; le "B" avec un délai de fonctionnement  et le "A" avec deux fins de course à l'ouverture et à la  fermeture.
Ces moteurs sont mis en route grâce à une cellule photorésistive .
Le programme est le suivant:

const int motorADirectionPin = 12; //Broche de controle de direction Moteur A
const int motorASpeedPin = 3; //Broche de controle de vitesse Moteur A (PWM)
const int motorABrakePin = 9; //Broche de controle de frein Moteur A
const int motorACurrentSensingPin = 0; //Broche de mesure du courant Moteur A

const int motorBDirectionPin = 13; //Broche de controle de direction Moteur B
const int motorBSpeedPin = 11; //Broche de controle de vitesse Moteur B (PWM)
const int motorBBrakePin = 8; //Broche de controle de frein Moteur B
const int motorBCurrentSensingPin = 1; //Broche de mesure du courant Moteur B

const int stopSwitch1Pin = 5; //Broche de detection fin de course 1
const int stopSwitch2Pin = 6; //Broche de detection fin de course 2
const int ldrPin = 2; //Broche de mesure Lumiere
const int potPin = 3; //Broche de mesure Vitesse Moteur (potar)

const unsigned long intervalleAttente = 30L; //Temps d'attente pour vérifier jour ou nuit (minutes)
const int seuilJour = 200; //Si supérieur, il fait jour
const int seuilNuit = 400; //Si inférieur, il fait nuit

const float courantMoteurBloqueA = 350.0; //Seuil de courant moteur A bloqué

const unsigned long intervalleMoteurB = 10L; //Temps de course moteur B (secondes)
const float courantMoteurBloqueB = 1000.0; //Seuil de courant moteur B bloqué

const boolean debug = true;

void setup() {
  if(debug)
    Serial.begin(9600);
 
  //Configuration Moteur A
  pinMode(motorADirectionPin, OUTPUT); //Configure broche de controle de direction Moteur A en sortie.
  pinMode(motorABrakePin, OUTPUT); //Configure broche de controle de frein Moteur A en sortie.
 
  //Configuration Moteur B
  pinMode(motorBDirectionPin, OUTPUT); //Configure broche de controle de direction Moteur B en sortie.
  pinMode(motorBBrakePin, OUTPUT); //Configure broche de controle de frein Moteur B en sortie.
}

void loop()
{
  //Ouverture
  if(debug)
   Serial.println("Ouverture Poulailler");
  moveB(true);
  if(debug)
   Serial.println("Ouverture Tremie");
  moveA(true,stopSwitch1Pin);

  //Attente de la Nuit
  if(debug)
   Serial.println("Attente de la Nuit");
  verifierJourouNuit(false); // false: verifier Nuit
 
  //Fermeture
  if(debug)
   Serial.println("Fermeture Poulailler");
  moveB(false);
  if(debug)
   Serial.println("Fermeture Tremie");
  moveA(false,stopSwitch2Pin);
 
  //Attente du Jour
  if(debug)
   Serial.println("Attente du Jour");
  verifierJourouNuit(true); //true: verifier Jour
}

void moveA(boolean forward, int stopSwitchPin)
{
  float motorCurrent = 0.0;
  int motorDirection = LOW;
  if(forward)
    motorDirection = HIGH;
  int motorSpeed = analogRead(potPin) / 4; // Mesure vitesse moteur (potar)
  digitalWrite(motorADirectionPin, motorDirection); //Specifier direction Moteur A
  analogWrite(motorASpeedPin, motorSpeed);   //Faire tourner le Moteur A a la vitesse demandee
  digitalWrite(motorABrakePin, LOW);   //Relacher le frein Moteur A
  delay(200); //Attente vitesse de croisiere
  int switchState = digitalRead(stopSwitchPin); //Detecter etat du switch fin de course
  while(switchState == HIGH) //Tant que le switch est ouvert
  {
    motorSpeed = analogRead(potPin)/4; // Mesure vitesse moteur (potar)
    analogWrite(motorASpeedPin, motorSpeed); //Adapter vitesse Moteur A
    motorCurrent = analogRead(motorACurrentSensingPin); // Mesure courant Moteur A
    motorCurrent = map(motorCurrent, 0, 675,0, 2000); // Conversion en courant (mA)
    if(motorCurrent > courantMoteurBloqueA) //Detection Moteur bloqué
    {
      if(debug == true)
      {
        Serial.print("Moteur A bloque, courant moteur A: ");
        Serial.println(motorCurrent);
      }
      break;
    }
    if(debug == true)
    {
      Serial.print("Courant moteur A: ");
      Serial.print(motorCurrent);
      Serial.print(", Vitesse moteur A: ");
      Serial.println(motorSpeed);
    }
    switchState = digitalRead(stopSwitchPin); //Detecter etat du switch fin de course
  }
  //Activer frein moteur A
  digitalWrite(motorABrakePin, HIGH);
}

void moveB(boolean forward)
{
  float motorCurrent = 0.0;
  int motorDirection = LOW;
  if(forward)
    motorDirection = HIGH;
  int motorSpeed = analogRead(potPin) / 4; // Mesure vitesse moteur (potar)
  digitalWrite(motorBDirectionPin, motorDirection); //Specifier direction Moteur B
  analogWrite(motorBSpeedPin, motorSpeed);   //Faire tourner le Moteur B a la vitesse demandee
  digitalWrite(motorBBrakePin, LOW);   //Relacher le frein Moteur B
  unsigned long step = 0; //Pas d'environ 0.1 secondes
  unsigned long intervalleMoteurBMilliseconds = intervalleMoteurB * 1000L;
  while(step < intervalleMoteurBMilliseconds) //Tant que le temps n'est pas atteint
  {
    delay(100L); //Attente 100ms
    motorSpeed = analogRead(potPin)/4; // Mesure vitesse moteur (potar)
    analogWrite(motorBSpeedPin, motorSpeed); //Adapter vitesse Moteur B
    motorCurrent = analogRead(motorBCurrentSensingPin); // Mesure courant Moteur B
    motorCurrent = map(motorCurrent, 0, 675,0, 2000); // Conversion en courant (mA)
    if(motorCurrent > courantMoteurBloqueB) //Detection Moteur bloqué
    {
      if(debug == true)
      {
        Serial.print("Moteur B bloque, courant moteur: ");
        Serial.println(motorCurrent);
      }
      break;
    }
    if(debug == true)
    {
      Serial.print("Courant moteur B: ");
      Serial.print(motorCurrent);
      Serial.print(", Vitesse moteur B: ");
      Serial.println(motorSpeed);
    }
    step = step+100L;
  }
  //Activer frein moteur B
  digitalWrite(motorBBrakePin, HIGH);
}

void verifierJourouNuit(boolean attenteJour)
{
  int lightSensorValue = 0;
  boolean wait = true;
  unsigned long waitingTime = 1000L * 60L * intervalleAttente;
  while(wait)
  {
    delay(waitingTime); //Attendre
    lightSensorValue = analogRead(ldrPin); //Mesure lumiere
    if(debug)
    {
      Serial.print("Lumiere: ");
      Serial.println(lightSensorValue);
    }
    if(attenteJour)
      wait = lightSensorValue < seuilJour; //Attendre le jour;
    else
      wait = lightSensorValue > seuilNuit; //Attendre la nuit;
    if(!(wait))
    {
      //Verifier etat pendant 5min
      for(int i = 0;i < 4;i++)
      {
        delay(waitingTime / intervalleAttente); //Attendre 1min
        lightSensorValue = analogRead(ldrPin); //Mesure lumiere
        if(debug)
        {
          Serial.print("Lumiere: ");
          Serial.println(lightSensorValue);
        }
        if(attenteJour)
          wait = wait && lightSensorValue < seuilJour;
        else
          wait = wait && lightSensorValue > seuilNuit;
      }
    }
  }
}


Le problème rencontré lors du démarrage: le moteur "B" fonctionne une très court instant et ses deux leds s'allument, puis aussitôt les deux leds du  moteur"A" s'éclairent mais le moteur n'a pas démarré.

Merci beaucoup de vos réponses .


Dernière édition par papaye85 le Ven 9 Mai - 18:25 (2014); édité 1 fois
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mer 7 Mai - 22:23 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

On pourrait avoir les branchements des moteurs ?
Utilisez-vous un "shield" ?
____________________________
http://simple-duino.com
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Jeu 8 Mai - 07:37 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Je vous joins deux photos du branchement moteurs.
En "a" il s'agit d'un moteur MFA (1.5 -3 volts) et en "B" d'un Arduino Motor Shield V3,non représenté sur la photo car déjà prépositionné sur la trappe.
Je vous remercie.
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Jeu 8 Mai - 07:59 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Je voulais écrire que j'utilisais un shield et qu'en "B"un moteur D.C. 5 - 7 v était connecté mais non représenté sur la photo.
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 9 Mai - 00:32 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Vous avez dû oublier les pièces jointes...
____________________________
http://simple-duino.com
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 9 Mai - 07:49 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Oupsss...! Voici:


Merci!
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 9 Mai - 08:43 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Tu n'aurais pas oublié des {} ?? (voir ligne 113 de ton script)
Je ne sais pas si c'est lié mais bon...
Tes moteurs sont-ils bien de "DC" ?
____________________________
http://simple-duino.com
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 9 Mai - 08:44 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Il semble y avoir d'autre oublis des {} aux lignes:
164/166/180/182
____________________________
http://simple-duino.com
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 9 Mai - 09:51 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Ok je regarde merci beaucoup.
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 9 Mai - 09:51 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

L
es moteurs sont bien des DC
Revenir en haut
gpbart
Débutant

Hors ligne

Inscrit le: 09 Mai 2014
Messages: 1
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 9 Mai - 17:59 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Un message du programmateur...


A ce que je sais, une condition if...else ne nécessite pas d'accolades {} du moment qu'elle ne contient qu'une instruction par condition.
D'ailleurs le programme tel quel fonctionne très bien.


Je laisse le soin à papaye85 d'expliquer quel était le problème. Il a été résolu entre temps.
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 9 Mai - 18:19 (2014)    Sujet du message: ouverture de trappes Répondre en citant

Après réflexion sur le script, j'ai trouvé la solution!

La fonction "anti-pincements" (corps étranger ou autre, qui bloque le passage de la trémie)  est activée avec un seuil de courant du moteur "A", fixé à "350" . Ce seuil était insuffisant (vérification faite avec le "Moniteur série, petite loupe en haut à droite) et j'ai fixé le seuil  à "1000":

.....
const unsigned long intervalleAttente = 30L; //Temps d'attente pour vérifier jour ou nuit (minutes)
const int seuilJour = 200; //Si supérieur, il fait jour
const int seuilNuit = 400; //Si inférieur, il fait nuit

const float courantMoteurBloqueA = 1000.0; //Seuil de courant moteur A bloqué

const unsigned long intervalleMoteurB = 10L; //Temps de course moteur B (secondes)
const float courantMoteurBloqueB = 800.0; //Seuil de courant moteur B bloqué

.......


A présent le moteur "A" tourne parfaitement après le "B", et les séquences "fins de course" fonctionnent également.

Merci encore d'avoir pris la peine de regarder mon script.

Merci Arduino !
Revenir en haut
papaye85
Débutant

Hors ligne

Inscrit le: 07 Mai 2014
Messages: 8
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 9 Mai - 18:25 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

- [TERMINER] Système de détécteur de passage.
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 9 Mai - 18:51 (2014)    Sujet du message: [Résolu] ouverture de 2 trappes Répondre en citant

Ok, bien joué  Okay
____________________________
http://simple-duino.com
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 00:30 (2017)    Sujet du message: [Résolu] ouverture de 2 trappes

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino