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 | – | – | – | – | – | ||
3 | |||||||
4 | |||||||
5 | |||||||
6 | |||||||
13 | – | – | – | ||||
17 | – | – | – |
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%