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!

Exibições: 1697

Responder esta

Respostas a este tópico

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!

Anexos
se vc conseguiu fazer qualquer outra coisa com scada +arduino, ponha o arquivo aqui. Que seja daqueles exemplos de acender o led do pino 13 do arduino. Coisa simples... so pra vermos qual foi o registro utilizado.

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.

Anexos

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.

 

Anexos

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.

  1. Criei um array de flags que monitora as funções sobe, desce, frente, tras, esquerda e direita.(a led ficou fora porque já é um pino só e já funcionava antes.)
  2. Esse array é inicializado com 6 zeros (pressupondo que no início nenhuma funcao foi acionada);
  3. Ao ser acionada a primeira função, como por exemplo,"sobe(GIRAR);"... um IF verifica se ela já não tinha sido acionada antes. Se o valor estiver 0, significa que ela não foi acionada, então ele sobe o valor pra 1 e gira os motores correspondentes.
  4. Se o modbus mandar novamente o valor 1 do registro relacionado à mesma função, esse valor será ignorado porque o IF vai constatar que ela já foi acionada.
  5. Dessa forma, a primeira vez que o Modbus enviar 0 para o registro correspondente, será acionada a mesma função "sobe(PARAR)"... parar de subir... então outro IF verificará se essa ordem não foi dada antes. Se for a primeira vez que o registro veio em 0, então será feito. Se não, será ignorado.

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.

Anexos

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...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço