Índice:

O registro de deslocamento 74HC164 e seu Arduino: 9 etapas
O registro de deslocamento 74HC164 e seu Arduino: 9 etapas

Vídeo: O registro de deslocamento 74HC164 e seu Arduino: 9 etapas

Vídeo: O registro de deslocamento 74HC164 e seu Arduino: 9 etapas
Vídeo: DICA EXCELENTE PARA CONTROLE DE SHIFT REGISTER | Curso de Arduino #143 2024, Novembro
Anonim
O registro de deslocamento 74HC164 e seu Arduino
O registro de deslocamento 74HC164 e seu Arduino
O registro de turno 74HC164 e seu Arduino
O registro de turno 74HC164 e seu Arduino

Os registradores de deslocamento são uma parte muito importante da lógica digital, eles agem como uma cola entre os mundos paralelo e serial. Eles reduzem a contagem de fios, o uso de pinos e até mesmo ajudam a aliviar a carga da sua CPU, sendo capazes de armazenar seus dados. Eles vêm em tamanhos diferentes, com modelos diferentes para usos diferentes e recursos diferentes. O que discutirei hoje é o 74HC164 de 8 bits, serial em paralelo, sem travamento, registrador de deslocamento. Por quê? Bem, para começar, é um dos registradores de deslocamento mais básicos, o que torna o aprendizado mais fácil, mas aconteceu de ser o único que eu tinha (risos!). Este instrutível cobre como esse chip funciona, como conectá-lo e faça a interface com um arduino, incluindo alguns esboços de amostra e circuitos de led. Espero que todos gostem!

Etapa 1: O que são registros de deslocamento?

Então, o que são registros de deslocamento?
Então, o que são registros de deslocamento?

Como mencionado anteriormente, eles vêm em todos os sabores diferentes, e também mencionei que estou usando um 74HC164 de 8 bits, serial em paralelo, sem travamento, registrador de deslocamento, então o que isso significa?!? Primeiro, o nome 74 - significa sua parte da família lógica 74xx, e como sua lógica não pode controlar diretamente muita corrente (16-20ma para todo o chip é comum), ele apenas passa sinais, mas isso não significa esse sinal não está indo para um transistor que pode alternar uma carga de corrente mais alta. HC significa que é um dispositivo CMOS de alta velocidade, você pode ler sobre isso no link abaixo, mas o que você basicamente precisa saber sobre isso é que é um dispositivo CMOS de alta velocidade. dispositivo de energia e funcionará de 2 a 5 volts (então se você estiver usando um arduino de 3,3 volts, ok) Também pode funcionar corretamente em altas velocidades, este chip em particular tem uma velocidade típica de 78 mhz, mas você pode ir tão lento ou tão rápido (até que comece a subir) como você desejawww.kpsec.freeuk.com/components/74series.htm164 é o número do modelo deste chip, há um grande gráfico deles em wikipediaen.wikipedia.org/wiki/List_of_7400_series_integrated_circuits Próximo, 8 bits Um registrador de deslocamento é feito de circuitos de flip-flop, um flip-flop tem 1 bit de memória, este ha s 8 (ou 1 byte de memória). Por ser memória, se você não precisar atualizar o registro, você pode simplesmente parar de "falar" com ele e ele permanecerá no estado em que você o deixou, até que você "converse" com ele novamente ou reinicie a energia. outros registradores de deslocamento da série 7400 lógicos podem ir até 16 bits seriais em paralelo. Isso significa que seu arduino envia dados em série (em pulsos desligados um após o outro) e o registrador de deslocamento coloca cada bit no pino de saída correto. Este modelo requer apenas 2 fios para ser controlado, então você pode usar 2 pinos digitais no arduino e dividir essas 2 a 8 saídas digitais adicionais - alguns outros modelos são paralelos na saída serial, eles fazem a mesma coisa, mas como entradas para o arduino (por exemplo, um gamepad NES) não travado Isso pode ser uma queda deste chip se você precisar dele. Conforme os dados entram em um registrador de deslocamento via serial, eles aparecem no primeiro pino de saída, quando um pulso de clock entra, o primeiro bit muda mais de 1 lugar, criando um efeito de rolagem nas saídas, por exemplo 00000001 apareceria nas saídas como 101001000100001001000001000000100000001Se você estiver conversando com outros dispositivos lógicos que compartilham o mesmo relógio e não esperava por isso, isso poderia causar problemas. Os registradores de deslocamento travados têm um conjunto extra de memória, portanto, uma vez que os dados sejam inseridos no registrador, você pode girar uma chave e mostrar as saídas, mas adiciona outro fio, software e coisas para acompanhar. No caso deste instrutível estamos controlando displays de LED, o efeito de rolagem acontece tão rápido que você não consegue ver (exceto quando você liga o chip pela primeira vez), e uma vez que o byte está no registrador de deslocamento não há mais rolagem. Estaremos controlando o tipo de gráfico de barras, 7 segmentos, e uma matriz de pontos 16LED 4x4 com este chip e software no arduino usando apenas 2 pinos digitais (+ alimentação e aterramento)

Etapa 2: Fiação Básica e Operação

Fiação Básica e Operação
Fiação Básica e Operação
Fiação Básica e Operação
Fiação Básica e Operação

Fiação O 74HC164 é um chip de 14 pinos, tem 4 pinos de entrada, 8 pinos de saída, alimentação e aterramento, então vamos começar do topo. Os pinos 1 e 2 são entradas seriais, eles são configurados como uma porta AND lógica, o que significa que ambos têm que ser lógico alto (ou seja, 5 volts) para que o bit seja visto como 1, um estado baixo (0 volts) em qualquer um deles será lido como zero. Nós realmente não precisamos disso e é mais fácil de lidar com o software, então escolha um e conecte-o a V + para que sempre leia alto. Eu escolhi usar um jumper do pino 1 ao pino 14 (V +), já que você pode simplesmente colocar um jumper da placa de ensaio sobre o chip. A única entrada serial restante (pino 2 em meus esquemas) irá para o pino digital 2 do arduino. Os pinos 3, 4, 5 e 6 do 74HC164 são os primeiros 4 bytes de saída O pino 7 se conecta ao aterramentoJumping para a direita, pino 8 é o pino do relógio, é assim que o registrador de deslocamento sabe que o próximo bit serial está pronto para ser lido, isso deve ser conectado ao pino digital 3 no arduino. O pino 9 é para limpar todo o registro de uma vez, se ele ficar baixo, você tem a opção de usá-lo, mas nada neste inescrutável faz, então ligue-o aos pinos V + 10, 11 12 e 13 são os últimos 4 bytes do pino de saída 14 é a potência do chip Operação Primeiro você precisa definir a entrada serial do registrador (pino digital 2 no arduino) alto ou baixo, em seguida, você precisa virar o pino do relógio (pino digital 3) de baixo para alto, o registrador de deslocamento lerá os dados na entrada serial e mudará os pinos de saída em 1, repita 8 vezes e você configurou todas as 8 saídas. Isso pode ser feito manualmente com loops for e gravações digitais no IDE do arduino, mas desde t Esta é uma comunicação de nível de hardware (SPI) muito comum e tem uma única função que faz isso por você. shiftOut (dataPin, clockPin, bitOrder, value) Basta dizer onde os dados e os pinos do relógio estão conectados ao arduino, de que forma enviar os dados e o que enviar, e isso é feito para você (útil)

Etapa 3: Projetos

Projetos
Projetos

Ok, chega de aula e teoria, vamos fazer algumas coisas divertidas com este chip! Existem 3 projetos para experimentar neste instrutível, os 2 primeiros são fáceis e podem ser implementados em instantes. O terceiro, a matriz de led 4x4, requer mais tempo e reflexão para ser construída, devido à fiação do led. Lista de peças Projeto 1: Controlador de display de LED de gráfico de barras '2 fios' 1 * 74HC164 Shift register1 * breadboard sem solda1 * arduino ou arduino compatível (5v) 1 * 330 ohm 1/4 watt resistor 8 * saída normal LEDs vermelhos 12 * fios de jumper Projeto 2: controlador de exibição de 7 segmentos '2 fios' 1 * 74HC164 Shift register1 * breadboard sem solda1 * arduino, ou compatível com arduino (5v) 1 * 330 ohm 1/4 watt resistor 1 * catodo comum display de sete segmentos9 * fios de jumper Projeto 3: '2 fios' 4x4 led matrix display 1 * 74HC164 Shift register1 * arduino, ou compatível com arduino (5v) 4 * 150 ohm 1 1/4 watt resistor8 * 1Kohm 1/8 watt resistor (ou maior) 8 * transistor NpN (2n3904 ou melhor) 16 * LEDs vermelhos de saída normal um meio de construí-lo e energia regulada de 5 volts que pode lidar com 160 + ma (você pode ligue todos os LEDs de uma vez como uma luz de freio)

Etapa 4: Projeto 1 [pt 1]: Hardware controlador de exibição de LED de gráfico de barras de '2 fios'

Projeto 1 [pt 1]: Hardware controlador de display de LED de gráfico de barras de '2 fios'
Projeto 1 [pt 1]: Hardware controlador de display de LED de gráfico de barras de '2 fios'
Projeto 1 [pt 1]: Hardware controlador de display de LED de gráfico de barras de '2 fios'
Projeto 1 [pt 1]: Hardware controlador de display de LED de gráfico de barras de '2 fios'

Conecte o arduino e o registrador de deslocamento de acordo com o esquema, eu já tenho um display de gráfico de barras de 10 segmentos pronto para uso em breadboard e é isso que você verá na imagem, mas você pode fazer a mesma coisa com led's individuais Na segunda página Afirmei que estes não eram dispositivos de driver, mas sim dispositivos lógicos, com pequenas quantidades de corrente capazes de passar por eles. Para executar 8 LEDs, mantendo o circuito simples, e não cozinhando o registro de deslocamento, é necessário limitarmos a corrente um pouco. Os LEDs são ligados em paralelo e compartilham um terreno comum (cátodo comum), antes de entrar na alimentação eles precisam passar por um resistor de 330 ohms, limitando a quantidade total de corrente que todos os LEDs poderiam usar a 10ma (a 5 volts). Isso deixa os LEDs em um estado de aparência doentia, mas eles acendem e, portanto, servem para neste exemplo, a fim de acionar os LEDs em sua corrente adequada, você precisará inserir um transistor onde o registro de deslocamento pode ligar / desligar uma fonte de corrente mais alta (consulte o projeto 3). O pino de dados do registro de deslocamento (pino 2) precisa para se conectar ao pino digital do arduino nº 2 O pino Clock do registro de deslocamento (pino 8) precisa se conectar ao pino digital do arduino nº 3

Etapa 5: Projeto 1 [pt 2]: Software controlador de display de LED de gráfico de barras '2 fios'

Projeto 1 [pt 2]: Software controlador de display de LED de gráfico de barras '2 fios'
Projeto 1 [pt 2]: Software controlador de display de LED de gráfico de barras '2 fios'
Projeto 1 [pt 2]: Software controlador de display de LED de gráfico de barras '2 fios'
Projeto 1 [pt 2]: Software controlador de display de LED de gráfico de barras '2 fios'

Exemplo 1: Abra o arquivo "_164_bas_ex.pde" dentro do IDE do arduino, é um esboço simples que apenas permite definir LEDs ligados ou desligados na exibição do gráfico de barras. As primeiras 2 linhas definem os números dos pinos que usaremos para dados e relógio, I use #define sobre const integer, acho mais fácil de lembrar, e não há vantagem para um ou outro uma vez compilado #define data 2 # define clock 3 next é a função de configuração do void, ela roda apenas uma vez, então o arduino gira ativado, define o registrador de deslocamento e não tem mais nada a fazer. Dentro da função de configuração do void, definimos o relógio e os pinos de dados como pinos de SAÍDA e, em seguida, usando a função shiftOut, enviamos os dados para o registrador de deslocamento void setup () {pinMode (clock, OUTPUT); // torna o pino do relógio uma saída pinMode (dados, OUTPUT); // torna o pino de dados uma saída shiftOut (data, clock, LSBFIRST, B10101010); // envie este valor binário para o registrador de deslocamento} Na função shiftOut você pode ver seus argumentos dados são o pino de dados, relógio é o pino do relógio LSBFIRST refere-se a qual ordem está, ao escrevê-lo em notação binária (Bxxxxxxxx) no 7º elemento além do B é o bit menos significativo primeiro, este é alimentado primeiro, então termina na última saída, uma vez que todos os 8 bits são alimentados em B10101010 é o valor binário sendo enviado para o registrador de deslocamento, e ele acenderá todas as luzes ímpares, tente jogar com valores diferentes para ativar ou desativar padrões diferentes e, finalmente, um loop vazio vazio (porque você precisa de um, mesmo se não o estiver usando) loop void () {} // loop vazio por enquanto Exemplo 2: as primeiras 8 linhas são o mesmo que as primeiras 8 linhas do primeiro exemplo, na verdade elas não mudarão para nenhum dos outros projetos, então #define data 2 # define clock 3void setup () {pinMode (clock, OUTPUT); // torna o pino do relógio uma saída pinMode (dados, OUTPUT); // torna o pino de dados uma saída Mas agora na configuração vazia há um loop de 8 contagens, ele pega um byte vazio e muda 1 bit por vez começando do bit mais à esquerda e movendo para a direita. Este é o retrocesso do primeiro exemplo, onde começamos do bit mais à direita e trabalhamos à esquerda, mas usando MSBFIRST a função shift out envia os dados da maneira correta. Também adicionamos um atraso no loop for para que fique lento o suficiente para ficar visível. para (int i = 0; i <8; ++ i) // para 0 - 7 faça {shiftOut (data, clock, MSBFIRST, 1 << i); // troca de bit um valor lógico alto (1) por i delay (100); // atrase 100ms ou você não seria capaz de vê-lo}} void loop () {} // loop vazio por enquanto carregue o script e você deverá ver o gráfico de barras acender cada luz, uma de cada vez

Etapa 6: Projeto 2: Controlador de exibição de 7 segmentos '2 fios'

Projeto 2: Controlador de exibição de 7 segmentos '2 fios'
Projeto 2: Controlador de exibição de 7 segmentos '2 fios'
Projeto 2: Controlador de exibição de 7 segmentos '2 fios'
Projeto 2: Controlador de exibição de 7 segmentos '2 fios'

Olhe a pinagem do seu display de 7 segmentos (eu só tinha um dual, mas apenas usando a metade) e use o desenho abaixo para conectar cada segmento ao bit correto no shift registerbit 1 = pino 3bit 2 = pino 4bit 3 = pino 5bit 4 = pino 6bit 5 = pino 10bit 6 = pino 11bit 7 = pino 12bit 8 = pino 13 (se você quiser usar o ponto decimal) E o cátodo do display através do resistor 330ohm e para a fonte de alimentação aterrar agora abra o seven_seg_demo.pde No IDE do arduino, primeiro você vê onde definimos os dados e os pinos do relógio # define os dados 2 # define o relógio 3 Em seguida, definimos todos os padrões de caracteres em binário, isso é muito fácil, olhe para o desenho abaixo, se você precisa do segmento do meio digite um, a seguir você precisa do segmento superior, se for o caso digite outro, continue fazendo isso até cobrir todos os 8 segmentos, observe que meu bit mais à direita (bit 8) é sempre 0, isso porque eu nunca ligo o decimal apontar. byte zero = B01111110; byte um = B00000110; byte dois = B11011010; byte três = B11010110; byte quatro = B10100110; byte cinco = B11110100; byte seis = B11111100; byte sete = B01000110 = byte oito1101.91110; byte oito = B111110 B11; byte oito = B111110; em seguida, na configuração de void, definimos nossos pinos de dados e clock para saídas void setup () {pinMode (clock, OUTPUT); // torna o pino do relógio uma saída pinMode (dados, OUTPUT); // torna o pino de dados uma saída3} então no loop vazio usamos shiftOut para exibir cada padrão (número), espera 1/2 segundo e exibe o próximo, 0 a 9, já que está sendo feito na função de loop vazio, ele contará 0-9 e repita para sempre. void loop () {shiftOut (dados, relógio, LSBFIRST, zero); atraso (500); shiftOut (dados, relógio, LSBFIRST, um); atraso (500); shiftOut (dados, relógio, LSBFIRST, dois); atraso (500); shiftOut (dados, relógio, LSBFIRST, três); atraso (500); shiftOut (dados, relógio, LSBFIRST, quatro); atraso (500); shiftOut (dados, relógio, LSBFIRST, cinco); atraso (500); shiftOut (dados, relógio, LSBFIRST, seis); atraso (500); shiftOut (dados, relógio, LSBFIRST, sete); atraso (500); shiftOut (dados, relógio, LSBFIRST, oito); atraso (500); shiftOut (dados, relógio, LSBFIRST, nove); atraso (500);}

Etapa 7: Projeto 3 [pt 1]: Display Matrix Led 4x4 '2 Wire'

Projeto 3 [pt 1]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 1]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 1]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 1]: Display Matrix Led 4x4 '2 fios'

O projeto da matriz 4x4 LED é um pouco mais complexo, mas está quase todo em construção, escolhi fazer o meu soldado no perfboard, mas deve ser possível replicar em uma placa de ensaio, apenas com muito mais espaçamento. Os circuitos também difere no sentido de que o registro de deslocamento não está conduzindo diretamente os leds, em vez disso, as saídas do registrador de deslocamento são enviadas através de um resistor de 1Kohm para a base de um transistor NpN, quando a saída do bit é alta, ele permite que corrente e voltagem suficientes passem para o transistor para alternar a conexão entre o coletor e o emissor, os coletores são ligados a um "resistente" regulado de 5 volts. Os emissores dos transistores são conectados a resistores de 150 ohms e os resistores são ligados aos anodos de 4 led's em uma limita a linha a 20ma, embora ao desenhar imagens na tela apenas 1 led esteja ligado por vez e, portanto, com brilho quase total (quase porque eles ligam e desligam muito rápido para formar a imagem inteira). Existem 4 linhas e 4 colunas, cada fileira recebe um resistor e um transistor, em cada coluna os cátodos dos LEDs são amarrados, vão para o coletor de um transistor, cuja base também é controlada pelo registrador de deslocamento, e finalmente para o solo. Versão grande do esquema www.instructables.com/files/orig/F7J/52X0/G1ZGOSRQ/F7J52X0G1ZGOSRQ.jpg

Etapa 8: Projeto 3 [pt 2]: Display de matriz de LED 4x4 '2 fios'

Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'
Projeto 3 [pt 2]: Display Matrix Led 4x4 '2 fios'

O registro de deslocamento controla o ânodo e os cátodos dos LEDs em um formato YX, observe o seguinte bit 1 = coluna 1 (extrema direita) bit 2 = coluna 2bit 3 = coluna 3bit 4 = coluna 4bit 5 = linha 1 (superior) bit 6 = linha 2 bits 7 = linha 3 bits 8 = linha 4 Para fazer uma imagem desenhe um quadrado 4x4 em papel milimetrado e preencha aqueles que deseja exibir, em seguida faça uma tabela YX. Abaixo você verá um mapeamento para um símile, o melhor que se pode fazer em 4x4 "pixels" Para cada seção preenchida eu escrevo em qual coluna (Y) ela está, então em qual linha está (X) Agora abra o arquivo _4x4.pde no IDE do arduino você verá nossos velhos 2 amigos #define data 2 # define clock 3, em seguida, uma matriz de inteiros int img = {1, 1, 4, 1, 1, 3, 4, 3, 2, 4, 3, 4}; Se você olhar, é apenas uma lista das minhas coordenadas YX anotadas, seria uma grande dor de cabeça converter esses valores manualmente, e temos um computador … deixe fazer isso! Seguindo em frente, há uma configuração de vazio onde fazemos nosso relógio e pinos de dados OUTPUTS void setup () {pinMode (clock, OUTPUT); // torna o pino do relógio uma saída pinMode (dados, OUTPUT); // tornar o pino de dados uma saída3} E um loop vazio de aparência confusa, para iniciar as coisas precisamos declarar algumas variáveis locais void loop () {int Y; int X; byte out; Então, um loop for, este loop precisa ser tão longo quanto a quantidade de entradas no array img, para esta imagem eu usei apenas 6 pixels, então isso dá 12 coordenadas YX. Eu faço com que ele ignore todos os outros números usando i + = 2, porque lemos 2 coordenadas por loop para (int i = 0; i <12; i + = 2) // número de pontos na matriz img, neste caso 12 {Agora lemos o entery Y em na matriz e subtraímos um de seu valor, porque os bytes não começam em um, eles começam em zero, mas contamos a partir de 1 // obtemos o primeiro par de cabos YX Y = (img - 1); // subtrai um, pois a contagem de bits começa em 0 Em seguida, lemos a entrada X em [i + 1] na matriz e subtraímos um de seu valor, pela mesma razão X = (img [i + 1] - 1); Depois de termos os valores YX do pixel, fazemos alguns bits ou matemática e mudamos para a esquerda. Primeiro, precisamos ler o valor X e, qualquer que seja o seu valor, deslocamos esse número + 4 para a esquerda, portanto, se X for 4 e adicionar 4 é o bit 8 (MSB), olhando para o gráfico novamente … bit 1 = coluna 1 (extrema direita) bit 2 = coluna 2bit 3 = coluna 3bit 4 = coluna 4bit 5 = linha 1 (superior) bit 6 = linha 2bit 7 = linha 3bit 8 = linha 4Bit 8 é a última linha Em seguida, o valor Y também é deslocado para a esquerda, desta vez sozinho, nada adicionado. Por fim, os dois são or'ed juntos em 1 byte em vez de 2 meio bytes (nibbles), usando bit a bit ou (o símbolo |) leva dois bytes e basicamente os soma, vamos supor que X = 10000000Y = 00000001 -------------------- OR = 10000001linha 4 coluna 1 out = 1 << (X + 4) | 1 << Y; E, finalmente, mude para exibir a imagem atual e continue fazendo isso até que não tenhamos mais dados na matriz … atrase um momento e faça um loop para sempre, já que estávamos deslocando os dados para a esquerda e precisamos que o MSB esteja no último pino de saída do registrador de deslocamento, envie-o primeiro. shiftOut (dados, relógio, MSBFIRST, saída); // desloca o byte para nosso registro delay (1); // atrase um pouco para que tenha uma chance de deixar um ponto de luz em seus olhos Sinta-se à vontade para fazer suas próprias imagens e efeitos. Existem 3 arquivos de amostra, o rosto sorridente e um tabuleiro de xadrez (que parece mais com listras), e finalmente um fabricante de brilhos aleatório

Etapa 9: Conclusão

Conclusão
Conclusão
Conclusão
Conclusão
Conclusão
Conclusão

Acima de tudo isso é um pequeno chip muito útil, e estou feliz por tê-lo jogado fora de um velho aparelho eletrônico que foi para o lixo. Ele pode ser usado para outras coisas além de sistemas de exibição, mas todo mundo gosta de luzes e o feedback instantâneo de ver o que está acontecendo é extremamente útil para pensadores visuais como eu. Também perdoe meu código, eu só tenho o arduino desde a terceira semana de outubro, e tem sido um curso intensivo. Mas essa é a grande coisa sobre o sistema, se você sentar e trabalhar com ele, está cheio de recursos interessantes que tornam o controle do mundo com um microcontrolador de 8 bits muito fácil de fazer. Como sempre, perguntas e comentários são bem-vindos, e obrigado por lendo, espero que você tenha aprendido muito

Recomendado: