Índice:
Vídeo: Projeto Arduino Digital Compass: 3 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
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:
Micro: Bit Compass DIY: 6 etapas
Micro: Bit Compass DIY: Como codificar um Micro: Bit Compass
Digital Ludo Dice com Arduino Projeto de exibição de 7 segmentos: 3 etapas
Ludo Dice digital com projeto de exibição de 7 segmentos Arduino: Neste projeto, a exibição de 7 segmentos é usada para exibir um número de 1 a 6 aleatoriamente sempre que pressionamos o botão. Este é um dos projetos mais legais que todo mundo gosta de fazer. Para aprender a trabalhar com display de 7 segmentos clique aqui: -7 segme
DIY Compass Bot: 14 etapas
DIY Compass Bot: Hi! Hoje vou fazer um bot Compass. Tive essa ideia pensando em como é difícil desenhar o círculo perfeito sem uma caixa matemática. Bem, eu tenho sua solução? Como você sabe que um círculo tem exatamente 360 graus, este bot pode desenhar um sha
Projeto de bloqueio de código digital Arduino usando teclado de matriz: 9 etapas
Projeto de bloqueio de código digital Arduino usando teclado de matriz: Construa um dispositivo de bloqueio de código digital com o sistema Arduino e Qwiic usando Zio M Uno e um teclado de matriz hexadecimal 4x3. Visão geral do projeto Para este projeto, construiremos um bloqueio de código digital simples que os usuários podem inserir e digitar in. Neste tutorial, mostraremos o uso
Gravador alimentado por USB! Este projeto pode queimar plásticos / madeira / papel (o projeto divertido também deve ser uma madeira muito fina): 3 etapas
Gravador alimentado por USB! Este projeto pode queimar através de plástico / madeira / papel (projeto divertido também deve ser madeira muito fina): NÃO FAÇA ISSO USANDO USB !!!! Eu descobri que isso pode danificar seu computador com todos os comentários. meu computador está bem tho. Use um carregador de telefone 600ma 5v. Eu usei isso e funciona bem e nada pode ser danificado se você usar um plugue de segurança para interromper a alimentação