keypad déporté et arduino

bonjour a tous
dans le but de pouvoir ouvrir un portail automatique via deux keypad
je souhaite pouvoir déporté un keypad
j'explique un peu le projet
un portail somfy acheter il y a peu
des télécommande fournit avec ( classique )
pour éviter d'acheter une télécommande par personne deux keypad vont être mit en place
un en entrée et un en sortie
celui en entrée recevra une carte arduino
celui en sortie sera déporté d'environ 10m
avec un câble réseau entre les deux

mais trois question reste en suspend

la première:
sur les ligne du keypad certain mettent des résistances d'autre non
utile ou pas utile ?

la deuxième:
de combien puis je déporté le keypad sans avoir trop de "perte" sur les câbles

la troisième:
suis je obliger d'utiliser deux fois 7 pin de l'arduino
ou puis je brancher les deux keypad en parallèle ?

un grand merci à toute la communauté

même si j'aime pas faire ça je croit qu'un petit up s'impose
et si des questions subsistent n'hésitez pas a les poser
merci

10 metres de CAT5 sa revient plus chère que 3 modules radio.

Les résistances sont peut être des filtres anti rebonds ? apres tout un keypad c'est ni plus ni moins q'une rangé de boutons.

les 2 keypad en para c'est techniquement pas possible.

hum 25€ les 100m de câble réseau en cat 5e
ça fait 25 cts le mètre donc 2.50€ pour les 10m
les modules radio ça vaut rien oui mais faut les géré derrière ( arduino attiny etc )
et faut pas oublier la batterie aussi
donc ça ce tâte au niveau prix

peut être des filtres antirebonds oui je vais regarder de ce coté

les 2 keypads en para c'est techniquement pas possible
la je comprends pas pourquoi
si tu peux m'expliquer je veut bien

anthology:
hum 25€ les 100m de câble réseau en cat 5e
ça fait 25 cts le mètre donc 2.50€ pour les 10m
les modules radio ça vaut rien oui mais faut les géré derrière ( arduino attiny etc )
et faut pas oublier la batterie aussi
donc ça ce tâte au niveau prix

peut être des filtres antirebonds oui je vais regarder de ce coté

les 2 keypads en para c'est techniquement pas possible
la je comprends pas pourquoi
si tu peux m'expliquer je veut bien

c'est qoui exactement comme keypad ?
à priori si c'est du simple contact , faire un deport en // sur 10m ne doit pas poser de probleme

oui simple contact
prit sur ebay donc je met un équivalent dx

je passe du câble réseau pour être tranquille et que ça soit blindé
merci artouste

je retrouve plus le câblage pour un keypad ^^
rien dans la librairie ( http://arduino.cc/fr/Main/LibrairieKeypad )
seulement deux images de google
la première avec des résistances
http://bildr.org/blog/wp-content/uploads/2011/05/keypad_Arduino_Wiring.png
et la deuxième sans résistances
http://imageshack.us/a/img7/2087/keypad4x4arduino1.jpg

voila pourquoi j'ai un doute

à priori si c'est du simple contact , faire un deport en // sur 10m ne doit pas poser de probleme

Ouai, enfin je serais pas aussi optimiste. Parce que un clavier matricé à 10m il va falloir ralentir le balayage de la matrice et protéger les entrées/sorties sinon va y avoir un maximum d'erreurs de lecture.
Franchement vu le prix d'une carte arduino mini personnellement j'en mettrais une derrière le clavier et je ferai une liaison série pas trop rapide entre les deux.

juste pour précisé
j'ai dit 10m pour etre large
en pratique j'ai la largeur du portail donc 4m + environ 1m de chaque coté
mais pour faire des comptes rond je part sur 10m
si tu as une idée de code pour la liaison série je suis preneur
je peux donner mon code actuelle si besoin
merci a toi

fdufnews:

à priori si c'est du simple contact , faire un deport en // sur 10m ne doit pas poser de probleme

Ouai, enfin je serais pas aussi optimiste. Parce que un clavier matricé à 10m il va falloir ralentir le balayage de la matrice et protéger les entrées/sorties sinon va y avoir un maximum d'erreurs de lecture.
Franchement vu le prix d'une carte arduino mini personnellement j'en mettrais une derrière le clavier et je ferai une liaison série pas trop rapide entre les deux.

bonsoir fdufnews
peut etre ou peut etre pas :grin:
de toutes façons une levée de doute est facile à faire et ne coute rien (ou pas grand chose)
2 embases RJ45 F et une longueur de cable, sur 10m (4 dans le cas exposé) je pense que c'est jouable sans trop de problème.
mais sinon effectivement un petit MCU scan clavier+sortie serie c'est aussi une bonne solution

Bonjour,

Je trouve le problème intéressant mais je comprends pas bien l'avantage de la liaison série par
rapport à câbler le clavier sur 10m. Qqn peut en dire un peu plus ?

marcha:
Bonjour,

Je trouve le problème intéressant mais je comprends pas bien l'avantage de la liaison série par
rapport à câbler le clavier sur 10m. Qqn peut en dire un peu plus ?

ce qu'expose tres justement fdufnews est que la longueur de cable peut etre problematique (taux de scan de la matrice) en ramassant/recuperant ce qui traine (perturbations) , ce qui entrainerait de l'aberration de lecture.
un petit MCU faisant le scan clavier et transferant en asynchrone bas debit l'info sera plus robuste sur la longueur, avec la possibilité d'integrer de la verif d'integrité et d'utiliser seulement3 fils de liaisons (VCC GND Data).

C'est le cas typique où l’expérimentation In situ prime pour choisir une solution.

effectivement la liaison série peut être intéressante
mais je vais essayer avec un câble de 10m au même endroits que la ou il sera plus tard
comme ça je serais fixé
si ça passe je reste comme ça
si par contre je récupère beaucoup de merde je passerais sur une liaison série

vous avez répondu a presque toutes mes interrogations
seul une dernière subsistent
l'utilisé des résistance sur le keypad
et ou les mettre ( pour les 10m )
au plus prés du keypad ou au plus prés de l'arduino ?

anthology:
seul une dernière subsistent
l'utilisé des résistance sur le keypad
et ou les mettre ( pour les 10m )
au plus prés du keypad ou au plus prés de l'arduino ?

il faut regarder ce que tu utilise comme code pour "lire" le clavier
ce sont des resistances de pull-up
l'arduino en embarque déjà par construction en utilisant cette directive
digitalWrite(pin, HIGH); // turn on pullup resistors

pour le moment j'ai fait un petit code
faut que je le teste dés que j'ai un peu de temps

/*
||  Ouverture portail avec keypad 4x3
||  Création le 07/04/2013
||  allumage led sur pin 10 quand code mauvais
||  allumage led sur pin 11 quand code bon
||  pilotage opto sur pin 12 quand code bon
*/


//* valide la saisie  
//# reset la saisie

/////////////////////////////////////////////////////////////////

#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip

Password password = Password( "1234" );

const byte ROWS = 4; // 4 lignes
const byte COLS = 3; // 3 colonnes
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = { 9,8,7,6 };// Connecter le keypad ROW0, ROW1, ROW2 and ROW3 sur les pins
byte colPins[COLS] = { 5,4,3, };// Connecter le keypad COL0, COL1 and COL2 sur les pins


// Création du keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

  keypad.addEventListener(keypadEvent); // ajout d'un evenement keypad
  pinMode(10, OUTPUT);   // mauvais
  pinMode(11, OUTPUT);   // bon
  pinMode(12, OUTPUT);   // opto    
}

void loop(){
  keypad.getKey();
}

// mise en place bouton sup
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
	switch (eKey){
	  case '*': checkPassword(); break;
	  case '#': password.reset(); break;
	  default: password.append(eKey);
     }
  }
}

void checkPassword(){
  if (password.evaluate()){ // action quand code bon
    digitalWrite(11, HIGH); // allumage led bon
    delay(1000);
    digitalWrite(12, HIGH); // opto 
    delay(1000);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
  }else{                    // action quand code mauvais
    digitalWrite(10, HIGH);
    delay(2000);
    digitalWrite(10, LOW);
  }
}

(taux de scan de la matrice) en ramassant/recuperant ce qui traine (perturbations)

Qu'est-ce qui fait que les perturbations sont moins importantes sur la liaison série ?

un petit MCU faisant le scan clavier et transferant en asynchrone bas debit l'info sera plus robuste sur la longueur

Désolé mais je comprends pas pourquoi :frowning: ?

Qqn a-t-il une explication électrique pour expliquer cette différence, c'était la le but de ma question.

marcha:

(taux de scan de la matrice) en ramassant/recuperant ce qui traine (perturbations)

Qu'est-ce qui fait que les perturbations sont moins importantes sur la liaison série ?

Déjà le signal de la liaison série il ne parcourra que 10m. Alors que la scan de la matrice en parcourra 20 (10 aller + 10 retour).
Ensuite comme l'a indiqué Artouste tu peux facilement ajouter du contrôle d'intégrité dans un message série.

marcha:

un petit MCU faisant le scan clavier et transferant en asynchrone bas debit l'info sera plus robuste sur la longueur

Désolé mais je comprends pas pourquoi :frowning: ?

Qqn a-t-il une explication électrique pour expliquer cette différence, c'était la le but de ma question.

Explications au-dessus

@fdufnews

Déjà le signal de la liaison série il ne parcourra que 10m. Alors que la scan de la matrice en parcourra 20 (10 aller + 10 retour).

Non, cela ne change rien, le retour de la laison série se faisant par la masse tu as aussi 20m

Ensuite comme l'a indiqué Artouste tu peux facilement ajouter du contrôle d'intégrité dans un message série.

Oui, mais le contrôle d'intégrité avec la matrice peut se faire aussi simplement par plusieurs lectures successives. Tant que l'utilisateur
presse assez longtemps sur la touche :slight_smile: ce qui doit pas être un problème dans le cas présent.

@anthology

sur les ligne du keypad certain mettent des résistances d'autre non
utile ou pas utile ?

Résistance PULL-UP ou en série sur la ligne ?

Si tu lis par balayage, tu vas activer une patte en sortie sur une ligne du clavier
et lire via une autre patte une colonne. Si tu te trompes et met les pattes en
sorties tu risque de griller ton cpu. Les résistances en série permettent de limiter le courant.

Quant à une PULL-UP je vois pas trop l'intérêt avec un arduino car il fourni assez de courant en
sortie à HIGH (si qqn peut confirmer ?)

de combien puis je déporté le keypad sans avoir trop de "perte" sur les câbles

Cela va déprendre de la qualité de ton câble, des perturbations qu'il peut y avoir. La perte
n'est pas forcement un problème, mais après il faut amplifier le signal (je maitrise pas du
tout cet aspect là)

suis je obliger d'utiliser deux fois 7 pin de l'arduino
ou puis je brancher les deux keypad en parallèle ?

Tu peux brancher en // en faisant attention de respecter chaque ligne et colonne. Mais tu
ne pourra pas distinguer quel clavier est utilisé.

Sinon tu peux brancher les lignes en // et séparer les colonnes, cela t'économise 4 pattes et
te permet de balayer un clavier après l'autre.

Les résistances sont peut être des filtres anti rebonds ?

Malheureusement pas. Mais elles ont une influence dans la forme du signal. Le câble n'étant
pas parfait, il se comporte également comme un inductance et une capacité avec également
une résistance. Les hautes fréquences seront plus atténuées que les basses. Donc il faut
s'attendre à ce que le signal idéalement carré soit "arrondi".

Pour filtrer les rebonds et autres parasites cela peut se faire avec l'arduino. Quand tu balaye
ton clavier tu active une ligne et tu attends un peu, ensuite tu lis plusieurs fois la touche
à des intervalles choisis. (perso je procèderai par tâtonnement + observation oscillo, mais
il y a surement une méthode plus académique)

Ce qui est important, si tu dois saisir un code au clavier, c'est d'attendre que la touche soit
relâchée avant de refaire une lecture pour discriminer le cas d'une double pression volontaire
(deux fois le même numéro dans le code secret) d'un effet de rebond.

Le fait d'avoir un long câble relié sur l'arduino risque de le faire planter en cas de perturbation.
Je pense qu'il te faut utiliser le watchdog interne.

Je te conseil également d’appliquer un signal carré au début de ton câble et de le mesurer
à la sortie d'une paire torsadée. Cela te permet d'avoir une idée de la dégradation de signal
à laquelle il faut t'attendre.

Normalement avec un câble cat 5 de seulement 10m, ça doit pas être un problème.

Si qqn a un conseil sur où il faut connecter le blindage du câble ?

j'ai vu les deux
pullup et en série sur la ligne
c'est pour ça que je doute

pour les perte je pense pas en avoir énormément sur 10m ( 20m aller retour )
mais on sait jamais
pour les interférences de toute façon le blindage sera ( si besoin ) relié a une terre donc ca devrais limité un peu

pour la mise en // j'ai pas besoin de savoir quel clavier est utilisé donc pas de problèmes

le watchdog si j'ai bien comprit permet de redémarré l'arduino une fois de temps en temps

de toute façon je ferais des essaie avant le montage finale pour être tranquille

le watchdog si j'ai bien comprit permet de redémarré l'arduino une fois de temps en temps

Pas exactement. Le but du watchdog est de redémarrer le système seulement si ça va mal.

Voici un exemple:

#include <avr/wdt.h>

void setup ()
{
  wdt_enable (WDTO_1S);  // Initialise le watchdog avec un délais de 1 secondes
}

void loop ()
{
  wdt_reset ();  // remet à zéro le timeout du watchdog
  // fait des choses normales de l'application
}

Dans le cadre d'un fonctionnement normal, ton application envoie un signal au watchdog
avec la commande wdt_reset(). Tant que le watchdog reçoit ce signal avant
que le temps (timeout) soit écoulé, il n'intervient pas et remet le timeout à zéro.

Si le programme plante, par exemple à cause d'un parasite qui a fait gicler le pointeur programme ailleurs
dans la flash, il se peut que l'arduino exécute des instructions pas prévues. Le watchdog ne recevant plus
de signal durant le temps imparti, il intervient et redémarre l'arduino.

Il faut juste configurer le timeout avec un délais supérieur aux plus long temps que ton application peut prendre entre
deux appels à wdt_reset(). Parfois il faut ajouter un wdt_reset() dans certaines boucles de traitement trop longues.

ah pas mal ça
j'avoue que je ne connaissait pas
je vais de ce pas en mettre un peu partout ^^
sur les programmes qui ont besoin de tourner longtemps je vais en mettre
genre si j'attends 10 sec pour allumer un escalier ( mon ancien projet fini )
je met 11 sec pour être tranquille
si l'arduino plante, au bout de 11sec watchdog redémarre l'arduino
j'avoue c'est très bien penser ca