สารบัญ:
- ขั้นตอนที่ 1: มันทำงานอย่างไร
- ขั้นตอนที่ 2: ส่วนประกอบ
- ขั้นตอนที่ 3: การเดินสายไฟโมดูล
- ขั้นตอนที่ 4: รหัส
- ขั้นตอนที่ 5: ฐานข้อมูลและหน้าเว็บ
- ขั้นตอนที่ 6: การทดสอบการนำทาง
- ขั้นตอนที่ 7: รอบชิงชนะเลิศ
วีดีโอ: ☠WEEDINATOR☠ ตอนที่ 2: การนำทางด้วยดาวเทียม: 7 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
ระบบนำทาง Weedinator ถือกำเนิดขึ้นแล้ว!
หุ่นยนต์เกษตรเร่ร่อนที่สามารถควบคุมได้ด้วยสมาร์ทโฟน
… และแทนที่จะทำตามขั้นตอนปกติของการรวมกัน ฉันคิดว่าฉันจะพยายามอธิบายว่ามันทำงานอย่างไร - แน่นอนว่าไม่ใช่ทุกอย่างแต่เป็นส่วนที่สำคัญและน่าสนใจที่สุด โปรดให้อภัยการเล่นสำนวน แต่เป็นวิธีที่ข้อมูลไหลระหว่างแต่ละโมดูลที่ฉันพบว่าน่าสนใจและแบ่งออกเป็นส่วนต่ำสุดที่เราลงเอยด้วย "บิต" จริง - ศูนย์และคน หากคุณเคยสับสนเกี่ยวกับบิต ไบต์ อักขระ และสตริง ตอนนี้อาจถึงเวลาที่จะไม่สับสนแล้วใช่ไหม ฉันจะพยายามแก้ความสับสนให้กับแนวคิดที่เป็นนามธรรมเล็กน้อยที่เรียกว่า 'การยกเลิกข้อผิดพลาด'
ตัวระบบเองมีคุณสมบัติ:
- GPS/GNSS: Ublox C94 M8M (โรเวอร์และฐาน)
- 9DOF Razor IMU MO เข็มทิศดิจิตอล
- Fona 800H 2G GPRS เซลลูลาร์
- หน้าจอ TFT 2.2"
- Arduino ครบกำหนด 'ปรมาจารย์'
- Arduino 'ทาส' ต่างๆ
น่าแปลกที่ Sat Navs จำนวนมากไม่มีเข็มทิศดิจิตอล ซึ่งหมายความว่าหากคุณอยู่นิ่งและหลงทาง คุณต้องเดินหรือขับรถไปในทิศทางใด ๆ แบบสุ่มก่อนที่อุปกรณ์จะแสดงทิศทางที่ถูกต้องจากดาวเทียม หากคุณหลงทางอยู่ในป่าทึบหรือที่จอดรถใต้ดิน แสดงว่าคุณเต็มแล้ว!
ขั้นตอนที่ 1: มันทำงานอย่างไร
ปัจจุบันมีการอัปโหลดพิกัดคู่ง่ายๆ จากสมาร์ทโฟนหรือคอมพิวเตอร์ ซึ่ง Weedinator ดาวน์โหลดแล้ว สิ่งเหล่านี้จะถูกตีความว่าเป็นหัวเรื่องเป็นองศาและระยะทางที่จะเดินทางเป็นมม.
GPRS fona ใช้เพื่อเข้าถึงฐานข้อมูลออนไลน์ผ่านเครือข่ายเซลลูลาร์ 2G และรับและส่งพิกัดไปยัง Arduino Due ผ่าน Arduino Nano Due เป็น Master และควบคุมอาร์เรย์ของ Arduinos อื่น ๆ เป็น Slaves ผ่าน I2C และบัสอนุกรม Due สามารถโต้ตอบกับข้อมูลสดจาก Ublox และ Razor และแสดงหัวข้อที่คำนวณโดยทาส Arduino ตัวใดตัวหนึ่ง
ตัวติดตามดาวเทียม Ublox นั้นฉลาดเป็นพิเศษ เนื่องจากใช้การยกเลิกข้อผิดพลาดเพื่อรับการแก้ไขที่แม่นยำมาก ซึ่งเป็นค่าเบี่ยงเบนรวมเล็กน้อยสุดท้ายประมาณ 40 มม. โมดูลนี้ประกอบด้วยคู่ที่เหมือนกัน ซึ่งหนึ่งในนั้นคือ 'รถแลนด์โรเวอร์' ที่เคลื่อนที่ไปกับ Weedinator และอีกอันหนึ่ง 'ฐาน' ถูกตรึงไว้บนเสาที่ใดที่หนึ่งในที่โล่งแจ้ง การยกเลิกข้อผิดพลาดทำได้โดยฐานที่สามารถแก้ไขได้อย่างแม่นยำโดยใช้ตัวอย่างจำนวนมากเมื่อเวลาผ่านไป ตัวอย่างเหล่านี้จะถูกนำมาเฉลี่ยเพื่อชดเชยการเปลี่ยนแปลงของสภาพอากาศ หากอุปกรณ์เคลื่อนที่ เห็นได้ชัดว่าไม่สามารถหาค่าเฉลี่ยใดๆ ได้และจะอยู่ในความเมตตาอย่างสมบูรณ์ของสภาพแวดล้อมที่เปลี่ยนแปลงไป อย่างไรก็ตาม หากอุปกรณ์แบบคงที่และแบบเคลื่อนที่ทำงานร่วมกันได้ ตราบใดที่สามารถสื่อสารกันได้ ก็สามารถใช้ประโยชน์จากทั้งสองอย่างได้ ในช่วงเวลาใดก็ตาม หน่วยฐานยังคงมีข้อผิดพลาด แต่ก็มีการแก้ไขข้อผิดพลาดที่คำนวณไว้ก่อนหน้านี้ด้วย เพื่อให้สามารถคำนวณข้อผิดพลาดที่แท้จริงได้โดยการลบพิกัดชุดหนึ่งออกจากชุดอื่น จากนั้นจะส่งข้อผิดพลาดที่คำนวณได้ไปยังรถแลนด์โรเวอร์ผ่านลิงก์วิทยุ ซึ่งจะเพิ่มข้อผิดพลาดลงในพิกัดของตัวเอง และเดี๋ยวก่อน เรามีข้อผิดพลาดในการยกเลิก! ในทางปฏิบัติ การยกเลิกข้อผิดพลาดทำให้เกิดความแตกต่างระหว่างค่าเบี่ยงเบนทั้งหมด 3 เมตรและ 40 มม.
ระบบที่สมบูรณ์นั้นดูซับซ้อน แต่จริงๆ แล้วสร้างได้ค่อนข้างง่าย ไม่ว่าจะหลวมบนพื้นผิวที่ไม่นำไฟฟ้าหรือใช้ PCB ที่ฉันออกแบบ ซึ่งช่วยให้โมดูลทั้งหมดติดตั้งอย่างแน่นหนาได้ การพัฒนาในอนาคตถูกสร้างขึ้นบน PCB ทำให้สามารถรวม Arduinos จำนวนมากเพื่อควบคุมมอเตอร์สำหรับการบังคับเลี้ยว การเคลื่อนที่ไปข้างหน้า และเครื่อง CNC ออนบอร์ด การนำทางจะได้รับความช่วยเหลือจากระบบรู้จำวัตถุอย่างน้อยหนึ่งระบบโดยใช้กล้องเพื่อตรวจจับวัตถุที่มีสี เช่น ลูกกอล์ฟเรืองแสง ซึ่งอยู่ในตำแหน่งอย่างระมัดระวังในตารางบางประเภท - ดูพื้นที่นี้!
ขั้นตอนที่ 2: ส่วนประกอบ
- Ublox C94 M8M (โรเวอร์และฐาน) x 2 จาก
- 9DOF Razor IMU MO เข็มทิศดิจิตอล
- Fona 800H 2G GPRS เซลลูลาร์ 1946
- Arduino Due
- Arduino Nano x 2 จาก
- SparkFun Pro Micro
- Adafruit 2.2" TFT IL1940C 1480
- PCB (ดูไฟล์ Gerber ที่แนบมา) x 2 จาก
- 1206 ตัวต้านทาน SMD ศูนย์โอห์ม x 12 จาก
- ไฟ LED 1206 ดวง x 24 จาก
ไฟล์ PCB เปิดขึ้นด้วยซอฟต์แวร์ 'Design Spark'
ขั้นตอนที่ 3: การเดินสายไฟโมดูล
นี่เป็นส่วนที่ง่าย - ง่ายโดยเฉพาะอย่างยิ่งกับ PCB ที่ฉันทำ - เพียงทำตามแผนภาพด้านบน จำเป็นต้องระมัดระวังเพื่อหลีกเลี่ยงการเดินสายไฟโมดูล 3v ถึง 5v แม้แต่ในสายซีเรียลและ I2C
ขั้นตอนที่ 4: รหัส
โค้ดส่วนใหญ่เกี่ยวข้องกับการเคลื่อนย้ายข้อมูลไปรอบๆ ระบบอย่างมีระเบียบ และบ่อยครั้งที่จำเป็นต้องแปลงรูปแบบข้อมูลจากจำนวนเต็มเป็นจำนวนลอยเป็นสตริงและอักขระ ซึ่งอาจทำให้สับสนได้! โปรโตคอล 'ซีเรียล' จะจัดการเฉพาะอักขระและในขณะที่ I2โปรโตคอล C จะจัดการกับจำนวนเต็มขนาดเล็กมาก ฉันพบว่าควรแปลงเป็นอักขระแล้วแปลงกลับเป็นจำนวนเต็มที่ปลายอีกด้านของสายส่ง
คอนโทรลเลอร์ Weedinator นั้นโดยทั่วไปแล้วจะเป็นระบบ 8 บิตที่มี Arduinos แต่ละตัวหรือ 'MCU's จำนวนมาก เมื่อ 8 บิตถูกอธิบายว่าเป็นเลขศูนย์ไบนารีจริงและเลขศูนย์จะมีลักษณะดังนี้: B01100101 ซึ่งจะเท่ากับ:
(1x2)+(0x2)2+(1x2)3+(0x2)4+(0x2)5+(1x2)6+(1x2)7+(0x2)8 =
ค่าตัวเลขทศนิยม | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
ค่าเลขฐานสอง | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
= 101
และค่าสูงสุดที่เป็นไปได้คือ 255 …. ดังนั้นจำนวนเต็มสูงสุด 'ไบต์' ที่เราสามารถส่งผ่าน I2C คือ 255 ซึ่งจำกัดมาก!
บน Arduino เราสามารถส่งอักขระ ASCII หรือไบต์ได้สูงสุด 32 ตัวต่อครั้งโดยใช้I2C ซึ่งมีประโยชน์มากกว่ามาก และชุดอักขระประกอบด้วยตัวเลข ตัวอักษร และอักขระควบคุมในรูปแบบ 7 บิต ดังนี้
โชคดีที่คอมไพเลอร์ Arduino ทำงานทั้งหมดในการแปลงจากอักขระเป็นไบนารีในพื้นหลัง แต่ก็ยังคาดหวังประเภทอักขระที่ถูกต้องสำหรับการส่งข้อมูลและจะไม่ยอมรับ 'สตริง'
ตอนนี้คือเมื่อสิ่งต่าง ๆ อาจทำให้สับสนได้ อักขระสามารถแสดงเป็นอักขระตัวเดียวโดยใช้คำจำกัดความของถ่านหรือเป็นอาร์เรย์หนึ่งมิติที่มีอักขระ 20 ตัวโดยใช้อักขระ[20] Arduino String นั้นคล้ายกับอาร์เรย์ของอักขระมาก และเป็นสตริงของอักขระที่สมองของมนุษย์มักตีความว่าเป็น 'คำ'
// สร้างตัวละคร 'distanceCharacter':
ตัวเริ่มต้นสตริง = ""; DistanceString = ตัวเริ่มต้น + DistanceString; int n = distanceString.length(); สำหรับ (int aa=0;aa<=n;aa++) { distanceCharacter[aa] = distanceString[aa]; }
โค้ดด้านบนสามารถแปลงสตริงอักขระยาวๆ ให้เป็นอาร์เรย์อักขระของอักขระ ซึ่งสามารถส่งต่อผ่าน I. ได้2C หรือซีเรียล
ที่ปลายอีกด้านหนึ่งของสายส่ง ข้อมูลสามารถแปลงกลับเป็นสตริงได้โดยใช้รหัสต่อไปนี้:
DistanceString = distanceString + c; // string = string + character
อาร์เรย์อักขระไม่สามารถแปลงเป็นจำนวนเต็มได้โดยตรงและต้องเข้าสู่รูปแบบสตริงก่อน แต่โค้ดต่อไปนี้จะแปลงจากสตริงเป็นจำนวนเต็ม:
int ผลลัพธ์ = (distanceString).toInt();
int distanceMetres = ผลลัพธ์;
ตอนนี้เรามีจำนวนเต็มที่เราสามารถใช้คำนวณได้ ทศนิยม (ตัวเลขที่มีจุดทศนิยม) ต้องแปลงเป็นจำนวนเต็มที่ในขั้นตอนการส่ง แล้วหารด้วย 100 สำหรับทศนิยมสองตำแหน่ง เช่น:
float distanceMetres = ระยะทางMm / 1000;
สุดท้ายนี้ สามารถสร้างสตริงจากการผสมผสานระหว่างอักขระและจำนวนเต็ม เช่น:
// นี่คือที่ที่ข้อมูลถูกคอมไพล์เป็นอักขระ:
dataString = ผู้ริเริ่ม + "BEAR" + zbearing + "DIST" + zdistance; // จำกัดอักขระได้ไม่เกิน 32 ตัว // สตริง = สตริง + อักขระ + จำนวนเต็ม + อักขระ + จำนวนเต็ม
โค้ดที่เหลือเป็นโค้ด Arduino มาตรฐานที่สามารถพบได้ในตัวอย่างต่างๆ ในไลบรารี Arduino ลองดูตัวอย่าง 'ตัวอย่าง >>>> สตริง' และตัวอย่างไลบรารี 'wire'
นี่คือกระบวนการทั้งหมดสำหรับการส่งและรับทุ่น:
แปลง Float ➜ Integer ➜ String ➜ Character array ….. จากนั้น TRANSMIT character array จาก Master ➜➜
➜➜ รับตัวละครแต่ละตัวใน Slave …. แล้วแปลง Character ➜ String ➜ Integer ➜ Float
ขั้นตอนที่ 5: ฐานข้อมูลและหน้าเว็บ
ด้านบนจะแสดงโครงสร้างฐานข้อมูลและแนบไฟล์โค้ด php และ html ชื่อผู้ใช้ ชื่อฐานข้อมูล ชื่อตารางและรหัสผ่านจะเว้นว่างไว้เพื่อความปลอดภัย
ขั้นตอนที่ 6: การทดสอบการนำทาง
ฉันสามารถเชื่อมต่อ datalogger เข้ากับแผงควบคุม Weedinator ผ่าน I2C และรับแนวคิดเกี่ยวกับประสิทธิภาพการวางตำแหน่งดาวเทียม Ublox M8M:
ใน 'Cold Start' แสดงโดยกราฟสีเขียว โมดูลเริ่มต้นด้วยข้อผิดพลาดจำนวนมาก ค่อนข้างคล้ายกับ GPS แบบ 'ปกติ' และข้อผิดพลาดค่อยๆ ลดลงจนกระทั่งหลังจากนั้นประมาณ 2 ชั่วโมง จะมีการแก้ไขข้อผิดพลาด RTK ระหว่างรถแลนด์โรเวอร์ และฐาน (แสดงเป็นกาชาด) ในช่วงเวลา 2 ชั่วโมงนั้น โมดูลฐานจะถูกสร้างขึ้นอย่างต่อเนื่องและอัปเดตค่าเฉลี่ยสำหรับละติจูดและลองจิจูด และหลังจากช่วงเวลาที่ตั้งโปรแกรมไว้ล่วงหน้าแล้วจะตัดสินใจว่ามีการแก้ไขที่ดี กราฟ 2 ถัดไปจะแสดงพฤติกรรมหลังจาก 'การเริ่มต้นอย่างรวดเร็ว ' ซึ่งโมดูลฐานได้คำนวณค่าเฉลี่ยที่ดีแล้ว กราฟบนสุดมีความยาวเกิน 200 นาที และบางครั้งการแก้ไขก็หายไป และรถแลนด์โรเวอร์ส่งข้อความ NMEA ไปยัง Weedinator ว่าการแก้ไขนั้นไม่น่าเชื่อถือชั่วคราว
กราฟสีน้ำเงินด้านล่างคือการ 'ซูมเข้า' บนกล่องสีแดงในกราฟบนสุด และแสดงภาพสแน็ปช็อตตัวแทนที่ดีของประสิทธิภาพของ Ublox โดยมีค่าเบี่ยงเบนรวม 40 มม. ซึ่งมากเกินพอที่จะแนะนำ Weedinator ให้ไปที่ตำแหน่ง แต่อาจไม่ดีพอที่จะปลูกดินรอบ ๆ พืชแต่ละชนิด?
กราฟที่สามแสดงข้อมูลที่รวบรวมโดย Rover และ Base ห่างกัน 100 เมตร - ไม่พบข้อผิดพลาดเพิ่มเติม - ระยะห่างของการแยกไม่ส่งผลต่อความแม่นยำ
ขั้นตอนที่ 7: รอบชิงชนะเลิศ
แนะนำ:
ปีกคอสเพลย์ที่เปิดใช้งานการเคลื่อนไหวโดยใช้ Circuit Playground Express - ตอนที่ 1: 7 ขั้นตอน (พร้อมรูปภาพ)
Motion Activated Cosplay Wings โดยใช้ Circuit Playground Express - ตอนที่ 1: นี่เป็นส่วนหนึ่งของโปรเจ็กต์สองส่วน ซึ่งผมจะแสดงให้คุณเห็นขั้นตอนในการทำปีกนางฟ้าอัตโนมัติ ส่วนแรกของโปรเจ็กต์คือ กลไกของปีก และส่วนที่สองทำให้สวมใส่ได้ และเพิ่มปีก
หุ่นยนต์ Telepresence: แพลตฟอร์มพื้นฐาน (ตอนที่ 1): 23 ขั้นตอน (พร้อมรูปภาพ)
หุ่นยนต์ Telepresence: แพลตฟอร์มพื้นฐาน (ตอนที่ 1): หุ่นยนต์ telepresence เป็นหุ่นยนต์ประเภทหนึ่งที่สามารถควบคุมจากระยะไกลผ่านทางอินเทอร์เน็ตและทำหน้าที่เป็นตัวแทนของคนอื่นได้ ตัวอย่างเช่น หากคุณอยู่ในนิวยอร์ก แต่ต้องการมีปฏิสัมพันธ์ทางกายภาพกับทีมผู้คนในแคลิฟอร์เนีย
ทำให้เรือนกระจกอัตโนมัติด้วย LoRa! (ตอนที่ 2) -- ที่เปิดหน้าต่างแบบใช้มอเตอร์: 6 ขั้นตอน (พร้อมรูปภาพ)
ทำให้เรือนกระจกอัตโนมัติด้วย LoRa! (ตอนที่ 2) || ที่เปิดหน้าต่างแบบใช้มอเตอร์: ในโครงการนี้ ฉันจะแสดงให้คุณเห็นว่าฉันสร้างที่เปิดหน้าต่างแบบใช้มอเตอร์สำหรับเรือนกระจกของฉันได้อย่างไร นั่นหมายความว่าฉันจะแสดงให้คุณเห็นว่าฉันใช้มอเตอร์อะไร ออกแบบระบบกลไกจริงอย่างไร ฉันขับมอเตอร์อย่างไร และสุดท้ายฉันใช้ Arduino LoRa อย่างไร
☠WEEDINATOR☠ ตอนที่ 4: รหัสเรขาคณิตการบังคับเลี้ยวแบบเฟืองท้าย: 3 ขั้นตอน
☠WEEDINATOR☠ ตอนที่ 4: Differential Steering Geometry Code: หากคุณมีเวลาดูวิดีโอด้านบน คุณจะสังเกตเห็นว่ามีเสียงแปลกๆ เกิดขึ้นจากมอเตอร์ที่พวงมาลัยค้างอยู่เป็นระยะๆ ขณะที่ WEEDINATOR นำทาง 3 จุดเลี้ยว มอเตอร์นั้นติดขัดอย่างมากกับ
☠WEEDINATOR☠ ตอนที่ 3: การสร้างแชสซี: 8 ขั้นตอน (พร้อมรูปภาพ)
☠WEEDINATOR☠ ตอนที่ 3: การสร้างแชสซี: ฤดูหนาวเป็นเวลาที่เหมาะสมที่สุดในการสร้างเครื่องจักร โดยเฉพาะอย่างยิ่งเมื่อต้องเชื่อมและตัดพลาสม่า เนื่องจากทั้งคู่ให้ความอบอุ่นในระดับที่พอเหมาะ หากคุณสงสัยว่าเครื่องตัดพลาสม่าคืออะไร ให้อ่านขั้นตอนในเชิงลึก หากคุณเคย