realisation porte automatique

Bonsoir tout le monde
Je commence enfin mon premier projet arduino (et oui il été temps ^^)
Alors j'ai déjà quelques plans, j'ai aussi déjà commander mon arduino + shield Ethernet + carte 4 relais. J'ai tout le reste des plan dans ma tète :slight_smile:
Mais les soucis commences déjà.
Je m'explique :
Il faut que j'alimente mon arduino avec du 9volts + ma carte relais 5volts + un ventilateur 12volts + un tout petit moteur de 9 volts.
Il faudrait donc que je prenne une allim 12volts et que je la régule en 9 et 5 volts ?
A oui aussi est se que cela dérange si je branche le petit moteur sur le même circuit 9v que la carte arduino ?
merci d'avance pour vos réponses =)

Je crois que tu t'es répondu tout seul :slight_smile:

Après il faut juste bien faire attention aux puissances nécessaires, et tu peux étudier différentes solution suivant ton budget et la l'intégration dans ton projet, l'idéal étant un transfo fournissant plusieurs tensions ou plusieurs transfo pour les différentes tensions. Après redressement, lissage et si besoin utilisation d'un régulateur.

j'aimerais partir sur un simple transfo 12v mais j'aurais besoin d'aide pour cree plusieurs tensions (5v-9v-9v-12v) a partir de celui ci .
j'ai entendu parler d'un pont diviseur de tension mais je ne sais pas si il n'est pas préférable de fabriquer un multi régulateur ?

Bonjour,

Tout d'abord, pourquoi vouloir alimenter spécialement l'Arduino en +9V ?

De plus, quand d'une telle source (isolée, non régulée, ...) tu veux en tirer plusieurs tensions d'alimentation, il est plus que recommandé de passer par des régulateurs, du moins tant que les puissances demandées sont relativement faibles.

Ce que je te conseille, est de réaliser un simple shield multi-régulateur avec une fiche pour le 12V en entrée, notamment à l'aide de shield incorporant des breadboards.

Pourquoi un shield ? Car en reliant la sortie de ton régulateur +5V à la pin correspondant du connecteur du shield, tu pourras alimenter l'Arduino et l'ethernet shield dans la foulée.
De plus en fonction des caractéristiques de ton ventilateur 12V, il est possible que tu puisses le rentrer sur ton +12V source, sans écrouler la tension d'entrée de tes régulateurs.

Attention cependant, fait le bilan des puissances de ton installation, pour vérifier que tous tes éléments peuvent être alimentés par ton transformateur 12V.

J'espère avoir répondu à tes questions.

Stéphane

Bonjour
Merci Stéphane d'avoir répondu a ma question .
Pourrais tu m'aider a réaliser se shield multi-régulateur ? (je n'est pas beaucoup de connaissance en électronique)

regarde la doc des régulateurs 7805 / 7812 et compagnie.

Ensuite, va faire un tour sur le site de sonelec (utilise google) dans la rubrique "montages"

Ensuite, fait des essais :wink: - commence par utiliser un crayon et une gomme, puis trace un schéma de montage qui te semble logique avec ce que tu auras appris sur les docs ci-dessus. Soumets le ici pour correction avant réalisation d'un proto.
note : tu peux aussi utiliser Fritzing

Bonsoir
Alors voici mon premier schema :

Uploaded with ImageShack.us

Mais comme dit c'est vraiment basique . il me reste a calculer la valeur des resistances mais avant sa j'ai encore quelques questions :

  • Est t-il vraiment necesaire de mettre un regulateur pour la partie 1?
  • Est t-il possible de brancher l'arduino + shield ethernet sur le meme regulateur que celui du moteur de la porte (regrouper partie 2 et 3) ?
    bref j'en est fini pour se soir
    se projet me tient particuliérement a coeur (j'ai deja mis en place tout les cablages et presque tout le reste, il me manque plus que la fabrication de cette boite avec l'arduino et tout le reste)
    Bon bonne nuit tout le monde je revien demain pour poster des photos et d'autres explications

Salut!

Très compliquée, ton alim, pour ce qu'elle doit faire.

Pourquoi n'utilises-tu pas une alim de PC, qui te fournira toutes les tensions nécessaires? elle te donnera du 12V sur 2A à 5A, deux lignes 5V (l'une à 1A pour l'arduino, l'autre à 20A pour tout le reste), et même du 3.3V, du -5V, du -12V... Le tout super régulé et déjà tout fait et surtout étudié pour la micro. il suffit juste de shunter deux fils et mettre une résistance sur le 5V de puissance pour assurer une consommation suffisante. Pour avoir du 9V, par contre, il te faudra un 7809 sur le 12V.

Dans ton schéma, si tu veux utiliser un 7812, il te faut un transfo de 15V (les régulateurs ont besoin d'une entrée d'au moins 3V au dessus de la sortie pour bien marcher), et tes régulateurs 5V vont beaucoup chauffer (la série 78/79 supporte mal la puissance au dessus de 5W pour des TO220). La puissance dissipée par un régulateur est (Vin-Vout) x Iout, et il faut rester en dessous de la moitié des limites du constructeur (même avec dissipateurs thermiques, cherche pas pourquoi, moi j'en ai cramé un paquet en les faisant marcher dans les autorisations constructeurs...).

Pour info, les régulateurs portent les noms suivants : 78_xx et 79_xx, 78 = régulateur positif et 79 = régulateur négatif, xx la tension de sortie, on en trouve des 03, 04, 05, 06... presque toutes les tensions. Ca évite le calcul de résistances...

Mais vois l'alim de PC... ça reste le plus simple...

merci pour les explications =)
je met tout sa un peu de coté car je viens de recevoir mon arduino.
Mais je suis vraiment débutant donc j'aurais besoin d'aide .
alors je m'explique : mon but est d'allumer la led1 grâce a une pression sur le bouton poussoir 1 et d'éteindre cette led1 2 seconde aprés. puis de ne rien faire tant que j'appuis pas sur l'interupteur2 .
une fois le l'interupteur2 enclenche, la led2 doit s'allumer pendant 2 secondes puis s’arrêter .
alors mon programme :

// --- Déclaration des constantes ---

const int APPUI=0; // constante état du BP - appui sur niveau bas
const int PAS_APPUI=1; // constante état du BP - relâché sur niveau haut


// --- constantes des broches ---

const int BP1=2; //declaration constante de broche 
const int relais1=3; //declaration constante de broche 
const int relais2=4; //declaration constante de broche 
const int BP2=5;

// --- Déclaration des variables globales ---

int ETAT_BP1; // variable d'état du bouton poussoir
int ETAT_BP2; // variable d'état du bouton poussoir

// --- Initialisation des fonctionnalités utilisées ---

//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

pinMode(relais1, OUTPUT); //met la broche en sortie 
pinMode(relais2, OUTPUT); //met la broche en sortie

pinMode(BP1, INPUT); //met la broche en entree 
digitalWrite(BP1, HIGH) ; // activation du pullup de la broche en entrée
pinMode(BP2, INPUT); //met la broche en entree 
digitalWrite(BP2, HIGH) ; // activation du pullup de la broche en entrée

} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

ETAT_BP1=digitalRead(BP1); // lit l'état du BP1 et met la valeur 0/1 dans la variable
ETAT_BP1=digitalRead(BP2); // lit l'état du BP2 et met la valeur 0/1 dans la variable


  if (ETAT_BP1==APPUI);{
  digitalWrite(relais1,1); // allume la LED
  delay(2000);                  // waits for a second
  digitalWrite(relais1,0);
  }
  
  if (ETAT_BP2==APPUI);{
  delay (3000);
  digitalWrite(relais2,1);
  delay(2000);
  digitalWrite(relais2,0);
}

// remarque : on aurait pu écrire ceci sur une seule ligne selon : 
// if (ETAT_BP==APPUI)digitalWrite(LED,1); else digitalWrite(LED,0);

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---

mais se programme ne fonctionne pas ?

1 - le programme marche mal, mais très bien (tu peux allumer le led1 mais tant qu'elle est allumée, tu ne peux pas agir sur la 2).
2 - tu as pris un truc tout fait, donc il ne correspond peu-être pas à tes attentes.
3 - tes leds sont à l'envers?
4 - tes BP sont mal câblés?
5 - pour n'allumer que deux leds (ou deux relais), c'est bien rempli, je trouve...

je te propose le prog suivant (avec led intégrée sur pin 13) :

const byte ledPin = 13; // led intégrée sur broche 13
const byte bp1 = 8; // BP branché entre pin 8 et GND

void setup(){
  pinMode (ledPin, OUTPUT);  // pin led en sortie
  pinMode (bp1, INPUT);        // pin bp en entrée
  digitalWrite (bp1, HIGH);     // pulup "on"
}

void loop(){
  while (digitalRead(bp1) == HIGH) {}  // boucle tant que pas d'appui.
  digitalWrite (ledPin, HIGH);             // led ON
  delay (1000);                                // attendre 1 seconde (1000 ms)
  digitalWrite (ledPin, LOW);             // led OFF
}

help me !
je ne comprend rien pour l'ethernet shield !
j'ai un arduino ethernet shield v1.1
je ne trouve pas l'adresse mac quelqu'un pourrait m'aider svp ?

Bonsoirs
Je débute dans l'univers arduino .
Mon but et de contrôler 4 relais par rapport a internet ou par rapport a 2 boutons poussoirs mais cela en fonction de 2 autres interrupteurs (fin de courses) et d'envoyer un email a une certaine adresse a un certain moment du programme .
je m'explique un peut mieux :
au démarrage de l'arduino mon programme est censé faire clignoter une led puis :

  1. Faire une vérification des capteurs ( si le fdc du verrou et le fdc de la porte sont tout les 2 == HIGH, la led rouge s'allume et le programme continu. Mais si le fdc du verrou est == LOW et que le fdc de la porte est == HIGH, allumer le relais de fermeture (relayclose) pendant 800 ms puis allumer la led rouge et continuer le programme. Autrement si le fdc du verrou == LOW et que le fdc de la porte est == LOW ou que si le fdc du verrou == HIGH et que le fdc de la porte est == LOW , continuer a chercher une condition valable pour continuer le programme.)

Le reste de mon programme est deja dans ma téte mais c'est trop long a expliquer pour le moment je prefere faire par étapes .
En gros mon souci c'est que je n'arrive pas a bien faire mon programme :confused:
J'aurais besoin d'un peu (beaucoups) d'aide.
merci d'avance .

ps :

#include <SPI.h>

const int relayopen = A0; //Relais 1 connecter au pin A0
const int relayclose = A1; //Relais 2 connecter au pin A1
const int relaylight = A2; //Relais 3 connecter au pin A2
const int relaypc = A3; //Relais 4 connecter au pin A3
const int ledverte = A4; //Led1 connecter au pin A4
const int ledrouge = A5; //Led2 connecter au pin A5
const int bpescalier = 4; //Bouton poussoir 1 (dans l'escalier) connecter au pin 4
const int bpporte = 5; //Bouton poussoir 2 (sur la porte) connecter au pin 5
const int fdcporte = 2; //Fin de course 1 (porte ouverte ou fermer) connecter au pin 2
const int fdcverrou = 3; //Fin de course 2 (verrou) connecter au pin 3

int bpescalierEtat = 0;
int bpporteEtat = 0;
int fdcporteEtat = 0;
int fdcverrouEtat = 0;
int switch1 = 1;
int width1 = 20; // configuration du nombre de repetition de l'animation de demarrage
void setup() {

// configuration des relais et des led
pinMode(relayopen, OUTPUT);
pinMode(relayclose, OUTPUT);
pinMode(relaylight, OUTPUT);
pinMode(relaypc, OUTPUT);
pinMode(ledverte, OUTPUT);
pinMode(ledrouge, OUTPUT);
// configuration des bp et de fdc
pinMode(bpescalier, INPUT);
digitalWrite(bpescalier, HIGH) ;
pinMode(bpporte, INPUT);
digitalWrite(bpporte,HIGH);
pinMode(fdcporte, INPUT);
digitalWrite(fdcporte, HIGH) ;
pinMode(fdcverrou, INPUT);
digitalWrite(fdcverrou, HIGH) ;
// initialisation de la connection SPI
Serial.begin(9600);
// initialisation de l'état des relais et des led
digitalWrite(relayopen,HIGH);
digitalWrite(relayclose,HIGH);
digitalWrite(relaylight,HIGH);
digitalWrite(relaypc,HIGH);

fdcverrouEtat = digitalRead (fdcverrou);
fdcporteEtat = digitalRead (fdcporte);
bpescalierEtat = digitalRead (bpescalier);
bpporteEtat = digitalRead (bpporte);

// animation de demarrage (a placer toujours a la fin)
for (int i=1;i<width1;i++){
digitalWrite(ledverte,HIGH);
delay(30);
digitalWrite(ledverte,LOW);
delay(30);
}

}

void loop(){

// partie sécuritée au demarrage

switch (switch1) {
case 1: if (fdcverrouEtat == LOW || fdcporteEtat == HIGH){
digitalWrite (relayclose,LOW);
delay (800);
digitalWrite (relayclose,HIGH);
digitalWrite (ledrouge,HIGH);
delay(500);
break;}

case 2: if (fdcverrouEtat == HIGH || fdcporteEtat == HIGH){
digitalWrite (ledrouge,HIGH);
delay(500);
break;

case 3: if (fdcverrouEtat == LOW || fdcporteEtat == LOW){
digitalWrite (ledverte,HIGH);
}
}
}

{
digitalWrite (relaypc,LOW);
delay (1000);
digitalWrite (relaypc,HIGH);
delay (1000);
}
}

Salut,

ça manque de

fdcverrouEtat = digitalRead (fdcverrou);
  fdcporteEtat = digitalRead (fdcporte);
  bpescalierEtat = digitalRead (bpescalier);
  bpporteEtat = digitalRead (bpporte);

appelé cycliquement pour mettre à jour l'état du bp... en tenant compte des éventuelles rebonds dû à la mécanique.

Astuce: places des "Serial.println("mon code est passé par ici") et autre "Serial.println("il est repassé par là") à des endroits stratégiques de ton programme: ça te facilitera le debogage. :wink:

Gromain

Merci de l'astuce Gromain.
Sa ne fonctionne pas comme j'aimerais car j'aimerais executer une seule fois se (switch/case) au demarrage mais dans la partie void loop. Quelqu'un aurais une idée ?

salut,

je ne comprend pas l'utilité du switch case, puisque la variable switch1 vaut 1 dans tous les cas ?
Si tu ne dois exécuter une partie du code qu'une fois au démarrage, alors place-le à la fin du setup()

Dans le code actuel, tu lis l'état des verrous une seule fois dans le setup(). Si tu attendais un changement d'état d'une entrée pour pouvoir faire évoluer le comportement du programme, c'est loupé. Ton programme passe à chaque cycle dans le case 1 et fait changer d'état le la sortie relaypc. Il ne se passera rien de plus.

N'oublies pas également les résistances de pull-up ou pull-down sur les entrées et que ton programme est en pause pendant toute la durée du delay()

Gromain

Ce qui est dommage (arduino ou pas), c'est les mauvais réflexes de programmation. Le nombre de variables ou constantes définies est assez énorme pour l'utilisation que tu en fais.

il faut préférer un

#define relayopen A0

qu'un

const int relayopen = A0;

L'intérêt du #define est de ne pas occuper de mémoire dans le micro-contrôleur, car il remplace (ici) automatiquement relayopen par A0 à la compilation.
même astuce pour ton "width1"... Je suppose que tu ne compte pas le changer pendant l'exécution du programme !

Et en effet, ton switch (sans parler des confusions dans la syntaxe et les accolades) ne sert à rien et les lignes suivantes doivent être placés dans loop() pour être exécutées chaque fois avant les tests.

  fdcverrouEtat = digitalRead (fdcverrou);
  fdcporteEtat = digitalRead (fdcporte);
  bpescalierEtat = digitalRead (bpescalier);
  bpporteEtat = digitalRead (bpporte);

Sinon, ça n'est pas recommandé par Arduino, mais j'ai toujours programmé mes micro-contrôleurs comme ça : on peut utiliser les registres DDRD, DDRC, ... pour initialiser l'état de plusieurs pattes en une ligne de code très rapide (cf Arduino Reference - Arduino Reference)
par exemple :

DDRC = 63; // B00111111 en binaire (1 pour sorties 0 pour entrées)

remplace les lignes de codes suivantes :

  pinMode(relayopen, OUTPUT);
  pinMode(relayclose, OUTPUT);
  pinMode(relaylight, OUTPUT);
  pinMode(relaypc, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledrouge, OUTPUT);

En conclusion, tu pourrais réduire la taille de ton code d'environ 70% avec un fonctionnement meilleur, moins lourd et plus rapide.

avant de réduire et optimiser le code, essayons déjà de le faire fonctionner XD

parfois, il faut aussi prendre le temps d'écrire sur le papier ce qu'on veut faire pour mieux structurer ses idées... et son code.

Oui justement je me sentais un peu perdu dans toutes ces lignes ^_^.
De mon point de vue, ça peut aider à trouver ses erreurs.

C'est pas un cahier des charges très compliqué, il devrait pouvoir s'en sortir en lui donnant quelques tuyaux !

Bonsoir
Alors :

je ne comprend pas l'utilité du switch case, puisque la variable switch1 vaut 1 dans tous les cas ?

: justement j'ai du mal avec les variables : comment les utiliser pour que le switch/case essai tout les cas?

Si tu ne dois exécuter une partie du code qu'une fois au démarrage, alors place-le à la fin du setup()

: je voudrai execute le switch/case 1 seule fois mais le but est aussi de ne pas executer le reste du programme (a venir par la suite) tant qu'aucune conditions valable n'a été trouver ?

aprés mon "cahier des charges" est bien établit mais dans ma téte (faut juste que je trouve le temps de tout poster sur le forum . Merci aussi pour les conseils de programmation (je vais essayer d'en tenir compte (je suis debutant)).