Muitas pessoas fumam muito, especialmente quando são viciadas em alguma coisa e não percebem como fumam um cigarro após o outro. A caixa preta do fumante (CJK) não permite que você pegue o próximo cigarro até que um certo período de tempo tenha passado. Neste artigo, prestarei atenção a alguns detalhes que podem ser úteis para outros desenvolvimentos, especialmente o não tão famoso controlador LC Teensy (família Arduino).
A mecânicaOs detalhes do ChYAK são impressos em uma impressora 3D e após a montagem das partes inferior, média e superior são coladas.
O mecanismo de travamento é eletromecânico, enquanto as funções básicas de travamento são realizadas puramente mecanicamente, isso dificulta a quebra do NJC manipulando as folgas e removendo as baterias.
O sistema de travamento consiste em um rack com dentes e uma catraca biestável, que permite que a bandeja se mova apenas na direção de fechamento. Ao atingir um período de tempo predeterminado, o servo faz um único movimento para frente e para trás e empurra a catraca, que é definida no segundo estado estável "aberto". O CFC permanece aberto até que o usuário puxe a bandeja mecanicamente. Quando estendida, a bandeja empurra a catraca e a coloca no estado de armação novamente.
O carregador é feito na forma de um tambor com 4 recessos para cigarros. Para evitar tentar enfiar um cigarro no carregador, o mecanismo da catraca não permite o movimento na direção oposta, do lado em que os pára-choques são feitos.
Os slots foram feitos na tampa superior, permitindo eliminar possíveis distorções de cigarros dentro da caixa e sacudir as lascas de tabaco.
InterfacePara controlar o tempo, o número de cigarros em CHYAK e o número de cigarros retirados, o monitor OLED é monitorado. Ele é desligado quase o tempo todo para não descarregar a bateria e é ligado apenas por um sinal do sensor capacitivo central, que é acionado quando uma mão é levada ao CHYAK ou um sinal do botão ao carregar cigarros. Outro botão captura o momento em que a bandeja é fechada e inicia o próximo ciclo de atraso. Dois sensores capacitivos adicionais estão localizados na parede traseira e são usados para ajustar os contadores de cigarros (necessários, por exemplo, ao trocar as baterias).
EletrônicosO microcontrolador é um LC Teensy. Este dispositivo do tipo arduin, compatível com a maioria das bibliotecas do Arduino, foi escolhido porque suporta sensores capacitivos (TSI). Os sensores são tão sensíveis que sentem facilmente a mão levantada a uma distância de um centímetro. O Teensy LC possui o chamado modo LLWU; nesse modo, todos os módulos estão no modo de suspensão, com exceção do oscilador de 1 kHz. Você pode sair desse modo de suspensão de 4 maneiras: a) interrompa o sensor capacitivo, b) interrompa o pino, c) transborde o contador de 1 kHz (timer de baixa potência, LPTMR); d) interrompa o alarme.
Aqui o autor estava com problemas: nos planos iniciais, era usado o TSI para acordar quando uma mão era apresentada, e o LPTMR para interrupções periódicas para ajustar os níveis do TSI (dependendo das condições ambientais) e o controle do tempo. Porém, o LPTMR é usado para o funcionamento da ETI e, portanto, não pode ser usado como contador de tempo. (A interrupção de transbordamento LPTMR é acionada por hardware para TSI e, é claro, deve ser rápida para monitorar o sensor. Geralmente esse contador é predefinido para menos um, para que o TSI seja pesquisado com a frequência mais alta possível de 1 kHz).
Outra possibilidade seria usar a interrupção de alarme do RTC, mas o fato é que o Tenncy LC não possui um relógio de tempo real (RTC). Em vez disso, o RTC está no próprio processador, mas não há fiação para o quartzo RTC na placa. No entanto, o desenvolvedor do processador deixou algumas brechas para questionar as mentes. O oscilador de 1kHz (que opera no modo de suspensão) pode ser usado como fonte para os registros RTC do controlador. Acontece que o RTC pode contar não segundos intervalos (como quando se usa quartzo a 32 kHz), mas 32 segundos se estiver usando um oscilador de 1 kHz. Essa precisão, é claro, não é suficiente. Mas há uma saída.
Veja como funciona:
Há um registro de pré-escalador de tempo RTC (RTC_TPR). Este registro de 16 bits conta os pulsos do oscilador. Quando transborda, o RTC Time Seconds Register (RTC_TSR) aumenta em um. No modo clássico, esses são os segundos que são comparados com o Registro de Alarme de Hora RTC (RTC_TAR) e, quando coincidem, é gerada uma interrupção de alarme. Ao usar quartzo normal de 32kHz, o RTC_TSR não é pré-instalado, mas é contado a partir de zero todas as vezes (32768 a estouro (segundos)). Mas se pré-instalarmos o RTC_TSR a cada vez, levando em consideração que temos um oscilador lento de 1kHz, podemos interromper um alarme com precisão de milissegundos (sem levar em conta a imprecisão do próprio oscilador). Obviamente, RTC_TAR também deve ser recalculado de acordo.

Por exemplo, se quisermos definir o período para 87 segundos, devemos escrever 2 em RTC_TSR (2 * 32768 = 65536ms = 65.536s), 2 em RTC_TAR e 32768- (87 * 1000-65536) = 11304 em RTC_TSR. Então 32.768-11.304 = 21.464 segundos passarão antes do primeiro estouro de RTC_TPR, e dois ciclos completos 2 * 32.768 = 65.536 serão adicionados a eles, que serão apenas 21.464 + 65.536 = 87 segundos
Em geral, assim:
void setAlarm(uint32_t seconds ) { RTC_SR = 0;
E até podemos monitorar o tempo total (até um erro de 1kHz do oscilador), por exemplo, se no início do programa todos os registros do RTC eram zero:
timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000
A precisão do oscilador de 1kHz é pequena, mas para nossos propósitos será suficiente. Observe que, ao iniciar um novo alarme, modificamos os registros RTC, portanto, se você precisar monitorar o tempo, eles devem ser lembrados antes do alarme iniciar e, após sair da interrupção do alarme, eles serão recalculados novamente, levando em consideração o tempo gasto na hibernação. Eu a descrevi em detalhes aqui:
sobre o RTC para Teency LCNo CJC, uma interrupção a cada 10 minutos mede e armazena o nível do sinal dos sensores capacitivos na ausência de uma mão. Isso é feito para poder rastrear com segurança as alterações nos sinais à medida que elas se aproximam. Com o fundo em ~ 500 unidades, usamos um nível excedente de ~ 20 unidades, possibilitando sentir a mão a uma distância de 5 a 10 mm. O nível de fundo depende da temperatura e umidade, portanto, para confiabilidade, ele deve ser ajustado periodicamente. Acredito que isso seja uma falha nos desenvolvedores de processadores. Por que eles não deram a oportunidade de ativar o TSI e algum outro contador de baixa potência ao mesmo tempo (basta adicionar mais um registro), já que o ajuste periódico dos níveis do TSI é quase obrigatório, mesmo que você não precise de um temporizador para outros fins!
Agora sobre a energia consumida. No modo de espera LLWU, o Teensy LC consome cerca de 15 uA quando não há kit corporal. Tivemos que conectar outro monitor OLED e um servo. Ambos os dispositivos possuem grandes correntes de fuga mesmo em estado passivo.
Tudo é simples com o OLED, este é o monitor OLED Adafruit de 0,96 ”, monocromático de 128x64, é alimentado por 3,3V, consome corrente de cerca de 20 mA quando está ligado (dependendo do número de pixels envolvidos) e é controlado pela SPI. Ou seja, basta conectar sua entrada de energia à saída de 20 miliamperes do Teensy LC (a Teency tem diferentes tipos de saídas) e pronto. Quando todo mundo dorme, essa saída é simplesmente transferida para o terceiro estado e a corrente não passa pelo visor. Com a ativação, a saída é transferida para o estado alto de saída e se torna Vcc para o visor.
Servo é um pouco mais complicado. Servo no modo de espera consome uma corrente de cerca de 2 mA, o que, é claro, não é aceitável. Portanto, você deve desativá-lo completamente enquanto dorme. Diferentemente do Arduin clássico, o Teensy LC tem uma seleção bastante pequena de fontes de alimentação: 1,7-3,3 V conectadas diretamente ou 2,6-5,5 V (com o regulador de tensão interno ativado). Servos geralmente acessíveis funcionam a partir de pelo menos 1S Lipo, e isso é de 3,3 a 4,2 V. Portanto, precisamos ligar três baterias padrão em série para ter de 3,3 (descarga) a 4,6 V (novo). Para a maioria dos servos, 3,3 V está no limite de operação, portanto, diretamente as saídas Teensy não podem ser usadas (como no OLED). Sim, e a corrente durante a rotação é de cerca de 50 mA, o que é um pouco demais para o Teensy LC. Portanto, o servo é ativado via MOSFET:

Com essa ativação, pode parecer que não é seguro, pois quando o MOSFET é desligado, a tensão na entrada PWM ctrl excede 3,3 V e as entradas Tennsy LC não são tolerantes a 5V (ao contrário do Arduin clássico). Mas você não deve ter medo disso, lembrando que a atual PWM ctrl é muito pequena e não há necessidade de ter medo do diodo limitador na entrada do processador (a razão da inadmissibilidade de exceder Vcc + 0,5 está nesse diodo), além disso, em correntes comparáveis às correntes do diodo fechado ele nem estará no estado aberto.
no CHYAK, uso o HK282 com um limite de 3,3V (só porque eu o tinha). Algum tipo de servo de baixa voltagem e baixa potência pode ser alimentado diretamente das saídas Teensy, de acordo com o esquema usado para o OLED.
Como resultado, a corrente no modo de suspensão acabou por ser de cerca de 50 uA, provavelmente foi possível reduzi-la ainda mais, mas eu decidi que isso era suficiente (se apenas adormecida, as baterias deveriam durar mais de 4 anos: 2000mAh / 0,05mA).
TécnicoImpresso em uma impressora Monoprice Ultimate 3D, plástico PLA, bico de 0,4 mm, camada de 0,2 mm. Para detalhes do mecanismo de travamento, uma camada de 0,1 mm para precisão. As molas também são impressas em uma impressora 3D. Digitando por um longo tempo. Por exemplo, a maior parte do meio (possui muitas partes internas e paredes duplas para eletrônicos e fios) foi impressa por 20 horas. Ele foi colado com cola de ciano-acrilato. Se algo quebrar, é impossível distinguir (proteção contra maníacos-fumantes), você precisará quebrá-lo como um cofrinho e imprimir novamente (um argumento a favor das impressoras 3D). Desenhos e animações são feitos no SolidWorks, o ambiente de desenvolvimento AtmelStudio (sim, o AVR (teency) é suportado imediatamente, como o Arduino, através do VisualMicro).