Page 16 sur 18

Re: Arduino - Traitement de l'information

Posté : lun. 16 déc. 2013, 18:16
par likiki
Toutafé, fils du dieux Arduino et de la déesse Mega2560, toujours habillé d'une toge rayé Jaune/Vert.

:mdr2:

Re: Arduino - Traitement de l'information

Posté : lun. 16 déc. 2013, 23:01
par jepi54
:moi: ben moi je suis largué de chez largué…

jp :ugeek:

Re: Arduino - Traitement de l'information

Posté : jeu. 19 déc. 2013, 10:16
par Arduino
Dans ce forum, on se rend compte qu'il y a une différence entre le prototype qui fonctionne et l'application en condition réelle. Le problème est la sensibilité au bruit (pas sonore mais électronique :lol: ) et aux parasites !

Il faut dire qu'en DCC, vu la fréquence du courant avec un signal carré alternatif, cela rayonne avec pas mal d'harmoniques (fréquences de rayonnement).

Le même montage aurait sans doute très bien fonctionné en alimentation analogique (courant continu) .... encore que ! (voir par exemple le rayonnement d'un téléphone mobile proche de l'application). :gne:

Il faut donc rechercher les solutions pour isoler le montage microcontrôleur de l'environnement (blindage, mise à la masse, capas de découplage) et ceci devient un problème d'électronique.

Mais c'est très bien d'avoir mis le doigt dessus et d'avoir solutionné. :applause:

Il ne faut jamais se décourager d'un montage qui ne fonctionne pas comme on le souhaiterait ; il y a toujours une solution.

Christian

Re: Arduino - Traitement de l'information

Posté : jeu. 19 déc. 2013, 18:36
par likiki
Actuellement, j'ai enrobé le cordon qui relis les capteurs a la carte d'un papier d'aluminium. le fait de poser un doigt sur la feuille d'aluminium permet un fonctionnement sans faille.

Je pense remplacer ce cordon par un cordon type fils téléphone blindé (le temps d'en trouver une chute pour faire un essais).

:siffle:

Re: Arduino - Traitement de l'information

Posté : dim. 12 janv. 2014, 18:00
par macsddau
Bonjour à tous

J'ai regarder le code de Likiki. Je m'en suis inspiré pour écrire mon propre programme. Comme je n'ai pas d'afficheur je l'ai remplacé par une transmission des résultats par la ligne série de l'Arduino.
Le programme a été testé avec un minimum de composants (pas de capteur IR…). J'utilise de boutons poussoirs qui ont l'inconvénient de provoquer des rebonds.
Voici le schéma du montage
Image
Et le code

Code : Tout sélectionner

//Utlisation directe des registres de l'AVR
//car plus rapide que les fonctions Arduino (dans certains cas)
#include <avr/io.h>

//entrées en pull up (état 1 lorsque le bouton n'est pas pressé)
#define ENTREE_ON PIND & (1 << PIND2)//entrée =digitalRead(2) 
#define SORTIE_ON PIND & (1 << PIND3)//sortie =digitalRead(3)

//paramètres du modèle réduit
#define LONGUEUR_ES  0.1//m
#define ECHELLE    160.0// 1:ECHELLE

// les variables dans lesquelles sont enregistrés les temps de passage
volatile unsigned long  tEntreeOn  = micros();
volatile unsigned long  tEntreeOff = tEntreeOn;
volatile unsigned long  tSortieOn  = tEntreeOn;
volatile unsigned long  tSortieOff = tEntreeOn;
volatile byte nValeurs             = 0; // drapeau nouvelles valeurs 

void setup () {
  //Pattes d'entrée (équivalent à pinMode)
  // Arduino UNO v3 borne D2 (PD2/INT0) pour l'entrée
  // Arduino UNO v3 borne D3 (PD3/INT1) pour la sortie
  DDRD &= ~(1 << DDD2 | 1 << DDD3);
  
  //Utilisation des interruptions INT0 et INT1
  EICRA |= 1 << ISC00 | 1 << ISC10;//détection de front
  EIMSK |= 1 << INT0 | 1 << INT1;//autorise INT0 et INT1

  Serial.begin(115200);

  sei();//active les interruptions
}

// détection à l'entrée
ISR ( INT0_vect ) {
  //A faire immédiatement :
  unsigned long t = micros();//lire le temps de passage
  byte etat = ENTREE_ON;//lire l'état de l'entrée 
  
  if (etat) {
    tEntreeOn = t;
    nValeurs = 2;
  } else {
    tEntreeOff = t;
    nValeurs = 1;
  }
  attenteMs(2);//supprime les rebonds. Retirer la ligne avec un capteur propre
}

// détection à la sortie
ISR ( INT1_vect ) {
  //A faire immédiatement :
  unsigned long t = micros();//lire le temps de passage
  byte etat = SORTIE_ON;//lire l'état de la sortie
  
  if (etat) {
    tSortieOn = t;
    nValeurs = 4;
  } else {
    tSortieOff = t;
    nValeurs = 3;
  }
  attenteMs(2);//supprime les rebonds. Retirer la ligne avec un capteur propre
}

float vitesse(unsigned long d, float l) {
  return l / d * 3.6e6 * ECHELLE;//m/us -> km/h à l'échelle
}

//A utiliser à la place de Delay(ms) car accepte les interruptions
//Ajuster le max de i :
//    utiliser un chronomètre avec duree = 10000 (10s) par exemple
//    ou plus pour une meilleure précision (65,535s max)
void attenteMs (unsigned int duree) {
  volatile unsigned int i; 
  unsigned int j;
  for (j=0; j<duree; j++) {
    for (i=0; i<100; i++) {//a ajuster
    }   
  }
}

void loop () {
  if (nValeurs == 4) {
    cli();//désactivation les interruptions
    //récupération des temps de passage
    unsigned long nTSortieOff = tSortieOff;
    unsigned long nTEntreeOff = tEntreeOff;
    unsigned long nTSortieOn  = tSortieOn;
    unsigned long nTEntreeOn  = tEntreeOn;
    nValeurs = 0;//lu r.à z.
    sei();//réactivation des interruptions   

    float vNN = vitesse(nTSortieOff - nTEntreeOff,LONGUEUR_ES);
    float vCC = vitesse(nTSortieOn  - nTEntreeOn,LONGUEUR_ES);
    float vMoy = (vNN + vCC)/2;

    Serial.print(vNN);
    Serial.print(" km/h NN ");
  
    Serial.print(vCC);
    Serial.print(" km/h CC ");

    Serial.print(vMoy);
    Serial.println(" km/h Moy");
  } 
}
J'utilise les interruptions car la mesure du temps (heure) de détection du passage est plus précise.

Je n'ai pas bien compris à quoi sert la vitesse devant un capteur (vkmn2 & 3). Avec 0,3 mm de long la mesure doit être très imprécise. J'ai remplacé ces 2 vitesse par le calcul d'une vitesse moyenne.

Bonne continuation dans vos projets Arduino

Re: Arduino - Traitement de l'information

Posté : dim. 12 janv. 2014, 18:43
par macsddau
J'ai lu les derniers messages concernant les problèmes de perturbations radio-électriques.

Dans le schéma de Likiki les entrées sont câblées de tel sorte que lorsque la diode est bloquée tu te retrouve avec une antenne de 60cm.
Voici 2 méthodes de câblage (à gauche celle de Likiki à droite une de celles décritent dans le LR798).

Image

J'aurai tendance à utiliser celle de droite bien qu'elle inverse la logique mais il n'y a plus d'antenne.

Re: Arduino - Traitement de l'information

Posté : dim. 12 janv. 2014, 18:58
par likiki
Quel co.... je suis de ne pas avoir compris ça de suite.

Je vais essayer d'essayer ça dans la semaine.

:siffle:

Re: Arduino - Traitement de l'information

Posté : dim. 12 janv. 2014, 20:33
par macsddau
Dans le montage que je propose, il va peut-être y avoir un problème de seuil de détection. Je ne connais pas grand chose en électronique mais je suppose que lorsque la diode est passante elle doit avoir une tension résiduelle. L'Arduino risque de ne pas détecter le changement d'état (les électrons sont faignants et choisissent le chemin le plus facile). Il faudra peut-être alors faire un câblage comme celui de droite :
Image
En prenant bien soins de placer le transistor et la résistance du collecteur au plus près de ton détecteur. Voir si phototransistor pourrai faire l'affaire.

Fais appel a des électroniciens confirmés pour valider le montage et choisir les composants.

Re: Arduino - Traitement de l'information

Posté : lun. 13 janv. 2014, 17:25
par macsddau
Le câblage suivant m'a été conseillé. A voir pour les composants Rb=10k, le reste je ne sais pas. En tout état de cause il faut éviter de laisser les entrées de l'Arduino "en l'air".
Bonne continuation
Image

Re: Arduino - Traitement de l'information

Posté : lun. 13 janv. 2014, 18:36
par Ramboman
Pourquoi faire simple quand on peut faire compliqué :mdr2:

Re: Arduino - Traitement de l'information

Posté : lun. 13 janv. 2014, 18:40
par likiki
Ben, dans ce cas précis, j'avais fait simple, résultat, une antenne a parasites. :mdr:

Je vais tenter l'idée de "marcsddau", si cela fonctionne, ce sera top. :siffle:

Re: Arduino - Traitement de l'information

Posté : sam. 18 janv. 2014, 22:19
par Guillaume22
Pour un projet, j'ai essayé les barrières IR.
J'ai essayé le cablage d'abord de likki pour une barrière IR. Impossible d'avoir des mesures correctes en analogique ne parlons pas du digital.
Puis j'ai connecté la LED IR comme un bouton poussoir : le 5v est connecté à une résistance de 100kohm de l'autre l'entrée de l'arduino ainsi que l'anode de la photodiode IR (récepteur à 2 pattes) et la cathode au GND.
Si barrière non coupée, entrée à 0 sinon entrée à 1 (digitale) ou 1023 y approchant en cas analogique. Cela marche au poil.
N'oubliez pas de mettre une résistance aussi sur l'émetteur sinon c'est grillage assuré, je viens de le faire...

Re: Arduino - Traitement de l'information

Posté : sam. 18 janv. 2014, 22:33
par macsddau
Bonne nouvelle pour Likiki !
Guillaume22 a écrit :Puis j'ai connecté la LED IR comme un bouton poussoir : le 5v est connecté à une résistance de 100kohm de l'autre l'entrée de l'arduino ainsi que l'anode de la photodiode IR (récepteur à 2 pattes) et la cathode au GND.
Si je comprends bien tu as utilisé ce montage :
Image
Guillaume22 a écrit :Si barrière non coupée, entrée à 0 sinon entrée à 1 (digitale)
.
En effet la logique est inversé. Il suffit de dire "Un train passe devant la barrière optique" la pin de l'Arduino est à HIGH et "Pas de train" la pin est à LOW.

Comme les électroniciens disent le tout est de bien soigner ses entrées.

Re: Arduino - Traitement de l'information

Posté : sam. 18 janv. 2014, 23:26
par Guillaume22
Oui c'est ce montage.

Re: Arduino - Traitement de l'information

Posté : sam. 18 janv. 2014, 23:27
par likiki
Et avec ça, pas de perturbation en DCC ni en analogique ? :siffle: