산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 및 Processing IDE를 사용하여 나침반을 만드는 방법

<메인 클래스="사이트 메인" id="메인">

이 Arduino 프로젝트에서는 Arduino, MEMS 자력계 및 처리 IDE를 사용하여 이 멋진 나침반을 만드는 방법을 살펴보겠습니다. 다음은 나침반의 데모 동영상입니다.

개요

이 프로젝트에 필요한 것은 지구 자기장, Arduino 보드 및 일부 점퍼 와이어를 측정하기 위한 MEMS 자력계뿐입니다. 예를 들어 GY-80 브레이크아웃 보드에 통합된 3축 자력계인 HMC5883L을 사용하겠습니다.

나침반의 작동 원리

아두이노 부품

먼저 I2C 프로토콜을 통해 Arduino 보드를 사용하여 센서에서 데이터를 가져와야 합니다. 그런 다음 센서의 X – 축 및 Y – 축 값을 사용하여 방향을 계산하고 직렬 포트를 통해 처리 IDE로 값을 보냅니다. 다음 코드가 해당 작업을 수행합니다.

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

#include <Wire.h> //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;

float heading, headingDegrees, headingFiltered, declination;

float Xm,Ym,Zm;


#define Magnetometer 0x1E //I2C 7bit address of HMC5883

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(115200);
  Wire.begin();
  delay(100);
  
  Wire.beginTransmission(Magnetometer); 
  Wire.write(0x02); // Select mode register
  Wire.write(0x00); // Continuous measurement mode
  Wire.endTransmission();
}

void loop(){
 
  //---- X-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mX1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mX0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mX0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mX1 = Wire.read();
  }

  //---- Y-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mY1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mY0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mY0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mY1 = Wire.read();
  }
  
  //---- Z-Axis
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mZ1);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mZ0 = Wire.read();
  }
  Wire.beginTransmission(Magnetometer); // transmit to device
  Wire.write(Magnetometer_mZ0);
  Wire.endTransmission();
  Wire.requestFrom(Magnetometer,1); 
  if(Wire.available()<=1)   
  {
    mZ1 = Wire.read();
  }
  
  //---- X-Axis
  mX1=mX1<<8;
  mX_out =mX0+mX1; // Raw data
  // From the datasheet: 0.92 mG/digit
  Xm = mX_out*0.00092; // Gauss unit
  //* Earth magnetic field ranges from 0.25 to 0.65 Gauss, so these are the values that we need to get approximately.

  //---- Y-Axis
  mY1=mY1<<8;
  mY_out =mY0+mY1;
  Ym = mY_out*0.00092;

  //---- Z-Axis
  mZ1=mZ1<<8;
  mZ_out =mZ0+mZ1;
  Zm = mZ_out*0.00092;
  // ==============================
  //Calculating Heading
  heading = atan2(Ym, Xm);
 
  // Correcting the heading with the declination angle depending on your location
  // You can find your declination angle at: https://www.ngdc.noaa.gov/geomag-web/
  // At my location it's 4.2 degrees => 0.073 rad
  declination = 0.073; 
  heading += declination;
  
  // Correcting when signs are reveresed
  if(heading <0) heading += 2*PI;

  // Correcting due to the addition of the declination angle
  if(heading > 2*PI)heading -= 2*PI;

  headingDegrees = heading * 180/PI; // The heading in Degrees unit

  // Smoothing the output angle / Low pass filter 
  headingFiltered = headingFiltered*0.85 + headingDegrees*0.15;

  //Sending the heading value through the Serial Port to Processing IDE
  Serial.println(headingFiltered);

  
  delay(50);
}Code language: Arduino (arduino)

MEMS 자력계의 작동 방식과 데이터를 가져오는 방법에 대한 자세한 내용이 필요한 경우 내 MEMS 센서 자습서를 확인하세요.

IDE 부분 처리

여기서 먼저 직렬 포트에서 오는 표제 값을 받아야 합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 내 Arduino 및 처리 자습서를 참조하세요.

나침반은 실제로 이미지이거나 더 정확하게는 Processing IDE에 로드된 여러 투명 이미지로 구성됩니다. 이미지는 스케치의 작업 디렉토리에 있습니다. image() 함수를 사용하여 draw() 섹션에서 이미지 객체를 정의한 후 배경 이미지를 로드합니다(선택사항, 배경에 간단한 색상만 사용할 수 있음). 그런 다음 회전 Z() 함수를 사용하여 제목 값으로 회전되는 나침반 이미지가 로드됩니다. 그 위에 나침반 화살표 이미지가 로드됩니다.

처리 IDE 코드는 다음과 같습니다.

/*   Arduino Compass 
 *      
 *  by 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;

String data="";
float heading;

void setup() {
  size (1920, 1080, P3D);
  smooth();
  imgCompass = loadImage("Compass.png");
  imgCompassArrow = loadImage("CompassArrow.png");
  background = loadImage("Background.png");
  
  myPort = new Serial(this, "COM4", 115200); // starts the serial communication
  myPort.bufferUntil('\n');
}

void draw() {
  
  image(background,0, 0); // Loads the Background image
    
  pushMatrix();
  translate(width/2, height/2, 0); // Translates the coordinate system into the center of the screen, so that the rotation happen right in the center
  rotateZ(radians(-heading)); // Rotates the Compass around Z - Axis 
  image(imgCompass, -960, -540); // Loads the Compass image and as the coordinate system is relocated we need need to set the image at -960x, -540y (half the screen size)
  popMatrix(); // Brings coordinate system is back to the original position 0,0,0
  
  image(imgCompassArrow,0, 0); // Loads the CompassArrow image which is not affected by the rotateZ() function because of the popMatrix() function
  textSize(30);
  text("Heading: " + heading,40,40); // Prints the value of the heading on the screen

  delay(40);
  
}

// starts reading data from the Serial Port
 void serialEvent (Serial myPort) { 
  
   data = myPort.readStringUntil('\n');// reads the data from the Serial Port and puts it into the String variable "data".
  
  heading = float(data); // Convering the the String value into Float value
}
Code language: Arduino (arduino)

여기에서 프로젝트, 이미지 및 소스 코드에서 파일을 다운로드할 수 있습니다.


제조공정

  1. Arduino를 사용하여 모니터 Ambilight 만들기
  2. ARDUINO를 사용하는 초음파 부상 기계
  3. Arduino, 1Sheeld 및 Android를 사용한 범용 원격 제어
  4. Arduino와 스마트폰을 사용한 DIY 전압계
  5. Arduino를 사용한 주파수 및 듀티 사이클 측정
  6. 사용자 정의 가능한 펀치 키보드 버튼을 만드는 방법
  7. arduino를 사용한 소나 및 IDE 처리 시 표시
  8. Arduino + Processing + PHP를 사용한 자동차 카운터
  9. 볼트와 Arduino를 사용하여 LED 밝기 제어
  10. Arduino를 사용한 간단하고 스마트한 로봇 팔