Go Down

Topic: Escalier interactif (Read 1 time) previous topic - next topic

jbx028

Bonjour,

J'aimerais réaliser cela chez moi à l'aide d'un arduino : http://www.interactivefurniture.de/index.html

J'ai déja un arduino, ainsi que 2 capteurs SRF02 (http://www.robot-electronics.co.uk/htm/srf02tech.htm)

Pour le kit LED, je voulais utiliser quelque chose du genre  :

http://www.leroymerlin.fr/mpng2-front/pre?zone=zonecatalogue&ideilist=1271666676191&1271666676191.pos=9&01-comment-choisir-render=off&02-multicritere-render=off&03-zoom-produit-render=off&eipublicationtype=product&backurl=pre%3Fzone%3Dzonerecherche%26family%3Dspots-a-encastrer%26intuitiontodo%3Dsearchproductsfamily%26numberofitemperpage%3D20%26pageid%3D71%26presentationid%3D2

Mais voila, je suis programmeur de profession (et je connais processing) mais totalement newbie en électronique. Pourriez vous me guider un tout petit peu pour pouvoir connecter ses LED à mon arduino sachant que comme dans la video, il ne faut pas que toute les LED s'éclairent/s'éteignent au même moment....

Merci d'avance pour votre aide

Johnny B



ekaki

Il faudrait savoir combien il y a de marches à éclairer car sur l'Arduino (de base) il y a une limite pour le nombre de voies commandables en PWM (afin que que cela s'allume et s'éteigne progressivement comme dans la vidéo que tu donnes).

S'il n'y a pas trop de marches, tu pourras les commander directement par l'Arduino via un circuit de puissance (à vue de pif' les LED vont demander plus que ce que l'Arduino peut fournir).

S'il y a trop de marche vis-à-vis des voies disponibles il faudra voir pour utiliser un circuit intermédiaire afin de multiplexer tout ça) -.^

Il existe certainement des modules "tout faits" qui pourront correspondre à tes attentes (pilotage de xx LED de puissance), si tu ne veux pas te lancer dans la fabrication.

Jean-François

#2
Apr 19, 2010, 02:01 pm Last Edit: Apr 19, 2010, 02:07 pm by jfs Reason: 1
Avec la Mega il me semble qu'il y a plus de sortie PWM, quelle modèle de plaque Arduino as-tu ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

B@tto

En utilisant un circuit RC y'a pas moyen de faire l'effet ? (et du coup de se passer du PWM)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Bidouille

Bonjour,

Sympa comme truc, j'ai fais voir ça au boulot et ça a bien plu.

Ce qui me chiffonne un peu, c'est que l'éclairage semble suivre la montée et la descente de la personne aussi je pense que tes 2 capteurs ne sont pas adapatés : que va t-il se passer si arrivé au milieu, tu décides de faire marche arrière ? Le système ne va pas le détecter et inverser le processus d'allumage / extinction ...
Ne faudrait il pas mettre plusieurs capteurs ( 6, 8 ? ) ou ne serait il pas plus judicieux de mettre une diode IR et un récepteur par marche ( ou toutes le 2 marches ) ?

A+  

ekaki

#5
Apr 19, 2010, 11:14 pm Last Edit: Apr 19, 2010, 11:14 pm by ekaki Reason: 1
Quote
(...) ne serait il pas plus judicieux de mettre une diode IR et un récepteur par marche ( ou toutes le 2 marches ) ?

Je pensais la même chose.
Mais il y a peut-être moyen de savoir à quelle distance est "le mobile" qui monte les marches avec deux capteurs à ultrasons (triangulation || effet Doppler ?).
Cependant, il faudrait mieux que l'escalier soit rectiligne, sinon bonjour les calculs ^.^

jbx028

Bonjour,

En cherchant un peu, j'ai trouvé ce kit à 99$ : http://alan-parekh.vstore.ca/index.php/cPath/1_2

C'est pas à base d'arduino mais ca devrait le faire. Je sais pas encore si je vais craquer...

En tous les cas, merci pour vos réponses.

Johnny B

B@tto

Quote
(...) ne serait il pas plus judicieux de mettre une diode IR et un récepteur par marche ( ou toutes le 2 marches ) ?
Je pensais la même chose.
Mais il y a peut-être moyen de savoir à quelle distance est "le mobile" qui monte les marches avec deux capteurs à ultrasons (triangulation || effet Doppler ?).
Cependant, il faudrait mieux que l'escalier soit rectiligne, sinon bonjour les calculs ^.^


Vous voulez tuer une mouche avec un char d'assaut vous ^^

Il suffit des deux barrières infrarouges sauf que la partie extinction ne se produit que lorsque la personne franchisse la seconde barrière (ou la première si jamais il a fait demi-tour). Au pire tu étoffes un peu le système en en ajoutant une au milieu.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

bgaswiss

#8
May 03, 2010, 12:51 am Last Edit: May 03, 2010, 12:57 am by bgaswiss Reason: 1
bonjour
j'ai une solution avec une carte d'extension avec un où plusieurs tlc5490 et des drivers uln2803 pour augmenter le courant sur les leds (luxeon 350 ma) + deux detecteurs PIR parallax

/LUXEON_TLC.png

/*
* commande d'eclairage dans un escalier de 2 à 16 leds
*  par bgaswiss
*  
* avec la librairie tlc5490
*
*/

#include "Tlc5940.h"

#include "tlc_progmem_utils.h"



#define light 4095 //luminiosité des leds 4095 = max 0 = min

uint8_t gsArray1[NUM_TLCS * 24] PROGMEM = {
 GS_DUO((light * 16)/16, (light * 16)/16), GS_DUO((light * 16)/16, (light * 16)/16),
 GS_DUO((light * 16)/16, (light * 16)/16), GS_DUO((light * 16)/16, (light * 16)/16),
 GS_DUO((light * 16)/16, (light * 16)/16), GS_DUO((light * 16)/16, (light * 16)/16),
 GS_DUO((light * 16)/16, (light * 16)/16), GS_DUO((light * 16)/16, (light * 16)/16),
};

uint8_t gsArray2[NUM_TLCS * 24] PROGMEM = {
 GS_DUO((0*16)/16, (0*16)/16), GS_DUO((0*16)/16, (0*16)/16),
 GS_DUO((0*16)/16, (0*16)/16), GS_DUO((0*16)/16, (0*16)/16),
 GS_DUO((0*16)/16, (0*16)/16), GS_DUO((0*16)/16, (0*16)/16),
 GS_DUO((0*16)/16, (0*16)/16), GS_DUO((0*16)/16, (0*16)/16),
};
int pir_down = 4; //detecteur descente
int pir_up = 5;// detecteur montée
int led_down = 6;// led descente detection
int led_up =7;// led montée detection
int ldr =0;// sonde de luminiosité
int calibration =10;// temps de mise en route pir
int speed_clr =15;// vitesse éteindre
int speed_set =30;// vitesse alumage
int canaux =16;// nombre de cannaux
int luminosite =512;// seuil de luminiosite
int temporis = 40;// temporisation étinction en secondes



void setup()
{
 Tlc.init();
 Tlc.clear();
 Tlc.update();
  pinMode(ldr,INPUT);
  pinMode(pir_down, INPUT);
  pinMode(pir_up, INPUT);
  pinMode(led_down, OUTPUT);
  pinMode(led_up, OUTPUT);
  digitalWrite(pir_down, LOW);
  digitalWrite(pir_up, LOW);
 
   for(int i = 0; i < calibration; i++){
      digitalWrite (led_down,HIGH );
     digitalWrite (led_up,HIGH);
     delay(1000);
     digitalWrite (led_down,LOW);
     digitalWrite (led_up,LOW);
     }

}

void loop(){
if (digitalRead(pir_up) == HIGH && analogRead(ldr) <=luminosite ){
   digitalWrite (led_up,HIGH);
 up_set();
digitalWrite (led_up,LOW);
delay(500);
 tempo_up();
}  
if (digitalRead(pir_down) == HIGH && analogRead(ldr) <=luminosite ){
  digitalWrite (led_down,HIGH);
 down_set();
  digitalWrite (led_down,LOW);
  delay(500);
 tempo_down();
}
}



void tempo_up(){
 for (int i=0 ; i< temporis; i++){
   if (digitalRead(pir_down) == HIGH)  {
      digitalWrite(led_down,HIGH);
     delay(500);
    goto suit ;
 }

   delay(1000);
 }
 suit:
  digitalWrite(led_down,LOW);
   digitalWrite(led_up,LOW);
up_clear();
}




void tempo_down(){
 for (int i=0 ; i< temporis; i++){
 
    if ( digitalRead(pir_up) == HIGH ) {
    digitalWrite(led_up,HIGH);
     delay(500);
    goto suit2 ;
 }
   delay(1000);
 }
 suit2:
  digitalWrite(led_down,LOW);
   digitalWrite(led_up,LOW);
 down_clear();
}




void up_set(){
  tlc_setGSfromProgmem(gsArray2);
 Tlc.update();

 // Fade each channel to zero
 for (TLC_CHANNEL_TYPE channel = 0; channel < NUM_TLCS * canaux; channel++) {
   int16_t initialValue = Tlc.get(channel);
   while (initialValue <light) {
     initialValue += speed_set;
     if (initialValue > light) {
       initialValue = light;
     }
     Tlc.set(channel, initialValue);
     
     // wait until the data has been sent to the TLCs before continuing
     while (Tlc.update());
   }
   }
 
}

void up_clear(){
   // Display the pattern (brightness ramp over the outputs)
 tlc_setGSfromProgmem(gsArray1);
 Tlc.update();

 // Fade each channel to zero
 for (TLC_CHANNEL_TYPE channel = 0; channel < NUM_TLCS * canaux; channel++) {
   int16_t initialValue = Tlc.get(channel);
   while (initialValue > 0) {
     initialValue -= speed_clr;
     if (initialValue < 0) {
       initialValue = 0;
     }
     Tlc.set(channel, initialValue);
     
     // wait until the data has been sent to the TLCs before continuing
     while (Tlc.update());
 
   }
 }
}

void down_set(){
   tlc_setGSfromProgmem(gsArray2);
 Tlc.update();

 // Fade each channel to zero
 for (TLC_CHANNEL_TYPE channel = canaux-1; channel < NUM_TLCS * canaux; channel--) {
   int16_t initialValue = Tlc.get(channel);
   while (initialValue <light) {
     initialValue += speed_set;
     if (initialValue > light) {
       initialValue = light;
     }
     Tlc.set(channel, initialValue);
     
     // wait until the data has been sent to the TLCs before continuing
     while (Tlc.update());
   }
   }
}

void down_clear(){
  // Display the pattern (brightness ramp over the outputs)
 tlc_setGSfromProgmem(gsArray1);
 Tlc.update();

 // Fade each channel to zero
 for (TLC_CHANNEL_TYPE channel = canaux-1; channel < NUM_TLCS * canaux; channel--) {
   int16_t initialValue = Tlc.get(channel);
   while (initialValue > 0) {
     initialValue -= speed_clr;
     if (initialValue < 0) {
       initialValue = 0;
     }
     Tlc.set(channel, initialValue);
     
     // wait until the data has been sent to the TLCs before continuing
     while (Tlc.update());
 
   }
 }
}

Go Up