Pages: [1]   Go Down
Author Topic: Escada Inteligente - A realização de um sonho  (Read 3500 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 2
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oi pessoal!

Terminei meu projeto e gostaria de compartilha-lo com vocês:  smiley-mr-green

https://www.youtube.com/watch?v=-WSerskAiiA

Peças
15 leds de alto brilho,
2 protoboards
1 arduino
1 fonte
30 metros de cabo de rede
2 sensores ultrasonico

Segue código fonte:

Code:
/*---------------------------------------------
 S H I F T O U T M E G A
 Ampliar o número de saídas do Arduino com
 Registrador de Deslocamento 74HC595
 --------------------------------------------*/
 
/*¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
 - Pino 8 do Arduino ligado ao pino 12 do CI.
 - Pino 11 do Arduino ligado ao pino 14 do CI.
 - Pino 12 do Arduino ligado ao pino 11 do CI.
 - Led 1 = Pino 15 do CI.
 - Led 2 = Pino 1 do CI.
 - Led 3 = Pino 2 do CI.
 - Led 4 = Pino 3 do CI.
 - Led 5 = Pino 4 do CI.
 - Led 6 = Pino 5 do CI.
 - Led 7 = Pino 6 do CI.
 - Led 8 = Pino 7 do CI.
 - Pinos 10 e 16 do CI ligados ao Vcc.
 - Pinos 8 e 13 do CI ligados ao GND.
 - Pino 9 do CI ligado ao pino 14 do próximo CI.
 ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*/
 
#include <ShiftOutMega.h> //Inclui a biblioteca ShiftOutMega.h
#include <NewPing.h> // Inclui a biblioteca NewPing.h

//Variáveis de uso dos registradores 74HC595
int latchPin = 8;  //Pino 8 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 11 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 12; //Pino 12 conectado ao pino 11 do 74HC595 (Clock).

//Define o numero de sensores, a distancia maxima e o intervalo da medição
#define SONAR_NUM   2 // Define o numero de sensores 
#define MAX_DISTANCE 80 // Distancia maxima 
#define PING_INTERVAL 33 // Milisegundos de intervalo entre medicoes (29ms e o tempo mínimo para evitar conflito entre os sensores)

unsigned long pingTimer[SONAR_NUM]; // Armazena a quantidade de vezes que a medicao deve ocorrer, para cada sensor 
unsigned int cm[SONAR_NUM];     // Armazena o numero de medicoes 
uint8_t currentSensor = 0;     // Armazena o sensor que esta ativo 
 
//criando objeto e definindo as portas digitais do Trigger - 6 - e Echo - 7

NewPing sonar[SONAR_NUM] =   
 {   // Armazena informacoes sobre a pinagem dos sensores 
  NewPing(6, 7, MAX_DISTANCE), // Pino trigger, echo e distancia máxima, para cada sensor 
  NewPing(3, 4, MAX_DISTANCE), 
 }; 
 
//Quantidade de registradores (74HC595). Para cada registrador, temos 8 saídas.
int qtdRegistradores = 2;
 
int totalSaidas = qtdRegistradores * 8;
int t = 100; //tempo entre o acender dos leds.
int tempo = 2000; //tempo que fica aceso os leds para depois apagar.

//Inicia a biblioteca passando os parametros de uso.
ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores);

void setup(){
Serial.begin(9600); //Inicializando o serial monitor 
  pingTimer[0] = millis() + 75;      //Primeira medicao começa com 75ms 
  for (uint8_t i = 1; i < SONAR_NUM; i++) //Define o tempo de inicializacao de cada sensor 
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;

     //Apagando todos os leds
  mega.shiftWrite(totalSaidas, LOW);
 }
 
void loop() { 
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop entre todos os sensores 
   if (millis() >= pingTimer[i]) {       
    pingTimer[i] += PING_INTERVAL * SONAR_NUM; //Define o tempo que o proximo sensor sera acionado 
    if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Ciclo do sensor completo 
    sonar[currentSensor].timer_stop();     // Reseta o timer antes de ler o proximo sensor 
    currentSensor = i;             // Número do sensor sendo acionado   
    cm[currentSensor] = 0;           // Se nao houver eco do sensor, seta a distância como zero 
    sonar[currentSensor].ping_timer(echoCheck); 
   } 
 } 
}
 void echoCheck() { //Se receber um sinal (eco), calcula a distancia 
  if (sonar[currentSensor].check_timer()) 
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; 
 }   
 
 void oneSensorCycle() { // Ciclo de leitura do sensor
     
//Se for detectado objeto entre 0 e 10 cm do sensor1, acende leds
     if (cm[0] > 1 && cm[0] < 10){
       
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, LOW);
      delay(t);
    }
   }
//Se for detectado objeto entre 0 e 50 cm do sensor2, acende o led   
     if (cm[1] > 1 && cm[1] < 10) {
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, LOW);
      delay(t);   
  }
 }
}

O desenho do projeto ainda não tenho pronto. quando terminar eu add aqui.

Abraço! smiley-wink
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1595
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gostei de ver, parabéns
Tenho uma sugestão para ti,
Qual o comportamento se eu for a correr e subir a escada?
Devias obter a velocidade de quem sobe ou desce e com base nesse valor regular a velocidade dos leds de acender e apagar.
Se fosse devagar os leds acompanham -me , mas se for depressa eles também o fazem de uma forma dinâmica.
Assim da um efeito mais natural
Se tens sensores ultra-sónicos consegues obter a velocidade em metros/segundo a que o utilizador passou e com base nisso definires uma velocidade aos leds.



Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ola,

Tenho interesse no assunto ...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oi pessoal!

Terminei meu projeto e gostaria de compartilha-lo com vocês:  smiley-mr-green

https://www.youtube.com/watch?v=-WSerskAiiA

Peças
15 leds de alto brilho,
2 protoboards
1 arduino
1 fonte
30 metros de cabo de rede
2 sensores ultrasonico

Segue código fonte:

Code:
/*---------------------------------------------
 S H I F T O U T M E G A
 Ampliar o número de saídas do Arduino com
 Registrador de Deslocamento 74HC595
 --------------------------------------------*/
 
/*¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
 - Pino 8 do Arduino ligado ao pino 12 do CI.
 - Pino 11 do Arduino ligado ao pino 14 do CI.
 - Pino 12 do Arduino ligado ao pino 11 do CI.
 - Led 1 = Pino 15 do CI.
 - Led 2 = Pino 1 do CI.
 - Led 3 = Pino 2 do CI.
 - Led 4 = Pino 3 do CI.
 - Led 5 = Pino 4 do CI.
 - Led 6 = Pino 5 do CI.
 - Led 7 = Pino 6 do CI.
 - Led 8 = Pino 7 do CI.
 - Pinos 10 e 16 do CI ligados ao Vcc.
 - Pinos 8 e 13 do CI ligados ao GND.
 - Pino 9 do CI ligado ao pino 14 do próximo CI.
 ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*/
 
#include <ShiftOutMega.h> //Inclui a biblioteca ShiftOutMega.h
#include <NewPing.h> // Inclui a biblioteca NewPing.h

//Variáveis de uso dos registradores 74HC595
int latchPin = 8;  //Pino 8 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 11 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 12; //Pino 12 conectado ao pino 11 do 74HC595 (Clock).

//Define o numero de sensores, a distancia maxima e o intervalo da medição
#define SONAR_NUM   2 // Define o numero de sensores 
#define MAX_DISTANCE 80 // Distancia maxima 
#define PING_INTERVAL 33 // Milisegundos de intervalo entre medicoes (29ms e o tempo mínimo para evitar conflito entre os sensores)

unsigned long pingTimer[SONAR_NUM]; // Armazena a quantidade de vezes que a medicao deve ocorrer, para cada sensor 
unsigned int cm[SONAR_NUM];     // Armazena o numero de medicoes 
uint8_t currentSensor = 0;     // Armazena o sensor que esta ativo 
 
//criando objeto e definindo as portas digitais do Trigger - 6 - e Echo - 7

NewPing sonar[SONAR_NUM] =   
 {   // Armazena informacoes sobre a pinagem dos sensores 
  NewPing(6, 7, MAX_DISTANCE), // Pino trigger, echo e distancia máxima, para cada sensor 
  NewPing(3, 4, MAX_DISTANCE), 
 }; 
 
//Quantidade de registradores (74HC595). Para cada registrador, temos 8 saídas.
int qtdRegistradores = 2;
 
int totalSaidas = qtdRegistradores * 8;
int t = 100; //tempo entre o acender dos leds.
int tempo = 2000; //tempo que fica aceso os leds para depois apagar.

//Inicia a biblioteca passando os parametros de uso.
ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores);

void setup(){
Serial.begin(9600); //Inicializando o serial monitor 
  pingTimer[0] = millis() + 75;      //Primeira medicao começa com 75ms 
  for (uint8_t i = 1; i < SONAR_NUM; i++) //Define o tempo de inicializacao de cada sensor 
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;

     //Apagando todos os leds
  mega.shiftWrite(totalSaidas, LOW);
 }
 
void loop() { 
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop entre todos os sensores 
   if (millis() >= pingTimer[i]) {       
    pingTimer[i] += PING_INTERVAL * SONAR_NUM; //Define o tempo que o proximo sensor sera acionado 
    if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Ciclo do sensor completo 
    sonar[currentSensor].timer_stop();     // Reseta o timer antes de ler o proximo sensor 
    currentSensor = i;             // Número do sensor sendo acionado   
    cm[currentSensor] = 0;           // Se nao houver eco do sensor, seta a distância como zero 
    sonar[currentSensor].ping_timer(echoCheck); 
   } 
 } 
}
 void echoCheck() { //Se receber um sinal (eco), calcula a distancia 
  if (sonar[currentSensor].check_timer()) 
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; 
 }   
 
 void oneSensorCycle() { // Ciclo de leitura do sensor
     
//Se for detectado objeto entre 0 e 10 cm do sensor1, acende leds
     if (cm[0] > 1 && cm[0] < 10){
       
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, LOW);
      delay(t);
    }
   }
//Se for detectado objeto entre 0 e 50 cm do sensor2, acende o led   
     if (cm[1] > 1 && cm[1] < 10) {
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, LOW);
      delay(t);   
  }
 }
}

O desenho do projeto ainda não tenho pronto. quando terminar eu add aqui.

Abraço! smiley-wink

amigo conseguias colocar aqui o esquema ?
gostava muito de fazer também este projecto.

obrigado
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Parabéns , muito bom.

A pergunta que fiz logo assim que vi foi a mesma que a do HugoPT  acima, se eu for a correr o que acontece? smiley deverá ser só uma questão de adaptar o projecto para esta situação
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

por favor malta , ninguém consegue arranjar o esquema deste projecto ?

obrigado
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 45
Posts: 1339
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muito bom, parabéns! E obrigado por partilhar.
Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 272
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Muitooo legal, excelente ideia smiley-grin
Já encomendei 4 sensores, vou implementar a ideia do HugoPT. usando 2 sensores no alto, e 2 sensores embaixo da escada, medindo assim a velocidade da pessoa e acendendo dinamicamente os leds. Uma pena que tá demorando séculos para chegar encomendas internacionais no Brasil, mas com certeza lembrarei de compartilhar quando estiver pronto (entre 2 a 4 meses para chegar)
Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 272
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Não vou aguentar esperar chegarem meus sensores  smiley-sweat, achei um sensor infrared jogado aqui e vou implementar assim mesmo: Num lado o sensor infrared, do outro lado um interruptor (do tipo campainha). Vou comprar canaletas e cabo de rede neste final de semana para instalar. Quando os sensores ultrassom chegarem eu instalo no lugar e altero o software

Teste:
http://youtu.be/B1wzsMQ-zcY

Esquemático:
http://imgur.com/wvy21Po

Código modificado para sensor e botão:
Code:
#define SENSOR1 A0 // Analog input pin that  is attached to the sensor
#define SENSOR2 8 //D8
#define ADC_REF 5//reference voltage of ADC is 5v.If the Vcc switch on the seeeduino
//board switches to 3V3, the ADC_REF should be 3.3


#define MAX_DISTANCE 1.0 // deve ser ajustado para distância de trigger desejada

float voltage;//the sensor voltage, you can calculate or find the distance
// to the reflective object according to the figures
//on page 4 or page 5 of the datasheet of the GP2Y0A21YK.


//Variáveis de uso dos registradores 74HC595
int latchPin = 10;  //Pino 8 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 11 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 13; //Pino 12 conectado ao pino 11 do 74HC595 (Clock).

int totalSaidas = 16; // max 16
int t = 100; //tempo entre o acender dos leds.
int tempo = 2000; //tempo que fica aceso os leds para depois apagar.

unsigned int leds;

void setup()
{
  // initialize serial communications at 9600 bps: 
  Serial.begin(9600);
 
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(SENSOR2, INPUT_PULLUP); // porque é botao
  shiftWrite(0);
}
 
void loop()
{
  leds=0;
  voltage = getVoltage();
  Serial.println(voltage);
  if(voltage > MAX_DISTANCE) {
    for (int i=0; i<=totalSaidas; i++){
      bitSet(leds, i);
      shiftWrite(leds);
      delay(t);
    }
    delay(tempo);
    for (int i=0; i<=totalSaidas; i++){
      bitClear(leds, i);
      shiftWrite(leds);
      delay(t);
    }
  }
   
  if (!digitalRead(SENSOR2))
  {
    for (int i=0; i<totalSaidas; i++){
      bitSet(leds, totalSaidas-i);
      shiftWrite(leds);
      //mega.shiftWrite(totalSaidas+1-i, HIGH);
      delay(t);
    }
       
    while(voltage < MAX_DISTANCE) {
      voltage = getVoltage();
    }
   
    for (int i=0; i<totalSaidas; i++){
      bitClear(leds, totalSaidas-1-i);
      shiftWrite(leds);
      //mega.shiftWrite(totalSaidas+1-i, LOW);
      delay(t);   
    }
    voltage = 0;
  }
   
  // wait 500 milliseconds before the next loop
  delay(100);
}
/****************************************************************************/
/*Function: Get voltage from the sensor pin that is connected with analog pin*/
/*Parameter:-void      */
/*Return: -float,the voltage of the analog pin      */
float getVoltage()
{
int sensor_value;
int sum; 
// read the analog in value:
for (int i = 0;i < 20;i ++)//Continuous sampling 20 times
{
sensor_value = analogRead(SENSOR1);
sum += sensor_value;
}
sensor_value = sum / 20;
float voltage;
voltage = (float)sensor_value*ADC_REF/1024;
return voltage;
}

void shiftWrite(unsigned int _leds) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, _leds);
  shiftOut(dataPin, clockPin, MSBFIRST, _leds >> 8);
  digitalWrite(latchPin, HIGH);
}
« Last Edit: June 25, 2014, 11:04:28 am by Osias Neto » Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 272
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Como prometido:
Como ficou o projeto adaptado > https://www.youtube.com/watch?v=Yu8I_pT2ZEY
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 45
Posts: 1339
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ficou muito engraçado!
Não percebi 2 coisas:
1- Os interruptores são os que já estavam na instalação, certo? (e foi aproveitada essa altura para colocar o sensor, não é?)
2- na parte de baixo não tem nenhum sensor ou o sensor é diferente? (vê-se uma pequena placa no vídeo, mas é diferente da de cima)
Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 272
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ficou muito engraçado!
Não percebi 2 coisas:
1- Os interruptores são os que já estavam na instalação, certo? (e foi aproveitada essa altura para colocar o sensor, não é?)
2- na parte de baixo não tem nenhum sensor ou o sensor é diferente? (vê-se uma pequena placa no vídeo, mas é diferente da de cima)

Sim e sim  smiley
Eu comprei os sensores ultrasonicos no ebay e vai demorar uns 3-4 meses para chegar. Para não ter que esperar improvisei com uma chave embaixo e um sensor IR em cima.

Ia colocar os sensores na altura dos pés para ficar mais discreto, mas tenho gatos em casa, seria um inferno com eles ativando o tempo todo a iluminação  smiley-sweat
Logged

Brasília - DF - Brazil
Offline Offline
Sr. Member
****
Karma: 8
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lembrei desse tópico.

Veja:
http://www.usinainfo.com.br/module/csblog/detailpost/134-79-stairlights-um-projeto-de-iluminacao-led-em-escada-baseado-em-arduino.html

Logged

Pages: [1]   Go Up
Jump to: