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

Helio,

Vamos por partes: o "sub" e o "des" que o Proteus não está encontrando são aqueles que estão no "switch-case". Eles não foram declarados.

Além do mais, vai ser difícil vc ter valor 1  em regs[MB_REG1]... como está na avaliação Switch(), porque é uma leitura em escala de 0 a 255, para o analogRead().

Por enquanto, remova todo código que está dentro da função loop, e coloque somente isso aqui:

void loop(){

      highSUB(); //para HIGH os pinos SUB

      delay(1000);

      lowSUB(); //para LOW os pinos SUB

      delay(1000);

      highDES(); //para HIGH os pinos DES

      delay(1000);

     lowDES(); //para LOW os pinos DES

     delay(1000);

}

O código acima funciona funciona ligando e desligando ciclicamente os pinos SUB e DES.

Entretanto eu não consegui saber qual é o objetivo e, por isso.

P.S.: ao invés de utilizar regs[MB_REG1], utilize analogRead(1); 

Abraços.

Diga o que falta, e a gente te ajuda.

Abraços.

   Edson obrigado pelo sua atenção, estou com um projeto para entregar dia 08/12 na escola técnica, e este código do arduino esta me dando uma surra! bem eu tenho um veiculo submerso q é comandado pelo scadabr junto com o arduino. neste arquivo q enviei consta o Modbus protocolo e o código do arduino. eu consegui programar o arduino com o scada de forma q o scada consiga comandar todos o pinos q vou precisar usar, mas eu preciso comandar 4 motores numa ponte H...  então é necessário acionar mais de uma saida do arduino para comandar os motores...  pensando nisto eu deduzi q seria mais conveniente criar uma variável q aciona as saidas digitais em sua ordem. assim eu teria a combinação certa para cada movimento do veiculo.

estou enviando o arquivo q criei, este esta funcionando com meu Scadabr + arduino, mas não consegui fazer a combinação correta das portas. neste arquivo eu comando todas as saidas de forma digital ( Liga / desliga)

Muito obrigado pela atenção!

Anexos

O Arquivo e este aqui....

Anexos

Hélio,

Minha ajuda vai ser mais com o Arduino e C++, porque nunca lidei com o Modbus.

Eu ainda não descobri se sua dúvida é apenas arduino, pois o script que vc passou tem mais código sobre como o arduino deve receber e interpretar os comandos provenientes do scadaBR/modbus.

Entretanto...

A forma de acionar vários pinos ao mesmo tempo é aquela de acionar digitalWrite() dentro de um laço FOR, ou aquela "direta" no qual o garagista escreveu PORTD = PORTD...etc.


Assim, vc apenas deve substituir os dos SWITCHs do trecho abaixo:

    switch ( regs[MB_REG0]) {
    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);
  }

por esses IFs (removi o Switch por ser desnecessário):

  if(regs[MB_REG0]==1) { //se o valor for igual a 1, então
             highSUB(); //para HIGH os pinos SUB
      } else {        //se qualquer outro valor

              lowSUB(); //para LOW os pinos SUB

      }


if( regs[MB_REG1] == 1) { //se for 1...
            highDES(); //para HIGH os pinos DES
    } else { //senão
            lowDES(); //para LOW os pinos DES
  }

Espero que seja suficiente. Se não der certo, gostaria que vc postasse uma imagem que ilustrasse a ligação da sua ponte H (que deve ser um L293) com os pinos do arduino e motor.

Abraços.

Ok Edson vou tentar descrever o funcionamento dos motores na ponte h.... estou utilizando um sheld q cabe no arduino do qual utiliza as seguintes saidas digitais:

Variável;

Sobe> SUB - M2  pin 10+8 e M3 Pin 11+13

Desce> DES - M2 pin 10+7 e M3 pin 11+12

Frente> FRE - M1 pin 9+4 e M4 pin 5+16

A traís> TRA - M1 pin 9+3 e M4 pin 5+15

Esquerda> ESQ - M1 pin 9+3 e M4 pin 5+16

Direita> DIR - M1 pin 9+4 e M4 pin 5+15

LEDs> LUZ - pin 6

A idéia e usar as variáveis dentro do arduino, quando o scadabr mandar um comando ele envia para a variável q controla as 4 saidas digitais das combinações acima.

Obrigado pelo apoio!

Abraços !

entendi.
estou no celular... descreva somente mais um detalhe:
A lista acima fala sobre o acionamento, mas não sobre o momento em que o motor é desligado.

responda-me:
1 - como funciona a questão de parar o motor?
2 -
será necessário executar duas dessas funcoes simultaneamente?

é da seguinte forma Edson quando aciono um motor klico em um botão no scada q coloca o registrador em HIGT, ligando o motor.  quando vou desligar também klico no mesmo botão, que aciona o registrador do modbus e muda para LOW..  desligando ele.

 A minha ideia e criar variáveis que eu vou comandar de forma digital pelo scada, liga desliga...

Hélio,


Eu escrevi duas classes para abstrair e melhorar a compreensão do código: Motor e Lâmpada.

Após, eu crio 4 objetos (M1, M2, M3 e M4) motores e um objeto "led" da classe Lâmpada.

O arquivo está em anexo. Abra-o tente compreender as modificações (antes do setup, no setup e no loop). Depois tente rodar.


Entretanto, tive que incrementar o número de registros (antes tinha somente MB_REG0 e MB_REG1; agora tem o 2, 3, 4 e 5). Não sei se é correto, porque não tenho certeza se esses registros podem ser adicionados.

Eu suponho que vc queira controlar cada função por um registro.


O ideal é que as funções sobe e desce (contraditórias?) fossem controladas pelo mesmo registro (passando os comandos PARA, SOBE e DESCE pelos inteiros 0, 1 e 2, respectivamente, o que economizaria a metade dos registros..., mas vamos deixar "como está".

ATENÇÃO: não tenho certeza se o MB_REGn é o registro que está vindo do ScadaBr. Meu script se baseou no SWITCH-CASE que vc tinha antes.

Abraços.

O arquivo está em anexo.

Antes de abri-lo, mova a pasta Sketch modbus_proteus que está dentro do diretório de Sketchs para um backup seguro. Depois abra esse arquivo (que criará novamente a pasta).

Anexos

OK...  isso mesmo para cada comando tenho um registro. eles só funcionam como digitais (liga / desliga)...  mais de uma função eu teria que criar um script dentro do scada.

eu imagino q sejam 7 MB_REGs ( 0, 1, 2, 3, 4, 5, 6)... sobe, dece, direita, esquerda, frente, ré e LED....

Obrigado vou testar!

No caso, o objeto Led (da classe Lâmpada) não está sendo aceso/apagado pelo MB_REG6, mas pelo acionamento dos motores.

Se quiser, vai ter que:

- adicionarr o MB_REG6 no "enum" do começo do script, onde estão os demais.

- remover os "led.acende();" e "led.apaga();" de dentro das funções

- adicioinar, na função loop(), mais um IF...

if(regs[MB_REG6]==1) { //se o valor for igual a 1, então
             led.acende(); //acende o Led
      } else {        //se qualquer outro valor

              led.apaga();

      }

Obrigado! vou fazer uns testes!

e te mando resultado!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço