Elektronik Pusula

Merhaba arkadaşlar , Arduino ile pusula yapılabilir mi diye araştırma yaparken gps modülü haricinde sadece pusula için COMPASS pusula modülünün varlığını keşfettim. Kullanımı I2C protokolünü kullanmasından dolayı kablo sıkıntısı olmadan rahatlıkla arduino ile bağlantı kurabiliyor.

Bu modülün adı  HMC5883 sensorü bu 3 eksende manyetik alanı ölçebiliyor buda Kuzey güney doğu batı yönünü rahatlıkla tesbitini sağlıyor . Arduino ile bağlantısı

GND , VCC, SDA ve SCL pinlerini bağlayarak sağlayabiliyorsunuz.

Projemizin çalışma mantığı HMC5883 sensöründen alınan veriler arduino ile işlenerek grafik ekranda animasyon ile kullanıcıya sunuluyor. Programda istediğiniz değişiklikler ile inanılmaz projeler yapabilirsiniz. Mesela  Her zaman kuzeyi , güneyi yada doğuyu yada batıyı gösteren bir kol . Projeyi nereye döndürürseniz döndürün kendisini o kuzeye  döndüren bir düzenek yapılabilir.

Projenin çalışmasını küçük bir videosu var buyrun izleyin .

Kullanılan Malzemeler

Arduino

Nokia5110 Grafik Ekran

HMC5883 Manyetik alan sensörü

Bağlantı Şeması

Bu sensör manyetik alanlardan çok etkilendiğinden dolayı çalışırken yakınlarında motor ,trafo , elektronik cihazlar olmamasına dikkat edin . Arkadaşlar her yerin bir sapma payı var , bulunduğunuz şehrin sapma payını çıkarmak için alttaki websitesine girerek sapmaları öğrenin. daha sonrası kolay.
http://www.magnetic-declination.com/

Kodların 60 ile  63. satırında kodlarda kendi değerlerinizi girmelisiniz. Bu kodlarda
float declinationAngle = 0.22; // Bu satırda sapma derecesini bulamazsanız silin.

3 boyutlu yazıcının dosyalarına buradan ulaşabilirsiniz.

Programımız

/* Arduino 3D printed Digital Magnetic Compass
 using 3-Axis Digital Compass IC HMC5883L board
 Thanks for display graphic feature : http://lookmanowire.blogspot.gr/search/label/Electronic%20compass 
 Ver. 1.0 / Date:2/4/2017 */

//Include libraries
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> //for graphics
#include <Adafruit_PCD8544.h> //for Nokia 5110 lcd 
#include <Adafruit_HMC5883_U.h>//for compass
#include <Adafruit_Sensor.h> //Common sensor library

//Init Display (SCLK, DIN, D/C, CS, RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
//Init HMC5883L sensor
Adafruit_HMC5883_Unified compass = Adafruit_HMC5883_Unified(12345);

//Constants
const int lcdLight = 13; //BL pin of LCD to arduino pin 13 (BL = Back Light)
// For 2nd display mode:
int r = 22; // radius of compass rose
int x0= 58; // x-origin
int y0 = 24; // y-origin

void setup() {
 pinMode(lcdLight, OUTPUT); // lcd led
 digitalWrite(lcdLight, HIGH); //Turn on backlight - Can also be controlled with a button
 compass.begin();
 Wire.begin();
 display.begin();
 display.setContrast(60);
 //Print a welcome message in startup for 6sec.//////////
 digitalWrite(lcdLight,HIGH);
 display.clearDisplay(); // clears the screen and buffer
 display.setTextColor(BLACK);
 display.setCursor(0,2);
 display.print(" ARDUMOTIVE ");
 display.setCursor(0,13);
 display.print(" ArduinoBased ");
 display.setCursor(0,23);
 display.print(" Compass ");
 display.setCursor(0,33);
 display.print(" 3D Printed "); 
 display.display(); // show splashscreen
 delay(6000);
 /////////////////////////////////////////////////////////
 display.clearDisplay(); // clears the screen and buffer
}

void loop() {

 //Reading and calculate degrees: /////////////////////////////////////
 //Get new sensor value every time that loop starting again
 sensors_event_t event; 
 compass.getEvent(&event);
 //Variable heading stores value in radians
 float heading = atan2(event.magnetic.y, event.magnetic.x);
 
 // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the compassnetic field in your location.
 // Find yours here: http://www.magnetic-declination.com/
 // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
 float declinationAngle = 0.43; //<--Change 0.22 with yours. If you can't find your declination juct delete those lines 😉
 heading += declinationAngle;
 // Correct for when signs are reversed.
 if(heading < 0) heading += 2*PI;
 // Check for wrap due to addition of declination.
 if(heading > 2*PI)heading -= 2*PI;
 // Convert radians to degrees for readability.
 float headingDegrees = heading * 180/M_PI; 
 //Convert float to int
 int angle=(int)headingDegrees;
 //////////////////////////////////////////////////////////////////////////

 display.clearDisplay(); // Just in case...
 
 // Calculation of compass needle on lcd pointing to the direction 
 DrawCircle(angle); //call DrawCircle function

 // Display actual heading
 display.setTextSize(2);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println(angle);
 
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(x0-2,5);
 display.println("N");
 
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor((x0+r)-6,y0-3);
 display.println("E");
 
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(x0-2,y0+r-8);
 display.println("S");
 
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor((x0-r)+4,y0-3);
 display.println("W");
 
 // Triangle for direction
 display.drawTriangle(0, 46, 20, 46, 10, 18, BLACK);
 display.fillTriangle (0, 46, 20, 46, 10, 18, BLACK);
 display.display();
 delay(500); //print new value every 0.5sec
 
}/// end of program

//////////// Functions ////////////



////Draw circle and print letters to display - 1st Display Mode
void DrawCircle(int angleActual) {
 if (angleActual >= 0 && angleActual <=45) {
 // 0-45 degrees
 int angle = angleActual/2;
 display.drawLine(x0, y0, x0+angle, y0-r, BLACK);

 } 
 else if (angleActual >45 && angleActual <=90) {
 // 46-90 degrees
 int angle = (angleActual-45)/2 ;
 display.drawLine(x0, y0, x0+r, (y0-r)+angle, BLACK);

 } 
 else if (angleActual >90 && angleActual <=135) {
 // 91-135 degrees
 int angle = (angleActual-90)/2;
 display.drawLine(x0, y0, x0+r, y0+angle, BLACK);

 } 
 else if (angleActual >135 && angleActual <=180) {
 // 136-180 degrees
 int angle = (angleActual-135)/2;
 display.drawLine(x0, y0, (x0+r)-angle, y0+r, BLACK);

 } 
 else if (angleActual >180 && angleActual <=225) {
 // 181-225 degrees
 int angle = (angleActual-180)/2; 
 display.drawLine(x0, y0, x0-angle, y0+r, BLACK);

 } 
 else if (angleActual >225 && angleActual <=270) {
 // 226-270 degrees
 int angle = (angleActual-225)/2; 
 display.drawLine(x0, y0, x0-r, (y0+r)-angle, BLACK);

 } 
 else if (angleActual >270 && angleActual <=315) {
 // 271-315 degrees
 int angle = (angleActual-270)/2;
 display.drawLine(x0, y0, x0-r, y0-angle, BLACK);

 } 
 else if (angleActual >315 && angleActual <=360) {
 // 316-360 degrees
 int angle = (angleActual-315)/2;
 display.drawLine(x0, y0, (x0-r)+angle, y0-r, BLACK);

 }
}

ardumotive

Boş zamanlarda arduino ile uğraşan kendi halinde bir Öğretmen.

  

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.