Esse projeto visa construir um artefato simples voltado para oficinas de introdução e experimentação da robótica. Aqui utilizaremos um magnetômetro e um Arduino para construir uma bússola.
O que é uma bússola
Bússolas são instrumentos utilizados para orientar-se com relação aos pontos cardeais. Desde a China antiga e da época das grandes navegações as bússolas já eram utilizadas. Elas podem ser de construção muito simples, podendo ser construídas com materiais que se encontram em casa.
A física por trás de uma bússola é simples de entender. A agulha (de material ferromagnético) alinha-se com o campo magnético mais forte nas suas vizinhanças. Não havendo nenhum imã por perto, a agulha se alinha com o campo magnético da terra apontando para o norte.
Bússola com Arduino
Para construir uma bússola com Arduino é necessário utilizar um magnetômetro, que é um sensor que assim como agulha de uma bússola se alinha com o campo magnético mais forte nas suas vizinhanças. O funcionamento interno do sensor depende de resistores sensíveis a campos magnéticos, instalados de maneira a formar um sistema de coordenadas ortogonal (x, y, z).
Estrutura:
O Artefato terá uma estrutura em andares, de modo que possa ser integrado a outros robôs como o Paulinho. Dessa maneira, teríamos o Arduino e sua bateria no primeiro andar e no segundo a estrutura propriamente dita do artefato. Nessa estrutura teremos 8 leds dispostos como uma rosa dos ventos em uma placa com o magnetômetro preso embaixo. A ação do artefato é indicar, acendendo um dos leds, a direção norte.
Material:
- 2 resistores de 10k;
- 8 resistores de 100;
- 8 leds;
- Magnetômetro;
- Arduino;
- Bateria 9V (ou Lipo);
- 20 jumpers macho-fêmea;
- 6 jumpers macho;
- Conector Arduino-bateria;
- 3 parafusos pequenos;
- 4 parafusos grandes;
- 15 porcas;
- 2 placas de nylon ou acrílico 7x11 cm.
Código
#include
#include
HMC5883L compass;
int error = 0;
int led1 = 2, led2 = 3, led3 = 4, led4 = 5, led5 = 6, led6 = 7, led7 = 8, led8 = 9;
void setup()
{
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
Serial.println("Iniciando a interface I2C.");
Wire.begin();
Serial.println("Criando novo HMC5883L");
compass = HMC5883L();
Serial.println("Definindo escala em +/- 1.3 Ga");
error = compass.SetScale(1.3);
if(error != 0) {
Serial.println(compass.GetErrorText(error));
}
Serial.println("Definindo medições contínuas.");
error = compass.SetMeasurementMode(Measurement_Continuous);
if(error != 0) {
Serial.println(compass.GetErrorText(error));
}
}
void loop()
{
MagnetometerRaw raw = compass.ReadRawAxis();
MagnetometerScaled scaled = compass.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = -0.379;
heading += declinationAngle;
if(heading < 0){
heading += 2*PI;
}
if(heading > 2*PI){
heading -= 2*PI;
}
float headingDegrees = heading * 180/M_PI;
if (headingDegrees < 23){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else if (headingDegrees < 68){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else if (headingDegrees < 170){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else if (headingDegrees < 240){
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else if (headingDegrees < 270){
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else if (headingDegrees < 300){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, HIGH);
} else if (headingDegrees < 330){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, HIGH);
digitalWrite(led8, LOW);
} else if (headingDegrees < 350){
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, HIGH);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
} else{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
Output(raw, scaled, heading, headingDegrees);
}
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
Serial.print("Raw:\t");
Serial.print(raw.XAxis);
Serial.print(" ");
Serial.print(raw.YAxis);
Serial.print(" ");
Serial.print(raw.ZAxis);
Serial.print(" \tScaled:\t");
Serial.print(scaled.XAxis);
Serial.print(" ");
Serial.print(scaled.YAxis);
Serial.print(" ");
Serial.print(scaled.ZAxis);
Serial.print(" \tHeading:\t");
Serial.print(heading);
Serial.print(" Radians \t");
Serial.print(headingDegrees);
Serial.println(" Degrees \t");
}
Ou