Neste tutorial vamos desenvolver um circuito utilizando sensor FLEX, Arduino Uno e um servo motor. Este projeto é um sistema de controle servo onde a posição do eixo servo é determinada pela flexão ou curvatura ou desvio do sensor FLEX.
Vamos primeiro falar um pouco sobre servo motores. Servo motores são usados onde há uma necessidade de movimento ou posição precisa do eixo. Eles não são propostos para aplicações de alta velocidade. Estes são propostos para aplicações de baixa velocidade, torque médio e posição precisa. Esses motores são usados em máquinas de braço robótico, controles de vôo e sistemas de controle. Servo motores são usados em sistemas embarcados, como máquinas de venda automática, etc.
Os servo motores estão disponíveis em diferentes formas e tamanhos. Um servo motor terá principalmente fios, um é para tensão positiva, outro é para aterramento e o último é para ajuste de posição. O fio VERMELHO está conectado à alimentação, o fio preto está conectado ao aterramento e o fio AMARELO está conectado ao sinal.
Um servo motor é uma combinação de motor DC, sistema de controle de posição e engrenagens. A posição do eixo do motor DC é ajustada pela eletrônica de controle no servo, com base na relação de trabalho do sinal PWM do pino SINAL.
Simplesmente falando, a eletrônica de controle ajusta a posição do eixo controlando o motor DC. Estes dados relativos à posição do eixo são enviados através do pino SIGNAL. Os dados de posição para o controle devem ser enviados na forma de sinal PWM através do pino de sinal do servo motor.
A frequência do sinal PWM (modulado por largura de pulso) pode variar com base no tipo de servo motor. O importante aqui é a DUTY RATIO do sinal PWM. Com base nesta razão de dever, a eletrônica de controle ajusta o eixo. Para que o eixo seja movido para 9o, a RAÇÃO DE LIGAÇÃO deve ser 1 / 18. ie. 1 milissegundo de 'tempo ON' e 17 milissegundos de 'tempo OFF' em um sinal de 18 ms.
Para que o eixo seja movido para 12o clock, o tempo ON do sinal deve ser 1,5 ms e o tempo OFF deve ser 16,5 ms. Esta relação é decodificada pelo sistema de controle no servo e ele ajusta a posição com base nele.
Este PWM aqui é gerado usando ARDUINO UNO. Portanto, por enquanto sabemos isso, podemos controlar o eixo do servo motor variando a relação de trabalho do sinal PWM gerado pelo Arduino Uno. O UNO tem uma função especial que nos permite fornecer a posição do SERVO sem perturbar o sinal PWM. No entanto, é importante saber a relação de dever PWM - posição do servo. Falaremos mais sobre isso na descrição.
Agora vamos falar sobre FLEX SENSOR. Para fazer a interface de um sensor FLEX ao ARDUINO UNO, vamos usar o recurso ADC (Conversão Analógico para Digital) de 8 bits para fazer o trabalho. Um sensor FLEX é um transdutor que muda sua resistência quando sua forma é alterada. Um sensor FLEX tem 2,2 polegadas de comprimento ou o comprimento de um dedo. Isso é mostrado na figura.
O sensor Flex é um transdutor que muda sua resistência quando a superfície linear é dobrada. Daí o nome flex sensor. Em termos simples, a resistência do terminal do sensor aumenta quando é dobrada. Isso é mostrado na figura abaixo.
Esta mudança na resistência não pode fazer bem a menos que possamos lê-los. O controlador em mãos só consegue ler as chances na tensão e nada menos, para isso vamos usar um circuito divisor de tensão, com isso podemos derivar a variação da resistência como variação da tensão.
O divisor de tensão é um circuito resistivo e é mostrado na figura. Nesta rede resistiva temos uma resistência constante e outra resistência variável. Conforme mostrado na figura, R1 aqui é uma resistência constante e R2 é o sensor FLEX que atua como uma resistência.
O ponto médio do ramo é medido. Com a mudança de R2, temos mudança em Vout. Assim, temos uma tensão que muda com o peso.
Agora, uma coisa importante a se notar aqui é que a entrada obtida pelo controlador para a conversão ADC é tão baixa quanto 50 µAmp. Este efeito de carregamento do divisor de tensão baseado em resistência é importante porque a corrente retirada de Vout do divisor de tensão aumenta a porcentagem de erro aumenta, por enquanto não precisamos nos preocupar com o efeito de carregamento.
FLEX SENSOR quando dobrado, sua resistência muda. Com este transdutor conectado a um circuito divisor de tensão, teremos uma tensão variável com FLEX no transdutor. Esta tensão variável é FED para um dos canais ADC, teremos um valor digital relativo ao FLEX.
Vamos combinar este valor digital com a posição do servo, com isso teremos o controle do servo por flex.
Componentes
Hardware: Arduino Uno , fonte de alimentação (5v), capacitor 1000 uF, capacitor 100nF (3 peças), resistor 100KΩ, SERVO MOTOR (SG 90), resistor 220Ω, sensor FLEX.
Software: Atmel studio 6.2 ou Aurdino noturno.
Diagrama de Circuito e Explicação
O diagrama do circuito para controle do servo motor pelo sensor FLEX é mostrado na figura abaixo.
A tensão no sensor não é completamente linear; será barulhento. Para filtrar o ruído, capacitores são colocados em cada resistor no circuito divisor, conforme mostrado na figura.
Aqui vamos pegar a tensão fornecida pelo divisor (tensão que representa o peso linearmente) e alimentá-la em um dos canais ADC do Arduino UNO. Vamos usar A0 para isso. Após a inicialização do ADC, teremos o valor digital que representa a inclinação no sensor. Vamos pegar esse valor e combiná-lo com a posição do servo.
Para que isso aconteça precisamos estabelecer algumas instruções no programa e falaremos sobre elas em detalhes a seguir.
ARDUINO possui seis canais ADC, como mostra a figura. Nestes, qualquer um ou todos eles podem ser usados como entradas para tensão analógica. O UNO ADC tem resolução de 10 bits (portanto, os valores inteiros de (0- (2 ^ 10) 1023)). Isso significa que ele mapeará tensões de entrada entre 0 e 5 volts em valores inteiros entre 0 e 1023. Então, para cada (5/1024 = 4,9 mV) por unidade.
Aqui vamos usar A0 de UNO.
Precisamos saber algumas coisas.
|
Em primeiro lugar, os canais UNO ADC têm um valor de referência padrão de 5V. Isso significa que podemos fornecer uma tensão de entrada máxima de 5 V para conversão ADC em qualquer canal de entrada. Como alguns sensores fornecem tensões de 0-2,5 V, com uma referência de 5 V obtemos menos precisão, portanto, temos uma instrução que nos permite alterar esse valor de referência. Portanto, para alterar o valor de referência, temos (“analogReference ();”) Por enquanto, deixamos como.
Como padrão, obtemos a resolução máxima do ADC da placa que é 10bits, esta resolução pode ser alterada usando a instrução (“analogReadResolution (bits);”). Essa mudança de resolução pode ser útil em alguns casos. Por enquanto, deixamos como.
Agora, se as condições acima forem definidas como padrão, podemos ler o valor do ADC do canal '0' chamando diretamente a função "analogRead (pino);", aqui "pino" representa o pino onde conectamos o sinal analógico, neste caso, seria “A0”.
O valor de ADC pode ser convertido em um número inteiro como “int SENSORVALUE = analogRead (A0); ”, Por esta instrução o valor após ADC é armazenado no inteiro“ SENSORVALUE ”.
Agora vamos falar do SERVO, o UNO tem um recurso que nos permite controlar a posição do servo apenas informando o valor do grau. Digamos que se queremos que o servo esteja em 30, podemos representar diretamente o valor no programa. O arquivo de cabeçalho do SERVO cuida de todos os cálculos da relação de trabalho internamente.
#incluir
Servo servo; servo.attach (3); servo.write (graus); |
A primeira instrução representa o arquivo de cabeçalho para controlar o SERVO MOTOR.
A segunda instrução é nomear o servo; nós o deixamos como o próprio servo.
A terceira declaração indica onde o pino do servo-sinal está conectado; deve ser um pino PWM. Aqui estamos usando o PIN3.
A quarta declaração fornece comandos para o posicionamento do servo motor e está em graus. Se for dado 30, o servo motor gira 30 graus.
Agora o sg90 pode se mover de 0-180 graus, temos o resultado ADC 0-1024
Portanto, ADC é aproximadamente seis vezes a POSIÇÃO DO SERVO. Portanto, ao dividir o resultado ADC por 6, obteremos a posição aproximada da mão do SERVO.
Com isso teremos o valor da posição do servo alimentado para o servo motor, que é proporcional a flex ou bent. Quando este sensor flexível é montado na luva, podemos controlar a posição do servo pelo movimento da mão.