
Antes de prosseguir, gostaria de avisar um leitor zeloso.
- O que eu descrevo não pode ser feito por muitos motivos; esses motivos serão indicados com alegria nos comentários, e eu de modo algum exorto você a fazê-lo. E, em nenhum caso, afirmo que o dispositivo descrito abaixo pode substituir um PLC real. Tudo o que foi descrito foi feito apenas para provar a mim mesmo que isso é tecnicamente possível e não se aplica a equipamentos reais.
- Se você se sentir mal apenas por mencionar a palavra "Arduino", é melhor não ler. Realizei todas as ações com o controlador no IDE do Arduino, é mais fácil para mim. Mas nada impede de fazer o mesmo sem usá-lo.
Durante muito tempo, quis escrever um artigo sobre minhas experiências com o ATtiny13, mas fiquei principalmente assustado com a atitude dos arduinoistas no site. Além disso, trabalho com controladores há apenas alguns anos (obrigado novamente ao Arduino, oh, onde você esteve antes!). Comentários sobre o artigo
Três olhares para o post ... mostraram que o tópico ainda é interessante para um número suficiente de usuários. A propósito, o título do artigo deveria ser “PLC on ATtiny13”, mas nos mesmos comentários, eles me explicaram educadamente
na mesa que o dispositivo descrito não poderia ser chamado de “PLC”. Bem, não, não.
O que precisamos do PLC?
Começou com o fato de que eu queria fazer um análogo funcional dos PLCs usados em minha empresa, levando em consideração como eles são usados. A maioria dos circuitos de controle temos retransmissão com todas as deficiências resultantes. PLCs de vários tipos também são usados em locais, a partir dos anos 90. Basicamente, eles executam a tarefa lógica do circuito de controle, começando pelo estado dos interruptores de limite e sensores de proximidade.
Sem interfaces complexas, sem sinais analógicos. On / Off. Só isso. Na maioria das vezes, até a carga para as saídas do PLC é fornecida pelos mesmos relés que eles estavam tão ansiosos para se livrar. (O engraçado é que em quase todos os lugares são usadas saídas de relé de PLC, que comutam relés externos, que comutam eletroímãs de distribuidores hidráulicos ... Às vezes, é adicionado mais um link do iniciador.) Então, o que eu preciso do PLC:
- Entradas discretas para um nível de sinal de 24 volts.
- Saídas discretas com tensão de 24 volts.
- Testando o algoritmo interno de acordo com um determinado esquema, que pode ser alterado se necessário (principalmente durante a depuração).
- Velocidade de cerca de 50 ms, não é mais necessário substituir os circuitos de relé.
E é isso. Sem interfaces. Sem interrupções. Sem telas. Ah, sim, as telas ... Não vai doer exibir o status das entradas e saídas; aqui, os LEDs ainda não possuem LEDs mais confiáveis. Bem, não esqueça que tudo é feito por interesse esportivo, respectivamente, o orçamento recai sobre os ombros do desenvolvedor. A propósito, um incentivo muito bom.
Se você não levar em consideração o nível do sinal de 24 volts, absolutamente qualquer microcontrolador com o número de E / S (entradas / saídas) não menos do que o necessário pode facilmente lidar com a tarefa.
Lidamos com os níveis
Inicialmente, eu queria usar optoacopladores nas entradas. Quem é mais ou menos versado em eletrônica, especialmente industrial, sabe que não existem muitos optoacopladores. Os comentários explicarão em detalhes por que é impossível sem os acopladores ópticos. Mas pesava os prós e os contras e decidi recusar. Portanto, alguns podem não ler mais e imediatamente prosseguir para escrever um comentário.
Portanto, temos um sinal de entrada de 24 volts ou 0 volts na ausência de um sinal. Isso permitirá o uso de um sensor de posição indutivo sem contato ou uma chave limitadora de contato convencional. A partir de 24 volts, é necessário obter a tensão da unidade lógica segura para o controlador. O bom e velho divisor de tensão lida com isso da melhor maneira possível.

Os resistores são calculados levando em consideração que, para qualquer desvio da tensão de entrada em mais ou menos 20% da tensão nominal na entrada do microcontrolador, deve haver mais do que a tensão de comutação (geralmente é metade da tensão do controlador), mas não mais do que a tensão do controlador, consideramos igual a 5 V. Adequado para qualquer controlador da família AVR. Além disso, a corrente estimada através do divisor é de cerca de 7 mA, o que reduz a probabilidade de interferência e, ao mesmo tempo, não carrega fortemente a saída do sensor e a fonte de energia. Um diodo zener de 4,7 V serve para proteger contra sobretensões na mesma interferência. Ainda há um grande número de contatos, podemos lutar com ele de forma programática ou absolutamente nada, é apenas uma maquete. Agora eu ainda teria que indicar o status da entrada. E aqui você pode aplicar o lifehack, matando dois coelhos com uma cajadada:

O LED no circuito executa duas funções - funciona como um diodo zener, limitando a tensão a 2,8 ... 2,9 volts (apenas para LEDs azuis e brancos!), E também brilha. Devo avisar que, em alguns casos, a tensão no LED não é suficiente para mudar a entrada do controlador! Ao usar várias entradas do controlador, simplificamos a instalação e salvamos vários diodos zener. Ao aumentar gradualmente a tensão de entrada, você pode notar que o momento de ignição do LED e o momento de alternar a entrada não coincidem um pouco. Mas isso não nos incomoda muito, pois não deve haver níveis intermediários na entrada, apenas 0 V ou 24 V. Naturalmente, nesse momento, você deve ter pelo menos o firmware de teste mínimo para uma entrada e uma saída no controlador.
Agora, o sinal de saída do controlador também precisa ser adaptado para 24 V, e levando em consideração que o fio comum, que também é negativo, é comum a todos os relés de saída. Aqui você precisa de pelo menos 2 transistores e 2 resistores:
De fato, seria necessário mais um resistor e um diodo de proteção paralelo ao relé, mas não é isso. No começo eu usei esse circuito. Mas, a certa altura, chamei a atenção para os acopladores ópticos, que recusei no início.
Quem nos incomoda nos ajudará
Examinamos os parâmetros dos acopladores ópticos por folhas de dados: o PC817C de saída mais barato e mais acessível permite que você alterne U: 35 V: I: 50 mA. Esses relés conectados ao CLP em nosso local (na empresa) levam até 45 mA. Sem estoque, mas bastante adequado. A maioria dos relés de tamanho pequeno a 24 V puxa até 15 ... 20 mA. No final, você pode comprar um acoplador óptico mais caro, se você realmente precisar, existem correntes de até 80 mA e tensão de até 60 V. Somos adequados para o layout e o 817. Para que você não aprenda com seus erros, aviso que, para obter a máxima corrente de saída através do LED do acoplador óptico, é necessário passar mais de 7 mA.
Bem, novamente, lembre-se da indicação. Para exibir o status da saída, adicionamos um LED em série com o LED do acoplador óptico, ainda temos mais de 3 volts ociosos lá. E é hora de desenhar um diodo de proteção antes de gravar o acoplador óptico. A propósito, não consegui encontrar um método para escolher um diodo de proteção, dependendo dos parâmetros do relé. Por um lado, deve ser pulsado, por outro, alta tensão. Além disso, ele pode ser colocado paralelo ao transistor, o que é melhor? A prática mostra que um diodo IN4148 de potência suficientemente baixa neste caso, mas eu gostaria de uma justificativa teórica.
Um resistor de 220 ohm é indicado com o cálculo novamente em um LED azul ou branco; se você colocar vermelho, a corrente no circuito de 3,5 mA aumentará para 9 mA, isso deve ser levado em consideração.
Um pouco sobre programação
Bem, existem muitas letras, mas ainda não cheguei ao final do título, nem a ATtiny13. Para programar meu controlador, usei
o projeto FLProg , um ambiente de programação visual que aproxima a programação do controlador da programação do CLP no LAD e FBD. O circuito criado nesse ambiente, que também é um projeto, é compilado em um esboço do Arduino, que eu já carrego do Arduino no ATtiny13 ou em outro controlador da família AVR. Por exemplo, um esquema tão simples

compila em código como este:
bool _k1 = 0;
void setup()
{
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, OUTPUT);
}
void loop()
{
_k1 = (((((!(digitalRead (1)))) &&((digitalRead (2))))) || ((((!(digitalRead (1)))) &&(_k1))));
digitalWrite (3, _k1);
}
- - , . FLProg , «» . , . , pin – , . ATtiny13, :
Attiny13 Attiny13a Arduino IDE , : FLProg ATtiny13 ( ), , , ATmega168. FLProg , ATtiny13, . Arduino IDE , .
? ATtiny13, 5 , . , 6 , , , :
? RESET.
, 6, . ?
:
, . . , . .
, 50 . , 50 , , . , .
0 2,8 , , . , , 1,1 ( ) 2,9 , 4 . , .
. , , . , , 5 , -- , . 3 ( ) 680 . , . , , .
? 50 , 1 , 50 . , 1 , . , .
, . , .
6+6=12 -, 2?
, ? , ) 4 , , , . 0 , , 2,8 , ( ). 24, 0, , 2 – 0,93 1,87 . , . Arduino IDE , ATtiny, . , .
, , 6 10 (!) ATtiny13 ( ). , , . , «» ATtiny. , ATmega8, . :-)
, .
, , , . I/O . , (8/6) , , « ».
, , , «»,
. .
P.S. , : « ?»