บทความนี้ กล่าวถึงขั้นตอนการใช้งาน โมดูล GPS รุ่น GY-NEO6MV2 NEO-6M กับ STM32 รุ่น STM32F407VET6 โดยใช้การสื่อสารกันผ่านพอร์ตอนุกรมแบบ UART และแสดงผล ละติจูด , ลองจิจูด ที่จอ LCD 16×2
GPS ย่อมาจาก Global Positioning System และใช้เพื่อตรวจจับละติจูดและลองจิจูดของตำแหน่งใด ๆ บนโลกโดยมีเวลา UTC ที่แน่นอน (Universal Time Coordinated) อุปกรณ์นี้รับพิกัดจากดาวเทียมเป็นรายวินาทีพร้อมเวลาและวันที่ GPS ให้ความแม่นยำสูงและยังให้ข้อมูลอื่น ๆ นอกเหนือจากพิกัดตำแหน่ง
เราทุกคนทราบดีว่า GPS เป็นอุปกรณ์ที่มีประโยชน์มากและนิยมใช้ในโทรศัพท์มือถือและอุปกรณ์พกพาอื่น ๆ เพื่อติดตามตำแหน่ง มีแอพพลิเคชั่นที่หลากหลายในทุกสาขาตั้งแต่การเรียกแท็กซี่ที่บ้านของคุณเพื่อติดตามระดับความสูงของเครื่องบิน
GPS โมดูล รุ่น GY-NEO6MV2 NEO-6M
GY-NEO6MV2 NEO-6M โมดูล GPS นี้มีสี่ขา + 5V, GND, TXD และ RXD โดย จะสื่อสารกันผ่านพอร์ตอนุกรมแบบ UART และสามารถเชื่อมต่อกับพอร์ตอนุกรม ของ STM32F407VET6 ได้อย่างง่ายดาย
UART หรือชื่อเต็ม Universal Asynchronous Receiver and Transmitter เป็นการสื่อสารข้อมูลผ่านพอร์ตอนุกรมแบบอะซิงโครนัส (asynchronous serial communication) ระหว่างอุปกรณ์ต่าง ๆ ซึ่งนิยมใช้เป็นการสื่อสารระหว่างไมโครคอนโทรลเลอร์ด้วยกัน การทำงานแบบอะซิงโครนัสหมายความว่าจะไม่มีสัญญาณนาฬิกา (clock signal) ส่งออกมาจากตัวส่งหรือตัวรับเพื่อกำหนดจังหวะการรับส่งข้อมูล แต่จะกำหนดผ่านโดยการตั้งความเร็วในการรับส่งข้อมูลของอุปกรณ์ดังกล่าวแทน
ขั้นตอนการทํางาน
1 : ทดสอบการใช้งานจอ LCD 16×2 กับ STM32
ทดสอบการใช้งานจอ LCD 16×2 กับ STM32 รุ่น STM32F407VET6 ตามลิงค์ด้านล่าง
2 : ติดตั้งไลบรารี TinyGPSPlus
สำหรับการใช้งานโมดูล GPS รุ่น GY-NEO6MV2 ต้องติดตั้งไลบรารี TinyGPSPlus เพิ่มเข้าไปที่ Arduino IDE
ดาวน์โหลดไลบรารีได้ที่ : TinyGPSPlus
ไปที่ Code -> Download ZIP
เปิดโปรแกรม Arduino IDE ไปที่ Sketch -> Include Library -> Add .ZIP Library…
ไปที่ ไลบรารี TinyGPSPlus ที่เรา ดาวน์โหลด มา -> Open
ตรวจสอบที่ Sketch -> Include Library จะพบ ไลบรารี TinyGPS++ เพิ่มเข้ามาใน Arduino IDE ของเรา
3 : อัพโหลดโค้ดให้กับ STM32
เขียนโปรแกรมและอัพโหลดโค้ดด้านล่างนี้ ไปที่ STM32
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <TinyGPS++.h> //Library for using GPS functions
TinyGPSPlus gps; //Object gps for class TinyGPSPlus
void setup()
{
Serial1.begin(9600); //Begins Serial comunication at Serial Port 1 at 9600 baudrate
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Circuit Digest");
lcd.setCursor(0, 1);
lcd.print("STM32 with GPS");
delay(4000);
lcd.clear();
}
void loop()
{
GPSDelay(1000);
unsigned long start;
double lat_val, lng_val;
bool loc_valid;
lat_val = gps.location.lat(); //Gets the latitude
loc_valid = gps.location.isValid();
lng_val = gps.location.lng(); //Gets the longitude
if (!loc_valid) //Excecutes when invalid data is received from GPS
{
lcd.print("Waiting");
Serial.print("Latitude : ");
Serial.println("*****");
Serial.print("Longitude : ");
Serial.println("*****");
delay(4000);
lcd.clear();
}
else //Excutes when valid data is received from GPS
{
lcd.clear();
Serial.println("GPS READING: ");
Serial.print("Latitude : ");
Serial.println(lat_val, 6); //Prints latitude at Serial Monitor
lcd.setCursor(0, 0);
lcd.print("LAT:");
lcd.print(lat_val, 6); //Prints latitude at LCD display
Serial.print("Longitude : ");
Serial.println(lng_val, 6); //Prints longitude at Serial monitor
lcd.setCursor(0, 1);
lcd.print("LONG:");
lcd.print(lng_val, 6); //Prints longitude at LCD display
delay(4000);
}
}
static void GPSDelay(unsigned long ms) //Delay for receiving data from GPS
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
4 : เชื่อมต่อ โมดูล GPS เข้ากับ STM32 ตามรูปด้านล่าง
เชื่อมต่อสายระหว่าง GY-NEO6MV2 กับ STM32F407VET6
5 : ผลลัพธ์การทำงาน
เชื่อมต่อแหล่งจ่ายไฟ 5V ให้กับ STM32 โดยเสียบสาย USB ระหว่าง STM32 กับ คอมพิวเตอร์ หรือ พาวเวอร์แบงค์
ถ้าไม่สามารถจับสัญญาณ GPS ได้ หรือรอสัญญาณ GPS จะแสดงข้อความ Waiting (ให้รอจนกระทั่งจับสัญญาณ GPS ได้)
ผลลัพธ์การทำงาน บรรทัดบนแสดงค่า ละติจูด (LAT) และ บรรทัดล่างแสดงค่า ลองจิจูด (LONG) แสดงว่าโมดูล GPS พร้อมใช้งานกับ STM32 แล้ว
6 : อุปกรณ์ที่ใช้
- 1. STM32F407VET6 Development Board Cortex-M4 ARM STM32
- 2. ST-Link V2 STM32 Simulator Programmer
- 3. โมดูล I2C LCD พร้อมหน้าจอ LCD 1602
- 4. Ublox GY-NEO6MV2 NEO-6M GPS Module
- 5. Right Angle Single Row Pin Male Header
credit : https://circuitdigest.com/microcontroller-projects/interfacing-stm32f103c8-with-gps-module-to-track-location-coordinates