Medindo distância com sensor de ultrassom

Um sensor interessante é o de ultrassom que de forma semelhante as técnicas de radares (e também utilizadas pelos morcegos) um som (que é uma vibração ou irradiação) é emitido por um lado do sensor e o mesmo é recebido por outro e após o cálculo (em microssegundos) do tempo de retorno do som é possível calcular (como em uma regra de três) a distância que o sensor se encontra de determinada barreira.

Penso que este tipo de sensor seja útil no caso da robótica como em carrinhos automatizados onde o mesmo deverá automaticamente parar antes de atingir uma barreira.

Abaixo o teste que realizei, no qual verifiquei que até distâncias de dois metros é possível obter bons resultados:

 

 

Fazendo um Capacímetro com o Arduino

Para aqueles que (como eu) tem dificuldades em identificar o valor de alguns capacitores ou que tem capacitores cujo valor está impossível de enxergar encontrarão neste projeto algo que nos auxiliará.

Este projeto trata de construir um Capacímetro utilizando apenas do Arduino, nos auxiliando a visualizar o real valor do capacitor, conforme o vídeo abaixo:

Observação: lembre-se de que todo componente eletrônico tem sua tolerância, seja de 10%, 20% etc.

Clique aqui para baixar o código fonte em arquivo: Código Fonte

E abaixo temos o código completo do projeto:

const int OUT_PIN = A2;
const int IN_PIN = A0;
//Capacitance between IN_PIN and Ground
//Stray capacitance value will vary from board to board.
//Calibrate this value using known capacitor.
const float IN_STRAY_CAP_TO_GND = 24.48;
const float IN_CAP_TO_GND = IN_STRAY_CAP_TO_GND;
//Pullup resistance will vary depending on board.
//Calibrate this with known capacitor.
const float R_PULLUP = 34.8; //in k ohms
const int MAX_ADC_VALUE = 1023;
void setup()
{
pinMode(OUT_PIN, OUTPUT);
//digitalWrite(OUT_PIN, LOW); //This is the default state for outputs
pinMode(IN_PIN, OUTPUT);
//digitalWrite(IN_PIN, LOW);
Serial.begin(115200);
}
void loop()
{
//Capacitor under test between OUT_PIN and IN_PIN
//Rising high edge on OUT_PIN
pinMode(IN_PIN, INPUT);
digitalWrite(OUT_PIN, HIGH);
int val = analogRead(IN_PIN);
digitalWrite(OUT_PIN, LOW);
if (val < 1000) { //Low value capacitor //Clear everything for next measurement pinMode(IN_PIN, OUTPUT); //Calculate and print result float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val); Serial.print(F("Capacitance Value = ")); Serial.print(capacitance, 3); Serial.print(F(" pF (")); Serial.print(val); Serial.println(F(") ")); } else { //Big capacitor - so use RC charging method //discharge the capacitor (from low capacitance test) pinMode(IN_PIN, OUTPUT); delay(1); //Start charging the capacitor with the internal pullup pinMode(OUT_PIN, INPUT_PULLUP); unsigned long u1 = micros(); unsigned long t; int digVal; //Charge to a fairly arbitrary level mid way between 0 and 5V //Best not to use analogRead() here because it's not really quick enough do { digVal = digitalRead(OUT_PIN); unsigned long u2 = micros(); t = u2 > u1 ? u2 - u1 : u1 - u2;
} while ((digVal < 1) && (t < 400000L)); pinMode(OUT_PIN, INPUT); //Stop charging //Now we can read the level the capacitor has charged up to val = analogRead(OUT_PIN); //Discharge capacitor for next measurement digitalWrite(IN_PIN, HIGH); int dischargeTime = (int)(t / 1000L) * 5; delay(dischargeTime); //discharge slowly to start with pinMode(OUT_PIN, OUTPUT); //discharge remainder quickly digitalWrite(OUT_PIN, LOW); digitalWrite(IN_PIN, LOW); //Calculate and print result float capacitance = -(float)t / R_PULLUP / log(1.0 - (float)val / (float)MAX_ADC_VALUE); Serial.print(F("Capacitance Value = ")); if (capacitance > 1000.0)
{
Serial.print(capacitance / 1000.0, 2);
Serial.print(F(" uF"));
}
else
{
Serial.print(capacitance, 2);
Serial.print(F(" nF"));
}
Serial.print(F(" ("));
Serial.print(digVal == 1 ? F("Normal") : F("HighVal"));
Serial.print(F(", t= "));
Serial.print(t);
Serial.print(F(" us, ADC= "));
Serial.print(val);
Serial.println(F(")"));
}
while (millis() % 1000 != 0)
;
}

Para fazer a medição de um Capacitor Eletrolítico (que tem suas polaridades) basta colocar o positivo no pino A2 e o negativo no pino A0. Já no caso de capacitores que não tem polaridade (como os cerâmicos) basta liga-los nos pinos A0 e A2. Em ambos os casos a medida da capacitância será automaticamente exibida.

 

Projeto iluminação automática com sensor LDR

Projeto de “iluminação automática”, utilizando do Arduino e de um sensor de Luminosidade LDR. Este projeto demonstra o funcionamento dos sistemas públicos automatizados de iluminação.

O sensor de LDR funciona como um resistor variável, porém a variação em Ohms de resistência é proporcional a captação de luminosidade ambiente.

Após atingir determinado valor que considero “noite” a programação faz com que um LED acenda. Ao mudar o valor especificado ao ponto de ser uma numeração que considero “dia”, com o uso do mesma estrutura condicional If, apago o LED:

Meu Shield Display 7 segmentos

Encontrei na internet alguns Shields que são display de 7 segmentos, mas resolvi fazer eu mesmo uma placa de circuitos juntamente com os resistores, display e CI decodificador. O único problema que encontrei foi a quantidade de ligações necessárias o que me forçou a colocar alguns “jumpers” na placa de modo a facilitar o circuito. Felizmente no fim deu tudo certo e realizei a contagem decimal sem o uso da protoboard:

Contagem em display de 7 segmentos com Arduino

Neste projeto fiz com que o Arduino realizasse uma contagem em binária e utilizando de um Circuito Integrado Decodificador BCD 7448 fiz a decodificação de binário para decimal, para finalmente exibir os números em um display de 7 segmentos.

Considerei interessante o aprendizado neste experimento pela questão da proximidade do sistema binário de numeração e a informática, colocando em prática o que apenas entendia através de cálculos e abstrações.

Aplicando o conceito do operador lógico AND com Arduino

Neste projeto utilizo do Arduino para demonstrar o uso do Operador Lógico AND da Tabela Verdade.

Com dois botões representando duas “variáveis” e um LED para visualizar o resultado comprovo que obtemos verdade (true) apenas quando as duas variáveis (ou condições) forem verdadeiras, desta forma o LED acende, caso contrário o mesmo permanecerá apagado.

Figura das ligações das ligações do circuito como Arduino:

Teste condição lógica AND

Código do projeto:


const int ledPin = 13; //led no pino 13
const int variavel1 = 2;
const int variavel2 = 4;
int EstadoVariavel1 = 0;
int EstadoVariavel2 = 0;
void setup(){
pinMode(ledPin, OUTPUT); //Pino do led será saída
pinMode(variavel1, INPUT); //Pino com botão será entrada
pinMode(variavel2, INPUT); //Pino com botão será entrada
}
void loop(){
EstadoVariavel1 = digitalRead(variavel1);
EstadoVariavel2 = digitalRead(variavel2);
//Teste AND
if ((EstadoVariavel1 == HIGH) && (EstadoVariavel2 == HIGH)){
digitalWrite(ledPin, HIGH); //acende
}else{
digitalWrite(ledPin, LOW); //apaga
}
}