Вы находитесь на странице: 1из 98

Cronógrafo de paintball / balística

Crie um cronógrafo de paintball de baixo custo por menos de US $ 40!

Um cronógrafo balístico é um dispositivo que registra a velocidade de um projétil. Este cronógrafo em particular que
fiz foi testado apenas com uma pistola de paintball e é relativamente simples de fazer. Também implementei uma
função que pode registrar a taxa de incêndio na qual um dispositivo está disparando.

Nota:
Como você usará um dispositivo que dispara projéteis em alta velocidade para testar este cronógrafo, use sua
cabeça e seja esperto. Siga todos os procedimentos e diretrizes de segurança relacionados ao uso do marcador de
paintball ou outro dispositivo que você esteja usando para disparar projéteis.

Embora este cronógrafo seja bastante fácil de construir, é essencial um conhecimento básico de eletrônica e
habilidades de solda. O maior problema que tive com este projeto foi fabricar o PCB. Uso o método de transferência
de toner, mas isso não produz placas muito agradáveis quando a impressora a jato de laser precisa de um novo
cartucho. A prancha em si tem alguns pontos que estão sem caroço e não parecem muito limpos, mas faz o
trabalho. Se você não é capaz de fabricar seus próprios PCBs, pode-se usar apenas uma placa de perfurar e apontar
para apontar tudo junto.

Aqui está uma lista dos seguintes componentes eletrônicos necessários:

- 2x capacitores eletrolíticos de 47µf - 2x capacitores de


0,1µf 0805 SMD
- 1x capacitor de 0,01µf 0805 SMD
- 1x capacitor de 0,01µf SMD - 1x capacitor de 0,01µf de cerâmica
- 2x capacitores 27pf 0805 SMD
- 2x 10kΩ 0805 SMD resistores
- 2x 2,4kΩ 0805 SMD resistores
- 2x 470Ω 0805 SMD resistores
- 1x 150Ω 0805 SMD resistor
- 2x 100Ω 0805 SMD resistores
- 2x 100Ω 0805 SMD resistores - 1x 4,7kΩ potenciômetro de guarnição
- 1x 1N4148 diodo
- 1x 1N4148 diodo - 1x regulador LM7805 5v
- 2x TSOP4838 IR Detectores
- 2x transmissores de infravermelho
- 2x conectores Molex de 2 pinos fêmea - 2x conectores Molex de 2 pinos
macho
- 1x cabeçalho de 5 pinos
- 1x transistor de uso geral MMMBT2222A
- 1x transistor de uso geral MMMBT2222A - 1x 12MHz Crystal
- 1x comutador tátil
- 1x comutador
oscilante - 1x microcontrolador SOIC PIC18F13K50
- 1x display LCD 16x2
- 1x clipe de bateria de 9v

A maioria desses componentes já tinha em mãos, mas estimaria o custo desse projeto em torno de US $ 30 a US $
40. Não mostrei nenhum dos componentes SMD (exceto o PIC) na foto abaixo.

Edit:
Eu fui e postei telas de impressão de alguns lugares onde você pode comprar os componentes. Alguns componentes
não puderam ser comprados como 1 ou eram mais baratos em quantidades maiores, é por isso que você pode ver
algumas peças extras nas fotos. Muitas peças podem ser compradas a um bom preço
em www.dipmicro.com. Marcarei o custo de cada produto nas fotos abaixo. Com todas essas partes, sem incluir a
placa, chegou a US $ 38,11 para comprar todos os componentes deste cronógrafo com todos os envios incluídos,
exceto o PIC18F13K50 comprado na Digikey. Então, seriam mais alguns dólares pelo tubo de PVC. Além disso, se
você quiser economizar US $ 3,39, poderá comprar displays LCD 16x2 no eBay por US $ 2,99, incluindo frete.

Etapa 3: como funciona

Agora que eliminamos todos os requisitos e a configuração, podemos seguir em frente e finalmente chegar ao que
interessa. A operação deste cronógrafo é bastante simples, existem dois transmissores de infravermelho e dois
detectores de infravermelho, cada par de transmissor / detector é colocado exatamente a quatro polegadas de
distância.

Quando um objeto quebra o primeiro feixe, o microcontrolador inicia um timer (Timer1). Esse cronômetro
continuará funcionando até que o objeto quebre o segundo feixe ou o cronômetro cause uma interrupção (no
65.536 ° ciclo de instruções). Se o objeto interromper o segundo feixe antes que o cronômetro cause uma
interrupção, ele interromperá o cronômetro e lerá o valor de 16 bits nos registradores TMR1H e TMR1L. Podemos
então calcular a quantidade de tempo que o projétil levou para percorrer o comprimento entre as vigas de
infravermelho, que estão a 10 cm de distância, e descobrir a velocidade do projétil.

Se o objeto estiver muito lento ou se o projétil quebrar o feixe nº 1, mas não o feixe nº 2, o cronógrafo exibirá uma
mensagem de erro no visor LCD. Como este é um tubo de 1 "de diâmetro e uma bola de paintball é de 0,68", nunca
tive uma bola de paintball que não conseguiu quebrar a viga nº 2. No entanto, se uma bola de paintball estourar no
barril, você poderá obter alguns dados imprecisos e provavelmente terá que limpar a tinta que teria respingado no
cronógrafo para garantir uma boa "conexão" do transmissor ao detector.

Etapa 4: cálculos
Agora vamos dar uma olhada em quais cálculos são necessários para obter a velocidade real do projétil.
O PIC18F13K50 está configurado para funcionar em 48MHz. São necessários 4 ciclos para executar um ciclo de
instrução, para que o MCU esteja funcionando a 12 MIPS (milhões de instruções por segundo). Portanto, o tempo
que leva para o PIC executar um ciclo de instrução é igual a (1/12MIPS), ou seja, 83,3333 nanossegundos / instrução.

Sabemos que a distância entre os "feixes" de IV é exatamente 4 polegadas. Então, tudo o que precisamos agora é
saber quanto tempo o projétil levou da viga nº 1 à viga nº 2. É para isso que o Timer1 é usado. A cada ciclo de
instrução (83.3333 ns), o valor de TMR1H: TMR1L aumentará.

Digamos que disparamos uma bola de paintball através do cronógrafo. Depois que o paintball percorre o cronógrafo
e quebra o feixe nº 2, lemos o valor de TMR1H: TMR1L (é um valor de 16 bits). Por exemplo, vamos dizer que o valor
que lemos foi 15.930. Aqui está como calculamos a velocidade do paintball:

Velocidade do MCU = 12 MIPS


= 83,3333 ns / ins

Distância = 4 pol.
= 1/3 pés

Tempo = Velocidade do MCU * TMR1H: TMR1L


= 83,3333 ns / ins * 15,930 instruções
= 1,33275 milissegundos

Velocidade = Distância / Tempo


= (1/3 pés) / 1,3275 ms
= 251 pés por segundo

O paintball estava viajando a uma velocidade de 251 fps. Embora essa maneira de calcular seja perfeitamente
correta, no meu código eu apenas reorganizei a equação para que o MCU pudesse calculá-la um pouco mais
rápido. A equação que eu uso no meu código é:

Velocidade = ((FOSC / 4) / TMR1H: TMR1L) / 3


= ((12 MIPS) / 15.930) / 3
= 251fps

Etapa 5: Taxa do modo de disparo


Conforme mencionado na introdução, este cronógrafo também possui o modo Rate of Fire (RoF). Isso permite que o
usuário determine quantos tiros por segundo seu marcador de paintball é capaz. É bem simples: quando o botão 2
(S2) é pressionado, o cronógrafo muda do modo de velocidade para o modo RoF e vice-versa.

No modo RoF, o Timer0 é configurado para interromper após 1.00s assim que ativado. O cronógrafo espera que um
projétil quebre a viga nº 1, uma vez que habilita o Timer0 e incrementa a variável 'taxa' que acompanha os tiros
disparados no período de 1,00s. O programa fará uma sondagem na viga nº 1 para ver se outro projétil foi
disparado. Se outro tiro foi disparado dentro do período de 1,00s, ele quebrará o feixe nº 1 e aumentaria a variável
'taxa', mais uma vez, em um. Em seguida, ele faz um loop até que o feixe 1 seja restaurado ao seu estado padrão
(não obstruído) antes de continuar e verificar se há outra foto. Isso é para garantir que não contemos o mesmo
projétil várias vezes ao passar pelo feixe nº 1.

Uma vez decorrido o período de 1,00s, o MCU exibirá o RoF por 2,00s no LCD, independentemente de quantas
outras cenas passem pelo cronógrafo no período de 2,00s. Isso é para garantir que o cronógrafo não comece a
gravar nenhuma foto logo após o período de 1,00s, o que resultaria em um novo valor de RoF. Sem esse atraso, o
usuário teria que parar de disparar antes que a interrupção de 1,00s acontecesse; caso contrário, se o usuário não
parasse de disparar logo antes da interrupção e uma bola extra ou duas viajassem pelo cronógrafo, registraria o RoF
do extra bolas que passaram porque a função iria recomeçar novamente.
Abaixo está o esquema anexado do cronógrafo, aqui está uma representação de pseudo-código de como o
cronógrafo opera:

================================= ===========
========== Operação do cronógrafo ==========
================= =======================
- Ligar
- Inicializar portas
- Inicializar LCD
- Inicializar PWM
- Inicializar temporizador0 mas mantê-lo desativado
- Inicializar temporizador1 mas mantê-lo desativado
- Inicializar INT2 externo (S2)
- Ativar interrupções

- Loop para sempre


- Verifique se está definido para o modo "velocidade" ou "RoF"
- Se estiver definido para o modo "velocidade", desative S2 e ative INT2 e entre no modo "velocidade"
- Caso contrário, se estiver definido para o modo "RoF", desative S2 e ative INT2 e entre no modo "RoF" Modo
de

velocidade:
- Prepare o Timer1 para registrar a velocidade do projétil (configure TMR1H: TMR1L para 0x0000)
- Faça um loop até que um sinalizador seja set (pressionar S2 causaria isso) ou um objeto interrompe o feixe # 1
- Iniciar Timer1
- Loop até que um sinalizador seja definido (S2 é pressionado ou o Timer1 transborda) ou um objeto quebra o feixe #
2
- Stop Timer1
- Verifique se um sinalizador está ativo foi definido (verifique se a operação foi concluída com êxito)
- Se nenhum sinalizador foi definido, aumente a contagem de disparos e calcule a velocidade dos projéteis
- Exiba a velocidade dos projéteis no visor LCD
- Caso contrário, se um sinalizador foi definido e não foi alterado para o modo "RoF", é exibido um erro
(este erro ocorre devido ao projétil se mover muito devagar para o cronógrafo capturar sua velocidade)
- Volte ao loop principal e verifique qual modo, o cronógrafo está no

modo RoF:
- Prepare o timer0 para interromper exatamente a 1,00s (ainda está desativado neste momento)
- faça loop até que um sinalizador seja definido (pressionar S2 causaria isso) ou um objeto interrompa o feixe # 1
- Verifique para verifique se um sinalizador não foi definido (S2 não foi pressionado)
- Se nenhum sinalizador foi definido, inicie o Timer0
- Faça um loop até que um sinalizador seja definido (até que o Timer0 seja interrompido após 1,00s)
- Se o feixe nº 1 for quebrado, incrementar variáveis 'rate' e 'shots'
- Faça um loop até que o feixe 1 seja restaurado (aguarde o projétil terminar de passar pelo feixe 1)
- Foram 1,00s e o Timer0 foi interrompido, exiba o RoF no LCD
- Retorne ao loop principal e verifique em qual modo o cronógrafo está em

=============================
========== Interrompe ========= =
=============================
Timer0:
- Desligar Timer0
- Definir um sinalizador
- Limpe o sinalizador de interrupção Timer0

Timer1:
- Definir uma flag
- Limpe a flag de interrupção Timer1

Ext_INT2:
- Verifique se os dois Timers estão desligados; Desligue o Timer0 e Timer1
- Altere o modo de "velocidade" para "RoF" ou vice-versa
- Defina um sinalizador
- Desative INT2 (para que possamos pressionar o botão S2)
- Limpe o sinalizador de interrupção INT2

PS> Peço desculpas pela aparência do esquema um pouco dispersa.

Passo 7: Fazendo o cronógrafo "Barrel"


Pegue o seu tubo de PVC de 1 "de diâmetro e meça 6" de uma das extremidades externas. Faça uma marca aqui com
um lápis ou um marcador. Use uma serra ou ferramenta similar para cortar o tubo de PVC na marca que você
fez. Agora você deve ter um pedaço de tubo de PVC de 15 cm. A partir daí, meça 1,5 cm de uma extremidade da
peça. Faça uma marca no tubo. É aqui que você fará o furo para o primeiro transmissor de infravermelho. Faça o
furo com uma broca de 3/16 "e, a partir do centro exato desse furo, meça 4" até o outro lado do tubo e faça outra
marca. Você fará o furo aqui para o segundo transmissor IR.

Depois de perfurar os dois orifícios para os transmissores de infravermelho, coloque a broca no segundo orifício que
você perfurou e verifique se está completamente perpendicular ao tubo de PVC (há fotos para a maioria dessas
etapas). Perfure o outro lado do tubo de PVC. Você acabou de fazer o furo do segundo detector de
infravermelho. Em seguida, vire o tubo e meça 4 "em todo o tubo a partir do centro exato do segundo furo dos
detectores de infravermelho. Faça uma marca e faça outro furo, este é para o primeiro detector de infravermelho.

O motivo de eu não perfurar os dois Os orifícios do transmissor de infravermelho e, em vez disso, medimos 4 "do
segundo orifício do detector de infravermelho, são precisos. É para garantir que os transmissores de infravermelho e
os dois detectores de infravermelho estejam espaçados exatamente 4 "um do outro.

Após a perfuração de todos os orifícios, os dois transmissores de infravermelho são colocados em seus respectivos
orifícios. Visto que usamos uma broca de 3/16 ", o diâmetro dos furos é de apenas ~ 4,8 mm. Isso significa que o LED
de 5 mm não se encaixa completamente no furo, é isso que queremos. Só queremos que os LEDs do IR fiquem
levemente picar para dentro do tambor, por duas razões. Primeira, ele ajuda a dirigir o feixe de infravermelhos em
um caminho reto para o detector de IR. em segundo lugar, reduz-se a possibilidade de um projéctil que golpeia o IR
em si e danificá-lo LED.

uma vez que o LED de infravermelho do são colocados nos buracos, um pequenoUm pouco de super cola é usado
para prendê-los no lugar. Não cole totalmente o LED IR no orifício, apenas no caso de precisar substituí-lo mais
tarde. Uma vez preso, coloque o ferro de soldar e solde alguns fios dos LEDs IR. Certifique-se de que os fios possam
alcançar o outro lado do tubo de PVC onde mais tarde instalaremos a PCB. Eu recomendaria colocar os conectores
nos fios para que seja mais fácil desmontar o cronógrafo, caso você precise limpá-lo.

Abaixo, eu enviei as fotos do PCB salvo em 300DPI. Esta é a placa de circuito que eu projetei para o cronógrafo. A
parte crucial desta placa é que os orifícios do detector IR estão exatamente a 10 cm de distância. Isso nos permitirá
alinhá-los com os orifícios no tubo de PVC. Também carreguei um arquivo PDF que contém todas as faces da placa
necessárias para criar um PCB usando o método de transferência de toner.

Depois de obter a PCB e soldar todos os componentes, você estará pronto para juntar tudo. Eu segui as etapas para
montá-lo nas fotos. É muito mais fácil seguir quando você pode visualmente visualizá-lo, então não os escreverei em
dois parágrafos, como estão nas tags de imagens.

Agora que o cronógrafo está funcionando, encontraremos os piores cenários e


tolerâncias a erros deste dispositivo. Vou calcular a precisão de acordo com
uma velocidade de 300fps (presumo que os transmissores / detectores de
infravermelho estejam posicionados exatamente a 4 ", não considerarei erros
de fabricação).

Precisão:
Se uma bola de paintball estiver viajando a 300fps, são necessários 3,3333ms para percorrer 1
pé (1 / 300fps = 3.3333ms). Como nossos pares de transmissores / detectores de infravermelho
estão espaçados 4 ", temos que dividir 3.3333ms por 3 (1ft / 4in. = 3). Portanto, o tempo
necessário para o paintball percorrer 4 "a 300fps é 1.1111ms.

300fps = 3.3333ms / ft

tempo para percorrer 4in. = 3.3333ms / (1ft / 4 in.)


= 1.1111ms

Velocidade da CPU = 12 MIPS


= 83.3333ns / ins
Precisão = 100 - (100 * (83.3333ns / 1.1111ms))
= 99.9925% de precisão @ 300fps

Agora essa não é a precisão real deste cronógrafo. Se esse microcontrolador pudesse detectar
um objeto em qualquer ciclo de instruções, teria uma precisão de 99,9995% a 300 qps, porque
seu pior cenário de não detectar um objeto quando ele quebrou o feixe poderia ser apenas
83,3333ns antes de realmente detectá-lo.

Como estou pesquisando os detectores de infravermelho e aguardando para ver quando um


objeto rompe o feixe nº 1, são necessários 8 ciclos de instruções por loop quando estou tentando
detectar se há um objeto quebrando o feixe. Depois de detectar um objeto, ele tem mais um ciclo
de instruções para executar, porque precisa iniciar o Timer1. Depois de fazer tudo isso, começou
a registrar o período de tempo necessário para o projétil viajar da viga nº 1 à viga nº 2. O mesmo
vale para o feixe 2. São necessários 8 ciclos de instruções por loop de "detecção" e mais uma
instrução para desativar o Timer1. Portanto, o pior cenário é:

Ins / Loop = 8 ins * 2 Loops


= 16 instruções antes da detecção

Ins / Ativação do Timer1 = 1 ins * 2 (ativação e desativação do Timer1)


= 2 instruções O

maior tempo possível antes da detecção = (16 segundos + 2 segundos) * 83,3333ns / ins
= 1,5 µs
Precisão = 100 - (100 * (1,5µs / 1,11111ms))
= 99,865% de precisão a 300fps

Portanto, supondo que não haja outras fontes de erro (a distância é exatamente de 4 ", os feixes
são quebrados de forma idêntica em cada lado, etc.), teríamos uma precisão de 99,865% a
300fps para este cronógrafo. Isso é muito bom, no entanto, existem . muitas outras pequenas
fontes de erro que eu não representaram por isso, é altamente improvável que o cronógrafo que
eu construir ou a construir será 99,865% de precisão no entanto, ele funciona muito bem e estou
muito satisfeito com ele..

Edit:
I esqueci de adicionar a velocidade mínima do projétil.Como a contagem mais alta que o Timer1
pode contar é 65.535, além de usar mais uma instrução para fazê-lo ultrapassar o zero e rodar a
12MIPS, podemos calcular a velocidade de um projetor. projétil tão baixo quanto 62fps Os
cálculos são os seguintes:

MCU Speed = 12 MIPS


= 83.3333ns / ins Timer de

contagem máxima1 = 65.535 instruções + mais 1 instrução para interromper


= 65.536 instruções

Velocidade mínima = ((12MIPS / 65.536 ins) *


1/3 pés) = 61.03516fps (Para segurança, diremos 62fps )
O que é um cronógrafo balístico?
Um dispositivo para medir a velocidade de um projétil de alta velocidade saindo de um arma de fogo é geralmente
conhecida como cronógrafo balístico. O termo cronógrafo foi cooptado da comunidade horológica e agora é
amplamente usado para descrever instrumentos para medir a velocidade de balas, flechas, dardos etc.

Este capítulo propõe duas versões do cronógrafo balístico: uma oferecendo a capacidade de medir com precisão
projéteis de alta velocidade e uma versão Lite que oferece um pouco menos de precisão, mas uma implementação
muito mais simples.

Embora eu me refira à versão mais simples como a versão “Lite”, ela não é de maneira alguma sofisticada.

Cronógrafos comerciais

Existem vários cronógrafos disponíveis comercialmente, a maioria destinada a pistolas e rifles de alta potência. Os
cronógrafos são geralmente colocados no chão ou em uma mesa na frente do atirador. A maioria dos dispositivos
comerciais populares depende da luz solar do ambiente para operação e, portanto, não funciona em ambientes
fechados ou em dias nublados. E, embora tenham preços modestos, não são realmente baratos.

Os cronógrafos variam de dispositivos simples de dois fios (ainda em uso e acredita-se que alguns sejam os mais
precisos) para unidades relativamente elaboradas com memória digital, cálculos de velocidade média e outros
recursos. A abordagem de dois fios simplesmente usa dois fios finos de fio (o fio de bitola 36 ou 40 serve) esticados
entre dois pares de contatos espaçados com precisão.

O projétil é disparado e quebra o primeiro fio para iniciar um cronômetro e, se você tiver uma mira boa, quebra o
segundo para interromper o cronômetro. O tempo entre as quebras é calculado para fornecer um valor de
velocidade em pés ou metros por segundo. Os primeiros cronógrafos foram construídos com um relógio, com
leituras de uns e zeros exibidos em um banco de LEDs. O número binário teve que ser convertido para um número
decimal e depois calculado com a distância entre os fios para obter a velocidade.

Medindo a velocidade no cano

Agora que você sabe que tipos de cronógrafos pré-criados existem por aí, vamos dar uma olhada na física do
dispositivo. Um projétil que sai do cano de uma arma tem uma velocidade atribuída a ele por algum propulsor, como
ar, CO2 ou gás criado pela rápida oxidação do combustível na pólvora.

O projétil viaja pelo cano e sai do focinho. A velocidade do projétil que sai é chamada velocidade do focinho.

A velocidade do cano das pistolas pneumáticas tende a variar dependendo da vários fatores, incluindo a carga do
propulsor, a limpeza do barril e a combinação de projétil a barril. Alguns rifles aéreos podem ser bombeados para
quase 3.000 psi (libras por polegada quadrada) para disparar projéteis maiores a velocidades relativamente
significativas. Essas pistolas de ar maiores têm velocidades de focinho relativamente baixas na faixa de sub-1.000
fps, mas oferecem um impacto real. Comparado 220 Capítulo 8 às espingardas de ar convencionais, que disparam
balas de 0,177 polegadas com capacidade entre 15 e 25 pés-libras (pés-libras) de potência, essas espingardas de
calibre maior oferecem entre 500 e 700 pés-libras de potência.

Idealmente, você deseja medir a velocidade o mais próximo possível do final de o barril quanto possível. No entanto,
isso pode ser difícil, e alguns fabricantes de cronógrafos afirmam que a velocidade não é muito atenuada nos
primeiros vários pés (ou até jardas) de viagem. Por outro lado, há pouca dúvida de que a resistência do ar é um fator
significativo, e o projétil desacelerará pelo menos um pouco nos primeiros metros - especialmente no caso de
projéteis maiores.
Abordagem deste projeto

Como nos sistemas de cronógrafo balístico de dois fios, estamos tentando medir o tempo que leva para um projétil
percorrer uma distância fixa. Mas, em vez de quebrar os fios finos, esse projeto tira proveito de uma fonte de luz
infravermelha e de um receptor sensível à luz, conforme ilustrado na Figura 8-2.

Dois pares de LEDs e sensores de infravermelho estão dispostos de modo que o sensor de infravermelho

normalmente detecta a fonte de luz. Mas quando o projétil quebra o feixe de luz do primeiro par, o sensor fica
escuro e muda seu estado elétrico.

O processador detecta essa alteração e inicia um timer. Quando o projétil interrompe um segundo par de fonte /
receptor, o temporizador para. Os dois conjuntos de fontes de luz e receptores são separados a uma distância
precisa, para que o tempo de viagem possa ser calculado com relativa facilidade na velocidade do projétil.

Para um exemplo simples, digamos que os feixes de luz estejam separados um pé. Um projétil interrompe um feixe
de luz e inicia o relógio; quando o projétil interrompe o segundo feixe de luz, o relógio para. Se o temporizador do
microcontrolador medisse 1 segundo, a velocidade seria de 1 pé em 1 segundo ou 1 fps.

Este sistema pode ser usado com uma variedade de projéteis e fornecer uma leitura digital em um LCD. Ao contrário
de outras abordagens, este dispositivo separa o banco de sensores dos eletrônicos, de modo que, se desejado,
diferentes sensores podem ser trocados para diferentes armas de fogo ou mesmo aplicações diferentes.

Por exemplo, você pode configurar um canal de sensor e fazer algumas experimentos de física, soltando pequenos
objetos através dele e registrando sua velocidade.

Parts List
One Arduino Pro Mini or clone

Two IR LEDs, about 650–850 nm

Two IR photosensors (I used the Honeywell Optoschmitt SA5600.)

Not e Some users have had trouble matching the IR LEDs with the Optoschmitt photosensors.

If you run into this problem, try the Honeywell SE3450/5450 or equivalent.

Another option is to use two Adafruit IR Break Beams (part #2167) instead of the

separate LEDs and sensors. The IR Break Beams will work for the Chronograph Lite,
but the output must be inverted for the full version.)

One 270-ohm, 1/8 W resistor

(Optional) Two 10-kilohm, 1/8 W resistors (if using phototransistors

rather than Optoschmitt photosensors)

One channel holding two LED/sensor pairs

One 16×2 LCD

One I2C adapter, if not included with the LCD

One x4 adapter housing (see “Connectors Used in This Book” on

page 18)

Four female pins for housing (see “Connectors Used in This Book” on

page 18)

One SPST switch

One momentary NO switch

One 9V battery connector

One 9V battery

One Hammond 1591 BTCL enclosure or equivalent

Two 7 1/2 × 1 1/2 × 0.06–inch aluminum pieces

One 1 3/8 × 7 1/2–inch piece of 1 3/8-inch acrylic sheet

Two #10-24×1-inch nylon screws

Two #10×24 nylon nuts

222 Chapter 8

Four 4-40×1/2-inch screws

Eight 4-40 nuts

Four 4-40 washers

Assorted 28-gauge hookup wire

Downloads

Esboço: ChronographLite.ino

Modelos PanelCutoutLite.pdf, PanelCutout.pdf, AccelerationChannel.pdf

O esquema

Fora da placa do Arduino, o circuito para este projeto não é muito complexo.

O esquema da Figura 8-3 usa o barramento I2C para alimentar o LCD, dois

conexões para os fotosensores e duas conexões para o interruptor de limpeza.


Construindo uma Cama de Teste
A Figura 8-4 mostra o banco de testes que foi usado para provar o conceito e desenvolva o esboço. Sugiro que você
construa seu próprio e instale seus LEDs e fotossensores antes de montar a placa de ensaio.

Para esta bancada de testes, cortei dois pedaços de papelão aproximadamente 2 × 6 polegadas e os perfurou para
caber dois pares de LEDs IR e fototransistores que foram espaçadas 3 polegadas à parte. Eu ferrou o papelão para
um pedaço de 1 polegada de espessura madeira, embora você possa colar ou grampear se você preferir. Quando
você constrói o seu, certifique-se de que cada fototransistor esteja diretamente em frente a um LED IR no canal.

Depois de instalar os LEDs IR e fototransistores no banco de ensaio, eu recomendamos prepará-los para o placa de
ensaio da seguinte forma:

1. Conecte os dois ânodos do LED IR com um pedaço de arame por solda ou enrolamento de arame.

2. Solde um fio de 24 polegadas de comprimento para os ânodos de LED combinados. E se você está usando fio de
núcleo sólido que se encaixa em uma tábua de pão, você pode simplesmente tirar a outra extremidade do fio de 24
polegadas.

Se você estiver usando fio trançado, prenda um pino de crimpagem masculino no final do fio.

3. Conecte os dois catodos de LED IR com um pedaço de arame por solda ou enrolamento de arame.

4. Conecte os dois emissores de fototransistor com um fio de solda ou enrolamento de arame.

5. Conecte os catodos de LED IR combinados ao fototransistor combinado emissores; Sugiro soldar um fio longo.

6. Solde um fio de 24 polegadas aos catodos combinados de LED e emissores de fototransistor e termine a outra
extremidade do fio com um pino de crimpagem masculino, como você fez na etapa 2.

7. Solde um fio de 24 polegadas ao coletor de cada fototransistor e finalize a outra extremidade do fio com um pino
de crimpagem macho, como você fez passo 2.
Na Figura 8-4, os LEDs e sensores de luz (estes serão fototransistores sensores Honeywell Optoschmitt, dependendo
da sua escolha) são colocado em buracos perfurados no papelão do canal de aceleração.

Usei um furador relativamente pequeno para que a fricção os segurasse

Figura 8-4: O banco de ensaio que eu usei inicialmente para verificar o cronógrafo conceito 224 capítulo 8 lugar. Em
vez disso, você pode colá-los com cola quente ou entrar em contato com cimento. Usei um fio telefônico de quatro
condutores de 24 polegadas para conectar o canal à placa de ensaio, mas qualquer fio serve. Na versão completa e
em outros protótipos, usei apenas quatro comprimentos de fio trançado de bitola 30, porque era mais flexível. Como
alternativa, você pode criar o canal final do sensor agora.

Os LEDs e fototransistores precisarão ser conectados ao Arduino, pois

indicado no diagrama esquemático da Figura 8-3. Liguei os ânodos de LED à fonte de alimentação através de um
resistor de 270 ohm (R3). No caso dos fototransistores, configurei-os para que os emissores fossem aterrados e cada
coletor passasse por um resistor de 10 quilohm (R1 e R2) até o positivo da fonte de alimentação para uma
configuração de coletor aberto. Assim, se o feixe de luz fosse interrompido, o fototransistor seria conduzido e a
tensão no coletor cairia.

Não e Se você usar o Honeywell Optoschmitt SA5600 / 5610, os resistores de 10 kilohm (R1 e R2) não serão
necessários, pois estão incluídos no chip SA5600 / 5610. A fiação dos sensores Optoschmitt é mostrada na parte
inferior esquerda do esquema na Figura 8-3.

Em vez de arremessar o escritório com bolas ao vivo, BBs ou pellets,

Configurei o show verticalmente para que um projétil pudesse ser jogado pelos feixes de luz para testar o sistema.
Esse método significava que as velocidades medidas não se aproximavam das de um projétil deixando o cano de
uma arma, mas eram boas o suficiente para um experimento inicial de prova de conceito. Quanto maior a queda do
alvo, maior a velocidade registrada - ou seja, se o seu objetivo for bom. (Lembre-se de s = (1/2) at2, onde s é
deslocamento ou distância, a é aceleração devido à gravidade, t é tempo e a velocidade inicial é zero.)

Se a luz ambiente causar problemas nos testes, um pedaço adicional de

o papelão pode ser colado na parte superior (lateral) dos dois pedaços de papelão para proteger o sensor, embora
eu não tenha achado que isso era um problema em nenhuma das experiências que conduzi.

The Sketch
Now to write the sketch to make things work. Here is the sketch for the
Chronograph Lite:

//Lite version of chronograph, using Optoschmitt sensors


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
unsigned long start_time = 0;
unsigned long stop_time = 0;
unsigned long time_of_flight = 0;
float velocity = 0;
Two Ballistic Chronographs 227
LiquidCrystal_I2C lcd(0x3F, 20, 4);
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
u while(digitalRead(2) == 1) {
//Waiting for first sensor to trip
}
v start_time = micros();
w while(digitalRead(4) == 1) {
}
x stop_time = micros();
y time_of_flight = stop_time - start_time;
Serial.print(" time of flight ");
Serial.println(time_of_flight);
velocity = 1000000*.25/(time_of_flight);
lcd.clear();
lcd.print("tm of flt ");
lcd.print(time_of_flight);
lcd.print(" us");
lcd.setCursor(0, 2);
lcd.print("Speed FPS ");
lcd.print(velocity);
}

O esboço é bem direto. Depois de configurar as variáveis e entradas, um loop while espera que o primeiro
sensor seja interrompido verificando a condição digitalRead (2) == 1 {1}. Quando disparado, o relógio é
iniciado com start_time = micros (); {2}, e outro loop while conta até o segundo sensor ser ativado (porque
o segundo sensor está conectado ao pino D4, esse loop while verifica se digitalRead (4) == 1 {3}). Quando o
segundo sensor é ativado, o relógio é parado com stop_time = micros () {4}.
O esboço calcula o tempo decorrido entre o primeiro sensor e o segundo com time_of_flight = stop_time -
start_time at {5}. Depois que o esboço faz seus cálculos, ele fornece instruções para exibir os resultados na
tela LCD.
Tudo o que você precisa fazer agora é carregar o esboço, levantar o canal de teste como na Figura 8-4 e
soltar um projétil como um mármore através do canal de papelão. Para começar, ligue o Mini com o
programador. Como alternativa, você pode usar uma fonte de alimentação regulada 5V separada
conectada ao terminal 5V no Mini ou conectar uma bateria à porta VIN do Mini e usar o regulador
integrado do Mini. Não conecte uma bateria de 9V aos trilhos de alimentação de 5V - isso pode queimar
tudo.
Quando estiver satisfeito com o funcionamento dos sensores, você poderá conectar o canal temporário do
sensor a uma pistola de ar real, se quiser testar mais o circuito (veja a Figura 8-6).
Se isso for suficiente para suas necessidades, você pode empacotá-lo e pular tudo em “O cronógrafo
balístico completo” na página 233. O Chronograph Lite deve funcionar bem em jogos e armas de
velocidade baixa e média (menos de 600 fps), como armas de chumbinho, armas BB, armas de airsoft e
assim por diante.
Apesar do desempenho satisfatório, no entanto, fiquei incomodado com o fato de que, embora o Arduino
possa contar microssegundos, ele pode fornecer resultados apenas como múltiplos de quatro, portanto, na
realidade, a resolução é de apenas 4 microssegundos. Por isso, desenvolvi o projeto Full Ballistic
Chronograph. Se isso também o incomoda e não planeja empacotar o Chronograph Lite, você pode pular
para "O cronógrafo balístico completo".

O cronógrafo balístico completo


Enquanto o Chronograph Lite funcionou bem e eu o usei para medir com sucesso a velocidade dos
projéteis, tive uma sensação incômoda de que poderia ser melhor. Se você estiver usando o dispositivo
para projéteis de baixa velocidade, ou seja, 600 fps ou menos, a precisão do Chronograph Lite é mais que
suficiente. Mas a restrição de 4 microssegundos de resolução resultou no que eu considerava uma
quantidade razoável de erro em pés por segundo (fps) em velocidades mais altas, então decidi construir o
cronógrafo balístico completo.

Parts List
Assembling the Full Ballistic Chronograph is relatively simple. Here’s what
you’ll need:
One Arduino Nano or clone
One 16×4 LCD
One I2C adapter, if not included with the LCD
One PCB shield
One enclosure (Hammond 1591 BTCL)
Four 1/2-inch×4-40 screws
Four 4-40 nuts
One 3PDT toggle switch
Two momentary pushbutton switches
Four 0.100×4 female headers
Four female X4 shells
Sixteen (eight male, eight female) adapter pins
One 4 MHz crystal
One TI SN 74LVC1GX04 crystal-oscillator driver
One SOT23 adapter board
One HCT 4011 4-input NAND gate
One CD4013 dual D flip-flop
One CD4040 12-stage binary counter
One ADC DAC8562 digital-to-analog converter
One LM7805 voltage regulator
One NPN transistor 2N5172 (or equivalent)
Four 5-kilohm, 1/8 W resistors
One 1-megaohm, 1/8 W resistor
One 1-kilohm, 1/8 W resistor
One 1.5-kilohm, 1/8 W resistor
One 270-kilohm, 1/8 W resistor
One 4.7 MFD tantalum capacitor
Two 33 pF capacitors
Two Ballistic Chronographs 235
One 0.01 μF capacitor
One 5 mm LED
Two IR detectors (I used the Honeywell Optoschmitt SD5610.)
Two IR LEDS, about 850–950 nm
28- or 30-gauge hookup wire

For the Full Ballistic Chronograph, you will have to use the inverted version of
the chip, the SA5610, or externally invert the signals. See the note at the bottom of
Figure 8-3.

Download
Esboço FullBallisticChronograph.ino
Modelos ChronoCover.pdf, AccelerationChannel.pdf
PCBs ChronoPCB.pcb, LEDHolder.pcb, SensorHolder.pcb
Melhorando a precisão
Existem várias soluções possíveis para melhorar a precisão do cronógrafo.
O Arduino Nano usa um relógio de 16 MHz, mas quando configurado usando a plataforma Arduino Nano e
o IDE, resulta em uma resolução de 1 microssegundo (± 2 microssegundos), mesmo que o período - o
tempo entre os ciclos - de um relógio de 16 MHz seja 1 / 16.000.000 de segundo, ou 0,063
microssegundos.
Embora um processador nunca possa resolver sua própria velocidade de clock, provavelmente é capaz de
muito melhor que 1 microssegundo. Claramente, há alguma sobrecarga no projeto atual - talvez parte de
hardware (os componentes na placa Arduino) e parte de software (parte do compilador e firmware do IDE)
- que limita o desempenho. Aqui estão algumas idéias que tive para melhorar a precisão, começando por
uma que não entrou no projeto final, mas que acho que é educacional.
Cavando no Código da Máquina
Uma solução possível é cavar a máquina básica Atmel e o código AVR.
Sem entrar em detalhes excruciantes, a montagem do AVR é a função idioma do chip Atmel. A comunidade
do Arduino cercou isso com um código especial que permite que o AVR seja executado no ambiente do
Arduino.
De acordo com as folhas de dados do ATmega328, é possível abordar diretamente os temporizadores
individuais no ATmega328 e obter a resolução necessária.
No entanto, olhando para ele, vi que esse método poderia ser excessivamente complexo e imaginei que
deveria haver outra maneira.
Criando uma janela de alta velocidade
O tempo de voo de um projétil que queremos examinar abrange uma variedade de aproximadamente 90
microssegundos (cerca de 3.000 fps a uma distância de 3 polegadas) a 236 Capítulo 850 microssegundos
(cerca de 260 qps na mesma distância de 3 polegadas) do mais rápido para o mais lento. Em relação às
frequências mais altas de alguns relógios, como o relógio de 16 MHz do processador, 90 microssegundos é
uma quantidade razoável de tempo.
Um método para medir a velocidade é abrir uma janela de tempo quando o primeiro feixe de luz é
interrompido, deixa passar um fluxo de sinal de alta velocidade até que o segundo feixe seja interrompido.
Enquanto a janela estiver aberta, os pulsos nesse sinal serão contados; quando a janela é fechada, a
contagem representará a hora em que a janela foi aberta.
Como exemplo, digamos que a janela se abre e um sinal de 10 ciclos por segundo (cps) passa até que a
janela se feche; São contados 100 ciclos.
Para esta ilustração, o relógio do Arduino é o sinal de alta velocidade. Quando você sabe a distância que o
projétil percorreu, você pode usar uma aritmética simples para determinar o tempo de viagem e a
velocidade: 100 ciclos a 10 cps nos dão 10 segundos. Se a distância fosse de 1 metro e fossem contados
100 ciclos enquanto a janela estivesse aberta, a velocidade seria de 1 metro por 10 segundos ou 0,1 m / s.
Uma única porta lógica NAND pode ser usada para criar uma janela que pode ser aberto e fechado. Um
gate lógico é simplesmente um comutador controlado eletronicamente que emite uma tensão apenas sob
certas condições, correspondendo a uma equação lógica booleana. NAND é a expressão booleana para
"not AND", e um gate NAND gera uma tensão quando suas duas entradas não são iguais.
Eu experimentei um portão NAND de alta velocidade 74HC00 e um Porta CD4011BC, e a peça padrão
funciona bem. Existem várias outras partes que também funcionarão. O que você procura é uma parte
com um atraso de propagação (Tpd) abaixo de 100 nanossegundos.
Selecionando um contador
Depois de decidir adotar a abordagem da janela, a próxima coisa a considerar é o quão alto você precisa
contar. Se você contasse números inteiros de 1 a 100, por exemplo, seria necessário um contador que
contasse até 100, o que forneceria uma resolução de 100. Se você escalasse isso, o contador poderia
fornecer um intervalo de 10 a 1.000 ou de 100 a 10.000. Se esse intervalo fosse o resultado do cálculo para
fps, você teria uma resolução de apenas 1.000 fps (cada incremento seria igual a 100 fps) mais qualquer
erro incluído, que abordaremos posteriormente.
Então, para onde você deve ir daqui? Para o compartimento de peças, é claro, para ver quais contadores
estão disponíveis para contar o sinal que passa por essa janela.
Ao selecionar um contador, você deve considerar a rapidez com que ele precisa e quantos pulsos você
deseja que conte. O testado e verdadeiro CD4040, contador digital de 12 bits, entrada serial, saída
paralela, parecia capaz de fazer o trabalho. (O CD4040 funcionava na frequência de 4 MHz, mas você
sempre podia usar uma mais rápida, como a 74HC4040 ou a 74HCT4040.) O CD4040 fornecerá uma
contagem digital de 0 a 4095 ou 2 ^ 12.
Selecionando uma velocidade de relógio
Em seguida, considere qual frequência de sinal é necessária para se adequar à faixa de velocidades dos
projéteis. Comecei com a suposição de que queria atingir uma faixa de aproximadamente 300 fps a 2.500
fps com tanta latitude nas duas extremidades quanto possível.
Além disso, embora o contador conte idealmente de zero até o máximo 4.095 contagens, existe a
possibilidade de algum erro. Tão arbitrariamente, escolhi olhar para a contagem digital total entre 400 e
4.000 para explicar a possibilidade de erro.
Dado o número de ciclos contados, a frequência do sinal e a distância percorrida, a velocidade de um
projétil pode ser encontrada com os seguintes cálculos:

Para um relógio de 4 MHz, uma contagem total de 4.000 ciclos equivale a cerca de 281 fps para o limite
inferior da faixa de velocidade. Na extremidade alta, considerando 400 ciclos contados e um sinal de clock
de 2 MHz, você medirá 1.250 fps e, em 4 MHz, pode medir até 2.500 fps.
Você pode ser criativo com sua frequência. Se você optar por usar um 2 MHz relógio, ele fornecerá a
resolução máxima na faixa de velocidade muito baixa. Se, por outro lado, você selecionar um relógio de 4
MHz, estará no meio da faixa de resolução. Um relógio de 8 MHz fornecerá uma resolução muito boa no
alcance rápido (mais rápido que qualquer arma convencional), mas reduzirá o desempenho no alcance de
velocidade mais baixa.
Porque eu previ que a maior parte das velocidades que eu precisava medir cairia no meio da faixa de
contagem, um relógio em torno de 4 MHz soou bem. Eu não estava antecipando muitas ocasiões em que
as velocidades estaria na faixa sub-300 fps e, na extremidade alta, parecia a precisão pode ser mantida em
mais de 5.000 qps (uma contagem digital de 238 Capítulo 8, pouco menos de 200, o que pode esticar um
pouco, mas parecia funcionar bem em simulações).
Se seus projéteis permanecerem na faixa abaixo de 300 fps, sugiro revisitar o cronógrafo Lite. Se, por
algum motivo, você quiser permanecer na faixa de fps mais baixa, mas exigir precisão máxima com talvez
vários dígitos, construa o Cronógrafo Balístico Completo com a taxa de clock mais lenta. Você pode
simplesmente trocar o cristal de 4 MHz por um cristal de 2 MHz e ajustar o desenho para deslizar o
intervalo para a área inferior.
Ajustando a velocidade do relógio
Para lidar com a velocidade do relógio (o sinal que é bloqueado no contador), o método mais preciso de
longe é usar um oscilador controlado por cristal, que geralmente apresenta erros apenas na faixa de
menos de 50 partes por milhão. Configurei um cristal de 4 MHz com o driver do cristal-oscilador TI SN
74LVC1GX04 experimentalmente e funcionou bem, então usei um no projeto final.
Enquanto eu olhava, revia e testava osciladores de chip único, como o Oscilador independente máximo
(7375), não era tão estável quanto a versão controlada por cristal.
Projetando o cronógrafo balístico completo
Agora, temos os meios para registrar o sinal no contador 4040, mas precisamos descobrir como exibir a
velocidade no LCD. Um método seria usar um contador diferente com uma saída serial que fosse
sincronizada diretamente no Nano. Outra possibilidade seria pegar os dados paralelos do CD4040,
serializá-los com um registrador de turnos e alimentar o resultado com o Nano.
No entanto, tomei uma direção diferente, conforme ilustrado no diagrama de blocos da Figura 8-12. Decidi
usar um conversor digital-analógico (DAC) de 12 bits para aceitar os sinais digitais paralelos e convertê-los
em um único valor analógico. Os DACs e seus equivalentes, conversores analógico-digitais (ADCs), são
usados em músicas digitais, TVs e em várias outras áreas em que uma entrada analógica precisa ser
digitalizada, manipulada, transferida, armazenada e, eventualmente, saída para retornar um sinal
analógico. Achei que seria uma boa oportunidade para apresentar os recursos dos conversores digital para
analógico.

O processo na Figura 8-12 mostra a operação do cronógrafo usando um simulador. Na operação real, o
simulador seria substituído pelos dois pares de sensores LED. O simulador, sob controle da chave de
disparo, inicia um sinal de partida que permanece ativo até que a segunda chave de parada seja ativada
após um período determinado pelo gerador de ondas quadradas. Isso simula essencialmente o projétil que
passa pelo primeiro e depois pelo segundo par de sensores.
Quando a chave de partida é ativada inicialmente, ele liga o flip-flop - um dispositivo bistate que liga com a
ativação da chave de partida e permanece ligado até que a chave de parada seja ativada. O flip-flop
alimenta o gatilho do portão. Quando o gatilho (T) está inativo - ou seja, quando está definido como um 0
lógico - o sinal do oscilador na entrada (A) não pode passar pelo portão para a saída (B). Quando o gatilho é
ativado (definido como 1 lógico), o gate permite que o sinal do oscilador (A) viaje através do gate para a
saída (B) e, eventualmente, para a entrada do contador binário. O contador binário conta o número de
pulsos que passam do oscilador através do portão e para de contar quando o portão é fechado.
As saídas do contador binário são alimentadas no DAC. Eles representam números binários de 0 a 4.095 -
ou seja, de 0 a 212 - 1. O DAC converte esses valores digitais em um único valor analógico. A técnica dessa
conversão depende do tipo de CAD usado; por exemplo, no DAC8562 usado aqui, uma escada de resistor
R-2R é comutada e um transistor é usado para produzir a saída. (Para obter informações completas,
consulte a folha de dados de Analog Devices no DAC8562.)
A saída do DAC tem uma escala de 0V a 4.095V correspondente a as entradas digitais. Essa saída é
direcionada para uma das entradas analógicas do Arduino Nano, que fornece a função inversa do DAC e
converte o sinal analógico de volta em um formato digital que o Nano pode suportar. O Nano pega esse
sinal e, seguindo as instruções do esboço, ajusta o valor para representar a velocidade em fps pelo tempo
que o projétil leva para percorrer as 3 polegadas. O Nano finalmente envia esses dados para o LCD, que
exibe a velocidade do projétil e o tempo de viagem.
O esquema
As Figuras 8-13 e 8-14 mostram os diagramas esquemáticos do cronógrafo completo de balística completo.
Observe os portões extras na parte inferior. Eu os incluí no esquema porque eles estão disponíveis para
você nos pacotes de ICs de porta e flip-flop NAND sugeridos para este projeto, mas meu design não os
utiliza. Se você deseja adicionar funcionalidades, elas estão disponíveis.
Outra coisa incluída no esquema que não abordamos é
o botão de reset. No cronógrafo balístico completo, incluí um botão para acionar a redefinição, em vez de
redefinir automaticamente. Eu poderia configurá-lo para que o resultado fosse exibido no LCD por um
período fixo de tempo antes da reinicialização do sistema, mas pode ter acontecido que o número foi
apagado antes que os usuários tivessem tempo para gravá-lo, ou eles podem ter se encontrado sentado
ocioso enquanto o tempo limite expirou. Eu decidi que um botão de reset seria mais conveniente.
Como a reinicialização do microcontrolador não perturbaria o sequência de coisas, eu escolhi usar um hard
reset no controlador através do transistor Q1. Para redefinir o CD4040 e o DAC, usei o sinal de redefinição
e o inverti usando um dos quatro portões NAND do CD4011 com as duas entradas ligadas. O SW2 fecha
manualmente o segundo conjunto de sensores, caso o primeiro par de sensores seja acionado e não o
segundo, e SW3 é o interruptor de energia e bateria.
The Sketch
The sketch for the Full Ballistic Chronograph is relatively straightforward:

//Full Ballistic Chronograph


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int DACpin = A0;
float DACvalue = 0;
float FPS;
float Time;
void setup() {
lcd.init();
lcd.backlight();
}
242 Chapter 8
void loop() {
u DACvalue = analogRead(DACpin);
Time = DACvalue*5/1023/4*1000;
FPS = .25/Time*1000000;
lcd.setCursor(0,0);
lcd.print("Speed ");
lcd.print(FPS,0);
lcd.setCursor(11,0);
lcd.setCursor(0,1);
lcd.print("Time ");
lcd.print(Time);
lcd.setCursor(11,1);
lcd.print(char(0XE4)); //To display the mu symbol, use 228 or 0XE4
lcd.print("s");
}

Neste esboço, o software recebe um sinal analógico do DAC em u e o converte em um valor digital. Em
seguida, ele realiza algumas operações matemáticas rápidas para obter a hora do voo (Time), calcula a
velocidade em pés por segundo (FPS) e, finalmente, exporta esses valores para o LCD.
Ao projetar circuitos eletrônicos, sempre existem compensações entre hardware e software. Muitos deles
têm a ver com problemas de tempo e latências internas em abordagens baseadas em software. Nesse
caso, a desvantagem é a necessidade de maior precisão não disponível com a abordagem direta do IDE do
Arduino sem cair para algum nível de código nativo. Para evitar o código nativo, o cronógrafo balístico
completo possui um hardware mais complexo que o cronógrafo Lite.
The Shield
Ao contrário do Chronograph Lite, o Cronógrafo Balístico Total é melhor construído em um escudo. O
escudo é um pouco mais envolvido do que alguns dos outros deste livro, mas não se deixe intimidar. A
Figura 8-15 mostra os traços reais da blindagem, enquanto a Figura 8-16 mostra a imagem da serigrafia
com os posicionamentos das peças e a configuração do furo. Para este projeto, optei por uma placa dupla,
porque o circuito era um pouco mais complexo do que alguns outros e porque me permitiu minimizar o
espaço necessário. O arquivo PCB completo está disponível para download em https://www.nostarch.com/
arduinoplayground /.
Tentei manter a pegada do escudo no mínimo para torná-la possível para o usuário espremer o sistema em
um pequeno gabinete portátil.
Como é, o cronógrafo balístico completo final cabe facilmente em uma caixa de 11 × 8 × 4 cm.
Este é outro caso em que optei por terceirizar a construção de PCB depois de eu ter feito e refinado a
primeira amostra pessoalmente, e garantido que todas as conexões críticas pudessem ser soldadas nos
dois lados da placa. A Figura 8-17 mostra a placa bruta conforme foi recebida da agência de serviços.

O canal do sensor
Construímos uma plataforma de teste de canal de sensor no início deste capítulo, mas agora vamos
construir um canal de sensor mais permanente e observar o par de sensores e LED que usaremos no
interior.
Construindo o canal do sensor
O canal do sensor é um túnel em forma de U que se prende ao cano de uma arma e mantém os pares de
fotodetector / LED que controlam a comutação.
Este canal pode ser construído com uma variedade de materiais. Usei uma seção de 3/8 pol. De acrílico e
duas peças de alumínio com 0,060 pol de espessura (veja a Figura 8-20).

Figure 8-20: The completed sensor channel shown from the top (right side up). Note the feed-through holes
in the acrylic for the positive and negative power supply connections to the LEDs (boxed). Also note the
current-limiting resistor on the PCB holding the LEDs (circled). The cross-hatch area is foam taped to protect
the weapon’s slide from being scratched.

Você poderia facilmente usar chapas de aço macio para as peças laterais. A peça superior, mostrada na
Figura 8-20, pode ser qualquer material leve, como fenólico, Lexan ou outro plástico para apoiar as peças
laterais. Escolhi acrílico transparente porque me permitia ver a arma sem ter que olhar para o cano. Você
pode ter uma visão mais ampla de todo o canal, incluindo o cabo do sensor, na Figura 8-21.

Figure 8-21: The channel with the cable attached and the PCB mounted so that the connector
faces toward the back (where the weapon attaches)
Existem dois PCBs, conectados a ambos os lados do canal com fita dupla face, para armazenar os LEDs e os
fotossensores. Esses PCBs são ligeiramente diferentes um do outro, como mostrado nas Figuras 8-22 e 8-
23. Os arquivos PCB para essas placas estão disponíveis para download em
https://www.nostarch.com/arduinoplayground/.

A parte superior de acrílico do canal do sensor media 1 3/8 × 7 5/8 polegadas. Eu usou um passador de
madeira reto para alinhar o cano com os sensores / LEDs.
Observe que existe um pequeno recuo, feito com uma broca de 1/2 polegada, na parte superior do acrílico
para permitir a visão ótica da pistola de ar Crossman T4.
Dois cronógrafos balísticos 249 As folhas de alumínio usadas para os lados mediam 1 3/8 × 7 5/8
polegadas.
Fiz os furos para fixar os lados de alumínio ao topo de acrílico com uma broca nº 30 e espaçei os furos 1
polegada. O acrílico foi perfurado com uma broca nº 43 e roscado para 4-40 parafusos. Veja a Figura 8-24
para especificações de perfuração para as peças de acrílico e alumínio. Os furos para o acrílico são
perfurados através da largura.
Além disso, como uma passagem para os fios do lado do LED até o lado do detector de foto, fiz dois furos #
43 em ambos os lados do quarto furos de montagem nas peças de acrílico e alumínio. A localização exata
desses orifícios não é crítica.
Além dos orifícios para fixação do acrílico, o alumínio necessários dois orifícios de cada lado para os pares
de LEDs e fotodetectores, e outros dois orifícios de um lado para montagem no cano (corrediça) da pistola
(A e B na Figura 8-24), perfurados com uma broca nº 25 e bateu para um parafuso 10-24. Confira o
tamanho dos LEDs IR. A maioria tem 5 mm e um orifício de 3/16 de polegada geralmente é um ajuste
apertado. O sensor Optoschmitt também se encaixa perfeitamente em um orifício de 3/16 de polegada. Os
orifícios para os LEDs e os fotossensores podem ser medidos com uma distância de apenas 3 polegadas ou
você pode medi-los para combinar com os PCBs montados na lateral.
Dependendo da (s) arma (s) que você pretende usar, convém ajustar o posicionamento dos furos A e B na
Figura 8-24. O canal do sensor também pode acomodar mais orifícios roscados para várias armas. Para
montar o canal do sensor no topo da pistola, usei parafusos de nylon com porcas de fixação.
Os parafusos de nylon foram capazes de apertar contra o acabamento em aço azulado da pistola sem
danificá-la.
Os parafusos para montar a pistola funcionaram bem com o Crosman T4, bem como em uma pistola de
pellets Crossman mais antiga (veja a Figura 8-25).
Figure 8-25: The sensor channel mounted on an older Crossman pellet gun. This angle shows the top (acrylic)
side of the channel.

No interior do canal, coloquei um adesivo de dupla face fita de espuma (se você puder encontrar uma fita
adesiva de espuma de um lado, tanto melhor) para proporcionar um ajuste mais confortável e proteger a
arma contra danos. Deixei a cobertura protetora do outro lado da espuma para que ela não aderisse à
arma nem estragasse o acabamento.
Dependendo da arma que você está usando, você pode adicionar um camada extra de espuma para cobrir
o canal, para que o centro do barril fique mais próximo do centro do canal. Mas desde que o cano não
esteja tão longe em ambos os lados que o projétil possa atingir o LED ou o detector fotográfico, centralizar
o cano perfeitamente não é crítico.
É essencial, no entanto, centralizar o ajuste vertical para que o LED / pares de detectores alinhados com a
trajetória do projétil. Para definir esse alinhamento, usei um passador de madeira reto do mesmo
diâmetro que o furo do cano, inseri-o parcialmente no cano da arma e, em seguida, ajustei a posição para
alinhar com os pares LED / detector. Depois de alinhado, aperte os parafusos de nylon para prender o
canal na arma.
Sensores de luz Optoschmitt e LEDs UV
Ao preparar o canal do sensor, experimentei vários tipos diferentes de LEDs e detectores para ver qual
oferece o melhor preço e desempenho.
As unidades compradas no eBay (pares de LED UV e fototransistor) funcionava bem, e eu os usei nas
versões iniciais do protótipo. No entanto, continuei a procurar um sensor que, com certeza, fosse rápido o
suficiente e proporcionasse boa sensibilidade em um campo estreito, o que ajuda a excluir a luz ambiente.
Depois de revisar várias amostras, escolhi o detector Optoschmitt SD5610 da Honeywell - assim chamado,
eu acho, porque inclui um circuito de gatilho Schmitt (veja a Figura 8-26).
O sensor Optoschmitt SD5610 é um pouco caro, mas possui um Ângulo de aceitação de 6 graus, que
funcionou bem para projéteis de todos os tamanhos, incluindo muito pequenos e grandes. Também
reduziu os efeitos da luz ambiente.
De acordo com o fabricante, o fotodetector consiste em um fotodiodo, amplificador, regulador de tensão,
gatilho Schmitt e um transistor de saída NPN com um resistor de tração de 10 quilogramas (nominal)
(consulte a Figura 8-26). O resistor de pull-up interno elimina a necessidade de um resistor externo no
circuito. Observe que existem duas versões deste dispositivo: o SD5600 e o SD5610. O SD5610 inclui um
inversor para que a saída seja baixa quando a luz ambiente estiver acima do limite de ativação. Como exigi
a saída invertida, usei o SD5610. A sensibilidade espectral é maior no comprimento de onda de 800 a 850
nm - a área dos LEDs infravermelhos mais comuns. Informação adicional na série SD5600 pode ser obtida
no site da Honeywell.
Para os LEDs, usei apenas LEDs IR regulares que reivindicavam saída no Faixa de 850–950 nm.
Simplesmente comprei uma sacola de 50 unidades no eBay e elas funcionam bem. Como alternativa, o
SparkFun oferece unidades únicas por um preço muito baixo.
Os LEDs e os fotossensores devem ser soldados nas PCBs feitas para eles e devem encaixar-se
confortavelmente nos orifícios. Prendi a placa de circuito impresso nas laterais do canal de aceleração
usando fita adesiva dupla face padrão da 3M.
Cabo Umbilical do Sensor
O cabo que usei para conectar o canal do sensor à balística completa O PCB do cronógrafo é feito de
quatro comprimentos de fio de calibre 30 torcidos juntos, presos com fita adesiva e conectados a um
conector Pololu de quatro condutores fêmea em cada extremidade. Esses conectores não são polarizados
e não possuem um retentor, portanto, podem ser relativamente facilmente desconectados ou conectados
de outra maneira. Antes de conectá-los, alinhe o fio com código de cores.
Inicialmente, tentei usar um cabo telefônico de quatro condutores, mas era muito rígido e causava
problemas.
O canal e o cronógrafo completo podem ser conectados facilmente.
Se você usou fio colorido, saberá que o plugue está conectado corretamente porque não está polarizado.
Configuração e operação finais
Depois de concluir a montagem da unidade e do canal do sensor, é hora de retirá-lo do alcance e
experimentá-lo. O Chronograph Lite e o Full Ballistic Chronograph foram projetados para operar com
energia da bateria, para que você não precise conectá-los. Configure o cabo umbilical para conectar o
canal do sensor à unidade do cronógrafo e, em seguida, monte o canal no a arma com segurança (veja a
Figura 8-27).

Figure 8-27: The completed Full Ballistic Chronograph with the acceleration channel
mounted to a Crossman 0.177 caliber pellet gun

Depois que o canal estiver conectado à arma, alinhe cuidadosamente o cano da arma com os LEDs /
detectores no canal usando uma cavilha reta do mesmo diâmetro que o furo do cano ou fazendo um
adaptador simples que use um comprimento reto de tubulação (veja a Figura 8-28).
Usando o cronógrafo balístico completo
Depois de alinhar o barril da melhor maneira possível, ative o Cronógrafo e pressione o botão de reset.
Aponte cuidadosamente para o seu alvo e dispare a arma. A velocidade do projétil em pés por segundo e o
tempo necessário para percorrer os três centímetros entre os sensores devem aparecer na tela LCD. Para
fazer outra medição, basta pressionar o botão de reset e disparar novamente.
Se, por acaso, você não alinhar a arma no canal corretamente, existe a possibilidade de o projétil
interromper o primeiro conjunto de fotosensores e não o segundo. Nesse caso, você pode pressionar o
botão Limpar e, em seguida, o botão Redefinir para tentar novamente. O interruptor de limpeza
simplesmente fecha a conexão para o segundo conjunto de fotosensor.
O cronógrafo balístico completo deve fornecer leituras precisas cerca de 300 fps a mais de 2.000 fps.
Usando o Chronograph Lite
O Chronograph Lite opera da mesma maneira, apenas é redefinido automaticamente para que nenhum
botão de reinicialização seja necessário. No entanto, se o projétil falhar em interromper o segundo
conjunto de sensores / detectores, será necessário limpar a tela pressionando o botão Limpar.
Essencialmente, isso faz o mesmo que interromper o segundo par de sensor / LED, mas você deve sempre
usar o botão Limpar e nunca tentar interromper o segundo par de sensor / detector com um objeto
externo - especialmente o dedo. A arma deveria acidentalmente, você pode sofrer uma lesão grave. O
Chronograph Lite fornecerá medições precisas de cerca de 200 fps a mais de 1.000 fps, mas sua precisão
tende a diminuir à medida que se aproxima dos 700 fps.
Usando com armas de alta potência
A menos que você tenha experiência com armas de fogo, eu recomendo fortemente o uso do cronógrafo
para medir armas de alta potência. Dito isto, eu testei o cronógrafo balístico completo em alguns deles.
A Figura 8-29 mostra o canal do sensor montado em uma pistola semi-automática de Smithfield XP / M 9
mm. Testei o cronógrafo com vários cartuchos e as medições ocorreram alguns fps da especificação do
fabricante da bala. Por exemplo, o Remington JHP afirma que a bala viaja a 1.155 fps e eu medi cerca de
1.152 fps. Outras armas também mediram perto das velocidades publicadas.

Phototransistor:
Many type working well.
I tested BPW17 and SFH309FA phototransistors.

PCB size:
81mm x 85mm
A tensão mínima de entrada é 7,5V
Corrente sem controlador (apenas LEDs IR): ~ 30mA
Com o MCU e o display de 7 segmentos em funcionamento: ~ 110mA

Se você não tiver fluxo de corrente, terá um problema de alimentação.

PROJETO DE REGISTRO DE VELOCIDADE MEDIA

tenho que desenvolver um projeto para calcular a velocidade media de uma material( imã) que passa por
dentro de tubos de alumino e tubo de PVC( é a experiencia do Tubo anti gravidade- Lei de Lenz) a ideia
inicial seria unir os dois tubos, sendo que o tubo de PVC ficaria na parte superior, instalar 3 sensores infra
vermelhos, 1 na entrada do tubo de PVC, 1 na saída do tubo de PVC, 1 na saída do tubo de alumínio, assim
que o material passar pelo primeiro sensor será iniciado a contagem de tempo, quando passar pelo 2
sensor será informada a velocidade media do período no display e armazenada, e abrira a contagem de
tempo novamente, ao passar pelo terceiro sensor será informada no display a velocidade media do
segundo período.
alguém pode ajudar?
Julio, bom dia.
Este projeto é um TCC?
O que voce já tem pronto deste projeto?
Parte mecânica, eletrônica, código, desenhos, fórmulas, etc?
Posta aqui e tb se tiver, fotos?
Assim poderemos auxilia-lo.
Não é TCC,
existe uma experiencia, que mostra a velocidade media de um imã quando passa por um tubo de
alumínio, que explica lei de Lenz, o vídeo esta no link https://www.youtube.com/watch?v=Sdoq9Q4D-dg a
ideia é complementar esta experiencia inserido um tubo de outro material, do mesmo comprimento e
analisar a velocidade media percorrida nos dois materiais. A mecânica é bem simples seria, cada tubo tem
o comprimento de 1 metro sendo emendado através de uma liva de pvc, vou enviar um esquema da
mecânica.
Oi Julio,
com o arduino,o código pra fazer isto é bem simples.
Modifique este código para fazer tb a 2a. medida.
Rui
// measures velocity of projectiles
// baseado no código postado por Bruno Godoi Eilliar

unsigned long Inicio=0; // variavel interia positiva para guardar o inicio da medida
unsigned long finish=0; // variavel interia positiva para guardar o fim da medida
float distance=10; // variavel floatpoint para informar a distancia para medida
// informar aqui a distancia entre os sensores em cm
float interval; // variavel floatpoint para guardar o calculo ente inicio e fim
float velocity; // variavel floatpoint para guardar guardar o calculo da velocidade
int done=1; // Flag para informar que foi feita a medida

int FlagInicio = 0; // Flag para informar que foi medido o tempo inicial
int FlagFinal = 0; // Flag para informar que foi medido o tempo final

int startPin = 4; // pino de entrada para sensor de inicio


int finishPin = 8; // pino de entrada para sensor de inicio
// -----------------------------------------------
void setup()
{
Serial.begin(9600); // Inicialização da serial
pinMode(startPin, INPUT_PULLUP); // definição do pino startPin como entrada e pull-up resistor
pinMode(finishPin, INPUT_PULLUP); // definição do pino finishPin como entrada e pull-up resistor

Serial.println("Medida de velocidad de projetil "); // Msg inicial


}
// -----------------------------------------------
void loop()
{
while(digitalRead(startPin) == LOW) // Faça se pino startPin esta obstruido
{
if (FlagInicio == 0) // Faça se ainda não tem medida inicial
{
Inicio = millis(); // Salva medida inicial em miliseg
Serial.println("Inicio "); // Informa que tem medida inicial
// Serial.println(Inicio); // informa valor da medida inicial
FlagInicio = 1; // informa que já tem medida inicial
}
}
while(digitalRead(finishPin) == LOW) // Faça se pino finishPin esta obstruido
{
if (FlagInicio == 1) // Faça se tem medida inicial
{
if (FlagFinal == 0) // Faça se ainda não tem medida final
{
finish = millis(); // Salva medida final em miliseg
Serial.print("Final "); // Informa que tem medida final
// Serial.println(finish); // informa valor da medida final
Serial.println(" "); // new line
done = 0; // informa que tudo foi medido
FlagFinal = 1; // informa que já tem medida final
}
}
}
while(!done) // fa;ca se tudo foi medido
{
interval = float(finish-Inicio); // calcula a diferença entre o inicio e o final em miliseg
velocity = (distance/interval)*60*60; // Divide distancia pelo tempo e multiplica por 3600(miliseg -->
minuto
Serial.println("Velocidade do projetil "); // Msg
Serial.print(velocity,4); // Imprime velocidade em cm/min com 4 casas decimais
Serial.println(" cm/min"); // msg sufixo
Serial.println("-----------------------"); // separador de msg
done = 1; // prepara para nova medida
FlagInicio = 0; // prepara para nova medida
FlagFinal = 0; // prepara para nova medida
finish = 0; // prepara para nova medida
Inicio = 0; // prepara para nova medida
}
}

JCP, segue o novo code,


testa e diga se ficou ok, pois aqui não tenho IDE.
Rui
// measures velocity of projectiles
// baseado no código postado por Bruno Godoi Eilliar
unsigned long Inicio=0; // variavel interia positiva para guardar o inicio da medida
unsigned long Meio=0; // variavel interia positiva para guardar o meio da medida
unsigned long finish=0; // variavel interia positiva para guardar o fim da medida
float distance=10; // variavel floatpoint para informar a distancia para medida
// informar aqui a distancia entre os sensores em cm
float interval1; // variavel floatpoint para guardar o calculo ente inicio e meio
float interval2; // variavel floatpoint para guardar o calculo ente meio e fim
float velocity1; // variavel floatpoint para guardar guardar o calculo da velocidade inicio meio
float velocity2; // variavel floatpoint para guardar guardar o calculo da velocidade meio fim
int done=1; // Flag para informar que foi feita a medida
int FlagInicio = 0; // Flag para informar que foi medido o tempo inicial
int FlagMeio = 0; // Flag para informar que foi medido o tempo meio
int FlagFinal = 0; // Flag para informar que foi medido o tempo final
int startPin = 4; // pino de entrada para sensor de inicio
int HalfPin = 6; // pino de entrada para sensor de meio
int finishPin = 8; // pino de entrada para sensor de inicio
// -----------------------------------------------
void setup()
{
Serial.begin(9600); // Inicialização da serial
pinMode(startPin, INPUT_PULLUP); // definição do pino startPin como entrada e pull-up resistor
pinMode(halfPin, INPUT_PULLUP); // definição do pino halfPin como entrada e pull-up resistor
pinMode(finishPin, INPUT_PULLUP); // definição do pino finishPin como entrada e pull-up resistor
Serial.println("Medida de velocidad de projetil "); // Msg inicial
}
// -----------------------------------------------
void loop()
{
while(digitalRead(startPin) == LOW) // Faça se pino startPin esta obstruido
{
if (FlagInicio == 0) // Faça se ainda não tem medida inicial
{
Inicio = millis(); // Salva medida inicial em miliseg
Serial.println("Inicio "); // Informa que tem medida inicial
FlagInicio = 1; // informa que já tem medida inicial
}
}

while(digitalRead(halfPin) == LOW) // Faça se pino finishPin esta obstruido


{
if (FlagInicio == 1) // Faça se tem medida inicial
{
if (FlagMeio == 0) // Faça se ainda não tem medida final
{
Meio = millis(); // Salva medida final em miliseg
Serial.print("Meio "); // Informa que tem medida final
Serial.println(" "); // new line
FlagMeio = 1; // informa que já tem medida final
}
}
}

while(digitalRead(finishPin) == LOW) // Faça se pino finishPin esta obstruido


{
if (FlagInicio == 1) // Faça se tem medida inicial
{
if (FlagFinal == 0) // Faça se ainda não tem medida final
{
finish = millis(); // Salva medida final em miliseg
Serial.print("Final "); // Informa que tem medida final
Serial.println(" "); // new line
done = 0; // informa que tudo foi medido
FlagFinal = 1; // informa que já tem medida final
}
}
}
while(!done) // faca se tudo foi medido
{
interval1 = float(Meio-Inicio); // calcula a diferença entre o inicio e o meio em miliseg
interval2 = float(finish-Meio); // calcula a diferença entre o meio e o final em miliseg
velocity1 = (distance/interval1)*60*60; // Divide distancia pelo tempo e multiplica por 3600(miliseg
--> minuto
velocity2 = (distance/interval1)*60*60; // Divide distancia pelo tempo e multiplica por 3600(miliseg
--> minuto
Serial.println("Velocidade do projetil 1a Parte"); // Msg
Serial.print(velocity1,4); // Imprime velocidade em cm/min com 4 casas decimais
Serial.println(" cm/min"); // msg sufixo
Serial.println("Velocidade do projetil 2a Parte"); // Msg
Serial.print(velocity2,4); // Imprime velocidade em cm/min com 4 casas decimais
Serial.println(" cm/min"); // msg sufixo
Serial.println("-----------------------"); // separador de msg
done = 1; // prepara para nova medida
FlagInicio = 0; // prepara para nova medida
FlagMeio = 0; // prepara para nova medida
FlagFinal = 0; // prepara para nova medida
finish = 0; // prepara para nova medida
Meio= 0; // prepara para nova medida
Inicio = 0; // prepara para nova medida
}
}

Cronógrafo Arduino, correção de código (modificado)

Olá pessoal,
Tive uma ideia que já havia ocorrido a alguém antes de mim aqui no fórum, apenas que gostaria de
melhorá-la.
O único problema é que, mesmo que eu tenha conhecimentos no campo da engenharia elétrica, não tenho
nenhum na programação.

O projeto envolve a construção de um cronógrafo softair baseado em arduino.


Os principais componentes são: um display de 16x2 caracteres, Arduino UNO e dois sensores
fototransistores Fairchild QRD1114.

Depois de ligado, faça o seguinte:


aguarde o primeiro ponto
medir e exibir na primeira linha da tela os "metros / segundo" do primeiro ponto,
meça e faça com que os "metros / segundo" do segundo ponto apareçam na primeira linha da tela
e assim por diante, para cada tiro disparado ...
na segunda linha, em vez disso, a média dos resultados obtidos dos medidores por segundo medidos até
aquele momento terá que aparecer.
Por enquanto, encontre esse código, se você puder me corrigir ...
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int firstsensPin = 4;
int secondsensPin = 5;
unsigned long time, time2;
float mps, elap;
int val;
int val2;

void setup()
{
lcd.begin(16, 2);
pinMode (firstsensPin, INPUT);
pinMode (secondsensPin, INPUT);
}
void loop()
{
lcd.println("Waiting");
val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 30)
{
val = analogRead(firstsensPin);
}

while (val2 > 30)


{
val2 = analogRead(secondsensPin);
}

while (val2 <= 30)


{
time2 = micros();
val2= analogRead(secondsensPin);
}
elap = time2 - time;

mps = x/elap; //Alla x sostituirò la distanza tra i sensori


lcd.print(mps );
}

. Funciona assim: você publica seu próprio código, que faz mais ou menos o que você pretende fazer e nós
o ajudamos a corrigi-lo e melhorá-lo.
Você já pensou nos problemas relacionados à luz? (sol, sombra, neon )
Você pensou no reflexo da cor do ponto
Pergunto-lhe isso porque nunca me fiz a pergunta de como fabricar este instrumento, mas, tendo usado
vários deles, que variam de baixas velocidades a 1400 / 1500fps, já vi MUITOS, MUITOS, até muitos que
deram os números, em vez do ProChrono, talvez o mais barato seja o que funciona melhor de todos !!!!
Após a atualização, digitei o código e simplifiquei as funções do cronógrafo.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte firstsensPin = A4;
const byte secondsensPin = A5;
unsigned long time, time2;
unsigned long shots = 0;
float sumspeed = 0;
float avgspeed = 0;
const int dist = 100; // sensor distance in mm.
float mps, elap;
int val;
int val2;

void setup()
{
lcd.begin(16, 2);
lcd.println("Ready!");
}

void loop()
{

val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 30) val = analogRead(firstsensPin);
time = micros();
while (val2 > 30) val2 = analogRead(secondsensPin);
time2 = micros();
shots++;
elap = time2 - time;
mps = (float)(dist*1000)/elap;
sumspeed += mps;
avgspeed = (float)sumspeed/shots;
lcd.setCursor(0,1);
lcd.println(mps);
lcd.print(avgspeed);
}

Verifique bem as conexões, para que não haja contatos falsos.


Tente isto
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte firstsensPin = A4;


const byte secondsensPin = A5;
unsigned long time, time2;
unsigned long shots = 0;
float sumspeed = 0;
float avgspeed = 0;
const int dist = 100; // sensor distance in mm.
float mps, elap;
int val;
int val2;

void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.print("Ready...");
}

void loop()
{

val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 40) val = analogRead(firstsensPin);
time = micros();
while (val2 > 40) val2 = analogRead(secondsensPin);
time2 = micros();
shots++;
elap = time2 - time;
mps = (float)(dist*1000)/elap;
sumspeed += mps;
avgspeed = (float)sumspeed/shots;
lcd.setCursor(0,0);
lcd.print("Cur speed: ");
lcd.println(mps,2);
lcd.print("Avg speed: ");
lcd.print(avgspeed,2);
}

Eu tentei o novo código, entrei na distância real, que é de cerca de 200mm.


O valor que aparece no visor é o do último "marcador" e ao lado do número aparece o primeiro dos dois
símbolos que apareceram antes.
A média não aparece, a única coisa semelhante à média é um número da ordem de algumas centenas
(como 840.0) que aparece quando eu cubro o primeiro sensor em vez da velocidade detectada (por
exemplo, velocidade Cur: 848.0) depois de ter detectou a primeira velocidade.
Além disso, os valores da velocidade detectada não são muito diferentes: eles variam de 0,00 a máximo de
0,02, sempre com o símbolo ao lado.
Acho que também precisamos mudar para alterar a unidade de medida e que há um problema com a
exibição dos valores no LCD.
Por exemplo, há um tempo atrás, tentei, com um exemplo do código do programa arduino para PC,
escrever no computador para fazer parecer o que escrevi na tela: notei que era necessário escrever mais
caracteres do que os que existem em uma linha para concluí-lo e vá para a cabeça.
Obrigado a quem está me ajudando.
Substitua a última peça por :

lcd.setCursor(0,0);
lcd.print("Cur speed: ");
lcd.print(mps, 1);
lcd.setCursor(0,1);
lcd.print("Avg speed: ");
lcd.print(avgspeed, 1);

reposicionando o cursor, temos certeza de que ele escreve nas duas linhas diferentes.
O , 1 deve indicar no visor para imprimir apenas um decimal.

A que velocidade esses pontos costumam viajar?


Uma abordagem diferente pode ser necessária usando interrupções e uma entrada digital.

Para o problema de sobreposição, você deve escrever espaços vazios antes de reescrever o número; é
claro que depois de escrever os espaços, é necessário reposicionar o cursor.
Para a mídia, talvez a fórmula precise ser revisada.
Se você mantiver o Arduino conectado ao PC, faça uma pequena depuração imprimindo as velocidades e o
tempo decorrido, bem como o número de disparos, na porta serial. Através do Monitor serial, você pode
ver se há comportamentos anormais.

Seguindo um guia, tentei este código:


void setup()
{
Serial.begin(9600);
}

void loop()
{

val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 40) val = analogRead(firstsensPin);
time = micros();
Serial.println("primo sensore");
while (val2 > 40) val2 = analogRead(secondsensPin);
time2 = micros();
Serial.println("secondo sensore");
shots++;
elap = time2 - time;
mps = (float)(dist*1000)/elap;
sumspeed += mps;
avgspeed = (float)sumspeed/shots;
Serial.print("Cur speed: ");
Serial.println("corrente");
Serial.print(mps, 1);
Serial.print("Avg speed: ");
Serial.println("media");
Serial.print(avgspeed, 1);
Serial.println("secondamedia");
}

editar por mod: inclua o código usando as tags apropriadas

A operação segue este curso:


Quando abro o primeiro sensor, o "primeiro sensor" aparece na tela (sem as aspas), quando abro o
segundo
"segundo sensor A
velocidade atual éexibida:
0,0 Velocidade média: média
0,0 segundo "
quando eu cobrir o primeiro novamente, em vez de apenas" primeiro sensor "aparecer
" primeiro sensor
segundo sensor
Velocidade atual: atual
20,2 Velocidade média:primeiro sensormédio
10,1
segundo "

ie" primeiro sensor "em começo e fim mais tudo o resto.


No total, cobrindo o primeiro sensor, depois o segundo,
"primeiro sensor
segundo sensor de
velocidade Cur: corrente
0.0Avg velocidade: média
0.0secondamedia
primeiro sensor
segundo sensor de
velocidade Cur: corrente
20.2Avg velocidade: média
10.1secondamedia
primeiro sensor"

Como você faria o código com interrupções?


Eu removi o time = micros e digitei startTime e elapsedTime.
O problema é que, neste caso (semelhante ao que aconteceu com o código anterior), ele fornece os
primeiros valores de Curspeed e Avgspeed iguais a 0,0, continuando a fornecer valores de velocidade
mesmo quando eu cobrir o primeiro sensor (o que não deve porque quando eu abro o primeiro sensor, ele
começa a contar os microssegundos).
Você deve redefinir (ou alterar para 0) o tempo (entre a linha "while ..." do primeiro sensor e startTime ou
no final do loop) para que, quando eu abranger o primeiro, ele nem demore o tempo que tinha
anteriormente.
Um pouco como um cronômetro, se você não redefinir o tempo, não fará nada além de parar e reiniciar a
contagem de milissegundos a partir do

Aqui está o código:


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte firstsensPin = A4;


const byte secondsensPin = A5;
long startTime;
long elapsedTime ;
unsigned long shots = 0;
float sumspeed = 0;
float avgspeed = 0;
const int dist = 150; // sensor distance in mm.
float mps, elap;
int val;
int val2;

void setup()
{
Serial.begin(9600);
}

void loop()
{

val = analogRead(firstsensPin);
val2 = analogRead(secondsensPin);
while (val > 40) val = analogRead(firstsensPin);
startTime = micros();
while (val2 > 40) val2 = analogRead(secondsensPin);
elapsedTime = micros() - startTime;
shots++;
mps = (float)(dist*1000)/elapsedTime;
sumspeed += mps;
avgspeed = (float)sumspeed/shots;
Serial.print("Cur speed: ");
Serial.print(mps, 1);
Serial.print("Avg speed: ");
Serial.print(avgspeed, 1);
}

Cronógrafo con Arduino


Publicado el 5 de noviembre de 2012por nosoybob
Damas y caballeros.

Éste quizás sea uno de los proyectos más buscados para hacer con Arduino.

Un cronógrafo es un aparato electrónico que se encarga de medir la velocidad de proyectiles.

Lo que hace éste proyecto tan buscado, es porque los buenos cronógrafos son costosos y no muy
fáciles de conseguir. El hecho de que sean construidos por uno mismo le da ese toque de
personalidad y lo hace además divertido.

Entonces, después de buscar, buscar, buscar y buscar finalmente encontré el código, al cual le hice
unas pequeñas modificaciones.

Por ahora lo he probado sólo con dos botones conectados a los pines digitales 2 y 3 y todo parece
estar en orden.

Así que aquí les dejo el código.

/*
Tomado de http://aeroquad.com/showthread.php?845-How-do-I-make-a-
tachometer-with-my-spare-arduino-board-and-IR-LED-and-RECEIVER
Modificado por Pablo Andrade Mejía http://www.arduinolab.wordpress.com

05 de Noviembre de 2012

Se le añadió la función de enviar la velocidad en metros por segundo y pies


por segundo al monitor serial
lo que quita la necesidad de tener una pantalla de cristal líquido

Aquellos que tengan dudas acerca de cómo se debe conectar los sensores para
que funcione correctamente
hagan click aquí http://www.instructables.com/id/Arduino-Based-Optical-
Tachometer/step3/IR-Detector-Circuit/
Los fotodiodos o fototransistores son nombrados como attachInterrupt(0, fro
nt, CHANGE); Éste está relacionado
con el pin digital 2, y, el attachInterrupt(1, rear, CHANGE); Éste está rel
acionado con el pin digital 3

Quienes quieran probarlo pueden conectar dos botones a los pines 2 y 3

Los fotodiodos deben tener una resistencia entre 10k y 100kohm conectados a
l colector (pin, o pata larga) y esta al pin digital
para asegurarnos que cuando el haz de luz sea interrumpido el voltaje llegu
e a 0 o tierra
*/

#include <LiquidCrystal.h>

#define MPS2FPSCOEFF 3.28084


#define LENGTH 0.159
#define MICRO2SEKCOEFF 1000000

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

volatile int stateFront = HIGH;


volatile int stateRear = HIGH;

int led1 = 12;


int led2 = 13;
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed; //double tiene la misma función que float, así
que no hay que preocuparse

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Super Chrono");
Serial.print("Cronografo");
lcd.setCursor(0, 1);
lcd.print("by Honk");
delay(700);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
Serial.println("Inicializando");
delay(700);
lcd.clear();
startChrono = 0;
elapsed = 0;
fpsSpeed = mpsSpeed = 0;

pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
/*
Sí los resultados no son los esperados donde dice CHANGE cambien por RISI
NG o LOW
tanto como en attachInterrupt(0, front, " "); como en attachInterrup
(1, rear, " ");

Sí todo resulta bien simplemente no hagan nada


*/
attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske
falling/rising/low
attachInterrupt(1, rear, CHANGE); //1 (on digital pin 3)

lcd.setCursor(0, 0);
lcd.print("Take a shot!");
Serial.println("Preparado para disparar?");
}

void loop()
{
//Start counting when interrupted
if(stateFront == LOW && startChrono == 0)
{
startTime = micros(); // Count microseconds since start
startChrono = 1; // Set Chrono flag
digitalWrite(led1, HIGH);
}

// Stop counting and calculate speed


if(stateRear == LOW && startChrono == 1)
{
stopTime = micros(); // Count microseconds since start
startChrono = 0; // Clear Chrono flag
elapsed = stopTime - startTime; // Calculate elapsed time (in us)

digitalWrite(led2, HIGH);
mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed; // s = v *
t, v = s / t
fpsSpeed = mpsSpeed * MPS2FPSCOEFF;

lcd.clear();
lcd.print("Fps: ");
lcd.print(fpsSpeed);
Serial.println("PPS(Pies por segundo) ");
Serial.print(fpsSpeed);
lcd.setCursor(0, 1);
lcd.print("m/s: ");
lcd.print(mpsSpeed);
Serial.println("Metros por segundo ");
Serial.print(mpsSpeed);

startChrono = 0;

delay(500);
digitalWrite(led2, LOW);
digitalWrite(led1, LOW);

void front()
{
stateFront = !stateFront;
}

void rear()
{
stateRear = !stateRear;
}

Continuando con el proyecto del cronógrafo para balística.


Publicado el 6 de noviembre de 2012por nosoybob
Un poco de teoría detrás de todo esto.

Un cronógrafo tiene dos partes importantes.

La primera es el cerebro, circuito integrado o microcontrolador

La segunda los sensores de luz.

La manera en que este funciona es simple, el microcontrolador está configurado como un


temporizador al cual se le añaden una serie de ecuaciones matemáticas.

Todo empieza cuando el proyectil pasa por los sensores de luz, cuando uno el primero detecta una
sombra que es causada por el proyectil al pasar. Ésta señal eléctrica es enviada al micro el cual
empieza a contar la cantidad de tiempo, cuando el proyectil pasa por el segundo sensor causa que
micro pare de contar la cantidad de tiempo, una vez esto ha ocurrido aplica la siguiente ecuación
v= d/t dónde v es velocidad, d es distancia (la cual ya debe ser conocida) y t es tiempo, entonces
sería como decir velocidad es igual a distancia sobre tiempo. Una vez todo esto ha ocurrido la
información se muestra en una pantalla LCD.
Suena simple, pero cuando llegamos a la parte de programación todo cambia.

Ahora hablemos de los sensores de luz. Generalmente éstos sensores de luz son conocidos como
fotodiodos o fototransistores, sabemos que los transistores tienen tres terminales una llamada
colector, otra base y una llamada emisor, y la manera en que éstos funcionan es cuando se aplica
una cantidad de corriente a la base otra cierta cantidad de corriente puede fluir a del colector al
emisor.

Los fototransistores a diferencia de los transistores comunes tienen dos terminales colector la
terminal más larga y emisor la terminal más corta, pero la corriente sólo puede fluir de colector a
emisor si hay luz sobre el de manera que cuando un proyectil bloquea los sensores la cantidad de
corriente que fluye disminuye cantidades, pero no lo suficiente para que el micro lo determine
como que no hay corriente, así que se usan resistencias para hacer caer el voltaje a cero o tierra.

Básicamente ésta es toda la teoría.

Ahora les dejaré un ejemplo de cómo deben ir los sensores conectados a la Arduino y el código.

/*
Tomado de http://aeroquad.com/showthread.php?845-How-do-I-make-a-
tachometer-with-my-spare-arduino-board-and-IR-LED-and-RECEIVER
Modificado por Pablo Andrade Mejía http://www.arduinolab.wordpress.com

05 de Noviembre de 2012

Se le añadió la función de enviar la velocidad en metros por segundo y pies


por segundo al monitor serial
lo que quita la necesidad de tener una pantalla de cristal líquido
Aquellos que tengan dudas acerca de cómo se debe conectar los sensores para
que funcione correctamente
hagan click aquí http://www.instructables.com/id/Arduino-Based-Optical-
Tachometer/step3/IR-Detector-Circuit/

Los fotodiodos o fototransistores son nombrados como attachInterrupt(0, fro


nt, CHANGE); Éste está relacionado
con el pin digital 2, y, el attachInterrupt(1, rear, CHANGE); Éste está rel
acionado con el pin digital 3

Quienes quieran probarlo pueden conectar dos botones a los pines 2 y 3

Los fotodiodos deben tener una resistencia entre 10k y 100k ohm conectados
al emisor (pin, o pata corta) y ésta a los pines digitales
para asegurarnos que cuando el haz de luz sea interrumpido el voltaje llegu
e a '0' o tierra

El colector (pin, o pata larga) debe ir a 3.3v o 5v


*/

#include <LiquidCrystal.h>

#define MPS2FPSCOEFF 3.28084


#define LENGTH 0.159
#define MICRO2SEKCOEFF 1000000

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

volatile int stateFront = HIGH;


volatile int stateRear = HIGH;

int led1 = 12;


int led2 = 13;
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed; //double tiene la misma función que float, así
que no hay que preocuparse

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Super Chrono");
Serial.print("Cronografo");
lcd.setCursor(0, 1);
lcd.print("by Honk");
delay(700);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
Serial.println("Inicializando");
delay(700);
lcd.clear();

startChrono = 0;
elapsed = 0;
fpsSpeed = mpsSpeed = 0;

pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
/*
Sí los resultados no son los esperados donde dice CHANGE cambien por RISI
NG o LOW
tanto como en attachInterrupt(0, front, " "); como en attachInterrup
(1, rear, " ");

Sí todo resulta bien simplemente no hagan nada


*/
attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske
falling/rising/low
attachInterrupt(1, rear, CHANGE); //1 (on digital pin 3)

lcd.setCursor(0, 0);
lcd.print("Take a shot!");
Serial.println("Preparado para disparar?");
}

void loop()
{
//Start counting when interrupted
if(stateFront == LOW && startChrono == 0)
{
startTime = micros(); // Count microseconds since start
startChrono = 1; // Set Chrono flag
digitalWrite(led1, HIGH);
}

// Stop counting and calculate speed


if(stateRear == LOW && startChrono == 1)
{
stopTime = micros(); // Count microseconds since start
startChrono = 0; // Clear Chrono flag
elapsed = stopTime - startTime; // Calculate elapsed time (in us)

digitalWrite(led2, HIGH);
mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed; // s = v *
t, v = s / t
fpsSpeed = mpsSpeed * MPS2FPSCOEFF;

lcd.clear();
lcd.print("Fps: ");
lcd.print(fpsSpeed);
Serial.println("PPS(Pies por segundo) ");
Serial.print(fpsSpeed);
lcd.setCursor(0, 1);
lcd.print("m/s: ");
lcd.print(mpsSpeed);
Serial.println("Metros por segundo ");
Serial.print(mpsSpeed);

startChrono = 0;

delay(500);
digitalWrite(led2, LOW);
digitalWrite(led1, LOW);

void front()
{
stateFront = !stateFront;
}

void rear()
{
stateRear = !stateRear;
}

Blog da Gadjet
Atualização do cronógrafo
Quando fiz um parafuso menor no sensor que se conectava ao PC e inseri o tempo em um aplicativo para
PC, ele me fez pensar em diferentes tipos de tela que poderiam ser usados e, depois de uma boa olhada na
rede, encontrei algumas opções .

O primeiro foi um display LED de 7 segmentos, com diferentes formas e tamanhos e ainda assim pode ser
bastante portátil quando adicionado ao sensor.
O único problema com esses monitores é a quantidade de E / S necessária para conduzi-los, pois cada um
dos segmentos exige condução. Encontrei a mochila de tela Adafruit 7, que tira todo o trabalho duro de
controlar as telas de 7 segmentos.

Os detalhes da mochila podem ser encontrados aqui

O dispositivo é baseado em um chip Holtek HT16K33 que controla os segmentos de LED e se conecta ao
Arduino através do barramento I2C e possui uma biblioteca que facilita o envio de dados para a tela.

Comprei um dos monitores do Ebay e o colei na lateral do tubo do sensor. Em seguida, adicionei o código
ao esboço para enviar o valor em pés / segundo ao monitor depois de enviar o valor uSecond para o PC.

Isso permitiria que o cronógrafo fosse usado em conjunto com o PC via USB ou remotamente com uma
bateria, apenas lendo o valor Feet / Second.
Mostrar os pés / segundo exigiria uma tabela de pesquisa para obter a potência da velocidade e do peso
do pellet, suponho que com alguns pequenos botões adicionados, você pode inserir o peso do pellet após
a energização, mas antes da primeira tacada alterne entre o FPS e a leitura de energia a cada 10 segundos
?.

Eu tentei usando minha pistola CP Sport Co2 e ela parece boa.


Depois, usei um pouco do dissipador de calor de PVC, normalmente usado para baterias, é muito bom
porque encolhe usando um secador de cabelo e é bastante duro quando está frio, mas pode ser facilmente
removido com uma tesoura ou uma faca.

Idealmente, eu gostaria de usar um pouco de transparência, mas só tenho vermelho ou branco, mas
surpreendentemente o LED mostra muito bem o PVC.

Coisas para pensar: -


 Gravando os dados da captura na EEPROM para recuperação posterior
 Adicionando botões para permitir que o peso do pellet seja inserido
 montar uma bateria para uso remoto
 Pense em esquemas de economia de energia
 Exibir energia da bateria ao ligar?
 Quem sabe?
O Nano Sketch pode ser baixado aqui. Você pode usá-lo com ou sem um PC. Se você quiser que o
aplicativo para PC me avise nos comentários, ainda é muito BETA.
Arquivo Fritzing aqui .

Mais sobre a segunda opção que encontrei mais tarde .....


em 25 de maio de 2013
Enviarpor e-mailBlogThis!Compartilhar no TwitterCompartilhar no FacebookCompartilhar no Pinterest
Etiquetas: 7 segemet , carabina de ar , airgun , Arduino , arduino nano , Arduino Uno
Sketch , cronógrafo , cronógrafo DIY , exibição de sete segmentos
130 comentários:
disse Randy ...
Olá, Nice post obrigado por compartilhar. Você poderia adicionar uma mensagem ao meu site na sua
próxima postagem? Eu retornarei o favor. Envie-me um email de volta. Obrigado!

Randy
randydavis387 em gmail.com

Gadgets
4 de junho de 2013 às 06:14

Jak Broadway disse ...


oi, esta é uma ótima leitura, estou interessado nos 7 segmentos que você concluiu. poderia me dizer de
onde você tirou os fotodiodos opl55c, já que eu não consigo encontrá-los em nenhum lugar?
27 de novembro de 2013 às 01:21

Gadjet disse ...


Jak,
Leia este post
http://gadjetsblog.blogspot.co.uk/2013/07/diy-chrono-shopping-list.html
No final, listei as fontes dos leds, etc.
27 de novembro de 2013 às 06:53

g.broomfield disse ...


oi muito interessado no crony, acabei de receber meu primeiro arduino uno e adoro pistolas de ar (alvo de
campo de tiro), isso parece um ótimo projeto para atrapalhar minha arma, muito interessado no lado do
software do pc para traçar uma série de tiros como eu sou Noob completo quando se trata de
programação, crescido em plc, s
não c ++ ou básico. você pode postar um link para o software em seu site, obrigado
19 de dezembro de 2013 às 19:28

s3k0 disse ...


bom blog e projetos,

podemos usar um sensor diferente do opl550?


28 de março de 2014 às 23:34

Gadjet disse ...


Obrigado,
sim , você pode usar qualquer LED e detector de infravermelho, usei aqueles com uma saída digital para
economizar no circuito de condicionamento de sinal externo.
Você pode usar um fototransistor simples, mas seria uma saída analógica e também garantirá que o tempo
de resposta seja rápido o suficiente.
29 de março de 2014 às 08:13

s3k0 disse ...


não posso esperar meus pedidos da china,
eu vou te dar dor de cabeça quando chegou :)
10 de abril de 2014 às 04:19

s3k0 disse ...


novamente oi gadjet

eu tenho o i2c display como este;


http://www.mauroalfieri.it/en/elettronica/display-lcd-1602-i2c-pcf8574t.html

então, como posso criar um arquivo skecth para essa tela, graças a
serkan
sekocan em gmail.com
15 de abril de 2014 às 12:25

Gadjet disse ...

serkan,
Não sabe ao certo o que você pergunta, a página que você vincula à sua postagem contém o código da tela
Você já tentou esse código?
15 de abril de 2014 às 16:20

s3k0 disse ...


desculpe pela minha pergunta de novatos para você ..
eu comprei o protocolo 16x02 lcd-i2c e no chip diz "pcf8574t",
então como é o código (endereço) no arquivo skecth para esse lcd
?
// inicializa a biblioteca com os números dos pinos da interface
// padrão LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
LiquidCrystal lcd (7, 8, 6, 5, 4, 3);
essa coisa só 4 pinos 5v, gnd, sda, scl como adafruit eu acho, mas eu não sei como :(

outra pergunta;
eu tinha 2 pinos ir led e emissor olhei seu desenho fritzing (7 seg disp) opl550 3 pinos (+ , logicOut, -)

Isso faz alguma diferença?


15 de abril de 2014 às 17:26

Gadjet disse ...


Não tem problema, eu já fui novato.
A interface I2C não usa a biblioteca LCD padrão com todos os pinos definidos.
O LCD I2C usa uma biblioteca diferente com apenas o endereço I2C do LCD especificado, ou seja, 0x27.
O link para a biblioteca está aqui http://www.robot-italy.com/download/LiquidCrystal_I2C1602V1.zip
Salve a biblioteca em uma pasta dentro da pasta de bibliotecas da pasta do programa Arduino e, em
seguida, você pode usar o código conforme mostrado na link da página da web que você me enviou, deve
funcionar, deixe-me saber como você se sai ou se tiver mais perguntas.

Você também pode visitar o site www.arduino.cc. Existe um bom fórum para obter respostas e código de
tutorial.
15 de abril de 2014 às 17:35

Gadjet disse ...


s3k0,
Se você estiver usando um detector IR de dois pinos, precisará converter a saída analógica do detector em
uma saída digital para alimentar o pino de entrada do 328p, esse é o principal motivo para perseguir um
detector com uma saída digital.
Qual é a parte não. do receptor de infravermelho que você está usando?
15 de abril de 2014 às 17:39

Gadjet disse ...


sk30,
Aqui está um link para algumas informações sobre circuitos de fotodiodo.
http://www.fiz-ix.com/2013/04/ir-photodiode-circuit-schematic/
Espero que ajude.
15 de abril de 2014 às 17:48

s3k0 disse ...


estou usando led de 5mm e emissor, não sei o que são exatamente :)
http://www.aliexpress.com/item/20pcs-5mm-940nm-LEDs-infrared-emitter-and-IR-receiver-diode-10pairs
-diodos-301A / 1579718658.html

e rastrear isso;

http://www.aliexpress.com/item/IIC-I2C-1602-blue-LCD-module-provides-libraries-For-
Arduino/1062018842.html

http://s27.postimg.org/3r9iz9ttv/IMG_20140416_072842.jpg

http://s27.postimg.org/6mmm64xtv/IMG_20140416_073028.jpg
16 de abril de 2014 às 05:36

Anônimo disse ...


s3k0,
estou um pouco preso, as coisas que você precisa considerar com o receptor ir são a velocidade, os
fototransistores têm um tempo de resposta à mudança do nível de luz, alguns são mais rápidos que outros,
não consigo encontrar a sua velocidade no especificação.
Idealmente, você precisa colocar o receptor em série com um resitor (conforme os circuitos no link da
página que eu publiquei) e usar um osciloscópio para observar a forma de onda ao passar algo entre o
emissor e o detector.
Esta é a razão pela qual eu usei o detector mais caro com a saída digital, é muito menos aborrecido ......
16 de abril de 2014 às 08:53

s3k0 disse ...


finalmente eu tenho imagem na tela lcd :)

editado skecth como este para o meu lcd;


https://docs.google.com/document/d/1tuZnfQ873t8fuN8SA_UkAH5Sd_z5usaBuBNfiaWjLjo/edit?usp=shari
ng

agora, estou tentando stucking :) ir emissor-receptores


16 de abril de 2014 às 11:58
Gadjet disse ...
s3k0,
Outra coisa sobre a sua configuração: o emissor / detector de infravermelho deve ser encoberto para
impedir o vazamento de infravermelho ao redor do objeto que quebra o feixe de infravermelho. Na minha
configuração de teste, usei um tubo com orifícios ....

http: // 3.bp.blogspot.com/-i10QqXOQeDA/URfGY4-
MhzI/AAAAAAAALHk/OOKinhG2BHk/s1600/Prototype+tube+setup.jpg
16 de abril de 2014 às 23:57

s3k0 disse ...


novamente olá,
você disse: "Se você estiver usando um detector de infravermelho de dois pinos, precisará converter a
saída analógica do detector em uma saída digital para alimentar o pino de entrada do 328p, essa é a
principal razão para perseguir um detector com uma saída digital "
sim, estou usando um detector ir de 2 pinos, como posso fazer isso?
u pode desenhar esquema para manequim (eu) como exatamente
17 de abril de 2014 às 14:08

Gadjet disse ...


s3k0,
este link mostra o circuito para tentar.
http://www.fiz-ix.com/2013/04/ir-photodiode-circuit-schematic/

Isso fornecerá uma saída variável para a entrada ADC, mas haverá um ponto em que o nível será visto
como digital 1 ou 0, acho que é um terço do VCC ou abaixo de 0 ou acima de dois terços do VCC para ser 1.
Você também pode alimentar o sinal através de um Schmitt Trigger ou buffer opamp para obter uma saída
digital limpa.
Seria muito mais fácil usar os mesmos detectores de infravermelho que eu usei ...... :-) especialmente se
você não estiver familiarizado com a eletrônica.
17 de abril de 2014 às 19:33

Gadjet disse ...


Aqui estão alguns links que podem ajudar.
http://www.boondog.com/tutorials/irled/ir.html

http://www.electroschematics.com/tag/photodiode-circuits/?ModPagespeed=noscript
Espero que ajudem.
17 de abril de 2014 às 19:40

s3k0 disse ...


ainda não consigo entender que os receptores de led:
eu estou piscando 999fps na tela se sou um emissor do bloco 1, ele é interrompido enquanto o monitor
serial me diz um loop de 20 nos 20 nos :) algo está errado, mas eu não posso te dizer :(

http: //www.youtube.com/watch?v=tAWjfIinq3Pode

criar um arquivo Fritzing para mim?


18 de abril de 2014 às 19:09

s3k0 disse ...


se eu for comprar sensor opl550 posso obter um bom resultado, quero dizer é que funciona :)
18 de abril de 2014 às 23:47

Gadjet disse ...


Você tentou o arquivo fritzing?

O meu funciona, então você deve! Lembre-se de que os LEDs devem estar em cada lado de um tubo.
19 de abril de 2014 às 08:36

s3k0 disse ...


Ainda não consigo fazê-lo funcionar ... posso precisar alterar algo no arquivo skecth ??
19 de abril de 2014 às 13:22

Gadjet disse ...


Volte ao básico.
Use o esboço desta publicação, não se preocupe com a tela, apenas use a saída serial. (Adicione seu código
de exibição posteriormente)

Conecte dois comutadores às entradas (pinos 2 e 3, eu acho) e use os comutadores para acionar as
entradas e verifique se os dados seriais estão de acordo.

Quando isso funcionar conforme o esperado, adicione os gatilhos de infravermelho, mas verifique se a
configuração é adequada para obter um bom gatilho de feixe de ruptura.
19 de abril de 2014 às 15:59

s3k0 disse ...


botões e resultados clicados aleatórios;

Duração 24 uS
Duração 268740 uS
Duração 73940 uS
Duração 24 uS
Duração 20 uS
Duração 20 uS
Duração 20 uS
Duração 20 uS
Duração 88064 uS
Duração 20 uS
Duração 166816 uS
Duração 145036 uS
Duração 91928 uS
Duração 20 uS
Duração 107672 uS
19 de abril de 2014 às 20:14

Gadjet disse ...


Eu segurei os dois interruptores sob o polegar e pressionei ao mesmo tempo (girando o polegar) de modo
que a entrada do gatilho 1 sempre fosse pressionada levemente antes da entrada do gatilho 2 ou de um
interruptor em cada mão e, depois de um cronômetro, pressione um segundo de intervalo .

Se as leituras parecerem boas, o esboço será bom. O próximo passo será resolver os feixes de
infravermelho.
19 de abril de 2014 às 20:24

s3k0 disse ...


finalmente eu consegui progresso ...
tudo que eu precisava era opl550a :) problema resolvido ..
agora a próxima pergunta max fps 999 posso obter mais?
7 de maio de 2014 às 11:36

Gadjet disse ...


Boas notícias, você não está no Reino Unido se quiser mais de 999 fps.
Examinarei o código hoje à noite, mas há uma verificação simples para ver se o valor está abaixo de 999 e
apenas enviar dados, se possível, isso pode ser alterado para o valor que você desejar.
Haverá uma limitação à rapidez com que a detecção será, mas ainda não descobri.
7 de maio de 2014 às 13:00

Gadjet disse ...


Esta é a linha no código
fps = constrain (fps, 0,999); // limita fps a um valor positivo de até 999

Além disso, você definiu a sua distância do sensor corretamente.

SensDist longo não assinado = 333333; // Distância entre sensores em pés * 1000000
7 de maio de 2014 às 15:23

s3k0 disse ...


oi novamente,
estou testado sistema hoje, então eu tenho 1515fps :) eu sei o seu errado porque eu tenho mk4is 16grain
875-876fps sempre
assim que você disse;

Você também definiu a distância do sensor corretamente.

SensDist longo não assinado = 333333; // Distância entre sensores em pés * 1000000
como você conseguiu 33333? Qual é a fórmula que esta coisa pode me explicar obrigado ...
3 de junho de 2014 às 21:56

Gadjet disse ...


Desculpe se você já disse, mas qual é a distância entre seus sensores, o calc para dar 333333 ois por
100mm.
Calcule para 60mm =
((60mm / 2,54) / 12) × 1000000 = 196850
Espero que isso resolva , isso daria 896,4 fps
3 de junho de 2014 às 22:33
Gadjet disse ...
s3k0,
você funcionou corretamente?
5 de junho de 2014 às 16:59

s3k0 disse ...


arquivo skecth editado para obter a distância correta do acionador, mas ainda não posso testar, informarei
quando testei
5 de junho de 2014 às 18:02

s3k0 disse ...


Eu testei hoje algumas fotos, eu entendi algo errado de 820-805-824fps, mas eu não sei porque o mesmo
rifle com chrony original 860-865fps com 13,43 grãos (FX 12 com regulador)
11 de junho de 2014 às 17:21

Gadjet disse ...


Parece ser melhor do que antes, mas ainda não é consistente.
O PCP com regulador seria mais consistente, algumas coisas que podem afetar as leituras: -
a montagem e a distância entre os sensores, eu encaro o par detector de emissor um pelo outro através de
um orifício de 2 mm para tentar criar uma área próxima de disparo.
O tubo de metal que uso mantém a maior parte da luz ambiente.
Os furos são exatamente através do centro do tubo, para que os pellets viajem através do centro do feixe.
O tubo está firmemente preso ao cano.

Devo admitir que realmente não olhei para a variação de fps em uma série de fotos. Só me interessei pelo
aspecto de potência. É possível que o software esteja introduzindo uma variação na leitura, talvez usando
interrupções para acionar o medição poderia melhorar a consistência, eu vou olhar para ele.
11 de junho de 2014 às 18:43

Gadjet disse ...


Outro pensamento, o FPS é bastante alto, no Reino Unido 760 fps é mais comum, com uma velocidade
mais alta, há menos tempo para medir a viagem 96uS a 860fps, isso significaria que algumas diferenças nos
EUA fariam uma alteração maior nos fpes indicados .
A que distância estão suas vigas? tente aumentá-las, talvez 100 mm, isso daria um intervalo mais longo,
tornando menos importante qualquer variação do ciclo do processador.
11 de junho de 2014 às 18:56

Gadjet disse ...


96 uS / polegada.
11 de junho de 2014 às 18:57

Brian O'Sullivan disse ...


Ao tentar verificar a seção a seguir, realce "Matriz Adafruit_7segment = Adafruit_7segment {}; com o
comentário afirmando" 'Adafruit_7segment' não nomeia um tipo ". A seção destacada está no início do
esboço logo após" #include "Adafruit_GFX. h ". Isso precisa ser alterado ou estou faltando alguma outra
coisa na minha configuração.? Qualquer ajuda seria muito apreciada. Tenho pouca ou nenhuma
experiência com a redação de esboços do Arduino, mas encontrei seu design on-line e gostei muito das
características do cronógrafo e realmente queria criar um. Então, eu realmente espero que você possa me
ajudar nesse desligamento e me tirar da filmagem. Obrigado novamente pelo seu tempo e ajuda com esse
problema.
8 de novembro de 2014 às 01:49

s3k0 disse ...


fiz outro cronômetro usando attiny2313

http://www.youtube.com/watch?v=zFlcWr1jlRg
8 de novembro de 2014 às 05:00

Gadjet disse ...


Brian,
suponho que você quer dizer que está recebendo um erro ao compilar o esboço, baixou as bibliotecas
adafruit e as colocou na pasta da biblioteca? Acho que seu esboço está procurando a biblioteca.
8 de novembro de 2014 às 08:32

Gadjet disse ...


sk30,
Parece realmente bom, eu gosto do fato de a tela estar voltada para você.
qualquer chance de algumas fotos melhores ou talvez algum código, tenho alguns smt attinys chutando em
algum lugar, gostaria de fazer um pcb incluindo os leds e o processador, seria bem pequeno.
8 de novembro de 2014 às 08:38

O cronógrafo disse ...


Isso permitiria que o cronógrafo fosse usado em conjunto com o ... ochronograph.blogspot.de
9 de janeiro de 2015 às 20:16

Anônimo disse ...


Oi

É possível fazer um esboço de como os componentes são conectados entre si?


13 de novembro de 2015 às 20:04

Gadjet disse ...


Desculpe, eu não entendo, há um esboço no post, você quer dizer outra coisa?
13 de novembro de 2015 às 21:24

Anônimo disse ...


Gadjet, obrigado pela sua resposta.
Eu comprei os itens como abaixo:
Foto sensor OPL550A
IR Emissor LED OP240A
Gostaria de saber. Eu deveria adicionar um resistor?
15 de novembro de 2015, 13:55

Gadjet disse ...


Minhas desculpas, você está correto, adicione um resistor ao fornecimento de emissores de LED conforme
necessário para limitar a corrente, eu deveria tê-los adicionado ao circuito.
15 de novembro de 2015 às 15:08

Anônimo disse ...


Que tipo de valores devem ser os resistores para o LED OP240A?
Não sou especialista nisso, mas acho que 160Ω será bom.
Os dados do resultado do cálculo http://optekinc.com/datasheets/op240-245.pdf
Algo vai acontecer se eu der um resistor maior 200Ω
15 de novembro de 2015 às 15:24

Gadjet disse ...


Se bem me lembro, usei 180 ohms com uma fonte de 5 volts, veja aqui http://3.bp.blogspot.com/-
69QqEtS5g9I/USFD-Nn_MOI/AAAAAAAALIg/t_yUagkrYvY/s1600/Tube+sensors4.jpg

15 de novembro de 2015 às 15:39

Anônimo disse ...


Nos meus recursos eu tenho apenas 200 ohms. Eu verifiquei que parece que funciona :)
OPL550A não precisa de um resistor? (Fornecimento Arduino Nano 5V)
15 de novembro de 2015 às 16:09

Anônimo disse ...


Algo funciona :)

Duração 534040
Duração 224540
Duração 200288
Duração 3414768
Duração 90524
Duração 32500 Movo
a caneta de um sensor para outro.
Quanto mais lento, maior a pontuação.
Eu tenho que decifrar o código. Ao mesmo tempo eu sou ruim :(
15 de novembro de 2015 às 17:02

Gadjet disse ...


Boas notícias.
200 ohms devem estar bem, os emissores de led estão muito próximos dos sensores, então você
provavelmente poderá usar valores ainda mais altos para economizar energia se estiver usando uma
bateria.
15 de novembro de 2015 às 18:03
Anônimo disse ...
No código, fiz algumas alterações. Você pode vê-los no link abaixo.
https://drive.google.com/file/d/0B_EqFfSmX6RhY1V2eV8tTWg0eE0/view?usp=sharing
Adicionei fps, mps.
A distância entre os sensores deve ser exatamente de 60 mm?
Com que precisão o protótipo?
A intuição me diz que deve ser a mais completa :)
15 de novembro de 2015 às 19:14

Gadjet disse ...


Altere o código como desejar e publique-o para que outros possam usá-lo.
A distância entre os sensores é muito importante, tendo dito que você pode fazer o que quiser e ajustar o
código de valor para se adequar, quanto maior a diferença, mais precisa a contagem, mas haverá mais
desaceleração no sedimento ao longo da distância .
Eu tenho dois tubos sensores, um de 60 mm e 100 mm.
15 de novembro de 2015 às 19:24

Anônimo disse ...


Eu modifiquei o código. Escrevi para visualizar fps, mps, jouls.
Gostaria de saber como adicionar um recurso que baixa os pellets salariais em gramas?
https://drive.google.com/open?id=1VLVPHUSnKKl691OgpLndaJ_OxpwaWugRQrbOU3TlQTc
17 de novembro de 2015, 09:26

Gadjet disse ...


Anônimo,
existem várias opções ...
1. Adicione o cálculo de potência em seu esboço (a fórmula está em um dos meus esboços ou faça uma
busca no Google) e envie-a em série.

2. Use algum software para PC (link em outra das minhas postagens) para mostrar os dados e inserir o peso
do pellet.

3. Adicione uma interface serial Bluetooth (discutida em outra postagem) e envie a hora para o seu
telefone e use o aplicativo para adicionar o peso e calcular a potência. (link para o aplicativo também em
um post)

4. adicione um monitor LCD local para mostrar FPS e energia.


17 de novembro de 2015, 09:55

Anônimo disse ...


Até agora estou fraco demais para os pontos 2; 3
Na web, encontrei um ponto 2; 3 mas não 1
Eu não sei como recuperar dados do console do PC e usar o programa :(
17 de novembro de 2015 às 13:04

Gadjet disse ...


Para não. 1 veja aqui a fórmula
http://www.pyramydair.com/article/What_is_Muzzle_Energy_August_2003/5

Você pode instalar o software para PC aqui


https://dl.dropboxusercontent.com/u/2253850/PC%20Chrongraph.rar
Descompacte e executar configuração, Já faz muito tempo desde que eu olhei isso, então talvez haja
alguns problemas.
Tente isso e me avise.
17 de novembro de 2015, 13:49

Gadjet disse ...


Para não. 1 veja aqui a fórmula
http://www.pyramydair.com/article/What_is_Muzzle_Energy_August_2003/5

Você pode instalar o software para PC aqui


https://dl.dropboxusercontent.com/u/2253850/PC%20Chrongraph.rar
Descompacte e executar configuração, Já faz muito tempo desde que eu olhei isso, então talvez haja
alguns problemas.
Tente isso e me avise.
17 de novembro de 2015, 13:52

Anônimo disse ...


Gadjet obrigado pela sua resposta
eu entendo cálculos. Tudo o que eu consegui implementar.
Agora eu quero adicionar o peso do pellet no teclado.
Por exemplo, quando o programa é iniciado.
Agora o peso é inserido permanentemente no código.

O programa requer Windows 32bit?


17 de novembro de 2015, 14:17

Gadjet disse ...


Tudo bem.
Não sei ao certo como inserir o peso no programa, talvez use a porta serial e o terminal no Arduino IDE
para enviar um valor ao Arduino para armazenar no eeprom?

Sim, janelas de 32 bits


17 de novembro de 2015, 14:31

Anônimo disse ...


"Desculpe se você já disse, mas qual é a distância entre seus sensores, o calc para fornecer 333333 ois para
100 mm.
Calc para 60 mm =
((60 mm / 2,54) / 12) × 1000000 = 196850
Espero que isso resolva o problema, isso seria dê 896,4 fps "

Se a distância entre os sensores for 100 mm, o resultado será 328083. É este o resultado que requer
arredondamento para 333333?
18 de novembro de 2015 às 12:24

Gadjet disse ...


Anônimo,
o cálculo está correto, tenho dois sensores de 100 mm e 60 mm, o código que postei foi provavelmente de
100 mm e provavelmente o ajustei porque a distância não era exatamente 100 mm quando a medi com
um vernier digital.

Também usei um osciloscópio para verificar o tempo entre pulsos e comparar com a medida calculada pelo
esboço.

BTW, desde então, modifiquei o esboço para usar as interrupções, mas não o testei completamente.
18 de novembro de 2015 às 15:46

Anônimo disse ...


Sensor fotoelétrico - OPL-550a e emissor emissor de infravermelho OP240A estão dispostos no tubo. Os
elementos são espaçados em 32 mm. Parece que essa distância é muito grande. System oblicza szaleje
więcej strzałów w nieskończoność. Você teve um problema semelhante?
19 de novembro de 2015 às 20:50

Gadjet disse ...


Eu tinha um espaço menor que esse, com cerca de 20 mm de distância.
Você os tem em ambos os lados de um tubo ou ao ar livre?
19 de novembro de 2015 às 21:45

Anônimo disse ...


Eu tentei muitas vezes. No cano e ao ar livre. Confirme a ação ao ar livre para 30 mm. O tubo tem
exatamente 32,08mm e não funciona mais. No espaço aberto, ele se comporta de maneira estranha. Se os
sensores se alinharem e aumentarem sua distância, ele começará a trabalhar em até 32 mm. Se a operação
do sistema com uma distância fixa de 32 mm sensores não vêem. Presumi que seria como o controle
remoto da TV. A princípio, a distância não foi um problema.
20 de novembro de 2015 às 07:20

Gadjet disse ...


Dê uma olhada neste post, a idéia é formar um feixe que será quebrado com um pellet, se os sensores
estiverem ao ar livre ou muito distantes, haverá um feixe mais amplo que contorna o pellet.

Eu uso um tubo grosso de paredes de 3 a 5 mm com um diâmetro externo de 20 mm, isso cria um ponto
ideal para o detector e permite que o pellet de passagem bloqueie a luz infravermelha de alcançá-lo.

veja a imagem http://2.bp.blogspot.com/-R3_HMY4XC-


k/USFBvyr81hI/AAAAAAAALIM/Khj9x4Qrelw/s320/tube+sensor+section+cut.jpg

Espero que ajude.


20 de novembro de 2015 às 07:33

Anônimo disse ...


Eu acho que estou fazendo algo errado. Mesmo que eu consiga cruzar os dois objetivos na tela, vejo
leituras estranhas. 0,01 ms. Parece que ele não leu tiros rápidos.
27 de novembro de 2015 às 15:59

Gadjet disse ...


Posso dizer que espaçei meus sensores a 60 mm de distância e não tenho problemas para detectar fotos
com segurança, a única vez que tenho problemas é quando a usei na minha pistola de CO2 e as primeiras
fotos foram muito rápidas, faço beicinho até um cartucho novo de CO2 e gás CO2, causando uma detecção
falsa.
Eu o uso com meu PCP sem problemas, qual tubo você está usando, material e tamanho e a que distância
estão os seus sensores?
27 de novembro de 2015 às 16:08

Anônimo disse ...

A distância é de 100mm, tento medir a velocidade do HW97k. Talvez rápido demais para o Arduino Nano.
27 de novembro de 2015 às 16:24

Anônimo disse ...


Eu tentei com uma bola de papel. A bola é grande o suficiente para não perder os sensores :) A uma
velocidade maior, não há leituras. Eu tentei Arduino Nano e Leonardo. É possível acelerar a leitura?
27 de novembro de 2015, 17:04

Gadjet disse ...


Eu não usaria uma bola de papel, você precisa usar algo sólido e opaco para que nenhuma luz possa
passar.

Usei um tubo de alumínio (cerca de 20 mm de diâmetro externo com furo de 14 mm) e, em seguida,
perfurei os dois orifícios de 3 mm no tubo com 60 mm de distância e fixei os sensores nas laterais do tubo.
Em seguida, usei uma caneta bic barata com o tubo de tinta removido e solte os pellets no tubo de
alumínio para que caiam no centro entre os sensores.

Você também pode usar um rolamento de esferas um pouco menor que o diâmetro interno do tubo, isso
garantirá que as vigas sejam quebradas.
27 de novembro de 2015 às 18:56

Anônimo disse ...


Você pode explicar por que a distância entre os sensores conta dessa maneira?

"Calc for 60mm =


((60mm / 2,54" inch ") / 12" inchy ") × 1000000"? "= 196850"
Muito obrigado
29 de novembro de 2015, 20:52

Gadjet disse ...


OH! Agora você está perguntando.
Se bem me lembro, é tudo sobre quantos microssegundos são necessários para percorrer os 60 mm e
também converter do mm em pés por minuto.

60mm dividido por 25,4 fornece a distância percorrida em polegadas = 2,36 polegadas

dividida por 12 para dar a parte de um pé = 0,197 pés.

O 1000000 é porque estamos usando o timer de microssegundos.

Quando o valor 196850 é dividido pelo tempo gasto em microssegundos, ele fornece a resposta em pés
por segundo, se o espaço entre os feixes do gatilho for alterado, o valor será alterado para ainda fornecer
o FPS.

Isso ajuda?
29 de novembro de 2015 às 21:37

Anônimo disse ...


Então isso resolveu o caso. Muito obrigado!
30 de novembro de 2015, 09:26

Gadjet disse ...


Fico feliz em ouvir isso. A propósito, qual esboço você está usando?
30 de novembro de 2015 às 11:34

Anônimo disse ...


Eu recebi ajuda em outro fórum para alterar o código. O dispositivo corre mais rápido e não há problema
com a detecção do míssil. Eu adicionei algumas linhas de código, mas a velocidade do programa forneceu o
fórum polonês www.forbot.pl

#include
#include
#include

#define I2C_ADDR 0x27 // << ----- Adicione seu endereço aqui. Encontre-o no scanner I2C
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7 #define firstsensor_1

10
#define 12 longo1

;
tempo não assinado2;
float fps, elap, ms, joule;

float bullet_weight; // A massa do projétil (gr)


float bullet_weight_kg;

int counter_shots = 0; // Após cada disparo 1 ++

LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

void setup () {
lcd.begin (16,2); // << ----- Meu LCD 16x2
lcd.setBacklightPin (BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight (HIGH); // Ligue a luz de fundo
Serial.begin (9600);
pinMode (firstsensor_1, INPUT);
pinMode (secoundsensor_2, INPUT);
digitalWrite (firstsensor_1, HIGH);
digitalWrite (sensor de segundo_2, ALTO);
reset_variables ();
}

void loop () {
lcd_i2c ();

Serial.println ("Estou aguardando uma chance - você pode atirar!");

while (digitalRead (firstsensor_1) == 0);


while (digitalRead (firstsensor_1));
time1 = micros ();

while (digitalRead (secoundsensor_2));


time2 = micros ();

serial ();

void printserial () {
Serial.print ("número da foto: \ t");
Serial.println (counter_shots ++);
elap = tempo2 - tempo1;
fps = 328083 / elap;
Serial.print ("FPS \ t");
Serial.println (fps);

ms = fps * 0,3048;
Serial.print ("MPS \ t");
Serial.println (ms);

bullet_weight = 0,51;
bullet_weight_kg = bullet_weight / 1000;

joule = pow (2, ms) * bullet_weight_kg / 2;


Serial.print ("JOULE \ t");
Serial.println (joule);
}

void reset_variables () {
time1 = 0;
time2 = 0;
}
30 de novembro de 2015 às 14:09

opango disse ...


Este comentário foi removido pelo autor.
30 de julho de 2016 às 10:55
opango disse ...
Este comentário foi removido pelo autor.
30 de julho de 2016 às 11:28

opango disse ...


Olá, é um projeto muito interessante, eu uso a tela de 7 segmentos Catalex TM1637, você pode modificar
o esboço para o prazer da tela?

Eu tento fazer os sensores, a distância do sensor 0,5 pés, quando modifiquei o esboço usando a tela
TM1637, ele diz: "error: 'matrix' não foi declarado neste escopo", o que devo fazer?

thx antes
30 de julho de 2016 às 11:30

Gadjet disse ...


Você carregou a biblioteca?
Dê uma olhada aqui https://github.com/avishorp/TM1637
30 de julho de 2016 às 13:39

opango disse ...


Sim, carreguei a biblioteca TM1637,
apenas modifico a distância do monitor e do sensor:

#include
#include
#define CLK 2 // pode ser qualquer pino digital
#define DIO 3 // pode ser qualquer pino digital
TM1637Display display (CLK, DIO ); // configura o display de 4 dígitos.

#define Trip_in_1 2 // defina o acionador de luz 1 para fixar D2


#define Trip_in_2 3 // defina o acionador de luz 2 para fixar D3
#define WAIT_STATE 0
#define MONITOR_STATE 1
#define OUTPUT_STATE 1 #

longo não assinado longo Trigger_1 = 0;


Trigger_2 longo sem sinal = 0;
volátil não assinado int current_state = WAIT_STATE;
char my_oldSREG; // manter o registro de status enquanto ints estão desativados
SensDist longo não assinado = 500000; // Distância entre sensores em pés * 1000000 0,5 pés
sem assinatura longa duração = 0; // tempo entre o tigre 1 e 2
booleano volátil is_timeout = false;

.
.
.
.
.

os sensores ainda não estão conectados e tento verificar,


mas ainda não verificados: o

status de saída 1
'matriz' não foi declarado nesse escopo

. Apenas me pergunto de onde veio o nome 'matriz', é de Adafruit_7segment matrix = Adafruit_7segment


(); propriedades? se sim, com certeza não há conexão para o TM1637, portanto, o esboço deve ser
alterado, mas não sei como ... sou novato e preciso de ajuda

31 de julho de 2016 às 05:35

opango disse ...


Este comentário foi removido pelo autor.
31 de julho de 2016 às 05:38

opango disse ...


desculpe, fontes faltando para

wire.h
TM1637Display.h
31 de julho de 2016 às 05:40

Gadjet disse ...


Observando o código que você postou, você está definindo os pinos de controle da tela com os mesmos
pinos usados para monitorar os sensores, 2 a 3.

Você precisa usar pinos diferentes para a tela


#define CLK 2 // pode ser qualquer pino digital> > USE OUTRO PIN
#define DIO 3 // pode ser qualquer alfinete digital >> USE OUTRO PIN PIN

TM1637Exibir display (CLK, DIO); // configura o display de 4 dígitos.

Eu não estou familiarizado com a tela, então terei que dar uma olhada, mas não posso fazê-lo
imediatamente.
31 de julho de 2016 às 09:47

opango disse ...

finalmente eu poderia fazer o upload do esboço para o TM1637! mas ..


uma coisa que me deixou louco porque minha tela não liga, várias horas pensando nisso, hein .. então eu
verifico a continuidade uma a uma de todos os jumpers e descobri que um dos jumpers está ruim, quebrou
o meio, é isso, depois de trocar o jumper, minha tela finalmente aparece.

não tenho sensor op550 ir, é difícil encontrá-lo aqui na Indonésia, portanto, para testá-lo ou não, uso 2
módulos de sensor de prevenção de infravermelho, conecto a saída aos pinos 4 e 5. coloquei esses
módulos na placa de ensaio apenas 1 polegada de distância entre sensores apenas para teste, sensores ao
ar livre, defina os módulos de potência imediatamente antes das luzes indicadoras acenderem, então
movo meu dedo + - 1 polegada sobre os sensores o mais rápido possível por várias vezes. está
funcionando, o indicador LED dos sensores pisca e o visor mostra valores. Eu tento atirar com um rifle de
pressão nos sensores, mas infelizmente os sensores não detectam o pellet, talvez o pellet seja muito
pequeno ou muito rápido.

Então comprei receptores de LED e IR universais geralmente para controle remoto de TV / DVD, coloque-os
na tábua de mostra valores aleatórios de continuidade ..

pode ser amanhã eu tentarei outro tipo de sensor IR

*/
#include Wire.h
#include TM1637Display.h #definir
CLK 2 // pode ser qualquer pino digital
#define DIO 3 // pode ser qualquer pino digital
TM1637Display display (CLK, DIO); // configura o display de 4 dígitos.

#define Trip_in_1 4 // define o gatilho 1 da luz para fixar D4


#define Trip_in_2 5 // define o gatilho 2 da luz para fixar D5
#define WAIT_STATE 0
#define MONITOR_STATE 1 #definir OUTPUT_STATE 1
#definir OUTPUT_STATE 2

longo não assinado Trigger_1 = 0;


Trigger_2 longo sem sinal = 0;
volátil não assinado int current_state = WAIT_STATE;
char my_oldSREG; // manter o registro de status enquanto ints estão desativados
SensDist longo não assinado = 500000; // Distância entre sensores em pés * 1000000 0,5 pés
sem assinatura longa duração = 0; // tempo entre o tigre 1 e 2
booleano volátil is_timeout = false;

void setup () {
//Serial.begin(57600);
Serial.begin (9600); // use para o módulo BT não modificado
display.setBrightness (0x0f); // Configuração 7 Seg Display
pinMode (Trip_in_1, INPUT);
pinMode (Trip_in_2, INPUT);
digitalWrite (Trip_in_1, HIGH); //
ativa o resistor de pull digitalWrite (Trip_in_2, HIGH);
display.showNumberDec (8888);
reset_variables ();
}

void loop () {

switch (current_state) {
case WAIT_STATE:
if (digitalRead (Trip_in_1) == LOW) {
Gatilho_1 = micros ();
current_state = MONITOR_STATE;
// Timer1.setPeriod (my_timeout);
}
quebrar;
case MONITOR_STATE:
while (digitalRead (Trip_in_2) == HIGH); // faz loop até que o gatilho fique LOW &&! is_timeout
if (! is_timeout)
Trigger_2 = micros ();
current_state = OUTPUT_STATE;
quebrar;
case OUTPUT_STATE:
// if (Trip2> Trip1) {
output_serial_info ();
reset_variables ();
current_state = WAIT_STATE;
//}
break;
}
}

void output_serial_info () {
// Serial.print ("Duration \ t");
Serial.println ((Trigger_2 - Trigger_1));
//Serial.println ("uS");
display.showNumberDec (500000 / (Trigger_2 - Trigger_1));

void reset_variables () {
Trigger_1 = 0;
Gatilho_2 = 0;
is_timeout = false;
//Timer1.stop ();
}
2 de agosto de 2016 às 17:11

Gadjet disse ...


É bom saber que você conseguiu fazê-lo funcionar, eu odeio quando algo assim acontece quando você
passa muito tempo tentando encontrá-lo.

A razão de eu usar os detectores de infravermelho é que eles são muito rápidos e têm uma saída digital.
2 de agosto de 2016 às 19:05

Gary lim disse ...


Oi gadjet !! Bom trabalho ... tenho alguns pedidos .. você pode esboçar isso .. exibir para fps e depois taxa
de tiro usando um único botão .. não sei nada sobre programação .. apenas mexo em eletrônicos ...
obrigado!
3 de outubro de 2016 às 14:23

Gadjet disse ...


Obrigado, suponho que seja possível adicionar um botão para alternar entre FPS e taxa de disparo. Vou dar
uma olhada, mas talvez não seja rápido em fazê-lo!
4 de outubro de 2016 às 12:26

Gary lim disse ...


Obrigado Gadjet!
6 de outubro de 2016 às 11:33
Rob van Duijn disse ...
Oi Gadjet,

Eu tenho um Arduino Nano com um TM1637 com os seguintes comandos.

/*

*/

#include
#include "TM1637Display.h" #definir
CLK 2 // pode ser qualquer pino digital D2
#define DIO 3 // pode ser qualquer pino digital D3
TM1637Display display (CLK, DIO); // configura o display de 4 dígitos.

#define Trip_in_1 4 // defina o gatilho 1 de luz para fixar D4


#define trip_in_2 5 // defina o gatilho 2 de luz para fixar D5
#define WAIT_STATE 0
#define MONITOR_STATE 1 #definir OUTPUT_STATE 1
#definir OUTPUT_STATE 2

longo não assinado Trigger_1 = 0;


Trigger_2 longo sem sinal = 0;
volátil não assinado int current_state = WAIT_STATE;
char my_oldSREG; // manter o registro de status enquanto ints estão desativados
SensDist longo não assinado = 196850; // Distância entre sensores em pés * 1000000 60 mm de
duração longa não assinada = 0; // tempo entre o tigre 1 e 2
booleano volátil is_timeout = false;

void setup () {
//Serial.begin(57600);
Serial.begin (9600); // use para o módulo BT não modificado
display.setBrightness (0x0f); // Configuração 7 Seg Display
pinMode (Trip_in_1, INPUT);
pinMode (Trip_in_2, INPUT);
digitalWrite (Trip_in_1, HIGH); //
ativa o resistor de pull digitalWrite (Trip_in_2, HIGH);
display.showNumberDec (8888);
reset_variables ();

void loop () {
switch (current_state) {
case WAIT_STATE:
if (digitalRead (Trip_in_1) == LOW) {
Gatilho_1 = micros ();
current_state = MONITOR_STATE;
// Timer1.setPeriod (my_timeout);
}
quebrar;
case MONITOR_STATE:
while (digitalRead (Trip_in_2) == HIGH); // faz loop até que o gatilho fique LOW &&! is_timeout
if (! is_timeout)
Trigger_2 = micros ();
current_state = OUTPUT_STATE;
quebrar;
case OUTPUT_STATE:
// if (Trip2> Trip1) {
output_serial_info ();
reset_variables ();
current_state = WAIT_STATE;
//}
break;
}
}

void output_serial_info () {

// Serial.print ("Duration \ t");


Serial.println ((Trigger_2 - Trigger_1));
//Serial.println ("uS");
display.showNumberDec (199475 / (Trigger_2 - Trigger_1));
}

void reset_variables () {
Trigger_1 = 0;
Gatilho_2 = 0;
is_timeout = false;
//Timer1.stop ();
}

Mas não consigo escrever no meu Arduino Nano. Você pode me ajudar no que eu faço de errado.
3 de fevereiro de 2017 às 21:35

Gadjet disse ...


Preciso de um pouco mais de informações para tentar ajudar. Você está recebendo um erro do IDE ao
tentar programar?
3 de fevereiro de 2017 às 22:48

Rob van Duijn disse ...


Eu tenho as mesmas partes que você tem. Só tenho um TM1637 em vez do adafruit.
Quando quero fazer upload / verificação no meu arduino nano pelo editor da web do arduino.
Ocorreu um erro (uma barra vermelha), mas não há texto errado e não consigo carregá-lo.
Também importei o tm1637display.h no esboço.
4 de fevereiro de 2017 às 19:26

Gadjet disse ...


Rob,
eu nunca encontrei uma "barra vermelha" antes, outros esboços carregam OK, você selecionou a porta
serial e a placa de arduino correta etc.?
4 de fevereiro de 2017 às 20:46

Rob van Duijn disse ...


Eu apenas tentei o Arduino 1.8.1 e é um erro de compilação.
Você usa outro software?
4 de fevereiro de 2017 às 21:25

Rob van Duijn disse ...


Sim, eu tentei seu esboço. E isso não foi um problema.
4 de fevereiro de 2017 às 21:27

Gadjet disse ...


OK, você tem uma instrução de inclusão na parte superior do seu código que não faz nada, remova-a.

Fiz o download da biblioteca TM1637Display e a incluí eo esboço compilado no Arduino 1.8.0, você
instalou o lbrary corretamente?

Aqui está o código que funciona para mim:


#include "TM1637Display.h" #definir
CLK 2 // pode ser qualquer pino digital D2
#define DIO 3 // pode ser qualquer pino digital D3
TM1637Display display (CLK, DIO); // configura o display de 4 dígitos.

#define Trip_in_1 4 // defina o gatilho 1 de luz para fixar D4


#define trip_in_2 5 // defina o gatilho 2 de luz para fixar D5
#define WAIT_STATE 0
#define MONITOR_STATE 1 #definir OUTPUT_STATE 1
#definir OUTPUT_STATE 2

longo não assinado Trigger_1 = 0;


Trigger_2 longo sem sinal = 0;
volátil não assinado int current_state = WAIT_STATE;
char my_oldSREG; // para manter o registro de status enquanto as entradas são desabilitadas
sem assinatura long SensDist = 196850; // Distância entre sensores em pés * 1000000 60 mm de
duração longa não assinada = 0; // tempo entre o tigre 1 e 2
booleano volátil is_timeout = false;

void setup () {
//Serial.begin(57600);
Serial.begin (9600); // use para o módulo BT não modificado
display.setBrightness (0x0f); // Configuração 7 Seg Display
pinMode (Trip_in_1, INPUT);
pinMode (Trip_in_2, INPUT);
digitalWrite (Trip_in_1, HIGH); //
ativa o resistor de pull digitalWrite (Trip_in_2, HIGH);
display.showNumberDec (8888);
reset_variables ();

void loop () {

switch (
estado_ atual ) { case WAIT_STATE:
if (digitalRead (Trip_in_1) == LOW) {
Trigger_1 = micros ();
current_state = MONITOR_STATE;
// Timer1.setPeriod (my_timeout);
}
quebrar;
case MONITOR_STATE:
while (digitalRead (Trip_in_2) == HIGH); // faz loop até que o gatilho fique LOW &&! is_timeout
if (! is_timeout)
Trigger_2 = micros ();
current_state = OUTPUT_STATE;
quebrar;
case OUTPUT_STATE:
// if (Trip2> Trip1) {
output_serial_info ();
reset_variables ();
current_state = WAIT_STATE;
//}
break;
}
}

void output_serial_info () {

// Serial.print ("Duration \ t");


Serial.println ((Trigger_2 - Trigger_1));
//Serial.println ("uS");
display.showNumberDec (199475 / (Trigger_2 - Trigger_1));
}

void reset_variables () {
Trigger_1 = 0;
Gatilho_2 = 0;
is_timeout = false;
//Timer1.stop ();
}
4 de fevereiro de 2017 às 23:34

Rob van Duijn disse ...


Oi Gadjet,
Muito obrigado.

A primeira vez que eu estava tendo os mesmos problemas. Eu tenho desinstalado todo o software.
E eu tento novamente. agora funciona com meu esboço e o esboço de vocês. O problema era um
problema de hardware e software do meu pc.

Mas agora está funcionando. Obrigado.


6 de fevereiro de 2017 às 21:45

Gadjet disse ...


Boas notícias.
7 de fevereiro de 2017 às 20:19

Anonimoqlo disse ...


onde posso encontrar o esboço?
24 de julho de 2017 às 08:14

gab disse ...


Olá Phil,
tenho todo o meu produto e agora posso fazer o upload do sketch.
mas com o meu arduino nano e a tela de 7 segmentos.

O esboço em dois postes acima deste, não funciona (problema de compilação / construção com placa
nano).

você poderia me o bom desenho por favor?


Além disso, este esboço também pode funcionar com o módulo bluetooth?

Saudações
2 de dezembro de 2017 às 08:16

Gadjet disse ...


Gab,
você baixou e instalou a biblioteca para a exibição?

Qual é o erro do compilador?


2 de dezembro de 2017 às 08:44

bayu kurniawan disse ...


oi gadjet, preciso de um esboço que funcione com a tela TM1637, você daria um link para mim. obrigado
13 de janeiro de 2018 às 06:36

Gadjet disse ...


bayu,
Existem vários esboços nos comentários acima, tente um deles :-)
13 de janeiro de 2018 às 08:40

bayu kurniawan disse ...


oi gadjet, ocorreu um erro ao compilar seu sketch acima, sair do status 1 erro ao compilar para o board
arduino nano. eu uso o arduino 1.8.5 na vitória 7. alguma pista?
13 de janeiro de 2018 às 12:07

Gadjet disse ...


Não faço ideia, qual é o erro?
Você instalou a biblioteca de exibição?
13 de janeiro de 2018 às 13:34

NiTrOuS 68 disse ...


Podemos usar esse modelo?

Imprimi-o em 3D, mas a distância entre os dois LEDs é de 30mm.

Não é muito curta a distância de 30mm entre os dois LEDs?

Vejo que você tem 60mm

https://www.thingiverse.com/thing:1633392
7 de fevereiro de 2018 às 12:08

Gadjet disse ...


Você pode usar esse modelo e alterar o código para usar 30 mm em vez de 60 mm ou usar meu modelo 3D
aqui https://www.thingiverse.com/thing:2784926 com um pedaço de tubo de alumínio ou até mesmo
imprimir um tubo, talvez?
7 de fevereiro de 2018 às 12:47

NiTrOuS 68 disse ...


Quero criar um sistema simples conectado ao PC por jack
e usar o software fornecido neste fórum.

http://www.france-airsoft.fr/forum/index.php?showtopic=111787 Em
vez de fabricar um tubo com 10 cm de espaçamento,
gostaria de usar o seu apoio no software "Kronyview" no fórum
que pudermos ajuste a distância entre o led,

mas eu queria ter certeza de que o resultado permanece preciso nessa curta distância.

Meu sistema é composto por 4 LEDs (2ir e 2PT) alimentados por 2 baterias e um conector conectado ao PC.

O custo é mais barato do que gastar US $ 40 em material, o que seria como pegar um novo cronógrafo no
aliexpress (xcortech ...)
7 de fevereiro de 2018 às 12:59

Gadjet disse ...


Concordo que sua solução é muito simples e parece funcionar bem, mas eu exigi um link para um
aplicativo de smartphone ou programa de PC, portanto, uso um Arduino £ 2 da China e os receptores de
LED IR têm uma saída digital, reduzindo a necessidade de equipamentos eletrônicos o sinal analógico.

Não sabe ao certo o que você quer dizer com


"Gostaria de usar seu suporte, no software" Kronyview "no fórum"

Como posso ajudar? é o seu software? você tem o código fonte?


7 de fevereiro de 2018 às 14:04

NiTrOuS 68 disse ...


Não, o software não me pertence.
Eu só queria saber se a distância de 30mm pode ser lida pelo conector do microfone do PC.

O software está disponível aqui: http://www.progvision.com/kronyview/Kronyview.zip,

mas não me pertence.


7 de fevereiro de 2018 às 14:13

Gadjet disse ...


Pelo que posso ver, há uma configuração no canto superior direito do SW para alterar a distância e pode
ser ajustada para 0,030m.
7 de fevereiro de 2018 às 14:48
NiTrOuS 68 disse ...
Sim, eu vi, mas o computador é capaz de calcular uma pequena distância?
+ é muito melhor saber?
ou + é curto sabe melhor?

Vou tentar isso,

ele fará o truque enquanto a placa arduino chega da China.

E parabéns pelo seu tutorial & Blog;)


7 de fevereiro de 2018 às 16:22

Gadjet disse ...


Obrigado.

Eu acho que o PC seria rápido o suficiente, mas pode ser um problema se houver um filtro de entrada na
entrada de áudio, você pode fazer a pergunta no fórum? Eu acho que seria bom se o software permite
selecioná-lo, talvez você possa trabalhar para igualar a uma frequência e ver se está abaixo de 20khz?
7 de fevereiro de 2018 às 18:55

NiTrOuS 68 disse ...


Não sei se você precisa olhar para o software, mas, na parte superior, também pode definir o filtro;) o
software está muito completo.

Quanto ao resto, vou ver no fórum, mas a data de 2009 ...

Você tem Facebook? como mais tarde, posso discutir com você se tiver algum problema com o sistema
Arduino.
7 de fevereiro de 2018 às 19:03

NiTrOuS 68 disse ...


Encomendei led, você pode me dizer se é compatível com o seu sistema Arduino? :

2X https://www.gotronic.fr/art-diode-emettrice-sfh4554-24269.htm

2X https://www.gotronic.fr/art-phototransistor-ire5-2314.htm

(10X) https: // www.gotronic.fr/art-10-resistances-1-4w-15-8486-15.htm


7 de fevereiro de 2018 às 19:09

Gadjet disse ...


Eu tenho muitas perguntas sobre os receptores de IR, principalmente as pessoas não conseguem as que eu
usei.
Suponho que qualquer transistor fotográfico sensível a infravermelho seria bom, mas você precisaria fazer
a interface com o Arduino; usei o OPL550 porque eles têm uma saída digital que se conecta diretamente a
uma entrada digital ao Arduino e têm um tempo de resposta muito rápido, se você usar um fotodiodo,
verifique se ele possui um bom tempo de resposta e pode fazer a interface com o arduino, não deve ser
muito difícil.

Para os resistores em série dos emissores, usei 150 ohms e não 15 ohms.

Se você quiser postar seu endereço de e-mail disfarçado, enviarei um e-mail e também excluo a postagem
imediatamente.
7 de fevereiro de 2018 às 19:49

wawan disse ...


Posso obter o arquivo .fzz ou .ini?

Link no artigo quebrado, obrigado


22 de maio de 2018 às 04:10

Gadjet disse ...


Olá,
atualizei os links, tente agora, deixe-me saber se eles não funcionam.
22 de maio de 2018 às 06:33

wawan disse ...


Este comentário foi removido pelo autor.
23 de maio de 2018 às 04:42

wawan disse ...


Muito obrigado, os arquivos são bem-sucedidos para baixar.
alguma substitude para OPL550? (ou você já tentou outro tipo)
porque não consigo encontrar aqui
23 de maio de 2018 às 04:49

Gadjet disse ...


wawan,
Confira este post para obter os detalhes das peças

https://gadjetsblog.blogspot.co.uk/2013/07/diy-chrono-shopping-list.html

É possível usar fotodiodos de IR padrão, mas eles não têm um saída digital para que você precise usar
alguns componentes eletrônicos para condicionar a saída da entrada do processador e verificar se os
tempos de resposta são rápidos o suficiente.

Essa é uma pergunta comum e pode ajudar você a ler os comentários de outras pessoas.
23 de maio de 2018 às 06:35

Anônimo disse ...


Olá, eu preciso do esboço para a tela "7 segmentos, você pode me ajudar talvez em m / s
24 de junho de 2018 às 15:42

Desconhecido disse ...


Excelente blog Gadjet! Eu tenho lido com grande interesse.

Tentei recriar um protótipo bastante grosseiro usando os mesmos leds IR e foto-transistores do RS. Eu
tenho o LED e o sensor separados por 20 mm (não a distância entre os dois sensores) montados em dois
suportes de alumínio em forma de L - onde eu perfurei orifícios de 3 mm para os leds / sensores. Nota:
Consegui separar no máximo 30 mm.

Meu código lê o sensor a cada 50ms no loop principal. No entanto, eu recebo resultados aleatórios. Ele
registra a presença de um dedo que cobre o sensor, mas nem sempre retorna ao seu estado padrão -
apenas flutua entre ligado e desligado.

Aqui está o código:

const int sensor1 = 2;

void setup () {
Serial.begin (57600);
Serial.print ("Iniciando ...");
pinMode (sensor1, ENTRADA);
digitalWrite (sensor1, ALTO);
}

void loop () {
Serial.print (digitalRead (sensor1));
atraso (50);
}

Você pode esclarecer (desculpe o trocadilho) sobre por que os resultados aleatórios, por favor?

Dave
24 de julho de 2018 às 20:33

Gadjet disse ...


Dave,
obrigado pelo feedback, há algumas coisas a serem observadas.
- Seu código olha apenas para um sensor? você precisaria ter dois gatilhos, um para iniciar o cronômetro e
outro para interromper o cronômetro.
- O código que escrevi foi projetado para digitalizar a primeira entrada sem atrasos, talvez uSegundos,
quando acionado, monitora o segundo acionador e, quando acionado, captura o tempo entre os
acionadores
- Se o sensor estiver fora de um tubo então eles podem ser suscetíveis à luz ambiente e podem receber
disparadores falsos, mas é mais provável que seja seu código, não deve haver atrasos.
24 de julho de 2018 às 21:30

Dave Cobb disse ...


Obrigado pela sua resposta rápida.
Eu só tenho um sensor codificado para provar que o alinhamento está correto, então esperava que os
resultados fossem consistentes antes de passar para dois sensores, daí o atraso forçado entre as leituras.

Vou tentar testar encoberto ou no escuro para ver se isso altera os resultados.

obrigado
24 de julho de 2018 às 21:41

Dave Cobb disse ...


Tentei novamente agora, está escuro, e obtenho resultados consistentes. Portanto, deve ter havido muita
luz ambiente ao testar antes. Eu acho que sua idéia de usar um tubo é a próxima na minha lista :)
24 de julho de 2018 às 22:14

Gadjet disse ...


É bom saber que você está funcionando como esperado, o tubo com paredes bastante grossas é crucial
para o sucesso do projeto, pois ajuda a alinhar o emissor e o detector e também, com o detector montado
no fundo de um pequeno túnel, excluindo luz externa que não seja o emissor. Conforme mostrado em uma
das imagens desta publicação https://gadjetsblog.blogspot.com/2013/07/diy-chrono-shopping-list.html
24 de julho de 2018 às 23:13

Dave Cobb disse ...


Usar um tubo parece funcionar melhor. Obrigado
Você sabe qual poderia ser a distância mínima entre os sensores?
Eu sei que você fez 60mm e 100mm, houve muita diferença nos resultados?
12 de agosto de 2018 às 16:26

Gadjet disse ...


A distância entre o primeiro e o segundo sensor é apenas uma diferença nos uSegundos medidos, quanto
maior a distância, maior a resolução, mas suponho que o pellet perca mais velocidade ao longo da
distância. No final, acho que não importa muito entre as duas distâncias, nunca fiz comparações diretas.

/*
Sketch to measure the time in uSeconds between two IR sensors being triggered
and sending the result to the serial port.
Use with the PC application to display results

Version 0.1
Phil Grant 25/04/13
*/

#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Adafruit_7segment matrix = Adafruit_7segment();

#define Trip_in_1 2 //set light Trigger 1 to pin D2


#define Trip_in_2 3 //set light Trigger 2 to pin D3
#define WAIT_STATE 0
#define MONITOR_STATE 1
#define OUTPUT_STATE 2

unsigned long Trigger_1 = 0;


unsigned long Trigger_2 = 0;
volatile unsigned int current_state = WAIT_STATE;
char my_oldSREG; //to hold status register while ints are disabled
unsigned long SensDist = 196850; //Distance between sensors in feet *1000000 60mm
unsigned long duration = 0; // time between triger 1 and 2
volatile boolean is_timeout = false;

void setup () {
Serial.begin(57600);
matrix.begin(0x70); //Setup 7 Seg Display
pinMode(Trip_in_1, INPUT);
pinMode(Trip_in_2, INPUT);
digitalWrite(Trip_in_1, HIGH); //turn on pullup resistor
digitalWrite(Trip_in_2, HIGH);
matrix.print(10000);
matrix.writeDisplay();
reset_variables();

}
void loop () {

switch (current_state) {
case WAIT_STATE:
if(digitalRead(Trip_in_1)==LOW) {
Trigger_1 = micros();
current_state = MONITOR_STATE;
// Timer1.setPeriod(my_timeout);
}
break;
case MONITOR_STATE:
while(digitalRead(Trip_in_2)==HIGH); //loop until the Trigger goes LOW && !is_timeout
if(!is_timeout)
Trigger_2 = micros();
current_state = OUTPUT_STATE;
break;
case OUTPUT_STATE:
//if (Trip2 > Trip1) {
output_serial_info();
reset_variables();
current_state = WAIT_STATE;
//}
break;
}
}

void output_serial_info() {

// Serial.print("Duration\t");
Serial.println((Trigger_2 - Trigger_1));
//Serial.println(" uS");
matrix.print(199475/(Trigger_2 - Trigger_1));
matrix.writeDisplay();
}

void reset_variables() {
Trigger_1 = 0;
Trigger_2 = 0;
is_timeout = false;
//Timer1.stop();
}
Neste exemplo, veremos como conectar um receptor de IR. Geralmente, eles exigem Vcc
(5v), mas achei que funcionava bem com 3v3, GND e existem dados que você conecta ao
seu Arduino. Aqui está um IR típico mostrando a pinagem.

Вам также может понравиться