AD4M4ST0R – medindo luminosidade

This post is part 6 of 9 of  AD4M4ST0R - um rover LEGO

A ideia é utilizar um sensor de cor para medir a luminosidade de modo a acender os LEDs de iluminação apenas o necessário para garantir uma imagem razoável.

O sensor utilizado é um EV3 Color Sensor (45506). Na wiki do projecto ev3dev há 2 artigos com a informação suficiente:

Após a ligação o sensor é imediatamente reconhecido:

root@ev3dev:~# dmesg
(...)
ev3-uart-host in2:ev3-uart-host: Started.
Registered LEGOEV3 line discipline. (29)
msensor sensor0: Mindstorms sensor registered.

Sendo o único sensor ligado aparece referenciado como ‘sensor0’ debaixo da classe ‘msensor’:

root@ev3dev:~# ls /sys/class/msensor/ -la
lrwxrwxrwx  1 root root 0 Aug 24 00:46 sensor0 -> ../../devices/platform/serial8250.0/tty/ttyS0/ttyS0:ev3-uart-sensor/msensor/sensor0

Temos a seguinte informação disponível:

root@ev3dev:~# ls /sys/class/msensor/sensor0
bin_data     device  mode    num_values  power      type_id    units    value1    value3    value5    value7
bin_data_format  dp     modes    port_name   subsystem  uevent    value0    value2    value4    value6

O sensor é inicializado no modo ‘COL-REFLECT’ mas podemos mudar para um dos seguintes modos disponíveis:

root@ev3dev:~# cat /sys/class/msensor/sensor0/mode
COL-REFLECT

root@ev3dev:~# cat /sys/class/msensor/sensor0/modes
COL-REFLECT COL-AMBIENT COL-COLOR REF-RAW RGB-RAW COL-CAL

Pretendo operar no modo ‘COL-AMBIENT’:

root@ev3dev:~# echo COL-AMBIENT > /sys/class/msensor/sensor0/mode

Neste modo o sensor gera apenas um valor:

root@ev3dev:~# cat /sys/class/msensor/sensor0/num_values
1

que será portanto ‘value0’:

root@ev3dev:~# cat /sys/class/msensor/sensor0/value0
3

Infelizmente a gama de valores lida pelo sensor deixa muito a desejar: no mesmo local na minha sala observei de ‘1’ (de noite com luz fraca) a ’17’ (numa tarde típica de Agosto sendo a sala virada a Sul embora não haja incidência directa no sensor). E com uma lanterna a apontar directamente ao sensor obtenho ’68’.

Tirei algumas fotos com vários valores de leitura e vários duty cycles aplicados a 3 pares de LEDs Power Functions para tentar elaborar uma regra (o rover e a minifig sempre no mesmo local com cerca de 15 cm entre a webcam e a minifig, a iluminação dos LEDs nunca alterou o valor medido pelo sensor e todas as fotos foram apenas reduzidas dos 640×480 originais para 160×120)

Brightness Duty Cycle
(%) 0% 25% 33% 50% 66% 75% 100%
1 bright01-duty000 bright01-duty100
3 bright03-duty000 bright03-duty025 bright03-duty033 bright03-duty050 bright03-duty066 bright03-duty075 bright03-duty100
4 bright04-duty000 bright04-duty025 bright04-duty033 bright04-duty050 bright04-duty066 bright04-duty075 bright04-duty100
5 bright05-duty000 bright05-duty025 bright05-duty033 bright05-duty050 bright05-duty066 bright05-duty075 bright05-duty100
6 bright06-duty000 bright06-duty025 bright06-duty033 bright06-duty050 bright06-duty066 bright06-duty075 bright06-duty100
13 bright13-duty000 bright13-duty033 bright13-duty066 bright13-duty100
17 bright17-duty000 bright17-duty066 bright17-duty066 bright17-duty100

 

Com esta informação optei pela seguinte função ‘fuzzy logic’:

  • Brightness <6  => Duty Cycle = 100%
  • Brightness ∈[6, 7] => Duty Cycle = 75%
  • Brightness ∈[8, 9] => Duty Cycle = 66%
  • Brightness ∈[10,11] => Duty Cycle = 50%
  • Brightness ∈[12,13] => Duty Cycle = 33%
  • Brightness >13 => Duty Cycle = 0%