Conhecimento necessário: [HW] Módulo de Sensores, [HW] Módulo de Interface do Utilizador, [AVR] Conversor Analógico-para-Digital, [LIB] Conversor Analógico para Digital, [LIB] LCD Gráfico, [LIB] Sensores
Um sensor FSR (force-sensing resistor) permite detectar pressão física, apertos e peso. Um FSR é basicamente um resistor que muda o seu valor de resistência (em ohms Ω), dependendo de quanto é pressionado. Estes sensores são bastante baratos e fáceis de usar, mas raramente são precisos. Também variam ligeiramente de sensor para sensor, à volta de 10%. Isto significa que quando se usa um FSR só se deve esperar para obter uma gama de resposta. Tal como acontece com todos os sensores baseados em resistências, os resistores sensíveis a força exigem uma interface relativamente simples e podem operar satisfatoriamente em ambientes moderadamente hostis. Em comparação com outros sensores de força, as vantagens dos FSR são o seu tamanho e boa resistência ao choque. No entanto, um FSR ficará danificado se for aplicada pressão por um período de tempo muito longo (horas).
Um FSR é constituído por um polímero condutor, que altera a resistência de uma forma previsível a seguir à aplicação de força a sua superfície. São normalmente fornecidos como uma folha de polímero ou de tinta que pode ser aplicada por impressão. O filme de detecção é composto por partículas electricamente condutoras e não condutoras em suspensão numa matriz. As partículas são de tamanho sub-micrométrico, e são formuladas para reduzir a dependência da temperatura, melhorar as propriedades mecânicas e aumentar a durabilidade da superfície. Aplicar uma força na superfície de uma película de detecção faz com que as partículas toquem os eléctrodos condutores mudando a resistência do filme.
Resistores sensíveis a força são comumente usados para criar “botões” sensíveis à pressão e têm aplicações em muitos campos, incluindo instrumentos musicais, sensores de presença em veículos e robótica.
O FSR Pololu com 12.7 mm de diâmetro de área circular activa exibe uma diminuição da resistência com o aumento da força aplicada à superfície activa. A sua sensibilidade à força é otimizada para uso em dispositivos electrónicos de controlo de toque humano. A característica força vs. resistência fornece uma visão geral do comportamento da resposta típica do FSR. Por conveniência de interpretação, os dados da força vs. resistência são plotados num formato log/log. Em geral, a resposta do FSR segue aproximadamente uma lei de potência inversa característica (cerca de 1/R).
A maneira mais fácil de medir uma resistência de um FSR é conectar um terminal à alimetação e outro de um resistor pull-down para a terra. De seguida, o ponto situado entre a resistência fixa do pull-down e o resistor variável do FSR é ligado à entrada analógica de uma placa de controlo. Nesta configuração, os valores lidos na tensão analógica variam entre 0V (terra) e cerca de 5V (ou quase o mesmo que a tensão da fonte de alimentação). À medida que a resistência do FSR diminui a resistência total do FSR e o resistor pull-down diminui desde cerca de 100Kohm para 10Kohm. Isso significa que a corrente que passa através de ambas as resistências aumenta, que, por sua vez faz com que a tensão que passa na resistência fixa de 10K aumente.
Para medir a força de Newton através de um FSR é boa idéia mapear os valores lidos no intervalo de 0V até à tensão fornecida. Depois calcula-se a resistência do FSR usando a fórmula seguinte:
RFSR = ( (Vcc - U) * R1) / U
Onde: RFSR - Resistência do FSR Vcc – Tensão de alimentação. Normalmente 5 V U – A tensão medida. A leitura do ADC tem de ser convertida para o intervalo 0V - Vcc R1 – resistor. 10 k
Depois pode calcular-se a condutividade CFSR em S/m [Siemens per meter]. É traçada a condutância vs. a força (o inverso da resistência: 1/r). Este formato permite a interpretação numa escala linear.
CFSR = 1 / RFSR
O guia de gráficos do FSR no datasheet pode ser usado para aproximar a força. Isso depende do intervalo de medição. Por exemplo, para a gama de força baixa (0-1 Kg) pode ser usada a fórmula:
FFSR = CFSR / 80
O programa de exemplo do sensor de força mostra a força medida (Newtons) e peso (kg) no LCD.
#include <stdio.h> #include <homelab/adc.h> #include <homelab/delay.h> #include <homelab/pin.h> #include <homelab/module/lcd_gfx.h> // Map a value from one range to another. long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } // Main program int main(void) { signed short value; // The analog reading. char text[16]; int voltage; // The analog reading converted to voltage. unsigned long resistance; // The voltage converted to resistance. unsigned long conductance; long force; // The resistance converted to force. long weight; // The force converted to weight. // Set the external sensors pins. pin ex_sensors = PIN(G, 0); pin_setup_output(ex_sensors); pin_set(ex_sensors); // LCD initialization. lcd_gfx_init(); // Display clearing. lcd_gfx_clear(); // Move the cursor to the right of the screen. lcd_gfx_goto_char_xy(1,1); // Print the name of the program. lcd_gfx_write_string("Force sensor"); // Set the ADC. adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); // An endless loop. while (true) { // Converting and averaging channel 0 value. value = adc_get_average_value(0, 4); // Analog voltage reading ranges from about 0 to 1023 // which maps to 0V to 5V (= 5000mV) voltage = map(value, 0, 1023, 0, 5000); // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V // so FSR = ( (Vcc - V) * R) / V // fsrVoltage is in millivolts so 5V = 5000mV resistance = 5000 - voltage; resistance *= 10000; // 10K resistor resistance /= voltage; // FSR resistance in ohms. conductance = 1000000; //We measure in micromhos. conductance /= resistance; //Conductance in microMhos. // Move the cursor to the right of the screen. lcd_gfx_goto_char_xy(1,3); // Calculate the force. force = conductance / 80; sprintf(text, "%lu Newtons ", force); // Printing of the force. lcd_gfx_goto_char_xy(1,3); lcd_gfx_write_string(text); // Printing and calculating of the weight. lcd_gfx_goto_char_xy(1,4); weight = force / 9,8; sprintf(text, "%lu kg ", weight); lcd_gfx_write_string(text); // Delay. sw_delay_ms(500); } }