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:
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!
O Arquivo e este aqui....
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 !
é 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).
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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por