E agora um primeira experiência com múltiplos DS2413 numa mesma microLAN…
Cada dispositivo 1-wire tem um ID distinto gravado em fábrica:
$sudo ls /mnt/1wire/ 3A.4C2B13000000 81.086D33000000 settings structure uncached 3A.B0E216000000 bus.1 statistics system
Vemos que temos 3 dispositivos de 2 classes diferentes. A classe 81 é a do Master Controller (o adaptador USB DS9490R) e a classe 3A é a do DS2413. Temos portanto dois dispositivos DS2413 na rede, cada um com o seu ID:
- 4C2B13000000
- B0E216000000
Na forma como o owfs lida com 1-wire o par “Classe.ID” funciona como um endereço. É possível definir alias mas funcionam apenas localmente (isto é: se movermos a microLAN do meu Ubuntu para o LEGO ev3dev tẽm de ser redefinidos) e na minha primeira experiência com alias perdi o acesso aos dispositivos por isso deixo para outra altura.
Sendo da mesma classe, estes dois dispositivos partilham os mesmos atributos (PIO.A, PIO.B e PIO.ALL por exemplo). Se tiver um LED em cada PIO destes devices podemos por exemplo acender todos os LEDs percorrendo todos os dispositivos da classe 3A e escrevendo “1,1” na subpasta PIO.ALL.
O programa abaixo acende cada LED em sequência, primeiro num sentido depois no outro:
import sys, traceback from time import sleep from subprocess import call # B0E216000000/PIO.A = primeiro LED # B0E216000000/PIO.B = segundo LED # 4C2B13000000/PIO.A = terceiro LED # 4C2B13000000/PIO.B = quarto LED def main(): try: # apagar tudo ao comecar call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); while True: # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.B0E216000000/PIO.A", shell=True); # LED1 sleep(0.25); # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.B0E216000000/PIO.B", shell=True); # LED2 sleep(0.25); # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.4C2B13000000/PIO.A", shell=True); # LED3 sleep(0.25); # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.4C2B13000000/PIO.B", shell=True); # LED4 sleep(0.25); # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.4C2B13000000/PIO.A", shell=True); # LED3 sleep(0.25); # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); call("echo 1 > /mnt/1wire/3A.B0E216000000/PIO.B", shell=True); # LED2 sleep(0.25); except (KeyboardInterrupt, SystemExit): print "Exiting..."; except Exception: traceback.print_exc(file=sys.stdout); # apagar tudo antes de sair call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); sys.exit(0); if __name__ == "__main__": main()
E o programa abaixo acende as luzes aleatoriamente, mais próprio para um concerto ou uma discoteca (com tempo hei-de estudar a forma de usar as rotinas PyAudio para medir a intensidade de uma música e controlar as luzes ao ritmo desta embora duvide que o EV3 tenha CPU para tal).
import sys, traceback from time import sleep from subprocess import call from random import randrange # B0E216000000/PIO.A = primeiro LED # B0E216000000/PIO.B = segundo LED # 4C2B13000000/PIO.A = terceiro LED # 4C2B13000000/PIO.B = quarto LED def main(): try: # apagar tudo ao comecar call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); while True: # apaga tudo call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); if (randrange(2) == 1): call("echo 1 > /mnt/1wire/3A.B0E216000000/PIO.A", shell=True); # LED1 if (randrange(2) == 1): call("echo 1 > /mnt/1wire/3A.B0E216000000/PIO.B", shell=True); # LED2 if (randrange(2) == 1): call("echo 1 > /mnt/1wire/3A.4C2B13000000/PIO.A", shell=True); # LED3 if (randrange(2) == 1): call("echo 1 > /mnt/1wire/3A.4C2B13000000/PIO.B", shell=True); # LED4 sleep(0.25); except (KeyboardInterrupt, SystemExit): print "Exiting..."; except Exception: traceback.print_exc(file=sys.stdout); # apagar tudo antes de sair call("echo 0,0 > /mnt/1wire/3A.B0E216000000/PIO.ALL", shell=True); call("echo 0,0 > /mnt/1wire/3A.4C2B13000000/PIO.ALL", shell=True); sys.exit(0); if __name__ == "__main__": main()