Auteur Sujet: Barrière infra rouge et interruptions  (Lu 35223 fois)

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Barrière infra rouge et interruptions
« le: juin 19, 2016, 09:14:42 am »
Bonjour à tous,
Je souhaite utiliser le système de barrière infrarouge présenté sur le site pour gérer une coulisse. Le programme de test du site fonctionne très bien avec mon montage et mon Arduino Mega mais lorsque je souhaite utiliser des interruptions rien ne se passe  :(. Peut être que quelque chose m'a échappé sur l'utilisation des interruptions  :o. Voici le code que j'ai testé
#include <PinChangeInt.h>
const byte Test=A0;
const int ledPin = 13;
int cpt=0;
void detect()
{
  cpt++;
}
void vide()
{
  cpt--;
}

void setup()
{
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);     
  pinMode(Test, INPUT_PULLUP);
  PCintPort::attachInterrupt(Test, detect, RISING);
  PCintPort::attachInterrupt(Test, vide, FALLING);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (cpt>0)
  {
      digitalWrite(ledPin, HIGH);
      delay(200);
      digitalWrite(ledPin, LOW);
      delay(200);
      digitalWrite(ledPin, HIGH);
      delay(200);   
      digitalWrite(ledPin, LOW);
      delay(200);
   }
   else
   {
    digitalWrite(ledPin, LOW);
    }

}
« Modifié: juin 19, 2016, 11:44:24 am par Cevenol38 »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #1 le: juin 19, 2016, 10:10:33 am »
Bonjour et bienvenue parmi nous.

L'entrée A0 du Mega correspond à la broche (ADC0)PF0 (voir https://www.arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf) de l'ATMega 2560. Sur ce même schéma on peut voir à quelle broche correspondent les 24 pin change interrupt :

- 10 à 15
- SCK, MOSI et MISO
- A8 à A15

et 7 qui ne sont pas disponibles sur les connecteurs

Dans la liste, il n'y a pas A0. Ça vient sans doute de là

Cordialement

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #2 le: juin 19, 2016, 11:38:59 am »
Merci :)
Du coup à quoi correspond le A0 indiqué sur le circuit de la carte ?   :-[ enfin je veux dire par quel numéro est il identifié en terme de programmation ?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #3 le: juin 19, 2016, 11:42:40 am »
C'est identifié par A0 :)

C'est juste que PCintPort::attachInterrupt n'a aucun effet sur cette broche étant donné qu'elle ne peut pas servir de broche d'interruption externe.
Cordialement

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #4 le: juin 19, 2016, 11:45:06 am »
OK du coup quelle broche puis je utiliser ? et surtout comment la désigner dans mon programme :) ?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #5 le: juin 19, 2016, 11:46:37 am »
A8 à A15 sont possibles par exemple et je pense qu'il suffit de les appeler par leur nom.
Cordialement

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #6 le: juin 19, 2016, 11:48:41 am »
Bon ben je viens de faire un test avec A8 et ça ne change rien :(

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #7 le: juin 19, 2016, 11:55:23 am »
En fait une mesure au multimètre indique un très faible voltage sur ma sortie de circuit 0.28v sans obstacle et 0.06V lorsque il y a un obstacle est ce normal ne devrait on pas retrouver 5V ?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #8 le: juin 19, 2016, 11:56:20 am »
Il est possible que la bibliothèque que vous utilisez ne fonctionne que sur Uno et équivalent (ATMega328). Essayez avec celle-ci qui comporte un exemple pour Mega :

https://github.com/GreyGnome/PinChangeInt
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Re : Barrière infra rouge et interruptions
« Réponse #9 le: juin 19, 2016, 11:56:50 am »
En fait une mesure au multimètre indique un très faible voltage sur ma sortie de circuit 0.28v sans obstacle et 0.06V lorsque il y a un obstacle est ce normal ne devrait on pas retrouver 5V ?

Non ce n'est pas normal.
Cordialement

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #10 le: juin 19, 2016, 12:05:36 pm »
Avec cette librairie le prog ne compile pas car non compatible avec arduino mega :(.
Ce qui est curieux c'est que lorsque je débranche la broche la variation de courant est détectée puisque ma led change d'état.

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #11 le: juin 19, 2016, 01:24:39 pm »
J'ai compilé l'exemple PinChangeIntExample2560 avec succès !
Cordialement,
Dominique

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #12 le: juin 19, 2016, 02:51:40 pm »
Oui autant pour moi, la compilation fonctionne mais cela ne change rien :(. Est ce que cela ne viendrait pas de la résistance de 2.2kohm qui serai trop importante ?
Ce qui est curieux c'est que sans les interruptions cela fonctionne très bien

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #13 le: juin 19, 2016, 03:32:01 pm »
Essaye de mettre INPUT au lieu d'INPUT_PULLUP.
Cordialement

Cevenol38

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Barrière infra rouge et interruptions
« Réponse #14 le: juin 19, 2016, 06:33:17 pm »
Même résultat, finalement j'ai laissé tombé les interruptions et j'ai fait cela autrement en simplement mesurant l'écart de valeur lorsque la barrière est rompue ou pas :) et ça marche très bien.
Voici le code en mode debug pour un seul canton :)
//Affectation des ports
//d'occupation
//const byte detect_v1[]={A0,A1,A2,A3,A4,A5};
const byte detect_v1[]={A0,A0,A0,A0,A0,A0};
//const byte detect_v2[]={A8,A9,A10,A11,A12,A13};
const byte detect_v2[]={A0,A0,A0,A0,A0,A0};
//de disjoncteurs
const int disj_v1[]={23,25,27,29,31,33};
const int disj_v2[]={22,24,26,28,30,32};
//des aiguillages;
const int p_aiguillages[]={34,36,38,40,42};
//Variables globales
// variable de temps en millisecondes
unsigned long liberation_v1[] = {0,0,0,0,0,0};   // derniere fois que le detecteur a changé
unsigned long liberation_v2[] = {0,0,0,0,0,0};   // derniere fois que le detecteur a changé
long Delai_liberation = 1000;   // delai d'une seconde pour valider un changement
int occup_vp1=0;
int occup_vp2=0;
int occup_v1[]={0,0,0,0,0,0};
int occup_v2[]={0,0,0,0,0,0};

//Fonctions
void init_canton(byte voie)
{
  Serial.print("Canton initialisé en mode INPUT");
  Serial.println(voie);
  pinMode(voie,INPUT);
}
void detection(byte canton,int num, int occup, int voie)
{
  int etat=analogRead(canton);
  if (etat>100)
  {
    //un train est détecté la valeur lue est supérieure à 15
    if (occup==0)
    {
      Serial.print("Valeur =");
      Serial.println(etat);
      occupation(canton,num,voie);
    }
  }
  else
  {
    if (occup==1)
    //le canton est libre
    {
     
      Serial.print("Valeur =");
      Serial.println(etat);
      liberation(canton,num,voie);
    }
   
  }
}
void occupation(byte canton,int num, int voie)
{
    if (voie==1)
    {
      occup_v1[num]=1;
      liberation_v1[num]=millis();
      Serial.print("Voie 1 Canton occupe :");
      Serial.println(canton);
    }
    else if(voie==2)
    {
      occup_v2[num]=1;
      liberation_v2[num]=millis();
      Serial.print("Voie 2 Canton occupe :");
      Serial.println(canton);
    }
   
   
}
void liberation(byte canton,int num, int voie)
{
  unsigned long time;
  time=millis();
  if (voie==1)
    {
      if (time-liberation_v1[num] > Delai_liberation)
      {
        occup_v1[num]=0;
        Serial.print("VOIE 1 Canton libre :");
        Serial.println(canton);
      }
    }
    else if(voie==2)
    {
      if (time-liberation_v2[num] > Delai_liberation)
      {
        occup_v2[num]=0;
        Serial.print("VOIE 2 Canton libre :");
        Serial.println(canton); 
      }
     
    }
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);           // set up Serial library at 9600 bps
  //for (int i=0;i<6;i++)
  for (int i=0;i<1;i++)
  {
    init_canton(detect_v1[i]);
   // init_canton(detect_v2[i]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  //for (int i=0; i<6;i++)
  for (int i=0;i<1;i++)
  {
    detection(detect_v1[i],i,occup_v1[i],1);
    //detection(detect_v2[i],i,occup_v2[i],2);
  }

}