Olá, amigos!
Como estou sempre buscando algo novo para fazer, esta semana resolvi usar meu sensor ultrassônico HC-SR04 para uma experiência com o Netduino: um sensor de proximidade que emite um bip repetidamente; quanto mais próximo o objeto estiver do sensor, mais rápido o bip toca.
Isso fez o aparelho ter basicamente a mesma característica de um sensor de estacionamento desses que equipam os carros mais modernos, ou que são vendidos em lojas de acessórios para carros.
O objetivo, porém, não é instalar o dispositivo no meu carro: é simplesmente mostrar a utilização do sensor no Netduino e exemplificar como o mesmo lida com tarefas em MultiThread, já que a leitura do sensor é feita pela thread principal, e o bip é controlado por uma thread paralela.
O código fonte do projeto para o Netduino é o seguinte:
Program.cs
Beep.cs
O link para o vídeo no YouTube também está aqui:
Sensor de Estacionamento com Netduino
Espero que gostem! Até a próxima!
Como estou sempre buscando algo novo para fazer, esta semana resolvi usar meu sensor ultrassônico HC-SR04 para uma experiência com o Netduino: um sensor de proximidade que emite um bip repetidamente; quanto mais próximo o objeto estiver do sensor, mais rápido o bip toca.
Isso fez o aparelho ter basicamente a mesma característica de um sensor de estacionamento desses que equipam os carros mais modernos, ou que são vendidos em lojas de acessórios para carros.
O objetivo, porém, não é instalar o dispositivo no meu carro: é simplesmente mostrar a utilização do sensor no Netduino e exemplificar como o mesmo lida com tarefas em MultiThread, já que a leitura do sensor é feita pela thread principal, e o bip é controlado por uma thread paralela.
O código fonte do projeto para o Netduino é o seguinte:
Program.cs
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
// Escrito por Marcio Paulo Mello Martins para testar o sensor HC-SR04
namespace SensorAproximacao
{
public class Program
{
private static int ticks;
private static InterruptPort echoPin = new InterruptPort(Pins.GPIO_PIN_D12, true, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
private static OutputPort triggerPin = new OutputPort(Pins.GPIO_PIN_D13, false);
private static Beep beep = new Beep() { BeepInterval = 3000 };
public static void Main()
{
echoPin.OnInterrupt += new NativeEventHandler(Port_OnInterrupt);
echoPin.DisableInterrupt();
Thread t = new Thread(new ThreadStart(BeepThread));
t.Start();
while (true)
{
Distance();
Thread.Sleep(250);
}
}
public static void Distance()
{
echoPin.EnableInterrupt();
triggerPin.Write(false);
Thread.Sleep(2);
triggerPin.Write(true);
Thread.Sleep(10);
triggerPin.Write(false);
Thread.Sleep(2);
}
private static void Port_OnInterrupt(uint port, uint state, DateTime time)
{
if (state == 0) // falling edge, end of pulse
{
int pulseWidth = (int)time.Ticks - ticks;
int distance = (pulseWidth * 10 / (int)578.29);
Debug.Print("Distancia = " + distance.ToString() + " milimetros");
lock (beep)
{
beep.BeepInterval = distance;
}
}
else
{
ticks = (int)time.Ticks;
}
echoPin.ClearInterrupt();
}
private static void BeepThread()
{
bool play = false;
int localInterval;
while (true)
{
lock(beep)
{
play = beep.BeepInterval <= 1000;
localInterval = beep.BeepInterval;
}
if (play)
{
beep.Play();
Thread.Sleep(localInterval);
}
}
}
}
}
Beep.cs
using System;
using Microsoft.SPOT;
using SecretLabs.NETMF.Hardware;
using System.Threading;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace SensorAproximacao
{
internal class Beep
{
internal int BeepInterval { get; set; }
internal PWM speaker = new PWM(Pins.GPIO_PIN_D9);
internal void Play()
{
speaker.SetDutyCycle(100);
Thread.Sleep(100);
speaker.SetDutyCycle(0);
}
}
}
O link para o vídeo no YouTube também está aqui:
Sensor de Estacionamento com Netduino
Espero que gostem! Até a próxima!
Hola! interesante su proyecto..yo en estos momentos tengo estoy haciendo algo parecido pero con un sensor con entrada en netduino el imput es de 5V..pero a veces me genera senales falsas...puede ser devido a la configuracion de .InterruptEdgeBoth o es mejor poner interruptEdgeLevelHigh?
ResponderExcluirGracias..saludos kike!!