Índice:

Projeto Arduino Digital Compass: 3 etapas
Projeto Arduino Digital Compass: 3 etapas

Vídeo: Projeto Arduino Digital Compass: 3 etapas

Vídeo: Projeto Arduino Digital Compass: 3 etapas
Vídeo: How To Make Radar With Arduino || Arduino Project. 2024, Julho
Anonim
Image
Image

Olá! Neste instrutível, você verá como fazer uma bússola digital usando um Arduino e o IDE de processamento. Este é um Projeto Arduino bastante simples, mas interessante e de aparência legal.

Você pode assistir ao exemplo de demonstração deste tutorial no vídeo acima. Você sempre pode encontrar vídeos mais interessantes como este no meu canal do YouTube, bem como encontrar muitos projetos eletrônicos e tutoriais no meu site, HowToMechatronics.com

Etapa 1: peças necessárias

Para este projeto, você precisará apenas de uma placa Arduino e um magnetômetro MEMS, para medir o campo magnético terrestre. Usarei a placa de breakout GY - 80 que contém o magnetômetro de 3 eixos MC5883L.

Antes de continuarmos com o código-fonte do projeto. Se você precisar de mais detalhes sobre como o magnetômetro MEMS funciona, bem como como conectar e usar a placa de breakout GY-80 por meio da Comunicação I2C, você pode verificar meus tutoriais específicos para isso.

Etapa 2: Código-fonte do Arduino

O que precisamos fazer primeiro é carregar um esboço para a placa Arduino que lerá os dados do magnetômetro e os enviará para o IDE de processamento. Este é o código-fonte do Arduino:

/ * Arduino Compass * * por Dejan Nedelkovski, * www. HowToMechatronics.com * * /

#include // I2C Arduino Library

# define Magnetometer_mX0 0x03

#define Magnetometer_mX1 0x04 #define Magnetometer_mZ0 0x05 #define Magnetometer_mZ1 0x06 #define Magnetometer_mY0 0x07 #define Magnetometer_mY1 0x08

int mX0, mX1, mX_out;

int mY0, mY1, mY_out; int mZ0, mZ1, mZ_out;

cabeçalho flutuante, cabeçalho Graus, cabeçalho Filtrado, declinação;

flutuar Xm, Ym, Zm;

# define magnetômetro 0x1E // endereço I2C de 7 bits de HMC5883

void setup () {

// Inicializa as comunicações Serial e I2C Serial.begin (115200); Wire.begin (); atraso (100); Wire.beginTransmission (magnetômetro); Wire.write (0x02); // Selecione o modo de registro Wire.write (0x00); // Modo de medição contínua Wire.endTransmission (); }

void loop () {

// ---- X-Axis Wire.beginTransmission (Magnetometer); // transmite para o dispositivo Wire.write (Magnetometer_mX1); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mX0 = Wire.read (); } Wire.beginTransmission (magnetômetro); // transmite para o dispositivo Wire.write (Magnetometer_mX0); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mX1 = Wire.read (); }

// ---- Eixo Y

Wire.beginTransmission (magnetômetro); // transmite para o dispositivo Wire.write (Magnetometer_mY1); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mY0 = Wire.read (); } Wire.beginTransmission (magnetômetro); // transmite para o dispositivo Wire.write (Magnetometer_mY0); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mY1 = Wire.read (); } // ---- Z-Axis Wire.beginTransmission (Magnetometer); // transmite para o dispositivo Wire.write (Magnetometer_mZ1); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mZ0 = Wire.read (); } Wire.beginTransmission (magnetômetro); // transmite para o dispositivo Wire.write (Magnetometer_mZ0); Wire.endTransmission (); Wire.requestFrom (magnetômetro, 1); if (Wire.available () <= 1) {mZ1 = Wire.read (); } // ---- Eixo X mX1 = mX1 << 8; mX_out = mX0 + mX1; // Dados brutos // Da folha de dados: 0,92 mG / dígito Xm = mX_out * 0,00092; // Unidade de Gauss // * O campo magnético da Terra varia de 0,25 a 0,65 Gauss, então esses são os valores que precisamos obter aproximadamente.

// ---- Eixo Y

mY1 = mY1 << 8; mY_out = mY0 + mY1; Ym = mY_out * 0,00092;

// ---- Eixo Z

mZ1 = mZ1 <0,073 rad declinação = 0,073; rumo + = declinação; // Corrigindo quando os sinais são revertidos if (cabeçalho <0) cabeçalho + = 2 * PI;

// Correção devido à adição do ângulo de declinação

if (cabeçalho> 2 * PI) cabeçalho - = 2 * PI;

headerDegrees = header * 180 / PI; // O título na unidade de Graus

// Suavizando o ângulo de saída / filtro passa-baixo

títuloFiltrado = títuloFiltrado * 0,85 + títuloGraus * 0,15;

// Enviando o valor do título por meio da porta serial para o IDE de processamento

Serial.println (cabeçalho Filtrado);

atraso (50); }

Etapa 3: Processando o código-fonte IDE

Depois de fazer o upload do esboço anterior do Arduino, precisamos receber os dados no IDE de processamento e desenhar a bússola digital. A bússola é composta por uma imagem de fundo, uma imagem fixa da seta e uma imagem giratória do corpo da bússola. Portanto, os valores do campo magnético eart calculados com o Arduino são usados para girar a bússola.

Aqui está o código-fonte do IDE de processamento:

/ * Arduino Compass * * por Dejan Nedelkovski, * www. HowToMechatronics.com * * / import processing.serial. *; import java.awt.event. KeyEvent; import java.io. IOException;

Serial myPort;

PImage imgCompass; PImage imgCompassArrow; PImage background;

Dados da string = "";

posição flutuante;

void setup () {

tamanho (1920, 1080, P3D); suave(); imgCompass = loadImage ("Compass.png"); imgCompassArrow = loadImage ("CompassArrow.png"); background = loadImage ("Background.png"); myPort = novo Serial (este, "COM4", 115200); // inicia a comunicação serial myPort.bufferUntil ('\ n'); }

void draw () {

imagem (fundo, 0, 0); // Carrega a imagem de fundo pushMatrix (); traduzir (largura / 2, altura / 2, 0); // Traduz o sistema de coordenadas para o centro da tela, para que a rotação aconteça bem no centro rotateZ (radianos (-heading)); // Gira a bússola em torno da imagem do eixo Z (imgCompass, -960, -540); // Carrega a imagem Compass e conforme o sistema de coordenadas é realocado, precisamos definir a imagem em -960x, -540y (metade do tamanho da tela) popMatrix (); // Traz o sistema de coordenadas de volta à posição original 0, 0, 0 imagem (imgCompassArrow, 0, 0); // Carrega a imagem CompassArrow que não é afetada pela função rotateZ () por causa da função popMatrix () textSize (30); texto ("Título:" + título, 40, 40); // Imprime o valor do título na tela

atraso (40);

}

// começa a ler dados da porta serial

void serialEvent (Serial myPort) {data = myPort.readStringUntil ('\ n'); // lê os dados da porta serial e os coloca na variável String "data". título = flutuante (dados); // Convertendo o valor String em valor Float}

Espero que goste deste projeto. Se for assim, você também pode visitar meu site para mais projetos interessantes.

Recomendado: