Sensor de distância ultra-sônico à prova dágua

sensor_ultra-som_DYP-ME007Y_IMG_1863_640_automalabs.com.br

sensor_ultra-som_DYP-ME007Y_IMG_1862_640_automalabs.com.br

Este sensor opera da mesma forma que o HC-SR04, usando os mesmos sketches e tem a mesma pinagem (encaixa no mesmo conector). Mas é preciso ficar atento para as seguintes diferenças:

  • Distância mínima de 30cm. Não consegue discernir nada mais próximo (o HC-SR04 vê tão perto quanto 2cm);
  • Distância máxima de 3m;
  • Requer mais energia. Essa é uma necessidade da blindagem. Com o arduino ligado apenas pela porta USB o sensor não funciona (dá sempre a mesma leitura), mas basta ligar uma fonte de 1A extra para resolver;
  • Altamente direcional. Durante os testes use um objeto do tamanho de uma prancheta, porque se usar apenas sua mão você vai ter grande dificuldade para posicioná-la na frente do sensor.

Sensor de distância ultra-sônico (ultra-som) HC-SR04

sensor_ultra-som_HC-SR04_IMG_1849_640_automalabs.com.br

sensor_ultra-som_HC-SR04_IMG_1864_640_automalabs.com.br

Este sensor não funciona se o shield Wiznet estiver plugado, mesmo que nenhuma biblioteca seja ativada.

sketch de teste

Requer Shield com keypad e display 1602

Exemplo testado com Arduino 1.05


// Jefferson Ryan - Automalabs.com.br
// Baseado em script de: luckylarry.co.uk
// Este sketech também demonstra o uso de Running Average.

#include <LiquidCrystal.h>
//Esta linha é específica para o display do shield com keypad
//se seu display for diferente você pode precisar mudar
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// variables to take x number of readings and then average them
// to remove the jitter/noise from the SRF05 sonar readings
const int qtdeLeituras = 10;                   // number of readings to take/ items in the array
int leituras[qtdeLeituras];                    // stores the distance readings in an array
int indice = 0;                             // arrayIndex of the current item in the array
int total = 0;                                  // stores the cumlative total
int distanciaMedia = 0;                        // stores the average value

// setup pins and variables for SRF05 sonar device

int echoPin = 2;                                // SRF05 echo pin (digital 2)
int triggerPin = 3;                                // SRF05 trigger pin (digital 3)
unsigned long tempoPulso = 0;                    // stores the pulse in Micro Seconds
unsigned long distancia = 0;                     // variable for storing the distance (cm)

void setup() {
lcd.begin(16, 2);

lcd.clear();
pinMode(triggerPin, OUTPUT);                     // set init pin 3 as output
pinMode(echoPin, INPUT);                      // set echo pin 2 as input

// create array loop to iterate over every item in the array

for (int estaLeitura = 0; estaLeitura < qtdeLeituras; estaLeitura++) {
leituras[estaLeitura] = 0;
}

}

void loop() {

digitalWrite(triggerPin, HIGH);                    // send 10 microsecond pulse
delayMicroseconds(10);                  // wait 10 microseconds before turning off
digitalWrite(triggerPin, LOW);                     // stop sending the pulse
tempoPulso = pulseIn(echoPin, HIGH);             // Look for a return pulse, it should be high as the pulse goes low-high-low
distancia = tempoPulso/58;                        // Distance = pulse time / 58 to convert to cm.

total= total - leituras[indice];           // subtract the last distance
leituras[indice] = distancia;                // add distance reading to array
total= total + leituras[indice];            // add the reading to the total
indice = indice + 1;                    // go to the next item in the array

// Ao chegar ao fim da matriz, voltamos a preencher do inicio
if (indice >= qtdeLeituras)  {
indice = 0;
}

distanciaMedia = total / qtdeLeituras;      // calculate the average distance

String myString = String(distanciaMedia, DEC);
myString +=" cm";
char charBuf[10];
//apago o conteúdo do array. Sem isso as leituras ficam completamente malucas,
//porque "toCharArray" não faz isso.
memset(charBuf, 0, sizeof(charBuf));
myString.toCharArray(charBuf, 10);

lcd.clear();
lcd.setCursor(1, 0);
lcd.print(charBuf);

// Serial.println(averageDistance, DEC);
/*Se o delay for muito baixo (10, por exemplo), alguns exemplares
sensores irão apresentar alta instabilidade a curtas distâncias
*/
delay(50);

}

Sensores de temperatura LM35 e DS18B20

LM35_DS18B20_IMG_1801_automalabs.com.br

  • LM35: saída analógica.
  • DS18B20: saída digital.

DS18B20

Para tirar o máximo proveito dos sensores com o mínimo esforço, você precisa desta biblioteca instalada:

  • OneWire 2 (Paul Stoffregen) – Clique em “Download ZIP”

E rode os exemplos da biblioteca. Mas se quiser simplificar ainda mais, instale também esta biblioteca:

E rode seus exemplos.

Daniel Quadros, da DQSOFT, tem posts sobre o uso deste sensor com o Arduino começando aqui e prosseguindo aqui.

LM35

Daniel Quadros também fala sobre esse sensor aqui.

 

 

 

Sensor óptico reflexivo TCRT5000

Sensor_TCRT5000_pinout_automalabs.com.br

Usado em diversas aplicações que envolvem detectar reflexão a uma curta distância (menos de 1cm) como, por exemplo, seguidores de linha.

Imagine esse sensor como uma chave. Mesmo a mais sensível chave mecânica ainda requer alguma força para ser acionada e pode eventualmente, após um grande número de acionamentos, começar a dar mau contato.  Esse tipo de sensor não tem nenhum desses problemas e por isso encontrou aplicação na detecção de fita em aparelhos de vídeo-cassete e em qualquer caso em que o espaço seja limitado.

Exemplo de uso no arduino:

http://www.bajdi.com/analogread-from-a-tcrt5000-sensor/

Datasheet sensor refletivo TCRT5000
305.9 KiB
1607 Downloads
Detalhes...

Micro Servo Motor SG90

servo_sg90_IMG_1796 _automalabs.com.br

Esse servo é o do tipo comumente chamado “9g”. É ideal para trabalhos leves de automação, como mover peças em maquetes. Apesar de muito pequeno tem uma força razoável.

Servo Motor MG995

servo_mg995_IMG_1795 _automalabs.com.br

Sensor de fluxo – 5 litros por minuto

Sensor_fluxo_5litros_IMG_1782 _automalabs.com.br

Sensor_fluxo_5litros_IMG_1783 _automalabs.com.br

O princípio de funcionamento é o mesmo do sensor de 1-30 litros, mas esse sensor é para tarefas de maior precisão, como controle de fluxo de água em cafeteiras elétricas.

Não testei pessoalmente com água, mas encontrei em mais de uma fonte que o sensor dá 1560 pulsos por litro.

A fórmula fornecida é : litros por minuto = pulsos por segundo/26.

26 pulsos em 1 segundo  equivalem então a 1 litro por minuto.

26*60 segundos = 1560 pulsos/L

Isso dá uma resolução de 0,6mL por pulso.

Sensor seguidor de linha (line hunter / line hunting)

sensor_line_hunting_IMG_1787_640 _automalabs.com.br

sensor_line_hunting_IMG_1788 _automalabs.com.br

É equipado com um sensor óptico TCRT5000 ou equivalente e um comparador de voltagem LM393.  Usado em robôs para a detecção da linha pintada no chão. Você ajusta no trimpot até que a saída OUT indique se o sensor está sobre a linha ou não. Esse método é usado quando você precisa que o robô siga por um caminho pré-estabelecido, porque sem isso é difícil fazer até mesmo o robô andar em linha reta. Uma pequena diferença na rotação dos motores ou no diâmetro das rodas já provoca uma tendência de desvio de rota que essa técnica ajuda a corrigir.

Projetos mais elaborados podem precisar de mais de um sensor desses, porque uma vez que o sensor deixe de ver a linha você não tem certeza, apenas usando um, se o desvio foi para a esquerda ou para a direita. A correção é possível, mas envolve “chutar” uma direção e caso não encontre a linha em x milisegundos, ir para a outra direção. O movimento do robô fica tremido.

Usando pelo menos dois você já pode saber em que direção foi o desvio e corrigir de forma mais precisa.

Chaves ópticas (optical switches)

optical_switches_IMG_1790_automalabs.com.brDe um lado um LED e do outro um foto-transistor. O objetivo é detectar a presença de um objeto no intervalo entre os dois. Também é usada, juntamente com discos encoder, para detecção de movimento e medição de velocidade.

Sketches que usem a biblioteca NewsoftSerial podem não funcionar no Mega

O problema não é na biblioteca, mas numa diferença que existe entre o Arduino UNO e o Mega que limita em que pinos NewSoftSerial pode receber dados. Segudo o que é explicado neste fórum, esses pinos são:

10, 11, 12, 13,
50, 51, 52, 53,
62, 63, 64, 65, 66, 67, 68, 69

Mas a biblioteca pode transmitir em qualquer pino.

Como a maioria esmagadora dos exemplos que usam NewsoftSerial foram feitos para o UNO (quem usa Mega geralmente não precisa de portas virtuais), é quase certo que usem os pinos abaixo de 10 e assim não vão funcionar no Mega. Isso inclui exemplos de uso para GPS, GPRS, bluetooth…

Se você tem um Mega e não precisa de mais que as quatro portas seriais físicas, eu recomendo que você modifique os exemplos para que usem as portas físicas e não a biblioteca NewSoftSerial (comece apagando a linha #include <SoftwareSerial.h>). Isso economizará espaço na sua flash e dará mais velocidade ao seu programa, porque a criação e uso de uma porta serial virtual tem um impacto no processamento.