Atuadores: LED, PWM, servo e relé
Do LED ao motor — e as três armadilhas elétricas que nenhum código evita.
Ler é metade; a outra é agir. São quatro formas, e a escolha entre elas é elétrica antes de ser de software.
Digital: ligado ou desligado#
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
placa.modo(13, "saida")
cycle i from 1 to 3:
placa.escrever(13, yes)
sleep(50)
placa.escrever(13, no)
sleep(50)
assert placa.simulador.pino(13) is 0
placa.fechar()PWM: o meio-termo que não existe#
Um pino digital só tem dois valores. "Meio brilho" é o pino ligando e desligando rápido o bastante para o olho — ou o motor — não notar. É o PWM, de 0 a 255:
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
placa.modo(9, "pwm")
cycle brilho in [0, 64, 128, 192, 255]:
placa.pwm(9, brilho)
sleep(20)
assert placa.simulador.pino(9) is 255
monitor:
placa.pwm(9, 300) // a faixa é 0..255
handle Error as e:
out e.message
placa.fechar()Num UNO, só os pinos 3, 5, 6, 9, 10 e 11 fazem PWM — e é a placa quem diz isso, não uma tabela escrita aqui. Um modo(13, "pwm") é recusado na hora, com a lista do que aquele pino aceita.
Servo: posição, não velocidade#
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
placa.modo(3, "servo")
cycle graus in [0, 90, 180, 90]:
placa.servo(3, graus)
sleep(30)
assert placa.simulador.servo(3) is 90
placa.fechar()Cada servo tem os seus microssegundos de fim de curso. Quando o braço treme numa ponta, é isso — e configurar_servo ajusta:
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
assert placa.configurar_servo(3, 600, 2300) is "servo"
placa.servo(3, 0)
placa.fechar()Relé: ligar o que não é de 5 V#
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
placa.modo(7, "saida")
action bomba(ligada):
placa.escrever(7, ligada)
yield ligada
assert bomba(yes) is yes
sleep(50)
assert bomba(no) is no
placa.fechar() // o relé desliga ao sairDesligar é parte do programa#
adopt Arcane.IoT as IoT
action regar(placa, segundos):
placa.modo(7, "saida")
defer:
placa.escrever(7, no) // roda mesmo se o corpo falhar
placa.escrever(7, yes)
sleep(segundos * 10)
yield "regado"
placa := IoT.conectar_simulada("uno")
assert regar(placa, 2) is "regado"
assert placa.simulador.pino(7) is 0
placa.fechar()O defer roda na saída da ação — inclusive quando ela falha no meio. Numa bomba de água, a diferença entre isso e um escrever(7, no) no fim do corpo é uma casa alagada.