Brinquedo infantil em elementos lógicos

Neste artigo, por assim dizer, quero falar sobre meu primeiro projeto em engenharia elétrica. Devo dizer que, por minha profissão, estou longe de circuitos e rádio eletrônicos, mas o interesse nesse tópico não me deu descanso desde tenra idade. Para pessoas com experiência, as informações abaixo podem parecer muito óbvias, e muito do que fiz foi "inventar uma bicicleta". Mas talvez algum novato, como eu, seja capaz de descobrir algo novo e interessante. Quem se importa, por favor, debaixo do gato.


Tudo começou com a idéia de fazer uma placa de desenvolvimento para minha filha. Primeiro, eu queria esticar os braços e fazer algo sozinho. Em segundo lugar, eu queria esticar meu cérebro e criar algo que não esteja em quadros comuns desse tipo.


Depois de observar o que a criança mais gosta de fazer na vida cotidiana, foi decidido que, além do padrão de alças de corrente, você precisa adicionar botões para pressionar e um determinado dispositivo que mostre a reação à pressão. Como algo simples, mas brilhante, deveria ter sido exibido, a escolha recaiu sobre a matriz vermelha de 8x8 LED.


Até o momento em que criei o brinquedo, eu estava acumulando poeira na prateleira do Arduino Uno por algum tempo - ele estava esperando por algo útil além do sistema de cores de rega automática, que, além do tédio em si, era um pouco menos do que eu não precisava. Eu pensei que a hora dela (Arduino) havia chegado, porque você precisa começar em algum lugar. Depois de ler os manuais da matriz, descobri que, além de não conectá-lo ao Arduino (apenas para ele você precisa de 16 pinos que não estão no meu Arduino), é impossível controlar todos os LEDs ao mesmo tempo. Você pode brilhar simultaneamente com certos diodos em uma linha ou em uma coluna (controle do cátodo comum ou do ânodo comum). E se você fizer isso de forma consistente e rápida o suficiente, uma pessoa deixa de perceber a piscar e vê uma imagem estável. Também aprendi que, para o Arduino, existem drivers e bibliotecas disponíveis no mercado que se preocupam em gerenciar esse processo. E o fato da ausência de um driver desse tipo na época predeterminou o resultado de todo o projeto.


Enquanto procrastinava tudo e adiava a escolha do melhor lugar para comprar um driver, me deparei com um artigo sobre a operação de sistemas de gatilho. Para meu cérebro, humanidades, tornou-se uma descoberta real, dando uma compreensão de como a memória é organizada em um nível primitivo. Então me perguntei se poderia ficar sem o Arduino e fazer meu projeto com base em gatilhos e circuitos lógicos.


Então, primeiro você tinha que decidir o que mostrar e como fazê-lo. Ficou claro que era necessário aplicar um sinal, por sua vez, a oito linhas da matriz e, para cada iteração, aplicar um sinal paralelo a determinadas colunas. Bem, isso me deu uma compreensão dos três componentes principais - um gerador de pulsos, um conversor de clock em oito sinais consecutivos e um conversor que para cada um dos oito sinais produzirá uma certa combinação de sinais paralelos. Não é tão complicado assim.


Depois de pensar um pouco, um circuito formado na cabeça no qual o sinal do relógio é convertido em código binário usando três gatilhos JK conectados em série e, em seguida, usando circuitos lógicos, em octal. Detalhes sobre esse tipo de gatilhos podem ser lidos pelo menos na Wikipedia . Em resumo, possui duas entradas (J e K) e duas saídas (Q e Q̄), além de uma entrada de sincronização (CLK). Quando uma unidade lógica é alimentada em uma das entradas durante o próximo pulso de sincronização, a unidade será exibida na saída correspondente e armazenada nela, independentemente de o pulso de sincronização ser aplicado novamente e se o valor na entrada selecionada for alterado, desde que a segunda entrada permaneça zero. Se você enviar uma unidade para a segunda entrada e para o primeiro zero, no próximo pulso de sincronização, o valor da primeira saída mudará para zero e o segundo para uma. Porém, se uma unidade for aplicada às duas entradas do acionador, a cada pulso de sincronização, a unidade aparecerá alternadamente em uma das saídas. E se você usar dois gatilhos, aplique um pulso de clock na entrada de sincronização do primeiro e o sinal da saída Q̄ do primeiro para a entrada de sincronização do segundo, como resultado, a saída Q1 emitirá um a cada dois ciclos e Q2 a cada quatro. Assim, é obtido um contador binário de dois dígitos. E se você adicionar o terceiro gatilho da mesma maneira, devido ao terceiro dígito, poderá contar até oito com um código binário - é isso que você precisa.


imagem


Em seguida, foi necessário criar uma tabela verdade e selecionar um conjunto de chaves lógicas para que o código binário se transformasse em oito sinais consecutivos. Se, para alguns, a tabela verdade e as operações booleanas são algo novo e desconhecido, você pode ler sobre elas novamente na Wikipedia aqui e aqui .


Parece que metade do trabalho está lá, mas, na verdade, não foi tão simples. Quando montei a primeira parte do circuito para o teste em uma placa de ensaio e imaginei como implementar a segunda parte de maneira semelhante, minha fantasia se prolongou por muitos meses (e talvez anos - o tempo para se envolver em um hobby é pouco mais de uma hora depois do trabalho) desenhando diagramas e compilando tabelas de verdade. De fato, para oito linhas de cada imagem, você precisa gerar uma combinação única de colunas. E quanto mais fotos houver, mais monstruoso será o circuito. Percebi que não funcionaria para fazer o que era planejado apenas em chaves lógicas. Era necessário procurar algo que pudesse simplificar esse processo.


A solução foi um chip de memória. Para minha tarefa, a memória EEPROM (memória somente leitura programável apagável eletricamente) era adequada - uma memória programável com a possibilidade de apagamento elétrico com entrada / saída paralela. A memória possui quantas entradas de endereço, que, de fato, são bits do endereço binário das células da memória. Ou seja, se a memória tiver n entradas de endereço, 2 ^ n células podem ser programadas. O número de pinos de memória é o chamado "comprimento da palavra" ou o comprimento real de uma sequência binária que pode ser gravada em cada célula. O produto do número de células por comprimento de palavra determina a quantidade de memória em bits.


O sinal de entrada na forma de código binário estava disponível para mim na saída dos gatilhos JK. Resta complementá-lo com bits dos botões, que devem ser responsáveis ​​pela saída de imagens diferentes, e o ponto está no chapéu.


E, novamente, a falta de experiência não me permitiu avaliar adequadamente a complexidade do processo. Afinal, a memória precisa ser programada e, para isso, você precisa de um programador - o dispositivo é significativamente caro para comprá-lo para um brinquedo artesanal. O Google mostrou que era teoricamente possível fazer isso com o Arduino. Porém, para a programação, é necessário fornecer sinais simultaneamente às entradas de endereço do chip de memória e às saídas, que devem reproduzir o sinal posteriormente. E também precisamos de sinais de controle de chip. Ou seja, novamente mais do que os pinos disponíveis. Pesquisadores adicionais me abriram um registro de turno - um chip que lembra uma determinada sequência de zeros e uns e os exibe em saídas paralelas. Freqüentemente, esses chips também funcionam como um buffer e têm uma saída que pode reproduzir sequencialmente os sinais de entrada. Ou seja, se você conectar o próximo registro a ele, poderá exibir simultaneamente uma sequência duas vezes maior do que uma. Quando você entra na linha, a primeira parte passa pelo primeiro registro como por um buffer no segundo e o restante permanece no primeiro registro. Ao adicionar um terceiro registro, você pode triplicar o comprimento da string, etc. Para implementar isso, você tinha que escrever um esboço em uma linguagem de programação desconhecida. Mas, com alguma experiência em Python e muitos exemplos na Internet, após uma série de tentativas e erros, essa tarefa se mostrou bastante viável. O esboço pode ser feito no github .


E agora o esboço está escrito, o microcircuito está conectado, o lançamento e ... nada - a memória não está programada. Algumas amostras, alterando as configurações de gravação e sem resultados. Eu tinha um microcircuito W27C512-45Z. Uma leitura cuidadosa dos manuais mostrou um momento desagradável. Para escrever para um contato específico do microcircuito, é necessário fornecer uma corrente de 0,03A com uma tensão de 12V. Eu pensei que tinha acabado de comprar um chip não tão adequado. Mas, depois de percorrer as prateleiras das lojas locais de componentes elétricos, certifiquei-me de que todos precisassem de 12V. Eu não tinha uma fonte de alimentação de laboratório. Existem muitos blocos de 12V na casa, mas todos são pulsados; além disso, a corrente é de cerca de 1A. Perdoe-me, engenheiros experientes por esse sacrilégio, mas em desespero, decidi tentar ver se um milagre aconteceria com aqueles blocos que estavam à mão. Não aconteceu. As duas primeiras passagens da gravação não renderam nada e, após o terceiro microcircuito, ele deixou de mostrar sinais de vida.


Na Internet, encontrei referências a um microcircuito ST662AB - um conversor de 5V-12V - que, juntamente com o conjunto correto de capacitores, deveria produzir a corrente e a tensão necessárias. De fato, não foi fácil encontrar o chip. Como resultado, encomendei da China, também SMD. E quanto a quatro a seis semanas de entrega? Certo, aprenda. Percorrendo os artigos sobre programação de memória, me deparei com uma menção de um chip que pode ser programado em 5V. Era sobre o AT28C256. E, de fato, nas folhas de dados para ela não havia menção a 12V. Precisa levar! É verdade que o chip para minhas necessidades era um pouco redundante, pois me permitia economizar 256Kb: uma saída de 8 bits para endereços de 32K, que, levando em conta os três pinos de endereço ocupados para sinais de sincronização de linha, permitiu codificar até 4096 imagens (10 seria o suficiente para mim). Além disso, a entrega já tinha que ser feita a partir do Reino Unido. Mas não encontrei outras opções e, no final, a memória pode ser reprogramada e, quando o brinquedo não é mais relevante, o chip pode ser usado em outro lugar. Então, depois de quatro dias, eu tinha uma memória. Execução de teste de esboço e felicidade - tudo funciona.


A última coisa que resta é decidir quantos botões haverá, desenhar imagens 8x8 e implementar a adição de sinais dos botões no circuito. Tendo estimado o lugar no tabuleiro, decidi por cinco botões. Dada a demanda inútil comparada ao recurso de memória, a maneira mais fácil era enviar um sinal de cada botão diretamente para uma entrada separada sem usar nenhuma codificação. É verdade que ainda tinha que resolver o problema de alternar entre fotos. Foi possível usar botões com fixação de pressão. Mas essa implementação não era adequada para uso por uma criança de um ano de idade, porque, antes de pressionar o próximo botão, era necessário pressionar o botão de trabalho e era bastante primitivo por si só. Eu queria criar um esquema para botões sem conserto, no qual o pressionamento de cada botão seria salvo e até cancelar o pressionamento do anterior. Eu li sobre os recursos do uso de diferentes tipos de gatilhos, esperando que alguns deles possam resolver esse problema por conta própria, mas infelizmente. Depois de me sentar um pouco com uma folha e um lápis, criei o seguinte diagrama (um exemplo para três botões).


Primeiro, você precisa conectar todos os botões a um determinado coletor, que na saída fornecerá uma unidade quando você clicar em qualquer um dos botões. Para isso, a tecla OR é adequada. Como na maioria das vezes os microcircuitos de teclas possuem apenas duas entradas, é necessário conectar os dois primeiros botões a uma tecla e, em seguida, conectar sua saída à primeira entrada da segunda tecla e o terceiro botão à segunda entrada. Dessa forma, você pode continuar conectando mais botões, adicionando uma nova chave para cada uma subseqüente. Além disso, cada botão deve ser conectado a uma tecla XOR separada e à entrada J de um gatilho JK separado. Conecte a saída do buffer OR à segunda entrada das teclas XOR e a saída de cada tecla XOR à entrada K do gatilho JK correspondente. Assim, pressionando, por exemplo, o botão 1, uma unidade será enviada para J1 e o XOR1 não será acionado, pois uma unidade é fornecida a partir do botão e do buffer OR. Na saída Q1, uma unidade também aparecerá e será salva. Ao mesmo tempo, o XOR2 e o XOR3 funcionarão, alimentando uma unidade para K2 e K3. E se no Q2 ou Q3 antes disso havia uma unidade, ela mudará para zero.


imagem


Criar imagens 8x8 também foi um teste separado. Poucos pontos para reproduzir uma imagem reconhecível. Mas ligar a fantasia, ainda conseguiu desenhar alguns, por exemplo, um andróide.


imagem


Para fotos, criei tabelas verdadeiras. Mas como é necessário enviar um para as linhas da matriz e zero para as colunas, a tabela teve que ser invertida. Anotei o código binário resultante na codificação hexadecimal para uso mais conveniente no esboço do Arduino.


Para construir todo o circuito, eu queria encomendar uma prancha pronta. Mas da lista de empresas disponíveis que oferecem serviços de fabricação de placa simulada, me ofereceram a opção mais barata de placa bilateral por quase US $ 25. Não sei, talvez esse seja um custo normal, mas me pareceu um pouco demais. Além disso, não tenho absolutamente nenhuma experiência em criar layouts. E acho o processo de solda muito agradável e relaxante. Portanto, comprei uma placa universal, um rolo de fio multicolorido, os componentes necessários e me sentei na montagem por várias noites. Como todos os componentes operam com tensão de 5V a 12V. Por conveniência, fiz uma bateria de 9V.


Como tudo funciona como resultado pode ser visto aqui , o esquema completo está disponível no github .
Como o "coração" de todo o circuito, usei um gerador de pulsos. Não sabia exatamente qual a frequência exata do pulso do relógio, então usei o circuito pronto com o ajuste. Infelizmente, eu não tenho um osciloscópio, mas comparando os ajustes e a folha de dados do circuito, algo em torno de 1KHz é usado. Aqui, o vídeo mostra como a frequência muda de baixa para maior. Você pode ver como as linhas da matriz são desenhadas.


Obrigado pela atenção.

Source: https://habr.com/ru/post/pt421967/


All Articles