Go Down

Topic: Sensor PIR em Pino D0\D1 ? (Read 2043 times) previous topic - next topic

almamater

Olá,

Por motivos de disponibilidade de pinos pergunto se posso ligar o pino OUT de um sensor PIR a um dos pinos TX\RX do ATMega328 ?

  • Enquanto a comunicação serial estiver ligada (Serial.begin) haverá erros de comunicação caso ocorra movimento no PIR?

  • Haverá risco de danificar o PIR sabendo que no arranque o ATMega tem ~5v nos pinos TX\RX? O Pino OUT do PIR podia estar ligado desta forma?


O objectivo é depois usar o PIR mas já com a ligação serial fechada (Serial.end), e com o pinoTX\RX em modo INPUT.

Sim.

Não vejo como podes estragar o PIR com 5V... mas posso estar a ver mal a coisa.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

almamater

#2
May 03, 2014, 09:45 pm Last Edit: May 04, 2014, 02:03 am by almamater Reason: 1
Eu estou a dizer ligar 5v na saída do PIR..  como é o output nao sei se seria mau:) a dúvida era essa

HugoPT

Quote
Enquanto a comunicação serial estiver ligada (Serial.begin) haverá erros de comunicação caso ocorra movimento no PIR?

Muito provavelmente diria que 99% de certeza que haverá, ja que se estas a enviar dados caso algo interfira isso sera adicionado ao que estas a transmitir fazendo uma grande "salada" no sinal transmitido.Nao sei a dimensao do teu projecto mas nao podes evitar a UART e usar outro qualquer?
Podes sempre usar um port-expander I2C para aumentar os GPIO do teu micro
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

almamater

#4
May 05, 2014, 12:57 pm Last Edit: May 05, 2014, 01:00 pm by almamater Reason: 1
Ok, não vou então usar o PIR neste pino, tenho então de fazer algumas alterações, uma solução seria passar 2 buzzers, que estão ligados num pino digital, para o Shift Register que estou a usar 74hc595 (que tb está cheio), trocava uns LEDs que estão ligados neste SR e metia-os então no pino RX\TX do ATMega que já não devem interferir com a ligação serial.

Posto isto fiquei com outra dúvida, neste momento tendo os buzzers ligados directamente ao pino digital e para fazer algo como 'Bip Bip' basta fazer isto:

Code: [Select]
digitalWrite(Buzzers, HIGH);
 delay(100);
 digitalWrite(Buzzers, LOW);
 delay(100);
 digitalWrite(Buzzers, HIGH);
 delay(100);
 digitalWrite(Buzzers, LOW);


Se passar os buzzers para o shift register teria que fazer algo deste tipo:

Code: [Select]
BitsVAR[2]=1; //pino no SR onde estariam os buzzers. LIGA

 for (int i = 7; i >= 0; i--) {
     bitWrite(dataOut, i, BitsVAR[i]);
   }
  pinMode(latchPin, OUTPUT);
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, dataOut);
   digitalWrite(latchPin, 1);

BitsVAR[2]=0;  // DESLIGA

 for (int i = 7; i >= 0; i--) {
     bitWrite(dataOut, i, BitsVAR[i]);
   }
  pinMode(latchPin, OUTPUT);
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, dataOut);
   digitalWrite(latchPin, 1);

BitsVAR[2]=1;   //LIGA

 for (int i = 7; i >= 0; i--) {
     bitWrite(dataOut, i, BitsVAR[i]);
   }
  pinMode(latchPin, OUTPUT);
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, dataOut);
   digitalWrite(latchPin, 1);

BitsVAR[2]=0;  //DESLIGA

 for (int i = 7; i >= 0; i--) {
     bitWrite(dataOut, i, BitsVAR[i]);
   }
  pinMode(latchPin, OUTPUT);
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, dataOut);
   digitalWrite(latchPin, 1);


Ou estou a pensar mal? se estiver correcto será que iria existir algum atraso significativo a tocar os buzzers?

Já pensaste na solução do port extender??

Tipo o MCP23017?

Queres mostrar o teu esquema para vermos se não existe possibilidade de melhorar essas lilgações?

Code: [Select]
´
//no inciio do ficheiro...

#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))

//No setup...
   pinMode(latchPin, OUTPUT);

//no ficheiro de código...
void ShiftUpdate(unsigned char data) {
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, data);
    digitalWrite(latchPin, 1);
}

//no loop

for (unsigned char i = 0; i < 2; i++) {
    SET_BIT (dataOut, 2);
    ShiftUpdate(dataOut);
    delay(100);
    CLR_BIT(dataOut, 2);
    ShiftUpdate(dataOut);
    delay(100);
}



Sempre que usas um delay estragas a performance do programa... logo não vale a pena sequer comentar o resto.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

almamater

#6
May 05, 2014, 02:38 pm Last Edit: May 05, 2014, 02:40 pm by almamater Reason: 1
O extender desconhecia essa possibilidade e fiquei interessado de facto na solução, mas para agora penso que não seria necessário pq já tenho tudo ligado só me falta solucionar este ponto devido a querer ligar-me por software ao ATMega e usar os pinos RX\TX, o que colocar aqui ligado não pode assim influenciar a ligação serial.

O esquema não tenho feito agora para mostrar mas basicamente é um projecto tipo 'alarme', com 2 PIRs, 2 SONAR e uns quantos LEDS, uma sirene, sensor LDR, sensor Temperatura, buzzers..

No Arduino neste momento tenho os pinos ocupados com:

Digitais: ()
4 pinos para o Shift Register (um dos pinos estou a controlar o OEpin)
3 Pinos para o LCD (ligação serial)
2 pinos para os PIR
2 Pinos para os SONAR
1 pino Buzzers
1 Pino LED 'piloto'
1 Pino sensor temperatura

Analógicos: (3 ocupados)
1 LDR
1 Botões
1 Outro botão

SHIFT REGISTER:
Q0 LED RGB - RED
Q1 LED RGB - GREEN
Q2 LED RGB - BLUE
Q3 LCD Backlight
Q4 RELE 1
Q5 RELE 2
Q6 LED Extra
Q7 Sirene

No Loop estou a verificar se existe movimento nos PIR e a controlar os SONAR, faço tocar os buzzers e pode ser mesmo necessário tocar a sirene. Para ligar\desligar os dispositivos no Shift Register estou a usar a código que mencionei atrás.. ou seja, sempre que altero o estado de 1 dos dispositivos faço o ciclo FOR para associar a cada BIT o valor de 0 ou 1 e enviar o estado dos 8 duma só vez.

O código que colocaste serve para melhorar o envio da informação para o SR? Dá para controlar apenas 1 saída é isso?

HugoPT

Quote
O código que colocaste serve para melhorar o envio da informação para o SR? Dá para controlar apenas 1 saída é isso?

Melhorar nao, fazer funcionar ja que o teu nao deve produzir o que queres.
Vejamos:
Quote

BitsVAR[2]=1; //pino no SR onde estariam os buzzers. LIGA

 for (int i = 7; i >= 0; i--) {
     bitWrite(dataOut, i, BitsVAR);
   }
  pinMode(latchPin, OUTPUT);
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, dataOut);
   digitalWrite(latchPin, 1);

O teu ciclo for apenas ira colocar a variável dataOut com todos os bits  a 1, mas tu só queres tocar no bit 2 certo?!!!
Quote

1 Botões
1 Outro botão


Aqui podes optimizar os dois botões a usares somente o mesmo pino manipulando a resistência em cada botão.Consegues saber que botão foi premido usando apenas um pino analógico.Se formares divisores de tensão com resistências consegues saber qual botão esta premido ou se ambos estão premidos.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

almamater

Sorry, esqueci de dizer que os 'botões' são 3 botões no pino 1 usando essa técnica, no entanto para garantir que não há qualquer erro meti um botão à parte uma vez que tenho pinos analógicos que cheguem para o fazer.

Quanto ao Shift Register tenho tudo a funcionar, mal ou bem não sei, mas tenho desta forma e consigo ligar\desligar o que quero:

Code: [Select]
Início:
int latchPin = 2;  //74HC595 pino 12
int clockPin = 3;  //74HC595 pino 11
int dataPin = 1;   //74HC595 pino 14
int OEpin = 9;     //74HC595 pino 13

int Equipamentos[8];
byte dataOut = 0;

No setup:
  pinMode(OEpin, OUTPUT);   
  digitalWrite(OEpin, LOW); 
  pinMode(latchPin, OUTPUT);

//Tudo OFF:
  Equipamentos[0] = 0  //Q0
  Equipamentos[1] = 0; //Q1
  Equipamentos[2] = 0; //Q2
  Equipamentos[3] = 0; //Q3
  Equipamentos[4] = 0; //Q4
  Equipamentos[5] = 0; //Q5
  Equipamentos[6] = 0; //Q6
  Equipamentos[7] = 0; //Q7
 
  for (int i = 7; i >= 0; i--) {
    bitWrite(dataOut, i, Equipamentos[i]);
  }

  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, dataOut);
  digitalWrite(latchPin, 1);


Quando quero alterar por exemplo o dispositivo 2 (Equipamentos[2]) faço isto:

Code: [Select]
Equipamentos[2]= 0    // ou 1 depende do estado que quero alterar

   for (int i = 7; i >= 0; i--) {
      bitWrite(dataOut, i, Equipamentos[i]);
    }
    pinMode(latchPin, OUTPUT);
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, dataOut);
    digitalWrite(latchPin, 1);


Faço mal?

HugoPT

Quote
Faço mal?

Ok efectivamente vendo melhor o teu código como tens deve funcionar.Podes melhorar isso para nao teres de alterar todo o array quando apenas queres alterar um bit.Tenta entender o que o Bubulindo te deu.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Efectivamente não necessitas do ciclo for... Isto para não dizer que o ciclo for estraga tudo... se tu dizes que funciona, eu acredito.

Em vez de estares a fazer um array para as tuas saídas (que é uma péssima ideia por imensos motivos), podes fazer as coisas de forma mais simples usando a função bitWrite (que é igual às macros que defini no meu exemplo).

Code: [Select]

/*
SHIFT REGISTER:
Q0 LED RGB - RED
Q1 LED RGB - GREEN
Q2 LED RGB - BLUE
Q3 LCD Backlight
Q4 RELE 1
Q5 RELE 2
Q6 LED Extra
Q7 Sirene
*/
#define RGBR             0
#define RGBG             1
#define RGBB             2
#define LCD_BLT      3
#define RELE1             4
#define RELE2            5
#define LED_Extra   6
#define SIRENE          7

//imagina que queres ligar a sirene...
bitWrite(dataOut, SIRENE, 1);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, dataOut);
digitalWrite(latchPin, 1);

//desligar a sirene...
//imagina que queres ligar a sirene...
bitWrite(dataOut, SIRENE, 0);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, dataOut);
digitalWrite(latchPin, 1);


Muito mais simples para a memória do teu sistema e também, diga-se de passagem, muito mais informativo para quem ler o código e não souber o que é o Equipamentos[3]. ;)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

almamater

Faz todo o sentido, ao início pensei que não seria possível alterar dessa forma e teria que enviar todo o array..  :D logo à noite já vou alterar e testar. Obrigado.

Nota que deves sempre criar funções para bocados de código que sejam repetidos... neste caso, como tens de activar o ship select, etc... convém colocar isso tudo numa função como eu fiz num dos meus exemplos.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up