- 1-wire LED
- 1-wire LEGO LED stripe
- Projectores LEGO
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()