Nunca há pinos GPIO suficientes em um microprocessador

Colocado sobre

De alguma forma, não importa qual microprocessador eu escolha, fico sem pinos GPIO para as necessidades do projeto ou para o que quero fazer.


Então, para um projeto recente, mudei do ESP8266 para o ESP32, que tem muito mais pinos GPIO do que seu antecessor ... mas ainda não o suficiente para o projeto em que estou trabalhando.

Para acabar com essa corrida para pinos GPIO de uma vez por todas, decidi que precisava de uma placa de expansão barata que pudesse ser configurada para switches (entrada) e LEDs ou outras coisas (saída). E enquanto eu estava nisso, pensei que alguma lógica extra seria legal.

Então, o que eu criei é uma placa I2C com oito pinos GPIO que são livremente configuráveis para entrada ou saída (eu chamo os pinos GPIO de "Slots").

A placa de expansão é ideal para uso em breadboard sem solda. O esquema pode ser posteriormente incorporado ao projeto geral de hardware.

ADW0720 Tipo 2 ADW0720 Tipo 2

Um slot configurado para entrada provavelmente será usado para interruptores e seria ótimo se pudéssemos distinguir entre pressionar o botão e liberá-lo (liberação rápida, liberação intermediária e liberação longa). No código do processador principal, você pode apenas dizer:

Os slots configurados para saída tornam-se um tipo de slot "atirar e esquecer". Ou seja, você pode definir o Slot como HIGH ou LOW como na função digitalWrite() no IDE Arduino . Mas você também pode dizer: vai para ALTO por 2500 ms e depois vai para BAIXO novamente. Em seu programa principal, você não precisa escrever o código para esperar 2500 ms e, em seguida, tornar o pino GPIO LOW.

Você também pode dizer ao bloqueio para piscar com um horário de ativação e desativação e, se desejar, uma duração. Por exemplo:

O bloqueio pisca a 500ms ligado, 1000ms desligado por um período de 10 segundos (10000ms) e então para de piscar.

Semelhante ao exemplo acima, mas agora o Lock piscará para sempre (ou até que você diga para fazer outra coisa);

O hardware é projetado em torno de um microcontrolador ATtiny841. A comunicação é feita através do barramento I2C (dois fios, SCL e SDA).
Você pode executar as placas em 5Volt ou 3,3Volt dependendo de suas necessidades (principalmente a voltagem que o processador principal usa), mas você não pode conectar sistemas de 5Volt e 3,3Volt juntos sem alguma lógica extra (deslocadores de nível para as linhas SDA e SCL) .

ADW0720 ATtiny841 ADW0720 ATtiny841

Para controlar as placas ADW0720 desenvolvi uma biblioteca com funções simples.
Todo dispositivo I2C possui um endereço na faixa de 1 a 127 (decimal). O endereço padrão das placas ADW0720 é 0x18 (24 decimais), mas você pode alterar para o que quiser com o seguinte código:

A segunda linha armazena isso novo endereço em EEPROM e a partir daí é novo endereço o endereço para este módulo.

Ao atribuir a cada placa ADW0720 um endereço exclusivo, você pode controlar várias placas ADW0720 usando apenas as duas linhas I2C!

Desenhei dois tipos de placas ADW0720 prontas para uso. A placa Tipo 1 possui 4 interruptores táteis e 4 LEDs, a placa Tipo 2 possui 8 LEDs, mas nenhum interruptor.

ADW0720 Tipo 1 (4 LEDs, 4 interruptores) ADW0720 Tipo 1 (4 LEDs, 4 interruptores)
ADW0720 Tipo-2 (8 LEDs, sem interruptores) ADW0720 Tipo-2 (8 LEDs, sem interruptores)


Em vez dos LEDs, também é possível acionar um MOSFET de canal N (como o 2N7000 ou 2N7002) como um interruptor para acionar cargas maiores, como campainhas, relés ou motores.

Você pode encontrar a biblioteca e o código do escravo ATtiny841-I2C em github. Lá você também encontrará a documentação da biblioteca.

A biblioteca vem com dois esboços de exemplo. O primeiro é mostrar o que as placas ADW0720 podem fazer (show-of) e o segundo exemplo (I2C_ADW0720_Configurator) mostra o uso mais avançado.

Com o segundo exemplo, você pode, por exemplo, definir a função (entrada ou saída) dos Slots e pode definir o endereço I2C do ADW0720 para que não precise fazer isso em seu programa principal.

Esquema da placa ADW0720 Tipo-1 Esquema da placa ADW0720 Tipo-1
ADW0720 placa Tipo-2 ADW0720 placa Tipo-2
Funções auxiliares da biblioteca Funções auxiliares da biblioteca
postado por Local na rede Internet Willem Aandewiel (1955) tem formação em eletrônica e técnicas digitais. No entanto, na maior parte de sua vida profissional, ele trabalhou em automação, onde trabalhou em praticamente todas as disciplinas, de programador a líder de projeto e gerente de projeto. Willem foi um dos primeiros holandeses com um microcomputador (KIM-1, 1976) numa época em que o PC ainda não havia sido inventado. Actualmente dedica-se principalmente à concepção e produção de pequenos circuitos electrónicos com microprocessadores. Sua 'missão na vida' é fazer as pessoas se entusiasmarem em fazer seus próprios circuitos eletrônicos, microcomputadores e programação.

Comentários

The Netherlands Edwin vd Oetelaar
Olá, Sr. Willem, Aplicar um expansor de E/S MCP23017 de 16 bits com geração de interrupção não seria mais conveniente nos projetos do que fazer você mesmo um processador de E/S separado? Estou perguntando isso porque também estou observando pássaros. Pretendo equipar um módulo ESP32-S com uma série de interfaces de termopares - um par de ADCs 0-10V - e uma linha de entradas/saídas lógicas para fazer um projeto referente ao controle de bombas de calor (e também entender o comportamento). é ajudar este clube https://www.adelaar-innovatie.nl/over-ons. Espero em 2 pensamentos, um ESP32 com tudo via barramento I2C ou um AVR separado (por exemplo, um atmega2560) que lide com todos os IO (e possivelmente comportamento em tempo real) e com o qual deixo o ESP32 falar por meio de um protocolo serial. Por favor, seus insights. Atenciosamente, Edwin van den Oetelaar
Colocado sobre 
Willem
Olá Edwin, Esse expansor de E/S também é adequado, mas não oferece opções extras, como lidar com pressionamentos de botão curtos, médios e longos ou LEDs piscando sem a intervenção de seu próprio código ou após um tempo especificado desligar um LED de novo. Veja: https://willem.aandewiel.nl/index.php/2020/08/10/extending-gpio-pins-on-your-micro-processor/
Colocado sobre 
Edwin
Olá Sr. Willem, obrigado por seus comentários sobre este tópico. Cheguei à mesma conclusão, ambas as opções são viáveis. No entanto, há uma coisa que me preocupa ao usar um processador IO controlado por firmware. Esse é o fato de que o firmware pode apresentar problemas (bugs ou outros). Ao atualizar o firmware principal do ESP32, gostaria também de atualizar e remover bugs em todo o sistema. Você já atualizou de outra CPU mestre o firmware de um MCU AVR que já estava em circuito e implantado? Uma abordagem alternativa que estou considerando é usar um FPGA para processamento de IO. O firmware (imagem) do FPGA é fornecido pelo processador principal na inicialização do sistema. Dessa forma, o firmware de todo o sistema pode ser atualizado enquanto o sistema está em campo, sem intervenção humana. Seus pensamentos e rica experiência são muito bem-vindos. Atenciosamente, Edwin
Colocado sobre 
Webwinkelkeur Kiyoh Trustpilot Opencircuit