This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pt:examples:sensor:force [2015/12/17 14:25] – artica | pt:examples:sensor:force [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Sensor de força (FSR) ====== | ||
| + | // | ||
| + | |||
| + | ===== Teoria===== | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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, | ||
| + | |||
| + | Resistores sensíveis a força são comumente usados para criar " | ||
| + | |||
| + | |||
| + | ===== Prá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, | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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: | ||
| + | |||
| + | R< | ||
| + | |||
| + | Onde: | ||
| + | R< | ||
| + | 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 C< | ||
| + | |||
| + | C< | ||
| + | |||
| + | 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: | ||
| + | |||
| + | F< | ||
| + | |||
| + | O programa de exemplo do sensor de força mostra a força medida (Newtons) e peso (kg) no LCD. | ||
| + | |||
| + | < | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // 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, | ||
| + | |||
| + | // Print the name of the program. | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Set the ADC. | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // An endless loop. | ||
| + | while (true) | ||
| + | { | ||
| + | // Converting and averaging channel 0 value. | ||
| + | value = adc_get_average_value(0, | ||
| + | |||
| + | // 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; // | ||
| + | |||
| + | // Move the cursor to the right of the screen. | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | |||
| + | // Calculate the force. | ||
| + | force = conductance / 80; | ||
| + | sprintf(text, | ||
| + | |||
| + | // Printing of the force. | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Printing and calculating of the weight. | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | weight = force / 9,8; | ||
| + | sprintf(text, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Delay. | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||