Olá estou com uma divida, gostaria de saber se é possível associar 4 saidas digitais em uma úníca variável. tipo eu gostaria de acionar a variável SUB aos pinos (4,9,8 e 10) do arduino e quando a variável ficar HIGT todas as saidas ficam HIGT... como programo no Setup para q eles fiquem associados apenas quando a variável for Higt?
Abraços agradeço a atenção!
Tags:
Olá Edson eu não consegui fazer funcionar as saidas, alias o scada não conseguiu comandar os motores... apresenta um erro dentro do escada... acredito que os comandos dentro do arduino não estão combinando...
me desculpe te incomodar mais realmente não compreendi o código... eu teria que editar os pinos? colocar as combinações?
vou adicionar ele para vc dar uma olhada.
Obrigado!
OK vou colocar um arquivo que funcionou comigo todos os pinos. neste código consigo comandar 12 pinos do arduino de forma digital( um botão para cada saida) sendo liga desliga. ele funciona perfeitamente mais não faz a combinação necessária da qual eu preciso.
Hélio. Desculpe a demora... só agora (19:00) vi vc já tinha carregado o arquivo anexo.
As modificações foram as seguintes:
1 - usei esse arquivo acima como base, e inseri as funções nele, apenas limitando os registros a MB_REG6.
2 - descobri um erro de lógica na utilização da função "parar()", onde os motores eram parados e deviam "permanecer" parados sempre que seus botões permanecessem em 0, ou seja:
A função "frente" aciona os motores M1 e M4, quando o registro vem como 1. Se o registro permanecer 0, a própria função frente se encarrega de manter os pinos de M1 e M4 em LOW, não podendo as demais funções ativá-los.
Então eu "comentei"/desativei a função parar. Recarregue o código que está em anexo. O efeito deve ser o seguinte: o veículo vai ficar descontrolado, porque não há função parar. Mas os motores têm que funcionar.
Então seja esperto e teste apenas um ou dois motores.
Enquanto isso eu penso como pode ser feita a função "parar" sem que a mesma obrigue o motor a ficar parado, impedindo as demais de girar o motor.
(Enquanto isso, vc também pode pensar em como programar o ScadaBR mandar 2, 3 ou 4 sinais já combinados, ao invés de utilizar o arduino para interpretar... os dados já iriam direto para a porta lógica, sem utilizar as funções que escrevi.... vamos pensando paralelamente).
Abraços.
Meu amigo agradeço muito sua ajuda!
vou dar uma olhada neste código, e te passo o resultado.
No scadabr estou tentando uma lógica mais não esta funcionando ainda...
Obrigadão! Edson!
Blz, Helio.
A lógica implementada no arduino seria a mesma do scada.
Implante o código e me diga o resultado, porque eu estou às cegas.
A única coisa que fiz quanto ao código foi verificar se compilava o sketch.
xi. o arquivo em anexo.
Meu amigo me desculpe o trabalho esta me ocupando demais!
Vou dar uma atenção ao projeto agora e te passo o resultados... o outro código não testei ainda...
ja te digo como foi...
Olá Edson! este ultimo código funcionou só falta o detalhe para desligar eles...
Eu consigo ligar os motores subindo, descendo, direita, esquerda, frente, ré....
mas eles não desligam.... notei também que vc colocou uma forma de um comando mudar o estado do outro... ja eu achei isto mais complicado e decidi utilizar o mesmo botão para ligar e desligar quando eu estava programando ele. tipo quando aciono um botão de subir, eu aciono ele novamente para parar os motores (comando digital 0/1) antes de qualquer outro comando. facilita a programação...
o botão luz funcionou perfeitamente... o MB_REG1 não aceita comando algum... ele não esta como digital.
Edson muito obrigado, depois nos falamos
vou continuar tentando aqui!
O ERRO DO CODIGO ESTÁ INDICADO POR NEGRITO
case 1: digitalWrite(sub,HIGH); break; case 0: digitalWrite(sub,LOW); break; default: digitalWrite(sub,LOW); } switch ( regs[MB_REG1]) { case 1: digitalWrite(des,HIGH); break; case 0: digitalWrite(des,LOW); break; default: digitalWrite(des,LOW); }
VOCÊ DECLAROU pinosSUB e pinosDES ,mas não SUB ou DES.
Estou entendendo que você não quer escrever os comandos digitalWrite(HIGH) or digitalWrite(LOW) para todos os 4 pinos toda vez que precisar. Tente criar uma função para isso. Veja exemplo a seguir:
void digitalWriteGroup(int value)
{
digitalWrite(pinx1, value);
digitalWrite(pinx2, value);
digitalWrite(pinx3, value);
digitalWrite(pinx4, value);
}
void loop()
{
.
.
.
digitalWriteGroup(HIGH); // Coloca os 4 pinos em nível alto
.
.
.
digiralWriteGroup(LOW); // Coloca os 4 pinos em nível baixo
.
.
.
}
É o que eu pensei tb.. Só mudaria o digitalWriteGroup() pra um popular liga() ou roda() ou para()...
A diferença de ligar os motores em um comando unico ou em varios seguidos é minima...
Não sei calcular, to chutando, mas se o AVR roda 1 instrução por clock a 16MHz e precisar de 16 instruções pra setar um bit (deveria precisar de uma ou duas).. faria cada set em 16 ciclod de clock, ou 1.000.000 por segundo... Não tá bom ???
Valeria tentar ter acesso ao arquivo de compilação (em outros compiladores sai .plt, que é um .txt com divisão de paginas) pra ver como ele compila esse digitalWrite. Não tem pq não fazer ele em 1 instrução só...
Se não fizer quem sabe vale implementar em assembler...
Mas enfim, acho que essa dif não causaria problema algum.
Achei esse site que ensina a olhar o resultado da compilação em assembler:
http://ucexperiment.wordpress.com/2012/02/21/arduino-assembly-langu...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por