Presente de Beloved para 14 de fevereiro de um engenheiro eletrônico
Saudações leitor GT. Para mim, como uma pessoa técnica e não muito romântica, escolher um presente para qualquer ocasião é uma dor incrível. Tudo seria simples se minha amada pudesse dar a RAM a um laptop ou a um slide de processadores, mas ela nunca foi uma técnica.Mas desde que: um presente não é tão caro quanto a atenção é cara (s) - tentaremos investir em tempo. Apresento a sua atenção "Coração v1.0"
A ideia básica do dispositivo foi inventada coletivamente com minha equipe para a "Árvore de Natal v1.0". Resumidamente, um conjunto de funções:- parabéns gravados no coração- energia do carregador do telefone (conector microUSB)- luz de fundo RGB com a capacidade de gravar perfis intermitentes que podem ser alternados por um botão- modo de luz noturna- memória interna para gravar saudações. Quando conectado a um PC, é definido como uma unidade flash.Depois de discutir / regozijar-se com a funcionalidade inerente, decidimos fazê-lo - ninguém suspeitou de quanto tempo o coração exigiria ...Ferro
Como se viu - a parte mais simples do coração. O primeiro passo foi elaborar um diagrama estrutural do dispositivo: os
detalhes foram retirados daqueles que estavam em nosso armazém e também foram usados mais de uma vez nos dispositivos. De acordo com o esquema, podemos dizer: o MK mais barato com USB a bordo do STM32F042F6P6, um simples LDO - XC6206P332MR, memória SPI de 32Mbps W25Q32FVSSIG (2 peças foram colocadas na placa, mas eventualmente elas soldaram uma), LED WS2812 controlado por RGB28.Diagrama esquemático: O
mínimo de detalhes e o erro de cálculo mais importante é a esperança de que o WS2812 funcione normalmente a partir do nível 3,3V (Slavik! Sim, eu fiz isso centenas de vezes ... muitos disseram).A placa era feita com a largura mínima, para escondê-la o máximo possível sob a borda do coração. A cor é branca O resultado obtido na figura.
Feil
Lembre-se, mencionei a esperança tímida de que o WS2812 funcione a partir de 3.3V? Portanto, não será !!! Mais precisamente, tudo parecia funcionar antes do início da troca via USB. Ao mesmo tempo, o canal Blue começou a falhar. Pesquisamos um problema no software por um longo tempo, pensando que não havia recursos suficientes no processador, mas puxamos a perna do PB1 para 5V através de um resistor de 1kΩ e tudo funcionou claramente. Ao mesmo tempo, o nível de log.1 tornou-se aproximadamente 4,3V. Entendo que isso não é bom, mas não houve escolha. O conselho acabou sendo uma "fazenda coletiva" bastante elegante:
Soft MK
Para facilitar a programação MK, foi decidido usar a Biblioteca STM HAL, já que quase tudo já está lá, você só precisa adicionar lógica e conectar todos os seus módulos. Em parte, o STM32CubeMX nos ajudou com isso - a geração da maior parte do código pode ser atribuída a ele. No entanto, aqui todos decidem por si mesmos - o código gerado ainda precisará ser substancialmente corrigido e o tamanho do firmware terá que ser pago - a biblioteca HAL não é compacta.No entanto, 32kb estão disponíveis em nosso microcontrolador, o firmware levará um pouco mais da metade, portanto é lógico armazenar nas demais seqüências de memória de três bytes (RGB), que são transmitidas à entrada de LED. Pressionar o botão percorrerá as seqüências gravadas no flash MK.Aqui estamos diante do primeiro problema: o LED WS2812 é muito exigente quanto ao período e duração dos pulsos, enquanto o tempo de pulso (0,4-0,8 μs) é pequeno o suficiente para um processador operando a 48 MHz. Além disso, devemos levar em consideração que, além de controlar o LED, nosso microcircuito também precisará atender à comunicação com um PC via USB e memória flash de leitura / gravação.Felizmente, esse diodo é bastante popular e vários métodos para implementar seu protocolo são descritos na Internet, inclusive nos microcontroladores STM. Talvez tenhamos escolhido um dos mais difíceis em termos de implementação, mas também ao mesmo tempo os mais eficazes em termos de tempo de CPU - DMA + timer. O DMA grava diretamente na porta GPIO, o timer controla os canais do DMA. Como o DMA grava na porta inteira de uma vez, não funcionará para usar outros pinos da porta como saída. É por isso que o pino PB1 foi selecionado para controlar o LED. Ideologicamente, tudo é simples, mas eu precisaria mexer na implementação se não fosse a maravilhosa biblioteca que Martin Hubáček escreveu e postou no github. Após um pouco de acabamento no nosso MK e no método selecionado de armazenamento de sequências RGB, obtemos um LED em funcionamento.Memória flash
Imagine dar-lhe um coração com um parabéns pessoal. Você vem, alegre, em casa, conecta-o ao computador e, em vez de "Amor!", Fornece "O driver de dispositivo necessário não foi encontrado" ou algo parecido. Não é bomPortanto, o coração deve ser reconhecido como uma unidade flash em qualquer sistema operacional comum, sem exigir a instalação de drivers. Portanto, usaremos a classe usb chamada "Dispositivo de armazenamento em massa", pois a Biblioteca de dispositivos USB do STM32 nos fornece uma solução pronta para uso. Pare com isso! Pronto ???? Agora vamos ver.Criamos um projeto no STM32CubeMX, combinamos os métodos de leitura / gravação para memória flash spi com as chamadas correspondentes no módulo de armazenamento em massa usb e encontramos dois problemas ao mesmo tempo: a unidade flash USB não deseja ser removida com segurança e "engasga" ao tentar escrever algo mais do que "Olá Mundo ”no arquivo README.txt.O primeiro problema é fácil de resolver - você precisa implementar o processamento SCSI ausente do comando StartStopUnit. O segundo é mais difícil de resolver. O tamanho do bloco do sistema de arquivos (naturalmente, com apenas 8 MB de espaço, usaremos o Fat16) é de 512 bytes. A memória só pode ser apagada em blocos de 4k. Teremos que reservar um dos blocos para armazenamento temporário (não podemos permitir 4kb de RAM com os 6kb disponíveis). Ou seja, para escrever 512 bytes, é necessário copiar 4kb, apagar 4kb e copiá-los novamente. Além disso, se o arquivo for grande o suficiente, o sistema operacional deseja gravar na unidade de 64kB de cada vez, e nosso controlador não pode lidar com uma quantidade tão grande de dados no momento certo, uma vez que a unidade flash usada também não é a mais rápida. Em geralenquanto o controlador grava lentamente 256 bytes de dados por vez (o tamanho da página de memória), o sistema operacional (pelo menos o Fedora, no qual tudo isso foi testado) já consegue decidir que a unidade morreu com coragem.Os especialistas provavelmente indicarão uma solução mais elegante para o problema, mas "iremos para o outro lado". A memória flash será lida através da interface do dispositivo de armazenamento em massa e, neste modo, se posicionará como Somente Leitura (ao mesmo tempo, o coração pode ser facilmente "retirado" do computador sem nenhuma "extração segura", mas com medo de estragar o sistema de arquivos), vamos anotá-la via porta virtual (também conhecida como classe de dispositivo de comunicação). Através da mesma interface, escreveremos nossas seqüências RGB no final da memória MK.O modo de inicialização (armazenamento em massa ou cdc) será selecionado durante o carregamento pressionando o botão (ou não).Assim que foi dito (como sempre, a maior parte do tempo e café foram gastos nessas duas palavras). Retornamos a leitura e gravação para a interface MSC, porque foi descoberto que, no modo somente leitura, os macOs se recusam a reconhecer a unidade flash USB - isso não importa, enganamos o sistema operacional e devolvemos o "sucesso" a qualquer solicitação de gravação sem fazer nada (novamente, uma solução da categoria de "embora não seja elegante, mas barata e alegre"). O ponto é pequeno - software para o PC.PC macio
Como foi decidido configurar e fazer o flash através da interface cdc, você simplesmente não pode arrastar e soltar arquivos com o mouse e precisa de um aplicativo especial capaz de fazer isso. Sua principal tarefa: fornecer ao usuário a oportunidade de criar uma imagem de disco, fazer upload de arquivos do usuário e gravar essa imagem na memória flash. O aplicativo também deve fornecer uma interface para criar / ler / gravar sequências RGB.O aplicativo deve ser multiplataforma, e aqui a biblioteca Qt para criar uma interface gráfica e o ChaN FatFS para criar e gerenciar uma imagem de disco vêm em nosso auxílio. A troca de dados com o dispositivo através da porta com está disponível no Qt das versões mais recentes “prontas para uso” (módulo QSerialPort). Para operações de imagem de disco, usamos o QTreeView com um modelo de item herdado de QabstractItemModel, no qual as operações de arrastar e soltar são implementadas adicionalmente (arrastar e soltar, o que você quiser) com um mouse ”é conveniente e familiar quando se trata de arquivos / pastas). Para criar sequências RGB, você pode usar QListWidget (para exibir a sequência de cores), a biblioteca QtColorWidgets (de Mattia Basaglia) para escolher cores e a classe QEasingCurve incorporada ao Qt para transições suaves (ou vice-versa espasmódicas) entre cores e criando um efeito arco-íris.Resultado: o aplicativo possui duas guias:1) “Armazenamento” para arquivos
2) “LED” para gerenciar sequências RGB Caixa de
diálogo para criar sequências RGB: A
caixa de diálogo funciona em três modos:a) RGB - permite especificar transições entre duas cores especificadas na notação RGB.b) HSV - a mesma coisa, mas na notação HSV - o estouro é mais familiar ao olho humano, em particular, o modo "HSV" + "Iterate-> HUE" permite criar arco-íris.c) Personalizado - este modo permite definir cada cor da sequência manualmente. É impossível criar sequências grandes como essa, mas é muito conveniente colocar seu coração por um tempo (definindo a cor para "preto").E, finalmente, a definição do nosso dispositivo como uma unidade flash no Windows / macOs / Linux (Gnome):


Conclusão
E depois de todo o trabalho realizado e do texto escrito, descobri que não havia tirado uma única foto normal do coração. Portanto, estou anexando a opção "como aconteceu":
na realidade, parece ótimo (especialmente com gravura). Ame seus entes queridos !!! Source: https://habr.com/ru/post/pt401013/
All Articles