Arduino Mega GPS พร้อมจอ LCD และการบันทึก SD: 9 ขั้นตอน

Arduino Mega GPS พร้อมจอ LCD และการบันทึก SD: 9 ขั้นตอน

สารบัญ:

Anonim

ใช้ Audino Mega ของคุณเป็นเครื่องบันทึก GPS พร้อมหน้าจอ LCD ที่ชัดเจนและปุ่มฟังก์ชั่น 5 ปุ่ม LED สองสีใช้เพื่อให้ข้อมูลสถานะ

SDcard สามารถอยู่ในและอ่านโดยใช้แบบร่างเครื่องอ่านการ์ดพร้อมเอาต์พุตไปยังการตรวจสอบแบบอนุกรม

คำแนะนำนี้จะแสดงให้คุณเห็นว่าบอร์ด Adafruit Ultimate GPS ซึ่งใช้ชิป MTK3339 สามารถตั้งค่าให้ลงชื่อเข้าใช้ sdcard ได้อย่างไร

หน้าจอ LCD ถูกกำหนดค่าให้แสดง:

  • ตำแหน่งละติจูดและลองจิจูด
  • การอ้างอิง Gid แห่งชาติของสหราชอาณาจักร
  • ระดับความสูง
  • ความเร็ว
  • การแบก
  • ระยะทางที่เดินทางจากจุดเริ่มต้น (จุดเริ่มต้นสามารถรีเซ็ตได้)
  • ช่วงจากจุดกำเนิด (ในขณะที่อีกาบิน)
  • เวลา
  • จำนวนดาวเทียม
  • การเจือจางในแนวนอนของตำแหน่ง (HDOP)
  • สถานะการบันทึก

ค่า LCD สามารถแสดงผลเป็นหน่วยเมตริกหรือหน่วยอิมพีเรียล

แนวคิดการบันทึกดั้งเดิมได้รับการพัฒนาจาก:

คนตัดไม้ของ Ladyada

กับห้องสมุด SdFat ของ Bill Greiman

ใช้ชิปเซ็ต MTK3339

วัสดุ:

ขั้นตอนที่ 1: ข้อกำหนด

1) Arduino Mega 2560

เมกะ Sainsmart ยังใช้งานได้

2) โล่ปุ่มกดจอแอลซีดี http: //www.hobbytronics.co.uk/arduino-lcd-keypad-s …

แผงปุ่มกด sainsmart ใช้งานได้เช่นกัน

3) adafruit สุดยอด gps logger shield http: //proto-pic.co.uk/adafruit-ultimate-gps-logge …

4) Arduino Header Kit (Shield) Header Kit - R3 http: //www.hobbytronics.co.uk/cables-connectors/p …

ดึงหมุดออกจากขั้วต่อหัวแถวเดี่ยวและใช้พลาสติกเพื่อสร้างความยาวของสเปเซอร์สำหรับตัวเชื่อมต่อหัวต่อโล่แบบเรียงซ้อนได้

5) แคโทดทั่วไปสีแดง / สีเขียวสองสีนำมีเส้นผ่าศูนย์กลาง 3/5 มม

6) การ์ดหน่วยความจำ Micro SD http: //www.hobbytronics.co.uk/4gb-microsd? keyword = …

7) ตัวต้านทานสำหรับการควบคุมกระแสไฟ LED (ขึ้นอยู่กับ LED)

ถ้า LED ต้องการ 10 ma @ 5V ตัวต้านทานจะเป็น R = V / I = 5 / 0.010 = 500 ohms

8) กล่องพลาสติก

ฉันใช้ 15 ซม. * 10 ซม. * 5 ซม. และจะเล็กกว่านี้หากฉันสามารถหามาได้

9) ปลั๊กไฟ DC 5.5 มม. สำหรับ Arduino http: //www.hobbytronics.co.uk/cables-connectors/dc …

9) ซ็อกเก็ตท่วงทำนองโมโนขนาด 3.5 มม

10) แผงสวิตช์ (เปิด / ปิดให้คะแนนอย่างเหมาะสมสำหรับ 5v 500mA)

11) ผู้ถือฟิวส์แผงกับฟิวส์ระเบิด 500mA อย่างรวดเร็ว

12) ฟุตกาวยางขนาดเล็ก (จำเป็นต้องใช้ 8)

13) spacers ไนล่อน 10 มม. ที่มีเส้นผ่านศูนย์กลางภายใน 3.3 มม. http: //www.hobbytronics.co.uk/hardware/spacers-was …

พอดีเหล่านี้อย่างสมบูรณ์บนปุ่ม LCD เพื่อสร้างส่วนขยาย ใช้ superglue ผู้สร้างโมเดลเพื่อแนบ สมัครโดยใช้หัวฉีดขนาดเล็กด้วยความระมัดระวัง!

14) สลักเกลียวขนาด 2-2.5 มม. พร้อมน็อตและแหวนรอง (จำเป็น 3 ชิ้น) เพื่อทำหน้าที่เป็นเสารองรับสำหรับ Arduino สกรูแคบ ๆ ยาว 2 ซม.

15) เดือยขนาดเล็กยาว 5 มม. สกรูขนาดเล็กเพื่อแก้ไข ล้างพลาสติกขนาดเล็ก 3-4

16) Hardboard ให้พอดีกับด้านล่างของกล่อง ไม้ทำสองฐานรองรับความกว้างของกล่อง

17) แบตเตอรี่ - ฉันใช้ 2 เซลล์ 500 mAH LIPO คุณจะต้อง เครื่องชาร์จ LIPO สำหรับสิ่งนี้.

18) นำไปสู่การจับคู่ประเภทขั้วแบตเตอรี่

19) สาย UFA ที่เป็นอุปกรณ์เสริมสำหรับอะแดปเตอร์ arial SMA หากคุณวางแผนที่จะเพิ่ม arial ภายนอก

gps ไวมาก - ฉันยังไม่ได้ซื้อ arial เลย

ขั้นตอนที่ 2: การเริ่มต้น

อ่านบทความ adafruit บนสุดยอด gps

อีกบทความที่มีประโยชน์ http: //learn.adafruit.com/adafruit-shield-compat …

พอดีกับเท้ายางขนาดเล็ก 4 จุดไปยังฐานของ Arduino Mega:

สิ่งนี้จะให้พื้นผิวการติดตั้งที่มั่นคง

หลีกเลี่ยงการติดตั้งรู

ติดตั้งตัวเชื่อมต่อแบบเรียงซ้อนได้เข้ากับบอร์ด gps:

ตรวจสอบให้แน่ใจว่าคุณใช้หลุมนอกสุดในบอร์ด GPS ตรวจสอบว่าทุกอย่างไปด้วยกัน!

ฉันแทรกบอร์ดลงใน arduino บางส่วนจากนั้นบัดกรีหมุด 2 อันในแต่ละส่วนโดยให้บอร์ดหงายขึ้น

ต้องใช้ความระมัดระวังเพื่อไม่ให้ความร้อนสูงเกินไปบนกระดาน หมุดที่เหลือถูกบัดกรีโดยนำบอร์ดออก

ใช้ความยาวของตัวเชื่อมต่อ Row Header แบบตรงและดึงพินออกมาเพื่อทำแถบของ spacers ติดตั้งสเปเซอร์กับตัวเชื่อมต่อแบบเรียงซ้อนได้ทั้ง 4 ส่วนที่คุณมีอยู่ในบอร์ด GPS

สมมติว่าคุณใช้เมกะ ตัดแทร็คเป็นพิน 7, 8 และ 10 ดังแสดงในภาพร่าง ใช้มีดผ่าตัดที่คมและตัดอย่างระมัดระวัง ตรวจสอบก่อนตัด!

ใส่แบตเตอรี่ GPS และการ์ด SD:

ใส่แบตเตอรี่โดยสังเกตขั้ว

เลื่อนการ์ด SD ที่ฟอร์แมตไว้ล่วงหน้าอย่างระมัดระวังลงในช่องเสียบจนกว่าจะเข้าที่ สังเกตการจัดตำแหน่งที่ถูกต้อง

เชื่อมต่อ 3 นำไปสู่ ​​CCS, TX และ RX :

ฉันงอลูกค้าเป้าหมายในตัวเชื่อมต่อแบบซ้อนกันได้ 6 ทางถึง 90 องศาและบัดกรีลงในแถวด้วย CSS / TX / RX

สิ่งนี้ทำให้ฉันสามารถลบลูกค้าที่มุ่งหวังได้อย่างง่ายดายหากต้องการ

หรือประสานบัดกรีโดยตรง

เพิ่มไฟ LED สองสี:

ตรวจสอบแผ่นข้อมูลสำหรับ LED สองสีของคุณแล้วเลือกตัวต้านทานเพื่อให้กระแสที่ถูกต้อง จัดวางแนวทางสำหรับผู้นำ LED ควรเป็นประเภทแคโทดทั่วไป

ติดตั้งบอร์ด LCD ลงบนบอร์ด GPS ชั่วคราวเพื่อจับคู่หลุมด้วยความระมัดระวัง!

โค้งนำไปสู่การใช้ pliars จมูกแหลมเป็นการสนับสนุนเพื่อให้บรรลุรายละเอียดในร่าง

ไฟ LED ควรล้างส่วนท้ายของหน้าจอแอลซีดีประมาณ 10-12 มม. และสูงกว่า 4-5 มม. เพื่อให้มันเพิ่งโผล่ออกมาจากกล่อง

นำ LCD ออกเมื่อคุณสร้างโปรไฟล์ลูกค้าเป้าหมายและความยาว

ประสาน LED, ตัวต้านทานและสายไฟ 3 เส้นไปยังด้านล่างของบอร์ด GPS

สีแดงนำไปสู่ขา 2, สีเขียวเพื่อพิน 3 และแคโทดผ่านตัวต้านทานถึง 0V

เสียบบอร์ด GPS เข้ากับ Arduino Mega:

หากคุณใช้ Sainsmart จะมี 2 ตัวนำแต่ละด้านไม่อยู่ในรูเสียบ - ก่อนการประกอบฉันงอออกเล็กน้อยเหล่านี้และวางท่อหดความร้อนบนหมุดสัมผัส

เชื่อมต่อ 3 นำไปสู่ ​​Arduino- RX กับ TX1, TX ถึง RX1 และ SSC เพื่อ pin 32 (อาจเป็นอีกหนึ่งถ้าคุณต้องการ)

ตั้งสวิตช์ GPS เป็น SOFT SERIAL

เสียบบอร์ด LCD เข้ากับบอร์ด GPS:

หารูสำหรับติดตั้งในแผงจอแอลซีดีถัดจากปุ่มต่างๆ ตัดเดือยไม้ 5 มม. อย่างระมัดระวังเพื่อรองรับปลายปุ่มของ LCD ด้านล่างรูติดตั้ง ควรพักผ่อนบนม้านั่ง จะเป็นการหยุดจอแอลซีดีเมื่อปุ่มถูกกด

ใส่แหวนพลาสติกลงในสล็อตเพื่อป้องกันไม่ให้ปิด ขันสกรูไม้ให้เข้าที่ - ใช้รูนำร่องที่ดี หากจำเป็นต้องปรับความสูงด้วยกระดาษทราย / ล้าง ไม้เรียวควรล้างการเข้าถึงช่องเสียบไฟขนาดใหญ่

ขั้นตอนที่ 3: สร้างกล่อง

1) ตัดชิ้นส่วนของฮาร์ดเพื่อให้พอดีกับฐานของกล่อง - อนุญาตให้มีการเคลื่อนไหวอย่างน้อย 2 มม. ทุกรอบ

2) วาง Mega บนฐาน - วางตำแหน่งอย่างระมัดระวังเพื่อให้ 15 มม. จากขอบด้านซ้ายของหน้าจอแอลซีดีทางด้านซ้ายของกล่องและ 35 มม. จากขอบด้านหน้าของจอแอลซีดีไปที่ด้านหน้าของกล่อง ทำเครื่องหมายและเจาะรูสำหรับติดตั้งหนึ่งรู ตอบโต้ที่ด้านล่างของฐาน ใส่น็อตและสลักเกลียวขนาด 2 มม. จากด้านล่าง

ปรับตำแหน่ง Arduino และติดตั้งรูที่สองเพื่อให้แน่ใจว่าจอแอลซีดีขนานกับฐาน

เพิ่มน็อตและสลักเกลียวตัวที่สาม ตัวยึดสุดท้ายจะเป็นสกรูจากด้านบนเข้าสู่รูติดตั้งด้านล่างขวา

ตัดและขันสลักเกลียวยึดตามความยาวหากเหมาะสม

3) วาง mega บน mounts วัดความสูงอย่างระมัดระวังระหว่างส่วนบนของกล่องและด้านบนของ LCD ตรวจสอบตำแหน่งด้านล่างของฝาปิดที่เกี่ยวข้องกับด้านบนของจอ LCD

ทำให้นักวิ่งรูปสี่เหลี่ยมผืนผ้าสองตัว ความลึกที่ถูกต้องเพื่อวางส่วนบนของ LCD 1-2 มม ใต้ฝาล่าง

นักวิ่งมือขวาต้องเป็น ตรงกลางที่รูสกรูสำหรับตำแหน่งการติดตั้งที่มุมล่างขวา

สกรูผ่านด้านบนของฐานเพื่อรักษาความปลอดภัยนักวิ่ง หลีกเลี่ยงการติดตั้งรู

ตรวจสอบความสูงของจอแอลซีดีอีกครั้งเกี่ยวกับฝา - อย่าวางฝาบน - ไฟ LED จะงอ!

4) เจาะรูสกรูเข้าไปในทางขวามือรองลงมาเบา ๆ รอบรูสำหรับสกรู ตัดตัวเว้นวรรคไนล่อน 10 มม. เพื่อรองรับส่วนล่างขวาของบอร์ด ถือสเปเซอร์เข้าที่ด้วยสกรูและยึดสเปเซอร์เข้าที่

5) วางตำแหน่ง Mega ด้วยจอแอลซีดีขนานกับด้านหน้าของกล่อง. ยึดฐานด้วยสกรู countersunk ในแต่ละนักวิ่งจากด้านนอกของกล่อง ต้องสังเกตตำแหน่งอย่างระมัดระวัง

6) วัดตำแหน่งของ LED. เจาะรูนำร่องเล็ก ๆ ในฝา ตรวจสอบว่า LED อยู่ในแนวเดียวกันและเปิดรูเป็นขนาดกวาดล้างสำหรับ LED ตอนนี้ฝาจะยังคงอยู่

7) วัดและตัดหลุมสำหรับหน้าจอ LCD - น้อยกว่าขนาดภายนอกของเมาท์จอ LCD 1-2 มม.

8) ลบฐานและตัดการ์ดลูกฟูกสองแถบเพื่อให้ตรงกับฐานของนักวิ่ง กาวเหล่านี้เพื่อนักวิ่ง จากนั้นใส่ 2 รูเข้าไปในการ์ดเพื่อให้ตรงกับรูสกรู ใส่ฐานกลับเข้าที่ ปรับแรงกดของสกรูจนกระทั่งฝาปิดพอดีกับด้านบนของจอ LCD (ช่องว่าง 1-2 มม.!)

9) เจาะรูปุ่มทั้งห้า:

ทาสีทิปป์สีขาวลงบนปุ่มอย่างระมัดระวัง

วัดตำแหน่งสำหรับปุ่มซ้ายล่าง เจาะรูนักบินในฝา ตรวจสอบว่ารูเปิด - เปิดฝาแล้วส่องไฟฉายจากด้านบน - ด้านบนของปุ่มสีขาวควรแสดงขึ้นมา

ปรับรูนำร่องถ้าจำเป็นด้วยไฟล์เข็มวงกลม - ตรวจสอบตำแหน่งและเจาะรูออกไปยังเส้นผ่านศูนย์กลางการกวาดล้างสำหรับตัวเว้นวรรคไนล่อน 10 มม.

ทำซ้ำอีก 4 ปุ่ม ทำความสะอาดทิปป์ด้วยวิญญาณสีขาว

10) เพิ่มปุ่มส่วนขยายไปยังบอร์ด LCD:

ปกป้องพื้นผิวการทำงานของคุณ เตรียมผ้ากระดาษให้พร้อม ลบเด็กที่เสียสมาธิทั้งหมด

ตรวจสอบว่าตัวเว้นวรรคไนล่อน 10 มม. วางตัวบนปุ่มอย่างดี หากจำเป็นให้ขยายรูจนกว่าจะมีสัญญาณรบกวนเข้าใกล้ คุณจะต้องใช้ผู้ผลิตโมเดลควบคุมวิทยุไซยาโนอะคริเลตกาว - ปานกลางถึงความหนืดบางและหัวฉีดกาวชั้นดีบางส่วนจากผู้จัดจำหน่ายโมเดลควบคุมวิทยุ ติดตั้งตัวเว้นวรรคแรกในแนวตั้ง จากนั้นใช้หัวฉีดที่ดีที่สุดใช้กาวจากด้านในของก้นหลอด พลิกบอร์ด LCD เพื่อป้องกันการซึมเข้าไปในสวิตช์ รอสักครู่แล้วทำปุ่มอื่น ๆ ตามขั้นตอนเดียวกัน ปล่อยให้ LCD กลับด้านเป็นเวลา 30 นาทีเพื่อให้กาวสามารถรักษาได้ ในระหว่างกาลให้ถอดและทิ้งหัวฉีดละเอียด ทำความสะอาดขวดกาวด้วยกระดาษทิชชูและเปลี่ยนกาวด้านบน

ตรวจสอบว่าฝาของกล่องพอดีกับ!

11) เจาะและติดตั้งที่ช่องเสียบอุปกรณ์ชาร์จสวิตช์ฟิวส์และตะกั่ว Arial (ถ้าจำเป็น)

12) ถอดสกรูบนกล่องกันชื้นแบบพลาสติกออกจากปลั๊กไฟ DC 5.5 มม. บัดกรีสายไฟหนึ่งเส้นเข้ากับขั้วสีแดงสำหรับส่วนปลาย ใช้ท่อหดเพื่อป้องกันและจัดเรียงสายไฟในโค้งก่อนให้ความร้อน. การถอดเคสบรรเทาความเครียดช่วยให้มีพื้นที่รองรับไม้ได้

13 เชื่อมต่อสายไฟตามที่แสดงในมุมมองภายในของกล่อง.

เคล็ดลับซ็อกเก็ต phono ควรเชื่อมต่อกับแบตเตอรี่เป็นบวก

การเชื่อมต่อแบบสลับบนซ็อกเก็ตท่วงทำนองจะจ่ายไฟให้กับส่วนที่เหลือของวงจร

14) ตัดรูสำหรับปลั๊ก USB และประกอบ Arduino อีกครั้ง

รวมการเชื่อมต่อ UFL เข้ากับลีออนตะกั่วหากจำเป็นต้องใช้ด้วยความระมัดระวัง

ขันสกรูยึดบอร์ดสุดท้ายให้แน่น

ตรวจสอบสายไฟอย่างระมัดระวัง ฉันไม่ยอมรับความรับผิดสำหรับคุณสมบัตินี้หรือคุณลักษณะอื่นใดที่มีอยู่ใน!

15) เชื่อมต่อแบตเตอรี่ และแก้ไขโดยใช้ velcro

ติดเท้ายางขนาดเล็ก 4 อันไปยังฐานของกล่องและมันเสร็จสมบูรณ์

ขั้นตอนที่ 4: ไลบรารีและซอฟต์แวร์

คุณจะต้องติดตั้งสองไลบรารี:

1) ดาวน์โหลดและติดตั้ง adafruit gps library

2) ติดตั้งไลบรารี sd การ์ด adafruit:

การติดตั้งเริ่มต้นจะไม่ทำงานเว้นแต่ว่าจะมีการลบไลบรารี sd ที่มีอยู่ออกจากโฟลเดอร์ Arduino libraries ของคุณ โดยทั้งหมดให้ทำและติดตั้งไลบรารีจาก

หรือทำให้ไลบรารี sd ของคุณมีอยู่แล้วและดาวน์โหลด SDADA.zip ซึ่งฉันได้แก้ไขเพื่อรับสายไปยัง SDADA ติดตั้งใน Arduino ห้องสมุด SDADA วิธีนี้คุณยังสามารถใช้ไลบรารี SD อื่นได้

หากคุณกำลังใช้รุ่น SDADA จะรวมอยู่ในร่างของ gps2.ino พร้อมกับบรรทัด:

#include SDADA.h

หากไม่เป็นเช่นนั้นให้คอมเม้นท์บรรทัดนี้และใช้งาน: #include SD.h

ห้องสมุดทั้งสองมีตัวอย่างที่คุณสามารถทดสอบ GPS ด้วย

ควรติดตั้งไลบรารีต่อไปนี้ตามค่าเริ่มต้นแล้ว:

LiquidCrystal.h

SoftwareSerial.h

SPI.h

AVR / sleep.h

ดาวน์โหลด gps2.zip

บันทึก gps2.ino และ gps_card.ino ไปยังโฟลเดอร์ของตนเองในไดเรกทอรีร่าง Arduino ของคุณ

เปิด gps2.ino

เปลี่ยนบรรทัดต่อไปนี้:

#include SDADA.h

ถึง #include SD.h หากคุณไม่ได้ใช้ห้องสมุด SD ที่แก้ไขแล้วของฉัน

การเปลี่ยนแปลงนี้นำไปใช้กับ gps_card.ino

ตรวจสอบการตั้งค่าสำหรับยี่ห้อ LCD:

ในส่วนการกำหนดค่า:

บูลีน sain = true; // ตั้งค่าเป็นจริงหากใช้โล่ LCD sainsmart เป็นเท็จสำหรับอุปกรณ์อื่นเช่น DFROBOT shield

ตั้งค่าตัวแปรที่ไม่เหมาะสมตามจอแอลซีดีที่คุณเลือก

โปรดทราบว่าทั้งสองแผงจอแอลซีดีที่ระบุใช้ pin 10 เพื่อตั้งแสงไฟ ปุ่มขึ้นช่วยให้สามารถปิดแบ็คไลท์เพื่อประหยัดพลังงานแบตเตอรี่

gps2.ino ควรรันแล้ว!

ปุ่ม:

ก) เลือก เปลี่ยนฟังก์ชั่นที่แสดงบนบรรทัดที่ 1 ของ lcd:

ตำแหน่งและระดับความสูง (ความยาวทศนิยมและละติจูดสลับกับระดับความสูง)

ตำแหน่ง (ลองจิจูดแบบทศนิยมและละติจูด)

ตำแหน่งในการสำรวจอาวุธยุทโธปกรณ์ด้านตะวันออกและพิกัดเหนือรวมทั้งหมายเลขแผ่น OS

ระดับความสูง

ใช้ระยะทางทั้งหมดจากจุดกำเนิด

ช่วงจากแหล่งกำเนิด

เวลา

ข) ซ้าย สลับการวัด / อิมพีเรียล

c) ขวา สลับการบันทึก:

L จะแสดงที่มุมล่างขวาเมื่อทำการบันทึก

อัน! ทำเครื่องหมายในตำแหน่งนี้ระบุว่าไม่มีการ์ด SD หรือการ์ดไม่พร้อมใช้งาน

ง) ขึ้น สลับการแสดงผลกลับ (ประหยัดพลังงานที่มีประโยชน์)

จ) ลง รีเซ็ตระยะทางเป็นศูนย์:

ตั้งค่าตำแหน่งปัจจุบันเป็นจุดเริ่มต้นของช่วง (อีกาบินไปไกลถึงแหล่งกำเนิด)

เพื่อเปิดใช้งานปุ่มค้างไว้จนกระทั่งไฟ led หยุดกระพริบ จากนั้นปล่อย

ขั้นตอนที่ 5: การใช้การ์ด SD ใน Gps2.ino

การตั้งค่าการ์ด sd:

ชิปเริ่มต้นเลือกพินและชิปจริงเลือกพินต้องตั้งค่าเป็นเอาท์พุท

เข้าถึงการ์ด SD ได้ด้วยคำสั่งเริ่มต้นซึ่งรวมถึงหมุดที่ใช้โดยการ์ดบนบอร์ดจีพีเอส

ความเร็วการ์ดตั้งไว้ที่ SPI_Full_SPEED

ในกรณีที่เกิดข้อผิดพลาดไฟ LED จะกะพริบรายละเอียดสัญญาณผิดพลาดในส่วนหัวของร่างภาพ

หากการดีบักถูกตั้งค่าเป็นจริงในการกำหนดค่าข้อความการตรวจสอบแบบอนุกรมจะถูกส่งไปด้วย

หากบัตรเริ่มต้นได้ตกลงตัวแปร hascard ถูกตั้งค่าเป็นจริง

// ตรวจสอบให้แน่ใจว่าพินเลือกชิปเริ่มต้นถูกตั้งไว้ที่

// เอาท์พุทแม้ว่าคุณจะไม่ได้ใช้มัน:

pinMode (SS, OUTPUT); // ค่าเริ่มต้นของหมุดเลือกขนาดใหญ่

pinMode (chipSelect, OUTPUT);

digitalWrite (chipSelect ต่ำ);

// ดูว่ามีการ์ดอยู่หรือไม่และสามารถเริ่มต้นได้:

if (! SD.begin (chipSelect, 11, 12, 13)) {

ถ้า (debug) Serial.println (F ("การ์ดเริ่มต้นล้มเหลว!"));

ข้อผิดพลาด (1);

} อื่น {

if (! card.init (SPI_FULL_SPEED, chipSelect, 11, 12, 13)) {

ข้อผิดพลาด (2);

if (debug) {

Serial.println (F ("การเริ่มต้นล้มเหลวสิ่งที่ต้องตรวจสอบ:"));

Serial.println (F ("* ใส่การ์ดหรือไม่"));

Serial.println (F ("* การเดินสายของคุณถูกต้องหรือไม่"));

Serial.println (F ("* คุณเปลี่ยนพิน chipSelect เพื่อให้ตรงกับชิลด์หรือโมดูลของคุณหรือไม่"));

}

}อื่น{

hascard = true;

ถ้า (debug) Serial.println (F ("การ์ดสำเร็จแล้ว"));

}

}

การเลือกไฟล์ SD สำหรับบันทึก:

เมื่อ กดปุ่มมือขวา รูทีนย่อย openfile เรียกว่า

สิ่งนี้จะตรวจสอบโฟลเดอร์ gps เพื่อค้นหาชื่อไฟล์ที่ไม่ได้ใช้ในลำดับ GPSLOGnn.TXT โดยที่ nn = 0 ถึง 99

หากพบไฟล์ให้ตั้งค่า Foundit เป็นจริง

if (! hascard) {return;} // ไม่ดำเนินการต่อหากไม่มีการ์ดหรือไม่พร้อมใช้งาน

ไบต์ฉัน

ชื่อไฟล์ถ่าน 18;

strcpy (ชื่อไฟล์ "/gps/GPSLOG00.TXT");

ชื่อไฟล์ 17 = ถ่าน (0);

บูลีน Foundit = false;

สำหรับ (i = 0; i <100; i ++) {

ชื่อไฟล์ 11 = '0' + i / 10;

ชื่อไฟล์ 12 = '0' + i% 10;

if (! SD.exists (ชื่อไฟล์)) {

FoundIt = true; ทำลาย;

}

}

หากชื่อไฟล์ทั้งหมดถูกใช้งาน Foundit จะเป็นเท็จและผู้ใช้จะถูกถามว่าควรลบ 50 รายการแรกหรือไม่ หากไม่เป็นเช่นนั้นฮาสการ์ดจะถูกตั้งค่าเป็นเท็จเพื่อที่จะไม่สามารถทำการล็อกได้อีก

ถ้า (! Foundit) {

int thisbutton = -1;

lcd.clear ();

lcd.print ("Dir เต็มลบ?");

lcd.setCursor (0,1);

lcd.print ("Sel: ตกลงถูกต้อง: ไม่");

ทำ{

thisbutton = read_LCD_buttons ();

} ในขณะที่ (thisbutton == btnNONE);

lcd.clear ();

ถ้า (thisbutton == btnSELECT) {

lcd.print ("ลบ");

สำหรับ (i = 0; i <50; i ++) {

ชื่อไฟล์ 11 = '0' + i / 10;

ชื่อไฟล์ 12 = '0' + i% 10;

ถ้า (SD.exists (ชื่อไฟล์)) SD.remove (ชื่อไฟล์);

}

i = 0;

ชื่อไฟล์ 11 = '0' + i / 10;

ชื่อไฟล์ 12 = '0' + i% 10;

}อื่น{

ข้อผิดพลาด (4);

hascard = false;

กลับ;

}

}

ไฟล์สามารถเปิดได้:

ในกรณีที่มีข้อผิดพลาดข้อมูลอนุกรมจะถูกส่งออกและรหัสข้อผิดพลาดที่ส่งสัญญาณผ่านสถานะนำ

หากสำเร็จบรรทัดแรกของไฟล์คือเอาต์พุต นี่คือส่วนหัวของคอลัมน์

หมายเหตุการใช้ logfile.flush () สิ่งนี้ทำให้มั่นใจได้ว่าเอาต์พุตทั้งหมดจะถูกส่งไปยังไฟล์ SD ก่อนดำเนินการต่อ

logfile = SD.open (ชื่อไฟล์, FILE_WRITE);

if (! logfile) {

if (debug) {

Serial.print ("ไม่สามารถสร้าง");

Serial.println (ชื่อไฟล์);

}

ข้อผิดพลาด (3)

hascard = false;

}อื่น{

การบันทึก = จริง

myfile = filename;

logfile.println (แผ่น ("เวลา", 13) + lpad ("วันที่", 9) + lpad ("ลองจิจูด", 10)

+ lpad ("Latitude", 10) + lpad ("ระดับความสูง", 9) + "m" + lpad ("Geoid", 9) + "m" + lpad ("ความเร็ว", 7) + "mph แบริ่ง");

logfile.flush ();

if (debug) {Serial.print ("Writing to"); Serial.println (ชื่อไฟล์);}

}

LPAD และ เบาะ เป็นฟังก์ชั่นการขยายข้อความ:

String lpad (String temp, ไบต์ L) {

ไบต์ mylen = temp.length ();

if (mylen> (L - 1)) return temp.substring (0, L-1);

สำหรับ (byte i = 0; i <(L-mylen); i ++) temp = "" + temp;

กลับอุณหภูมิ

}

แผ่นสตริง (String temp, ไบต์ L) {

ไบต์ mylen = temp.length ();

ถ้า (mylen> (L - 1)) กลับมา

temp.substring (0, L-1);

สำหรับ (byte i = 0; i <(L-mylen); i ++) temp = temp + "";

กลับอุณหภูมิ

}

กำลังเขียนไฟล์:

ลูปหลักจะอ่านจีพีเอสและส่งออกค่าไปยังไฟล์หากมีการบันทึก (ตัวอักษร "L" แสดงที่ด้านล่างขวาของหน้าจอ LCD)

ค่าถูกจัดรูปแบบเพื่อสร้างคอลัมน์ความกว้างคงที่

ฟังก์ชั่น dtostrf (float, w, dp, buf) เป็นฟังก์ชั่นห้องสมุด Arduino ที่ใช้ตัวแปรลอยและแปลงเป็นสตริงความกว้าง w พร้อมทศนิยมทศนิยม buf เป็นบัฟเฟอร์ถ่านซึ่งจะต้องมีขนาดใหญ่พอที่จะจัดการการแปลง

ฉันกำหนด buf ด้วย "char buf 20;" ในส่วนหัวของร่างภาพ

ไฟล์ถูกลบทิ้งก่อนดำเนินการต่อ

ogfile.print (แผ่น (MyTime 13)); // รวมมิลลิวินาที

logfile.print (แผ่น (myyear 9));

logfile.print (dtostrf (เส้นแวง, 10,5, buf));

logfile.print (dtostrf (ละติจูด, 10,5, buf));

logfile.print (dtostrf (altitudem, 9,1, buf)); logfile.print ("m");

logfile.print (dtostrf (จีออยด์, 9,1, buf)); logfile.print ("m");

logfile.print (dtostrf (speedmph, 7,2, buf)); logfile.print ("mph");

logfile.print (dtostrf (หัว 6,1, buf)); logfile.println ("องศา");

logfile.flush ();

การปิดไฟล์:

หากไม่สามารถคืนการ์ดได้มิฉะนั้นให้ล้างข้อมูลที่เหลือทั้งหมดไปยังการ์ดก่อนที่จะปิดไฟล์

เป็นโมฆะ closefile () {

ถ้า (! hascard) กลับมา;

logfile.flush ();

logfile.close ();

การเข้าสู่ระบบ = false;

if (debug) Serial.println ("ไฟล์" + myfile + "ปิด");

}

ขั้นตอนที่ 6: อ่าน Gps

ตั้งค่าไลบรารีในส่วนหัวของสคริปต์:

#include Adafruit_GPS.h

#include SoftwareSerial.h

HardwareSerial mySerial = Serial1;

Adafruit_GPS GPS (& mySerial);

เลือก gps ในการเริ่มต้น:

pinMode (chipSelect, OUTPUT);

digitalWrite (chipSelect ต่ำ);

GPS.begin (9600);

// ตั้งค่าอัตราการอัปเดต // 1Hz ทำงานได้ดีและหมดเวลาในการบันทึก GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // อัตราการอัปเดต 0.1Hz, 5Hz และ 10Hz

// RMC (ขั้นต่ำที่แนะนำ): GGA (แก้ไขข้อมูล) รวมถึงระดับความสูง GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA)

// ปิดการอัพเดทสถานะเสาอากาศหากเฟิร์มแวร์อนุญาต

GPS.sendCommand (PGCMD_NOANTENNA);

อ่าน GPS โดยขัดจังหวะเพื่อจุดประสงค์ในการสะท้อนไปยังจอภาพอนุกรม

โปรดทราบว่าข้อมูลกำลังถูกตีความในรหัสห้องสมุด Adafruit_GPS.h ไม่ใช่ในรูทีนการขัดจังหวะนี้

// 1ms ขัดจังหวะบน timer0 เพื่ออำนวยความสะดวกข้อมูล gps echo-

ถ้า GPSECHO = true useInterrupt (true); // อ่านอินพุตโดยขัดจังหวะถ้าเป็นจริง

แค่นั้นแหละ! วนซ้ำและอ่าน:

GPS.newNMEAreceived () ถูกตั้งค่าเป็นจริงหากข้อมูล gps ใหม่มาถึงแล้ว

GPS.parse (stringptr) ถูกตั้งค่าเป็นจริงหากค่าถูกแยกสำเร็จ (แยกวิเคราะห์) จากสตริงข้อความ GPS ดิบ

GPS.fix ถูกตั้งค่าเป็นจริงหาก GPS รายงานว่ามีการแก้ไขตำแหน่ง

หากจีพีเอสมีการแก้ไขแยกค่าสำหรับตำแหน่ง, ความสูง, ความเร็ว, แบริ่ง, เวลา, geoidheight, ดาวเทียมและ hdop

ตำแหน่งจะถูกส่งคืนเป็นลองจิจูดและทศนิยม, ความเร็วเป็นนอต, ระยะทางเป็นเมตร

ถ้า (GPS.newNMEA ได้รับ ()) {

ถ่าน * stringptr = GPS.lastNMEA ();

ถ้า (! GPS.parse (stringptr)) กลับมา; // ไปที่อื่นถ้าเป็นเท็จ

ถ้า (GPS.fix) {

digitalWrite (ledGreen, สูง);

fixed = true; // จำรัฐในกรณีที่มันเปลี่ยนกระบวนการกลาง

mymillis = GPS.milliseconds;

myseconds = GPS.seconds;

mytime = String (GPS.hour) + ":" + String (GPS.minute) + ":";

logtime = mytime;

logtime + = String (int (myseconds + mymillis / 1000 + 0.1)); // ปัดเศษถ้าภายใน 0.1 วิ

mytime + = String (myseconds + mymillis / 1000); // เวลาที่เรียกคืนเต็ม

myyear = String (GPS.day) + "/" + String (GPS.month) + "/";

lcdyear = myyear; พวกเขา = String (GPS.year);

myyear + = พวกเขา;

mylen = พวกเขา. ความยาว ();

lcdyear + = themear.substring (mylen-1, mylen); // ตัวเลขสุดท้ายเท่านั้นที่จะพอดี

ละติจูด = GPS.latitudeDegrees;

ลองจิจูด = GPS.longitudeDegrees;

altitudem = GPS.altitude;

altitudef = altitudem * fconvert;

speedknots = GPS.speed;

speedmph = speedknots * 1.15077945;

speedkph = speedknots * 1.85200;

หัวเรื่อง = GPS.angle;

ดาวเทียม = GPS.satellites;

geoid = GPS.geoidheight ความสูง;

hdop = 7-int (GPS.HDOP + 0.5);

ขั้นตอนที่ 7: ตำแหน่งกริดแห่งชาติของสหราชอาณาจักรและระยะทางที่เดินทาง

1) การแปลงตำแหน่งในหน่วยลองจิจูดลองจิจูดและละติจูดเป็นมาตรวัดแบบสำรวจกรมสรรพาวุธของสหราชอาณาจักร มีรายละเอียดในรูปแบบ pdf จัดทำโดยการสำรวจอาวุธยุทโธปกรณ์:

http: //www.ordnancesurvey.co.uk/docs/support/guide …

หน้า 40 ไม่ได้ทำให้การอ่านเบา แต่ให้คณิตศาสตร์ที่จำเป็น

รูทีนย่อยของฉันเป็นโมฆะสรรพาวุธ (โฟ phi, ลอยแลมด้า) ดำเนินการคำนวณ

ค่าที่ส่งคืนมีความถูกต้องถึง + - 0.1 สำหรับทิศตะวันออกและ + - 0.02 สำหรับทิศเหนือ การขาดความแม่นยำนี้เกิดจากความแม่นยำที่ จำกัด ของเลขคณิต Arduino float Arduino รองรับเฉพาะตำแหน่งทศนิยมที่มีความหมาย "6-7" เท่านั้น

เลขที่แบบสำรวจอาวุธยุทโธปกรณ์สามารถแยกได้จากตัวเลขที่สำคัญที่สุดในค่าลองจิจูดและละติจูด ฟังก์ชั่น String NE2NGR (float & east, float & north) ทำการสกัดและให้เครดิตกับ:

อเล็กซ์ http: //www.codeproject.com/Articles/13577/GPS-Der …

2) ระยะทางที่เดินทางสามารถคำนวณได้จากความแตกต่างในค่าละติจูดและลองจิจูดสองค่า

สำหรับความแตกต่างเล็กน้อยการประมาณนั้นจะต้องสงสัยว่าเกิดจากการขาดความแม่นยำในการแก้ไข gps ข้อ จำกัด ของการสนับสนุนทศนิยมตำแหน่งทศนิยม Arduino ยังส่งผลกระทบต่อความถูกต้องโดยรวม แม้กระนั้นก็ตามการประมาณระยะทางสะสมที่เดินทางมีความสมเหตุสมผล ช่วงของจุดกำเนิดนั้นค่อนข้างแม่นยำเนื่องจากเกี่ยวข้องกับความแตกต่างระหว่าง 2 ตำแหน่งเท่านั้น

ที่มาสำหรับการคำนวณระยะทางสามารถตั้งค่าใหม่ได้โดยใช้ปุ่มล่าง

ที่ความเร็วต่ำฉันจะสุ่มตำแหน่งในช่วงสามวินาทีเพื่อเพิ่มโอกาสที่ความแตกต่างของตำแหน่งจะมากกว่าระยะทางของความไม่แน่นอนในการแก้ไข GPS ที่ความเร็วสูงฉันลดเวลาระหว่างตำแหน่งที่สุ่มตัวอย่าง เวลานี้ถูกควบคุมโดยตัวแปร dlimit

รูทีนย่อย float distance_between (float lat1, float long1, float lat2, float long2) ส่งคืนระยะทาง

งานต้นฉบับมอบให้ Maarten Lamers

ขั้นตอนที่ 8: การอ่าน Sdcard โดยใช้ Gps_card.ino

ภาพร่างนี้ถือว่าคุณเชื่อมต่อกับมอนิเตอร์อนุกรมแล้วควรมีความสามารถในการคัดลอกข้อความ

น่าเสียดายที่หน้าจอ Arduino Serial เริ่มต้นนั้นไม่มีคุณสมบัตินี้ (ฉันเขียนเอง)

CoolTerm โดย Roger Meier ทำงานได้ที่

หากคุณใช้การตั้งค่าไลบรารี SD เริ่มต้นทำการเปลี่ยนแปลง:

#include SD.h แทนที่ #include SDADA.h

ตั้งค่าการตรวจสอบแบบอนุกรมเป็น baud ของ 115200

เมื่อร่างรันมันจะทดสอบการ์ด SD และ แสดงขนาดการ์ดและรายละเอียดของไดเรกทอรี gps

พิมพ์ชื่อไฟล์ และมันจะถูกเปิดและแสดง

แต่ละไฟล์สามารถลบได้โดยใช้ #delete ชื่อไฟล์

ข้อมูลจะแสดงในคอลัมน์ความกว้างคงที่พร้อมตัวคั่นช่องว่าง

สมมติว่าคุณสามารถคัดลอกข้อความโดยใช้ค่าใน excel นั้นตรงไปตรงมามาก

ขั้นตอนที่ 9: ข้อมูลจำเพาะ

จอแสดงผล LCD มีบรรทัดบนสุดที่เลือกได้และ บรรทัดล่าง ซึ่งประกอบด้วย:

จำนวนดาวเทียม

ความเร็ว

HDOP- การเจือจางตำแหน่งในแนวนอน

การแบก

สถานะการบันทึก:

  • "L" - การบันทึก
  • "" - ไม่บันทึก
  • "!" - ไม่มีการ์ด SD หรือไม่มี

บรรทัดบนสุด:

ตำแหน่งละติจูดและลองจิจูดเป็นองศาสลับกับระดับความสูง

ละติจูดและลองจิจูดเป็นองศา

การอ้างอิง Gid แห่งชาติของสหราชอาณาจักร

ระดับความสูง

ระยะทางเดินทางจากจุดกำเนิด (สามารถรีเซ็ตจุดเริ่มต้นได้)

ช่วงจากแหล่งกำเนิด

เวลา

หมายเหตุ:

ค่า LCD ในแบบเมตริกหรือแบบอิมพีเรียล

สำหรับจอแสดงผล LCD ความเร็ว <= cutoff (0.65) mph แสดงเป็น 0

จำนวนดาวเทียมแสดงเป็นแถบแนวตั้งที่มุมซ้ายล่าง จำนวนที่มากที่สุดที่สามารถแสดงได้คือ 8 หลังจากนั้นแถบจะเต็ม

HDOP ถูกระบุในแถบเลื่อนกลางด้านล่าง HDOP บ่งชี้การแพร่กระจายของดาวเทียมที่สังเกตได้ - การแพร่กระจายที่เพิ่มขึ้นจะเพิ่มความแม่นยำและลดจำนวน HDOP ค่า HDOP ของ 1 นั้นดีมาก!

ความแม่นยำ HDOP <0.5 แสดงโดยแถบเต็ม

HDOP ที่ 0.5 ถึง 1.5 (1) จะแสดงด้วย 7 บาร์

HDOP 6 แสดงด้วย 1 แถบ

HDOP จาก> 6 ไม่แสดงแถบ

ปุ่ม:

a) เลือกเปลี่ยนบรรทัดที่ 1 ระหว่าง lcd

ระดับความสูง / ตำแหน่ง (ลองจิจูดและละติจูด)

ตำแหน่ง (Long & Lat)

ตำแหน่งในการสำรวจอาวุธยุทโธปกรณ์ x, y พิกัด

ระดับความสูง

เวลา

b) สลับซ้ายเมตริก / จักรวรรดิ

c) สลับการบันทึกที่ถูกต้อง

d) สลับสลับการแสดงผลกลับ (ประหยัดพลังงานที่มีประโยชน์)

e) Down รีเซ็ตระยะทางเป็นศูนย์และกำหนดตำแหน่งปัจจุบันเป็นจุดกำเนิดสำหรับช่วง (อีกาบินระยะทางไปยังจุดกำเนิด)

เพื่อเปิดใช้งานปุ่ม - กดค้างไว้จนกระทั่งไฟ led หยุดกระพริบ จากนั้นปล่อย

ตัวบ่งชี้ที่นำ:

กะพริบเป็นสีแดงช่วงเวลา 1 วินาที - ไม่มีการแก้ไข

กระพริบสีเขียวช่วงเวลา 1 วินาที - แก้ไข

ไฟกระพริบสีเขียวสี่ครั้ง - มีการกดปุ่ม

แฟลชสีแดงซ้ำ 1 ครั้ง 5 ครั้ง - ข้อผิดพลาด 1: การเริ่มต้นการ์ด SD ล้มเหลว

กะพริบ 2 สีแดงซ้ำ 5 ครั้ง - ข้อผิดพลาด 2: การเริ่มต้นด้วยความเร็วเต็ม SD การ์ดล้มเหลว

กะพริบ 3 สีแดงซ้ำ 5 ครั้ง - ข้อผิดพลาด 3: ไม่สามารถสร้างไฟล์บันทึก

กะพริบ 4 สีแดงซ้ำ 5 ครั้ง - ข้อผิดพลาด 4: 100 ไฟล์ในโฟลเดอร์บันทึกและอย่าลบ

การประมาณระยะทางสะสมจะมีข้อผิดพลาดในการปัดเศษสะสมจากตำแหน่งช่วงเวลาหนึ่งหลายวินาที

ช่วงจะมีความแม่นยำมากขึ้นเนื่องจากถูกกำหนดโดยสถานที่เพียงสองแห่ง

โปรดทราบว่าความแม่นยำของค่าการสำรวจอาวุธยุทโธปกรณ์มี จำกัด - ค่าลอยตัวของอาร์ดิโนมีตำแหน่งทศนิยม 6-7 ตำแหน่ง สูตรการแปลงเกี่ยวข้องกับการคำนวณจำนวนมากและข้อผิดพลาดในการปัดเศษมีผลกระทบสะสม ความแม่นยำในท้ายที่สุดถูก จำกัด โดยค่าบาปค่า cos และแทนที่ส่งคืน

ค่าทิศตะวันออกดูเหมือนจะแม่นยำถึง + - 0.1

ทิศเหนือไปยัง + - 0.02

โดยการเปรียบเทียบค่าลองจิจูด / ละติจูดแสดงถึงความถูกต้องถึง + - 0.00001

การเชื่อมต่อตะกั่วจาก ufl ไปยัง SMA จะไม่ส่งผลต่อประสิทธิภาพ ชิป GPS จะรับรู้เฉพาะ arial (1575.42MHz) เท่านั้น