Netduino - Sensor de Estacionamento

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
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!

Comentários

  1. 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?

    Gracias..saludos kike!!

    ResponderExcluir

Postar um comentário