Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Forum Index



[Résolu] ouverture de 2 trappes


 
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Projets -> Vos projets
Previous topic :: Next topic  
Author Message
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Wed 7 May - 22:08 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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 .


Last edited by papaye85 on Fri 9 May - 18:25 (2014); edited 1 time in total
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Wed 7 May - 22:23 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Thu 8 May - 07:37 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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.
Back to top
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Thu 8 May - 07:59 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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.
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Fri 9 May - 00:32 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

Vous avez dû oublier les pièces jointes...
____________________________
http://simple-duino.com
Back to top
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 9 May - 07:49 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

Oupsss...! Voici:


Merci!
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Fri 9 May - 08:43 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Fri 9 May - 08:44 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 9 May - 09:51 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

Ok je regarde merci beaucoup.
Back to top
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 9 May - 09:51 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

L
es moteurs sont bien des DC
Back to top
gpbart
Débutant

Offline

Joined: 09 May 2014
Posts: 1
Masculin
Niveau d'éléctronique: Pro

PostPosted: Fri 9 May - 17:59 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

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.
Back to top
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 9 May - 18:19 (2014)    Post subject: ouverture de trappes Reply with quote

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 !
Back to top
papaye85
Débutant

Offline

Joined: 07 May 2014
Posts: 8
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 9 May - 18:25 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

- [TERMINER] Système de détécteur de passage.
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Fri 9 May - 18:51 (2014)    Post subject: [Résolu] ouverture de 2 trappes Reply with quote

Ok, bien joué  Okay
____________________________
http://simple-duino.com
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Projets -> Vos projets All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  

Index | Xooit.com free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino