HMC5883L là một module từ kế do Honeywell phát triển bằng cách sử dụng công nghệ điện từ dị hướng. Nó là một module đa năng hoạt động như một vi mạch la bàn digital để tìm hướng, đo độ lớn và hướng của từ trường dọc theo trục X, Y và Z. Module HMC5883L chuyển đổi từ trường thành đầu ra điện áp vi sai ở 3 chân trục.
Ứng dụng từ kế
Không giống như con người, những cỗ máy không người lái như rô bốt và máy bay không người lái không thể cảm nhận được hướng di chuyển của nó. Do đó, họ cần một cảm biến để xác định phương hướng. Do đó, chúng ta cần từ kế.
Họ cảm nhận từ trường và cho biết hướng của một thiết bị mà chức năng từ kế được tích hợp. Do đó, chúng ta có thể sử dụng HMC5883L để xác định hướng của các đối tượng
Sơ đồ chân IC HMC5883L
Module từ kế HMC5883L gồm IC XC6206P332MR với các thành phần khác. Bây giờ trước tiên chúng ta hãy thảo luận về cấu hình chân của IC:
Cấu hình chân IC
Phần này cung cấp thông tin chi tiết về tất cả các chân của IC HMC5883L.
Chân 3, 5, 6, 7 và 14 là chân NC, chúng không có bất kỳ chức năng nào và đó là lý do tại sao không được kết nối.
Chân giao tiếp I2C
Chân 1 và chân 16 là các chân giao tiếp cho giao thức I2C.
- SCL – Chân 1
- SDA – Chân 16
SCL là đầu vào xung nhịp Master / Slave nhận tín hiệu xung nhịp từ Master. IC từ kế hoạt động như một Slave khi giao tiếp với vi điều khiển. Do đó, vi điều khiển phải cấp tín hiệu xung nhịp cho IC. SDA là một chân truyền dữ liệu nối tiếp.
Chân cung cấp điện
- Chân 2 là chân cấp nguồn. Nó yêu cầu điện áp trong phạm vi từ 2.16V đến 3.6V để hoạt động. Nó cấp nguồn cho các hoạt động bên trong. Chân 9 và chân 11 là chân nối đất.
- Chân 4 là chân S1. Nối vào vào VDDIO.
- Chân 8 là chân đầu vào tích cực SET / RESET. Nó loại bỏ từ tính từ trước được lưu trữ trong cảm biến.
- Chân 10 là chân cho tụ điện. Kết nối tụ điện 4.7 µF ở chân này.
- Chân 12 SETC: đấu nối với điều khiển SET / RESET.
- Chân13 VDDIO: cấp nguồn cho IO, từ 1,71V đến VDD.
- Chân 15 là chân ngắt dữ liệu cho biết khi nào dữ liệu đã sẵn sang gửi.
Sơ đồ module HMC5883L
Như bạn biết IC XC6206P332MR có rất nhiều chân cắm và chúng ta cần sử dụng các linh kiện bên ngoài để nó hoạt động. Nhưng may mắn thay, đã có module tích hợp có sẵn trên thị trường với tất cả các thành phần cần thiết. Hình này cho thấy sơ đồ chân của module từ kế.
Như bạn có thể thấy sơ đồ chân này, module sẽ dễ sử dụng và có ít chân hơn. Chức năng của tất cả các chân đều giống nhau. Các chân SCL và SDA được sử dụng giao tiếp với vi điều khiển, để nhận dữ liệu 3 trục từ từ kế.
Đặc tính
- Nó hoạt động với điện áp một chiều từ 3V đến 6V.
- Nó hỗ trợ giao thức truyền thông.
- Cảm biến từ tính 3 trục, ASIC, 12-bit ADC và mạch boostrap.
- HMC2883L đo cường độ từ trường trong phạm vi từ -8 đến +8 gauss với độ chính xác từ 1-2 độ.
- Tốc độ đầu ra dữ liệu tối đa là 160Hz.
Nơi ứng dụng
HMC5883L là một cảm biến nhỏ, rẻ và dễ mua. Giao tiếp digital cho phép nó sử dụng với các vi điều khiển khác. Bạn thậm chí có thể kết nối nó với IC thông thường. Đây là những cảm biến nhạy và đáng tin cậy nhất so với các từ kế khác trong ngành.
Bạn có thể sử dụng cảm biến này trong các ứng dụng để đo cường độ và độ lớn của từ trường. Nó cũng có thể đo từ hóa của vật liệu. Nếu bạn đang tìm kiếm một từ kế có thể thực hiện các chức năng trên bằng cách đưa ra các phép đo chính xác, thì cảm biến này sẽ xử lý tốt nhất.
Cách sử dụng HMC5883L
Hình dưới đây cho biết hai thiết kế tham chiếu của module cảm biến HMC5883L để hiểu nguyên lý hoạt động của nó. Trong thiết kế nguồn cung cấp đơn, cấp cùng một nguồn điện áp cho cả hai chân VDD và VDDIO.
Trong khi ở chế độ cung cấp nguồn kép, chúng ta đã cấp các bộ nguồn riêng biệt cho cả hai chân. VDD cung cấp nguồn cho các xử lý bên trong của IC trong khi VDDIO cấp nguồn cho giao thức để cho phép giao tiếp.
Tất cả các kết nối khác trong cả hai mạch đều giống nhau. Nó có hai chế độ hoạt động bình thường và chế độ nhanh. Do đó, chúng ta kết nối điện trở kéo để hỗ trợ các chế độ này.
Thiết kế nguồn cung cấp đơn
Thiết kế nguồn cung cấp kép
Giao tiếp HMC5883L với Arduino Uno
HMC5883L có một bảng đáng mạch có mạch bổ sung để làm tương thích với các bộ vi điều khiển khác. Bạn có thể kết nối trực tiếp bảng mạch với Arduino Uno mà không cần thêm các thành phần phụ.
Các kết nối rất đơn giản kết nối Vcc với + 5V và mass với chân nối đất của Arduino. Kết nối các chân giao tiếp SCL và SDA vào chân analog 5 và 4 hoặc Arduino.
Thư viện Arduino HMC5883
Việc lập trình module HMC5883 rất dễ dàng với thư viện HMC5883L của James Sleeman. Trước hết, hãy truy cập link này và tải thư viện.
Sau đó, vào trình quản lý thư viện Arduino và thêm thư viện HMC5883. Hoặc bạn có thể giải nén thư mục đã tải xuống và dán tệp này vào bên trong thư mục thư viện Arduino.
Sơ đồ kết nối với Arduino
Thực hiện kết nối với module từ kế và Arduino Uno theo sơ đồ này.
- Module la bàn GY-273 -> Arduino
- VCC -> VCC (Xem ghi chú bên dưới)
- GND -> GND
- SCL -> A5 / SCL, (Sử dụng chân 21 trên Arduino Mega)
- SDA -> A4 / SDA, (Sử dụng chân 20 trên Arduino Mega)
- DRDY -> Không được kết nối ( như trong ví dụ này)
Code Arduino
Đoạn code này cho thấy các chức năng của thư viện Arduino module HMC5883L.
#include <Arduino.h> // PLEASE NOTE! // The Arduino IDE is a bit braindead, even though we include Wire.h here, it does nothing // you must include Wire.h in your main sketch, the Arduino IDE will not include Wire // in the build process otherwise. #include <Wire.h> #include "HMC5883L_Simple.h" HMC5883L_Simple::HMC5883L_Simple() { declination_offset_radians = 0; mode = COMPASS_SINGLE | COMPASS_SCALE_130 | COMPASS_HORIZONTAL_X_NORTH; i2c_address = COMPASS_I2C_ADDRESS; // NB: The HMC5883L does not appear to be able to have any different address. // so this is a bit moot. } /** Set declination in degrees, minutes and direction (E/W) * See http://www.magnetic-declination.com/ */ void HMC5883L_Simple::SetDeclination( int declination_degs , int declination_mins, char declination_dir ) { // Convert declination to decimal degrees switch(declination_dir) { // North and East are positive case 'E': declination_offset_radians = ( declination_degs + (1/60 * declination_mins)) * (M_PI / 180); break; // South and West are negative case 'W': declination_offset_radians = 0 - (( declination_degs + (1/60 * declination_mins) ) * (M_PI / 180)); break; } } /** Set the sampling mode to one of COMPASS_CONTINUOUS or COMPASS_SINGLE */ void HMC5883L_Simple::SetSamplingMode( uint16_t sampling_mode ) { // Mode is the bits marked M in mode // xxxxxxxxxxxSSSMM mode = (mode & ~0x03) | (sampling_mode & 0x03); Write(COMPASS_MODE_REGISTER, mode & 0x03); } /** Set the scale to one of COMPASS_SCALE_088 through COMPASS_SCALE_810 * Higher scales are less sensitive and less noisy * Lower scales are more sensitive and more noisy */ void HMC5883L_Simple::SetScale( uint16_t scale ) { // Scale is the bits marked S in mode // xxxxxxxxxxxSSSMM mode = (mode & ~0x1C) | (scale & 0x1C); Write(COMPASS_CONFIG_REGISTER_B, (( mode >> 2 ) & 0x07) << 5); } /** Set the orientation to one of COMPASS_HORIZONTAL_X_NORTH * through COMPASS_VERTICAL_Y_WEST * */ void HMC5883L_Simple::SetOrientation( uint16_t orientation ) { // Orientation is the bits marked XXXYYYZZZ in mode // xxXXXYYYZZZxxxxx mode = (mode & ~0x3FE0) | (orientation & 0x3FE0); } /** Get the heading of the compass in degrees. */ float HMC5883L_Simple::GetHeadingDegrees() { // Obtain a sample of the magnetic axes MagnetometerSample sample = ReadAxes(); float heading; // Determine which of the Axes to use for North and West (when compass is "pointing" north) float mag_north, mag_west; // Z = bits 0-2 switch((mode >> 5) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.Z; break; case COMPASS_SOUTH: mag_north = 0-sample.Z; break; case COMPASS_WEST: mag_west = sample.Z; break; case COMPASS_EAST: mag_west = 0-sample.Z; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // Y = bits 3 - 5 switch(((mode >> 5) >> 3) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.Y; break; case COMPASS_SOUTH: mag_north = 0-sample.Y; ; break; case COMPASS_WEST: mag_west = sample.Y; break; case COMPASS_EAST: mag_west = 0-sample.Y; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // X = bits 6 - 8 switch(((mode >> 5) >> 6) & 0x07 ) { case COMPASS_NORTH: mag_north = sample.X; break; case COMPASS_SOUTH: mag_north = 0-sample.X; break; case COMPASS_WEST: mag_west = sample.X; break; case COMPASS_EAST: mag_west = 0-sample.X; break; // Don't care case COMPASS_UP: case COMPASS_DOWN: break; } // calculate heading from the north and west magnetic axes heading = atan2(mag_west, mag_north); // Adjust the heading by the declination heading += declination_offset_radians; // Correct for when signs are reversed. if(heading < 0) heading += 2*M_PI; // Check for wrap due to addition of declination. if(heading > 2*M_PI) heading -= 2*M_PI; // Convert radians to degrees for readability. return heading * 180/M_PI; } /** Read the axes from the magnetometer. * In SINGLE mode we take a sample. In CONTINUOUS mode we * just grab the most recent result in the registers. */ HMC5883L_Simple::MagnetometerSample HMC5883L_Simple::ReadAxes() { if(mode & COMPASS_SINGLE) { Write(COMPASS_MODE_REGISTER, (uint8_t)( mode & 0x03 )); delay(66); // We could listen to the data ready pin instead of waiting. } uint8_t buffer[6]; Read(COMPASS_DATA_REGISTER, buffer, 6); MagnetometerSample sample; // NOTE: // The registers are in the order X Z Y (page 11 of datasheet) // the datasheet when it describes the registers details then in order X Y Z (page 15) // stupid datasheet writers sample.X = (buffer[0] << 8) | buffer[1]; sample.Z = (buffer[2] << 8) | buffer[3]; sample.Y = (buffer[4] << 8) | buffer[5]; return sample; } /** Write data to the compass by I2C */ void HMC5883L_Simple::Write(uint8_t register_address, uint8_t data) { Wire.beginTransmission(i2c_address); Wire.write(register_address); Wire.write(data); Wire.endTransmission(); } /** Read data from the compass by I2C */ uint8_t HMC5883L_Simple::Read(uint8_t register_address, uint8_t buffer[], uint8_t length) { // Write the register address that we will begin the read from, this // has the effect of "seeking" to that register Wire.beginTransmission(i2c_address); Wire.write(register_address); Wire.endTransmission(); // Read the data starting at that register we seeked Wire.requestFrom(i2c_address, length); if(Wire.available() == length) { for(uint8_t i = 0; i < length; i++) { buffer[i] = Wire.read(); } return length; } return 0; }
Code mẫu
Code mẫu này cho biết việc đọc dữ liệu từ kế ba trục HMC5883L trên serial-monitor Arduino.
#include <Arduino.h> #include <Wire.h> #include <HMC5883L_Simple.h> // Create a compass HMC5883L_Simple Compass; void setup() { Serial.begin(9600); Wire.begin(); // Magnetic Declination is the correction applied according to your present location // in order to get True North from Magnetic North, it varies from place to place. // // The declination for your area can be obtained from http://www.magnetic-declination.com/ // Take the "Magnetic Declination" line that it gives you in the information, // // Examples: // Christchurch, 23° 35' EAST // Wellington , 22° 14' EAST // Dunedin , 25° 8' EAST // Auckland , 19° 30' EAST // Compass.SetDeclination(23, 35, 'E'); // The device can operate in SINGLE (default) or CONTINUOUS mode // SINGLE simply means that it takes a reading when you request one // CONTINUOUS means that it is always taking readings // for most purposes, SINGLE is what you want. Compass.SetSamplingMode(COMPASS_SINGLE); // The scale can be adjusted to one of several levels, you can probably leave it at the default. // Essentially this controls how sensitive the device is. // Options are 088, 130 (default), 190, 250, 400, 470, 560, 810 // Specify the option as COMPASS_SCALE_xxx // Lower values are more sensitive, higher values are less sensitive. // The default is probably just fine, it works for me. If it seems very noisy // (jumping around), incrase the scale to a higher one. Compass.SetScale(COMPASS_SCALE_130); // The compass has 3 axes, but two of them must be close to parallel to the earth's surface to read it, // (we do not compensate for tilt, that's a complicated thing) - just like a real compass has a floating // needle you can imagine the digital compass does too. // // To allow you to mount the compass in different ways you can specify the orientation: // COMPASS_HORIZONTAL_X_NORTH (default), the compass is oriented horizontally, top-side up. when pointing North the X silkscreen arrow will point North // COMPASS_HORIZONTAL_Y_NORTH, top-side up, Y is the needle,when pointing North the Y silkscreen arrow will point North // COMPASS_VERTICAL_X_EAST, vertically mounted (tall) looking at the top side, when facing North the X silkscreen arrow will point East // COMPASS_VERTICAL_Y_WEST, vertically mounted (wide) looking at the top side, when facing North the Y silkscreen arrow will point West Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH); } // Our main program loop. void loop() { float heading = Compass.GetHeadingDegrees(); Serial.print("Heading: \t"); Serial.println( heading ); delay(1000); }
Các ứng dụng
- Điện thoại không dây GPS
- Trò chơi trên máy tính
- Thiết bị điều khiển không dây
- Đồng hồ thể thao
- Máy thu GPS di động
>>> Mời anh em xem thêm:
- Cảm biến đo chất lượng khí Nova PM SDS011
- Cảm biến bụi quang học GP2Y1014AU0F
- Transistor khuếch đại NPN 2SC828