Começar a trabalhar com sensores Mindstorms, mais concretamente Touch Sensores. Tenho duas versões: NXT e EV3.
Adicionei touch sensor (NXT) no porto #2. O sistema operativo detecta o acontecimento:
root@ev3dev:~# dmesg
...
msensor sensor0: Mindstorms sensor registered.
touch-sensor in2:nxt-analog-sensor: Touch sensor connected to port in2
Alguma informação útil na wiki do projecto ev3dev:
De acordo com a wiki, os sensores Mindstorms são mapeados em “/sys/class/msensor”:
root@ev3dev:~# ls /sys/class/msensor
sensor0
Confirma-se a presença de um sensor “sensor0”. Que podemos saber acerca dele?
root@ev3dev:~# ls /sys/class/msensor/sensor0
bin_data dp num_values subsystem units value2 value5
bin_data_format mode port_name type_id value0 value3 value6
device modes power uevent value1 value4 value7
Muita informação, alguma apenas genérica. Fiquemos por “mode” e “value0”:
root@ev3dev:~# cat /sys/class/msensor/sensor0/mode
TOUCH
Sim, é um Touch Sensor. E como saber o estado?
root@ev3dev:~# cat /sys/class/msensor/sensor0/value0
0
O sensor estava em repouso. Vamos repetir enquanto premimos o sensor:
root@ev3dev:~# cat /sys/class/msensor/sensor0/value0
1
Então e se trocarmos por um sensor EV3?
root@ev3dev:~# dmesg
...
msensor sensor0: Mindstorms sensor unregistered.
msensor sensor1: Mindstorms sensor registered.
touch-sensor in2:ev3-analog-sensor: Touch sensor connected to port in2
E qual é o device?
root@ev3dev:~# ls /sys/class/msensor/
sensor1
Agora é ‘sensor1’ em vez de ‘sensor0’. Talvez a troca tenha sido demasiado rápida ou talvez o sistema operativo nunca liberte os mapeamentos efectuados [até ao próximo boot].
A informação disponível é semelhante:
root@ev3dev:~# ls /sys/class/msensor/sensor1
bin_data dp num_values subsystem units value2 value5
bin_data_format mode port_name type_id value0 value3 value6
device modes power uevent value1 value4 value7
root@ev3dev:~# cat /sys/class/msensor/sensor1/mode
TOUCH
E a leitura do estado do sensor funciona da mesma maneira através de ‘value0’.
Este forma do sistema operativo mapear todos os dispositivos no file system dá-nos uma enorme flexibilidade – todas as linguagens de programação permitem aceder a ficheiros… até a própria shell! Eis shell script que se limita a esperar que o sensor seja premido:
#!/bin/bash
BOTAO=0
while [ $BOTAO -ne "1" ]; do
BOTAO=$(cat /sys/class/msensor/sensor0/value0)
done
echo "Ouch!" > /dev/tty0
se o ficheiro contendo este script se chamar ’touch.sh’ e tiver permissões de execução podemos invocá-lo directamente da linha de comando:
root@ev3dev:~# chmod +x touch.sh
root@ev3dev:~# ./touch.sh
ou de dentro de outros scripts.
Nota: usei aqui ‘sensor0’, assumo que há apenas um sensor e excepto na situação acima em que retirei um sensor e adicionei outro que por isso ficou ‘sensor1’, será sempre ‘sensor0’.