Página 1 de 1

Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 22:48
por AVCampos
Já tinha visto em vários sítios que se podia combinar o sensor de luz do RCX com o emissor de infravermelhos dele e ficar com um sensor de proximidade... assim não é preciso dar com o nariz nas coisas para saber que elas estão lá. 8)

O sensor de luz aponta na mesma direcção que o RCX, e mede os infravermelhos que este emite e que são reflectidos por algum obstáculo. Mais fácil de construir não há:
[align=center][img width=320]http://www.brickshelf.com/gallery/AVCam ... sensor.png[/img][/align]

Era o que eu tinha planeado para o Explorador e o Mk. II, mas nunca consegui que o programa funcionasse bem: precisava duma calibração complicada e mesmo assim dependia muito da luz à volta!

Então lembrei-me duma coisa simples: simplesmente medir a luz sem os infravermelhos ligados, medir a seguir com eles, e ver a diferença. Se houver uma diferença grande, é porque está algo perto e cuidado! Resolvi partilhar o método aqui, para o caso de dar jeito a algum de vós.

Estruturalmente, fica assim:
  • Fazer uma leitura do valor de luz
  • Iniciar a emissão contínua de mensagens por infravermelhos
  • Fazer uma nova leitura do valor de luz
  • Parar a emissão de mensagens por infravermelhos
  • Se as duas leituras tiverem uma diferença maior que determinada constante, dar o alerta
Para testar isto, fiz o seguinte programa de NQC (que está em inglês no link da imagem, para quem tiver preguiça de copy-paste ;)):

Código: Selecionar todos

#define LIMIAR 160

task main ()
{
	int valorvelho;
	SetSensorType (SENSOR_1, SENSOR_TYPE_LIGHT);
	SetSensorMode (SENSOR_1, SENSOR_MODE_RAW);
	SetTxPower (TX_POWER_HI);

	while (true)
	{
		valorvelho = SENSOR_1;
		start Enviar;
		if (abs (SENSOR_1 - oldvalue) > LIMIAR)
			PlaySound (SOUND_CLICK);
		stop Enviar;
	}
}

task Enviar ()
{
	while (true)
		SendMessage (255);
}
Com este programa, o RCX apita como um detector de metais sempre que se aproxima a menos de alguns decímetros de alguma coisa, tanto de dia como de noite, seja uma parede branca ou um gato preto. ;D Deve ser possível melhorar o programa, para só medir a luz no mesmo instante em que tem os infravermelhos ligados, mas não experimentei. :)

Este método também deve funcionar da mesma maneira com o NXT e o seu sensor de luz! Por exemplo, o sensor de ultra-sons aponta para a frente do robot para medir a distância a obstáculos, enquanto o de luz aponta para baixo para detectar o bordo da mesa (ou degraus) e não cair.

Como, ao contrário do sensor do RCX, pode-se ligar e desligar o LED vermelho que tem, em princípio fará a mesma coisa mas com luz visível em vez de infravermelhos. Terá a vantagem de se poder ter o sensor onde se quiser e não atrelado ao "tijolo", mas deve dar um efeito de "pisca-pisca" com o LED a acender e apagar. Alguém quer experimentar e ver se funciona? :expectation:

Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 22:57
por Jorge Reis
Excelente descoberta e muito bem apresentado, PARABÉNS.

Lembraste daquele projecto de robótica que te falei?

é este tipo de coisinha que gostava de ver mais vezes aqui exploradas no fórum :fixe:

Força nisso rapaz :fixe:

Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 23:00
por Conchas
Será o mesmo principio que foi utilizado com este Segway ???


Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 23:16
por AVCampos
[quote="Jorge Reis"]
é este tipo de coisinha que gostava de ver mais vezes aqui exploradas no fórum :fixe:[/quote]
Também eu gostava! Os roboticistas não são muitos por cá, e têm pouca tendência de criar coisas novas (eu incluído). :'( Vamos lá pessoal, vamos matar a fome de engenhos uns dos outros! :expectation:

[quote="Conchas"]
Será o mesmo principio que foi utilizado com este Segway ???[/quote]
É bem possível, não faço ideia! Pode ser que a taxa de imagens do vídeo não deixe ver a cintilação do LED, ou então ele está sempre ligado e são medidos valores absolutos de luz. Seja como for, ou o Legway tem muito peso à frente ou está programado para manter uma distância do sensor ao chão muito curta, pois tem de ser empurrado para trás para ficar no mesmo sítio. ;)

Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 23:18
por Conchas
É uma questão de programação.
O do Philo não se comporta da mesma maneira.

Coloquei este porque o video é mais animado e o do Philo acho que não está no YouTube.

Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 23:24
por AVCampos
[quote="Conchas"]
É uma questão de programação.[/quote]
Exacto! Por isso é que passei tantos eventos (pelo menos, que me lembre, o último aniversário da PLUG e a PLUGfest do Laranjeiro) de nariz metido no computador às voltas com a programação do bicho e sem funcionar bem. :notcool: E, no fim de contas, tinha este ovo de Colombo à espera de se esparramar contra a minha cara. :D

Re: Sensor de proximidade simples para o RCX

Enviado: 29 jul 2009, 23:26
por Conchas
Muitas vezes mais vale deixar de lado durante uns tempos, que as boas ideias acabam por vir quando meno se espera. ;)

Re: Sensor de proximidade simples para o RCX

Enviado: 31 jul 2009, 18:05
por aparicio
Viva,

Fiz o seguinte teste no NXT (código NXC):
(ver também  http://www.plug.pt/forum/http://localho ... 077#p57077)

Código: Selecionar todos

int sensorLuzOff; // valor com led off
int sensorLuzOn;  // valor com led on

task main(){

     SetSensorLight(IN_3);     // sensor de luz
     SetSensorMode(IN_3,IN_MODE_PCTFULLSCALE);
     ResetSensor(IN_3);
                 
     ClearScreen();

     while(true){

                 // led on
                 SetSensorType(IN_3,IN_TYPE_LIGHT_ACTIVE);
                 sensorLuzOn = Sensor(IN_3);   // leitura com led on
                 
                 Wait (1000);
                 
                 // led off
                 SetSensorType(IN_3,IN_TYPE_LIGHT_INACTIVE);
                 sensorLuzOff = Sensor(IN_3);     // leitura com led off

                 ResetSensor(IN_3);
                 Wait (1000);
                                 
                 TextOut(0,LCD_LINE1,"SensorLuzOn", true);   // true limpa LCD
                 TextOut(0,LCD_LINE2,NumTOStr(sensorLuzOn));

                 TextOut(0,LCD_LINE4,"SensorLuzOff", false);
                 TextOut(0,LCD_LINE5,NumTOStr(sensorLuzOff));
    }
}
O valor medido com e sem o led ligado varia bastante, principalmente quando há pouca luz ambiente.

Mesmo assim ainda consegui distinguir uma bola vermelha de uma azul com pouca luz. Com o led ligado a diferença entre a leitura entre cores é muito mais elevada. Apontando o sensor para a janela obtive a mesma leitura em ambos os casos.

Uma coisa é certa: vou poupar bateria nos casos em que houver muita luz ambiente :)

Re: Sensor de proximidade simples para o RCX

Enviado: 01 ago 2009, 00:53
por AVCampos
Nesta aplicação é mau haver diferenças de leituras conforme as cores: o ideal é as leituras variarem só com a distância ao objecto e não com as suas características.

Mas, mantendo tudo parado, é bastante promissor haver diferenças acentuadas com o LED ligado e desligado! Assim podes medir com ele desligado para obter a luz ambiente, e medir com ele ligado para obter a ambiente + a reflectida pelo obstáculo. :fixe: