Pages: [1]   Go Down
Author Topic: Sensor PIR em Pino D0\D1 ?  (Read 1852 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3266
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim.

Não vejo como podes estragar o PIR com 5V... mas posso estar a ver mal a coisa.
Logged

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).

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

Eu estou a dizer ligar 5v na saída do PIR..  como é o output nao sei se seria mau:) a dúvida era essa
« Last Edit: May 03, 2014, 07:03:26 pm by almamater » Logged

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

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
Logged

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


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

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:
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:
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?
« Last Edit: May 05, 2014, 06:00:34 am by almamater » Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3266
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
´
//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.
Logged

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).

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

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?
« Last Edit: May 05, 2014, 07:40:48 am by almamater » Logged

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

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.
Logged

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


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

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:
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:
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?
Logged

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

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.
Logged

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


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3266
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
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]. smiley-wink
Logged

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).

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

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3266
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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).

Pages: [1]   Go Up
Jump to: