LusoRobótica - Robótica em Português
Electrónica => Sensores => Tópico iniciado por: Arknum em 25 de Maio de 2010, 14:43
-
Boas
Comecei a fazer experiencias com este sensor e deparei-me com algumas dúvidas.
Consegui liga-lo e funcionou como neste topico http://lusorobotica.com/index.php?topic=1971.45 (http://lusorobotica.com/index.php?topic=1971.45)
Agora a questão. Como eu "ainda" não tenho um arduino, utilizo um PIC16f84a e não possui entradas analógicas e pelo que me apercebi as saidas deste sensor são analógicas, como faço, ou melhor, qual é a melhor forma para passar as saidas deste sensor para digital?
Eu fiz uma experiencia e funicionou mais ou menos bem, utilizei um comparador LM358 e um potencimetro e na saida do comparador um led que acendia quando tapava o led. Só não experimentei ligar ao PIC, mas fiquei com a sensação que não seria a melhor opção. Alguem tem alguma sugestão?
-
Podes trocar esse PIC por um 16F88 ? esse já tem entradas analógicas.
No entanto, este LINK (http://www.pololu.com/catalog/product/961) tem uma boa explicação na zona "Interfacing the QTR-8RC Outputs to Digital I/O Lines"
Aí explica como ligar uma saída dessas analógica, a um pino de entrada. É o método de carga/descarga do condensador.
-
Boas
Infelizmente não consegui ver o link que colocaste (estou na escola e é bloqueado) vejo em casa.
Mas qual aconselhas utilizar? com o condensador ou o comparador ou trocar o pic?
Diz-me só o seguinte, esse PIC que aconselhas funciona de igual modo do que o 16f84, isto é, tem as mesmas interrupções, e esquema de ligações? Desculpa estar a fazer estas perguntas meio tolas, bastaria ir pesquisar mas onde estou agora não consigo ver quase nenhuma página, a escola bloqueia uase tudo, felizmente não bloqueia o da Lusorobotica. Já agora são faceis de arranjar esses Pics?
Mais uma vez peço desculpa por tanta questão.
-
podes usar o condensador directo com o PIC16F84, se não quiseres trocar de PIC. Aliás... esse é óptimo para aprender as bases, mas falta-lhe quase tudo de periféricos.
Se pesquisares a série PIC16, vais ver que a arquitectura é toda idêntica. Até o pinout é igual nas caixas de 18pinos.
Os PICs podem ser comprados nas boas lojas de electrónica, ou então tentar as amostras directamente do faricante.
-
o sensor QTR 8RC têm as saídas são digitais.. mas funcionam de maneira difente do que a leitura digital normal, acho que têm haver com comprimento de impulso por condensadores, (no post que mensionates têm um código que eu fiz para efectuar a leitura dos sensores, tens de usar a biblioteca que a pololu fornece).. para que funcionalidade queres esses sensores? seguidor de linhas?, se for, que posso disponibilizar te um código que já tenho feito usando o controlo PID..,
-
http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)
tens ai um exemplo de um código que a polou fornece..
-
o sensor QTR 8RC têm as saídas são digitais.. mas funcionam de maneira difente do que a leitura digital normal, acho que têm haver com comprimento de impulso por condensadores, (no post que mensionates têm um código que eu fiz para efectuar a leitura dos sensores, tens de usar a biblioteca que a pololu fornece).. para que funcionalidade queres esses sensores? seguidor de linhas?, se for, que posso disponibilizar te um código que já tenho feito usando o controlo PID..,
As saídas não são digitais, são analógicas. Podem é ler-se com um pino digital, se se medir o tempo que o condensador demora a descarregar.
# O pino do micro vira saída e carrega o condensador
# o pino vira entrada, reset do temporizador, e espera até o condensador descarregar
# qd o condensador descarrega, o estado lógico da entrada muda
Por isso é q se pode fazer leitura "analógica", com um pino digital.
Este sistema é bastante usado para medição grosseira de temperaturas, com micros de poucos recursos. Uma NTC/PTC é o suficiente para tal.
Se se pretender usar o sensor com comparadores analógicos, sempre se pode optar pelo PIC16F628A, ou outro mais moderno com comparadores internos.
Mas é um excelente desafio de treino usar uma entrada digital e medir a temporização :)
-
eu não sabia bem como funcionava, sabia que tinha haver com isso dos condensadores, e disse que a leitura era digital pq se efectuam nos pinos digitais,
mas já fiquei a perceber como funciona essa leitura, :)
-
asena podias dar um exemplo em C de como fazer isso?
# O pino do micro vira saída e carrega o condensador
# o pino vira entrada, reset do temporizador, e espera até o condensador descarregar
# qd o condensador descarrega, o estado lógico da entrada muda
-
asena podias dar um exemplo em C de como fazer isso?
# O pino do micro vira saída e carrega o condensador
# o pino vira entrada, reset do temporizador, e espera até o condensador descarregar
# qd o condensador descarrega, o estado lógico da entrada muda
A página do sensor (http://www.pololu.com/catalog/product/961) dá uma boa explicação de como o fazer.
RB0 é o pino usado. TMR0 sem divisor e incrementado pelo clock interno, no caso do PIC incrementa a Fosc/4.
A ideia é carregar o condensador, e depois contar o tempo que demora a sua descarga.
C para PIC ::
TRISB = TRISB & 0b11111110; //torna o RB0 uma saída, e não mexe nos outros pinos
RB0 = 1; //saida a 1, para carregar o condensador
DelayUs(50); //espera 50us
TRISB = TRISB | 0b00000001; //torna o RB0 uma entrada de alta impedância
TMR0 = 0; //limpa o contador
while (RB0); //enquanto o pino estiver a nivel lógico 1, mantém-se aqui
TMR0_lido = TMR0; //guarda o valor do tempo passado
Consoante o tempo que demora a descarregar, podemos saber se estava na linha, ou não. É uma questão de testes, consoante as condições do terreno.
-
Boas
Estive a fazer experiencias para ver se conseguia ver a saida do qtr num pino digital e não consegui.
1º- Liguei uma saida do qtr(saida 1) a um pino do condensador 10nF e o outro pino a uma entrada do Pic (entrada RB0).
2º- Utilizei este programa para tentar ver os tempos do condensador
#include <16F84.h>
#fuses hs,noprotect,nowdt
#use delay (clock=4000000) // igual ao cristal
#use RS232(baud=2400, bits=8, parity=N, xmit=pin_a1, rcv=pin_a0)
int TMR0_lido;
main()
{
while (1){
set_TRIS_B(11111110); //torna o RB0 uma saída, e não mexe nos outros pinos
output_high(pin_B0); //saida a 1, para carregar o condensador
Delay_Us(10); //espera 10us
set_TRIS_B(00000001); //TRISB = TRISB | 0b00000001;
set_timer0(0); //TMR0 = 0; //limpa o contador
while (input(PIN_B0)); //enquanto o pino estiver a nivel lógico 1, mantém-se aqui
TMR0_lido=get_timer0(); //TMR0_lido = TMR0; //guarda o valor do tempo passado
printf("HiThere");//só para escrever alguma coisa
printf(get_timer0());//para ver se escrevia desta forma
printf(TMR0_lido);
Delay_ms(1000);
}
}
O resultado foi só HiThere de 1 em 1 segundo, não me aparecia nenhum valor.
Devo estar a fazer alguma coisa mal mas não sei o que é.
ALguem me pode ajudar?
Obrigado
-
# estás a usar o esquema de ligação que o fabricante aconselha? o condensador liga ao sensor e à alimentação
# os pinos não usados do PIC, devem ser configurados como SAÍDA. Qualquer pino configurado como entrada, e q não esteja ligado, é propenso a gerar confusão.
# tens q converter os valores binários/décimais, para ASCII, antes de os mandares para a porta série
# "printf" é tudo menos bom para programar. Só serve para encher a memória do PIC. Usa porta série directa.
-
Boas
O esquema que utilizei foi este:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg31.imageshack.us%2Fimg31%2F77%2Fsemttulotul.png&hash=7fee9cd9355cce7549947ef7bdfecf47d108444d) (http://img31.imageshack.us/i/semttulotul.png/)
Uploaded with ImageShack.us (http://imageshack.us)
Mas pelo que dizeste asena já vi que está mal. Estive à procura do esquema do fabricante mas não descobri, consegues-me enviar o esquema correcto? se sim porreiro agradeço desde já.
Não sei se deste uma vista de olhos no código, está correcto?
tentei fazer como tu dizeste e como estava no site do fabricante.
O set_tris_b(xxxxxx) configura os pinos como entrada ou saida conforme é 0 ou 1.
Não faço mesmo ideia como converter os valores para ascii, pensei que não era preciso fazer nada bastava enviar por rs232. Os valores do TMR0 não são de 0 a 255?quando faço get_timer0()?
E em vez de utilizar printf() dizes que é melhor o puts()?
-
#
Segundo esta imagem ::
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.pololu.com%2Fpicture%2F0J629.600.png&hash=d4d29650852a8a6737725d6bfe2c23cf6e8115e4)
podes ver como está o condensador de 10nF ligado. Está entre o VCC e o COLECTOR do transistor. O PIC vai apenas ler a tensão nesta junção, através de uma resistência para limitar a corrente de carga.
#
Se as ligações estão correctas? assim de repente sim. mas não confirmei o pinout do MAX. Assim que puderes, muda para um PIC16F628A (no mínimo), para não teres que usar cristal e para usares a USART por hardware interna
#
Tens aqui a TABELA ASCII (http://www.asciitable.com/). Vê como podes converter os valores. É simples.
#
Uma função ou outra... depende de como a puts() está escrita. Isso são funções da biblioteca STDIO e a outra do compilador... eu prefiro usá-las escritas por mim. São mais rápidas e ocupam pouco espaço. Tive que as fazer, na altura em que comecei a aprender PIC e só havia 16C54 e 16C84.
Procura por bit-bang software usart pic. O google é teu amigo.
-
asena não consigo ver a imagem.
em relação ao resto vou a google o nosso amigo :P
e mais uma vez obrigado.
Já agora asena não fazes formação nos açores(São Miguel)?
se fizeres avisa-me.
-
A imagem de certeza que esta no site da pololu ou no datasheet que eles fizeram, vais até lá e procuras por qtr-8rc.
Aliás, basta meter qtr 8rc no google que vais logo para a página da pololu, que tem lá tudo...
http://www.pololu.com/catalog/product/961 (http://www.pololu.com/catalog/product/961)
-
tenho um sensor igual a esse, comprei na loja do LR
-
Bom, isto já por implicancia minha está quase a ir tudo ao ar e ponho isto num pic16f877, mas ultima tentativa a ver se aprendo alguma coisa.
Fiz a ligação agora da seguinte maneira
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg163.imageshack.us%2Fimg163%2F5403%2Fsemttulohrt.png&hash=0ab24825ee948bbf8ec7fa9641c3e299def65e1b) (http://img163.imageshack.us/i/semttulohrt.png/)
Uploaded with ImageShack.us (http://imageshack.us)
Parece-me que agora está bem ligado. Não utilizei a resistencia de 220 pq não tinha nenhuma então pus uma de 270.
Utilizei este codigo
#include <16F84.h>
#fuses hs,noprotect,nowdt
#use delay (clock=4000000) // igual ao cristal
#use RS232(baud=2400, bits=8, parity=N, xmit=pin_a1, rcv=pin_a0)
#use fast_io(b)
int TMR0_lido;
int ler;
main()
{
while (1){
set_TRIS_B(11111110); //torna o RB0 uma saída, e não mexe nos outros pinos
output_high(pin_B0); //saida a 1, para carregar o condensador
Delay_Us(10); //espera 50us
set_TRIS_B(00000001); //TRISB = TRISB | 0b00000001; //torna o RB0 uma entrada de alta impedância
set_timer0(0);//limpa o contador
while (input(PIN_B0)); //enquanto o pino estiver a nivel lógico 1, mantém-se aqui
TMR0_lido=get_timer0();//guarda o valor do tempo passado
ler=get_rtcc();
putc(ler);
putc(get_timer0());
}
}
Mas a unica coisa que recebo é 0 tapo o sensor e nada.
Será o código ou a ligação que está mal, não faço ideia, Alguem me pode dar umas luzes sff.
-
Pelo que se vê do esquema eléctrico interno do sensor, todos os componentes necessários já lá estão incluidos.
Podes ligar directamente a saída do sensor, ao PIC.
Experimenta.
-
e o código o que te parece?
-
Já fiz ligação directa e nada, dá-me sempre 0 e penso que a programação está de acordo com que o fabricante diz, não percebo!!
Algum dica?
-
Onde é que estás a inicializar o timer e com que velocidade/frequencia, essa parte do código não está aqui, ou pelo menos não estou a ver.
-
Obrigado a todos esse problema está resolvido.
Pelo vistos senso era mesmo a inicialização do timer que faltava ao código.
Já agora fica aqui o codigo
#include <16F84.h>
#fuses hs,noprotect,nowdt
#use delay (clock=4000000) // igual ao cristal
#use RS232(baud=2400, bits=8, parity=N, xmit=pin_a1, rcv=pin_a0)
#use fast_io(b)
int TMR0_lido;
long ler;
main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8); //Set Timer0 prescaler to 8
while (1){
set_TRIS_B(11111110); //torna o RB0 uma saída, e não mexe nos outros pinos
output_high(pin_B0); //saida a 1, para carregar o condensador
Delay_Us(50); //espera 50us
set_TRIS_B(00000001); //TRISB = TRISB | 0b00000001; //torna o RB0 uma entrada de alta impedância
//TMR0 = 0; //limpa o contador
set_timer0(0);
while (input(PIN_B0)); //enquanto o pino estiver a nivel lógico 1, mantém-se aqui
ler=get_timer0();
putc(ler);
putc(get_timer0());
}
}
Depois de ter feito umas experiencias e ter retirado os tempos fiz este codigo para colocar um led a piscar se existisse um objecto num sensor do array ou mantinha-se a 0 se não detectasse nada, mas o led so fica liga se eu colocar um objecto mesmo em cima do sensor e quando lá nao tenho nada o led está sempre a piscar que nem um doido.
Alguem me ajuda sff.
O codigo que utilizei foi este
#include <16F84.h>
#fuses hs,noprotect,nowdt
#use delay (clock=4000000) // igual ao cristal
#use RS232(baud=2400, bits=8, parity=N, xmit=pin_a1, rcv=pin_a0)
#use fast_io(b)
long ler;
main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8); //Set Timer0 prescaler to 8
while (1){
set_TRIS_B(11111110); //torna o RB0 uma saída, e não mexe nos outros pinos
output_high(pin_B0); //saida a 1, para carregar o condensador
Delay_Us(50); //espera 50us
set_TRIS_B(00000001); //torna o RB0 uma entrada de alta impedância
set_timer0(0);//limpa o contador
while (input(PIN_B0)); //enquanto o pino estiver a nivel lógico 1, mantém-se aqui
ler=get_timer0();
if(ler<=30)
output_high(PIN_A2);
else
output_low(PIN_A2);
}
}
-
Viva,
Preciso de um sensor para detectar linhas e já tinha visto este na LR ha uns tempos. Alguém que já tenha trabalhado com ele, qual a distância máxima a que o sensor ainda se comporta como deve ser?
Obrigado!
-
Viva,
Preciso de um sensor para detectar linhas e já tinha visto este na LR ha uns tempos. Alguém que já tenha trabalhado com ele, qual a distância máxima a que o sensor ainda se comporta como deve ser?
Obrigado!
Nas questões técnicas do material está especifico:
# Optimal sensing distance: 0.125" (3 mm)
Certamente dará para um pouco mais, mas perde optimização.
-
Se quiseres fazer um array á mão podes usar os TCRT5000 da vishay que penso que funcionam até 1cm
-
E para os robots da busca e salvamento o pessoal costuma usar os QRD114 ne? Mas esse, tal como o array QTR-8RC possui uma gama de distância muito pequena... mas secalhar vai ter de ser, nao posso gastar tanto dinheiro nos sharp..
-
Os Sharp não são para detectar preto/branco, aliás, uma das suas características é a pouca diferença de sinal com cores diferentes, para seguir linhas os QDR 1114 são mesmo bons :) estragas um, compras outro por 1€ :)
-
Os Sharp não são para detectar preto/branco, aliás, uma das suas características é a pouca diferença de sinal com cores diferentes, para seguir linhas os QDR 1114 são mesmo bons :) estragas um, compras outro por 1€ :)
http://loja.lusorobotica.com/123-qtr-8rc-reflectance-sensor-array.html (http://loja.lusorobotica.com/123-qtr-8rc-reflectance-sensor-array.html)
Estes não são indicados para detectar linhas pretas para rescue? :o
-
Acho que ele se estava a referir a Sharps, que são os de distancia e não o QTR-8c que se procurares na internet tens montes de robots a usa-los para seguir linhas.
-
Quando referi os sharp falava deste por exemplo:
http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html (http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html)
A minha questão é que o QTR-8RC e o QRD1114 têm um alcance muito curto... têm de estar quase colados ao chão, nao?
-
Quando referi os sharp falava deste por exemplo:
http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html (http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html)
A minha questão é que o QTR-8RC e o QRD1114 têm um alcance muito curto... têm de estar quase colados ao chão, nao?
Pois, a 0.3cm do chão...
Aqueles robots que vocês têm encomendados da Índia não têm uma placa destas? ;)
-
Quando referi os sharp falava deste por exemplo:
http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html (http://loja.lusorobotica.com/126-pololu-carrier-with-sharp-gp2y0d810z0f.html)
A minha questão é que o QTR-8RC e o QRD1114 têm um alcance muito curto... têm de estar quase colados ao chão, nao?
Pois, a 0.3cm do chão...
Aqueles robots que vocês têm encomendados da Índia não têm uma placa destas? ;)
Isso são os qu-bot. mas são muito limitados, nao da para fazer muito com eles... portanto eu tenho uma equipa e vamos fazer um robot de raiz para participar no encontro do Clube de Robotica da ESTG. Mas quero fazer uma coisa generica, que depois dê para expandir. E os qu-bot usam uns simples emissores e receptores de IV, como estes por exemplo:
http://www.sonigate.com/?pt#!/3/13810/LED-5mm-Emissor-Infravermelho/ (http://www.sonigate.com/?pt#!/3/13810/LED-5mm-Emissor-Infravermelho/)
http://www.sonigate.com/?pt#!/3/13799/LED-3mm-Receptor-Infravermelho-L-932P3BT/ (http://www.sonigate.com/?pt#!/3/13799/LED-3mm-Receptor-Infravermelho-L-932P3BT/)
E eu questiono a utilização do QTR-8RC por causa do seu alcance... é que apesar de terem a vantagem de ser baratos, podem nao ser muito fiaveis..