สารบัญ:

Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS: 6 ขั้นตอน (พร้อมรูปภาพ)
Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS: 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS: 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS: 6 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: IOT Home Automation Using Raspberry Pi Pico & ESP8266 WiFi With Blynk App Monitoring 2024, กรกฎาคม
Anonim
Image
Image
Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS
Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS
Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS
Alexa Voice ควบคุม Raspberry Pi Drone ด้วย IoT และ AWS

สวัสดี! ฉันชื่ออาร์ม ฉันอายุ 13 ปีจากแมสซาชูเซตส์ บทช่วยสอนนี้แสดงให้เห็นว่าคุณสามารถอนุมานจากชื่อได้อย่างไรว่าจะสร้าง Raspberry Pi Drone ได้อย่างไร ต้นแบบนี้แสดงให้เห็นว่าโดรนมีการพัฒนาอย่างไรและจะมีบทบาทสำคัญเพียงใดในอนาคต ฉันสามารถเห็นตัวเองตื่นขึ้นในอีก 10 ปีข้างหน้าและขอให้โดรนทำอาหารเช้าให้ฉัน โดรนใช้ Amazon Alexa, Amazon Web Services, IoT (Internet of Things) และที่สำคัญที่สุดคือ Raspberry Pi มีขึ้นเพื่อแสดงและแจ้งเกี่ยวกับโดรนและการพัฒนาในแต่ละวัน หวังว่าคุณจะประสบความสำเร็จและเรียนรู้เกี่ยวกับโดรนในกระบวนการนี้ ขอให้โชคดีและขอบคุณสำหรับการอ่าน -อาร์มาน

เสบียง

ในการสร้างต้นแบบ มีความต้องการฮาร์ดแวร์และซอฟต์แวร์ที่หลากหลาย ฉันใช้บทช่วยสอนออนไลน์โดย The Drone Dojo เพื่อสร้างโดรนและผสานรวมเทคโนโลยีที่ระบุไว้ สำหรับโดรน คุณสามารถค้นหารายการชิ้นส่วนได้ที่นี่:

รายการอะไหล่โดรน

ข้อกำหนดซอฟต์แวร์:

  • Amazon Web Services
  • โน้ตบุค
  • ซอฟต์แวร์ Mission Planer
  • Balena Etcher
  • พบการ์ด MicroSD พร้อมไฟล์ Raspbian ที่นี่
  • Amazon Alexa ทางกายภาพหรือเสมือน

ขั้นตอนที่ 1: รวบรวมและทำความเข้าใจชิ้นส่วนต่างๆ

การรวบรวมและทำความเข้าใจชิ้นส่วน
การรวบรวมและทำความเข้าใจชิ้นส่วน

ทุกส่วนที่กล่าวถึงในรายการจัดหาเป็นสิ่งที่จำเป็น และความเข้าใจที่ชัดเจนของทุกส่วนก็เช่นกัน คุณสามารถค้นหาชิ้นส่วนต่างๆ ทางออนไลน์และเมื่อรวบรวมแล้ว ให้อ่านต่อ เพลย์ลิสต์โดย The Drone Dojo เพื่อความเข้าใจอย่างถ่องแท้ของชิ้นส่วนต่างๆ สามารถพบได้ที่นี่ คำอธิบาย 4 นาทีในช่อง youtube ของฉันสามารถพบได้ที่นี่ เมื่อพูดถึงโดรน มีเพียงส่วนเดียวเท่านั้นที่ไม่ใช่แค่มอเตอร์และใบพัดเท่านั้น แม้ว่าคนส่วนใหญ่จะคิดอย่างไร ด้านล่างนี้เป็นจุดประสงค์พื้นฐานของแต่ละส่วน

Raspberry Pi พร้อม Emlid Navio2

ส่วนนี้ค่อนข้างจะเป็นโปรเซสเซอร์กลางและเป็นจุดหลักของโดรน Raspberry Pi ทำหน้าที่เหมือน CPU ของคอมพิวเตอร์ที่ส่งคำสั่งไปยัง Navio2 เพื่อดำเนินการผ่าน PWM (Pulse Width Modulation Signals) ไปยังส่วนอื่น ๆ ของโดรน

2. ESC's (ตัวควบคุมความเร็วแบบอิเล็กทรอนิกส์)

ชิ้นส่วนสีเหลืองเหล่านี้อยู่ใต้กรอบ มีการเสียบปลั๊ก 4 ตัวเข้ากับ Navio หนึ่งอันสำหรับมอเตอร์แต่ละตัว เมื่อรับสัญญาณ PWM พวกเขาจะหมุนมอเตอร์และเริ่มบิน

3. มอเตอร์

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

4. ใบพัด

ใบพัดสร้างแรงผลักดันให้โดรนบินได้ พวกเขาหมุนไปในทิศทางเดียวกับมอเตอร์เพื่อยกรถ

5. โมดูลแบตเตอรี่และพลังงาน

LiPo Battery ให้พลังงานแก่โดรนทั้งหมดผ่านเฟรมโดยใช้โมดูลพลังงาน ให้เวลาบินประมาณ 15-20 นาทีและทำหน้าที่เป็นแหล่งพลังงาน

6. GPS

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

7. โมดูล Telemetry

โมดูล telemetry เชื่อมต่อโดรนของเรากับสถานีควบคุมภาคพื้นดิน ในกรณีของเรา Mission Planner จะได้รับการตรวจสอบ

8. ตัวควบคุม RC และโมดูลพร้อมกับตัวเข้ารหัส PPM

RC Controller ใช้วิทยุเพื่อส่งสัญญาณและคำสั่งไปยังโมดูล RC เพื่อขับโดรนด้วยตนเอง ตัวเข้ารหัส PPM แปลสัญญาณเหล่านี้สำหรับ Navio + RPI เพื่อประมวลผลและดำเนินการ

9. เฟรม

กรอบสีแดงและสีขาวนี้ทำหน้าที่เป็นฐานหรือแท่นสำหรับวางส่วนอื่นๆ เฟรมเป็นแบบแอโรไดนามิกและน้ำหนักเบา จึงเหมาะอย่างยิ่งสำหรับการสร้างโดรนของเรา

ด้วยความรู้ทุกส่วน ในที่สุดก็สร้างโดรนได้แล้ว! ไปสู่ขั้นตอนต่อไป!

ขั้นตอนที่ 2: การประกอบโดรน

การประกอบโดรน
การประกอบโดรน

ขั้นตอนนี้น่าจะยากที่สุดในแง่ของความพยายามทางกายภาพ ฉันแนะนำให้มีบุคคลอื่นเพื่อขอความช่วยเหลือหรือลองใช้มือช่วยในรายการชิ้นส่วน กระบวนการนี้ใช้เวลานานเกินไปที่จะสาธิตที่นี่ ดังนั้นฉันจะให้ลิงก์อื่นที่ฉันใช้โดย The Drone Dojo

สร้างโดรน Raspberry Pi

อีกครั้ง เนื่องจากฉันจะไม่ลงรายละเอียดมากเกินไป ฉันจะเน้นที่พื้นฐานของแต่ละขั้นตอน

1. จัดระเบียบอุปกรณ์ของคุณ - รวบรวมวัสดุของเราและทำให้แน่ใจว่าสามารถเข้าถึงได้ง่าย

2. วางแผนงานสร้างของคุณ - จัดระเบียบชิ้นส่วนของคุณบนเฟรมเพื่อสร้างพิมพ์เขียวของสิ่งที่คุณจะสร้าง

3. งานบัดกรี - เป็นงานที่ทำคนเดียวได้ยาก คุณต้องประสานขั้วต่อกระสุนสีทองที่มาพร้อมกับมอเตอร์เข้ากับ ESC ถัดไป คุณต้องใช้ส่วนล่างของเฟรมและประสาน ESC เข้ากับเฟรมด้านล่างหรือบอร์ดจ่ายไฟ โมดูลแบตเตอรี่จะถูกบัดกรีบนบอร์ดจ่ายไฟด้วย

4. การตั้งค่าเฟรม - จากนั้นคุณต้องขันสกรูส่วนบนของเฟรมเข้ากับแขน จากนั้นคุณสามารถติด Raspberry Pi ไว้ด้านบนได้ทุกแบบที่คุณต้องการ (ฉันใช้เทปพันสายไฟ) จากนั้นคุณสามารถยึด ESC ไว้ที่แขนด้วยซิป ตอนนี้เราเกือบจะเสร็จแล้ว

5. การผูกตัวควบคุม RC กับเครื่องรับ - ลองทำตามคำแนะนำในเพลย์ลิสต์ด้านบนเพื่อผูก RC Controller โดยใช้ ESC

6. Finalizing Parts on Frame - เทปพันท่อหรือสายรัดบนโมดูล telemetry บนเฟรม ติดเทปพันท่อ PPM Encoder ไว้ที่แขนด้วย ตอนนี้คุณสามารถเชื่อมต่อ ESC และ PPM Encoder กับ Navio

7. GPS Mount + Battery - ประกอบ GPS Mount ด้วยสกรูและชิ้นส่วนต่างๆ ใช้ซิปผูกติด GPS เข้ากับเฟรม ฉันไม่จำเป็นต้องใช้ GPS Mount เนื่องจากความเปราะบางของมัน แต่ก็ขึ้นอยู่กับคุณ ถัดไป คุณสามารถใส่แบตเตอรี่ระหว่าง Power Dist กระดาน. ฉันติดและติดเทปโมดูลพลังงานเข้ากับเฟรมด้วย ตอนนี้ฮาร์ดแวร์ของคุณได้รับการตั้งค่าแล้ว มาถึงส่วนที่รอคอย!

8. การติดตั้งใบพัด!!! - คุณสามารถขันใบพัดให้แน่นโดยใช้แผนภูมิที่กล่าวถึงในเพลย์ลิสต์ จากนั้นคุณสามารถเสียบ ESC กับมอเตอร์ และในที่สุดเราก็สร้างโดรนเสร็จแล้ว

ซอฟต์แวร์ต่อไปเป็นต้น!

ขั้นตอนที่ 3: การกำหนดค่า Raspberry Pi และ GCS (ผู้วางแผนภารกิจ)

การกำหนดค่า Raspberry Pi และ GCS (ผู้วางแผนภารกิจ)
การกำหนดค่า Raspberry Pi และ GCS (ผู้วางแผนภารกิจ)

อีกครั้ง คุณสามารถค้นหาคำแนะนำโดยละเอียดเพิ่มเติมในเพลย์ลิสต์ได้จากขั้นตอนสุดท้าย อย่างไรก็ตาม คุณอาจรู้วิธีตั้งค่า RasPi แต่ครั้งนี้เราทำแบบไม่มีหัว ใช้ Balena Etcher เพื่อเบิร์นระบบปฏิบัติการจากเว็บไซต์ Navio OS ลงในการ์ด MicroSD ในขณะที่เสียบเข้ากับคอมพิวเตอร์ของคุณ ให้ไปที่ผู้ร้องขอ wpa โดยใช้ notepad++ หลังจากนั้นให้ป้อน ssid และรหัสผ่านสำหรับ Raspberry Pi เพื่อเชื่อมต่อกับ WiFi ของคุณ จากนั้นคุณต้องเพิ่มไฟล์ชื่อ SSH สามารถทำได้ผ่าน Command Line หรือวิธีอื่น ตอนนี้เราสามารถ SSH คุณสามารถใช้พรอมต์คำสั่งหรือสีโป๊ว ฉันใช้พรอมต์คำสั่งแล้วพิมพ์ "ssh pi@navio" เพื่อเชื่อมต่อในกรณีของฉัน หรือคุณสามารถค้นหาที่อยู่ IP และ ssh ด้วยวิธีนั้น เมื่อเชื่อมต่อแล้ว ให้ใช้วิดีโอนี้เพื่อตั้งค่าและกำหนดค่า Navio ในการตั้งค่า telemetry คุณต้องแก้ไข Raspberry Pi ก่อน ทำตามนี้เพื่อทำการแก้ไขและลองเชื่อมต่อกับ Mission Planner หากการวัดและส่งข้อมูลทางไกลไม่ทำงาน คุณสามารถเลิกทำการแก้ไขและเชื่อมต่อโดยใช้การเชื่อมต่อ UDB โดยป้อน IP ของ GCS (Ground Control Station เช่นแล็ปท็อป) เมื่อเชื่อมต่อกับ Mission Planner แล้ว คุณสามารถใช้วิซาร์ดการตั้งค่าเพื่อปรับเทียบทุกส่วนของโดรนได้ หากคุณต้องการความช่วยเหลือโปรดดูเพลย์ลิสต์อีกครั้ง โดยปกติ ทุกครั้งที่คุณตั้งค่า จะเกิดข้อผิดพลาดขึ้นเกือบทุกครั้ง การแก้ไขปัญหาเป็นส่วนที่ใหญ่ที่สุดส่วนหนึ่งของโครงการนี้ ฉันไม่สามารถช่วยคุณได้จริงๆ เนื่องจากฉันไม่ทราบข้อผิดพลาดของคุณ แต่ข้อผิดพลาดส่วนใหญ่สามารถแก้ไขได้ด้วยความช่วยเหลือจากอินเทอร์เน็ต หลังจากทุกอย่างพร้อม โดรนก็พร้อมบิน! คุณสามารถตั้งค่าตัวควบคุม RC และโหมดการบินบน Mission Planner พยายามถือไม้เท้าซ้ายที่ด้านล่างขวาสุดเป็นเวลาห้าวินาทีเพื่อติดอาวุธโดรน ฉันไม่แนะนำให้บินโดยไม่ได้ดูบทช่วยสอน เพราะโดรนนั้นบอบบางมากและแตกหักง่าย สำหรับฉัน ครั้งแรกที่ฉันบิน ฉันทำ GPS Mount และใบพัดแตก หากคุณไม่ต้องการการควบคุมด้วยเสียง คุณสามารถหยุดที่นี่ หากต้องการเรียนรู้เกี่ยวกับ AWS และการเขียนโปรแกรมโดรน ให้ดำเนินการต่อ!

ขั้นตอนที่ 4: ตั้งโปรแกรมโดรนให้บินด้วย Python

การเขียนโปรแกรมโดรนให้บินด้วย Python
การเขียนโปรแกรมโดรนให้บินด้วย Python

ก่อนเข้าสู่ AWS เราควรเข้าใจวิธีตั้งโปรแกรมโดรนให้บินก่อน หลังจากการตั้งค่าเริ่มต้น การรวมการควบคุมด้วยเสียงไม่ควรยากเกินไป สิ่งแรกที่เราสามารถพยายามทำความเข้าใจได้คือการสร้างโปรแกรมบินขึ้นและลงจอดอย่างง่าย หลังจากตั้งค่า Raspberry Pi แล้ว เราก็สามารถ SSH เข้าไปใหม่ได้ คุณสามารถดูเพลย์ลิสต์อีกครั้งหรือทำตามคำแนะนำของฉัน

1. ก่อนอื่นให้ดาวน์โหลด ArduPilot Source Code ในไดเร็กทอรีบน Raspberry Pi

mkdir src

จากนั้นรับไฟล์จาก GitHub โดยใช้ git clone

โคลน git -b Copter-3.6.11

ตอนนี้ ไปที่ /src/ardupilot

cd src

cd ardupilot

ตอนนี้ มาเริ่มต้นไฟล์ต้นฉบับกัน

git submodule update --init --recursive

2. ต่อไปเราต้องคอมไพล์เฟิร์มแวร์บน Raspberry Pi

อย่าลืมไปที่ /src/ardupilot/ ด้วย cd ก่อนทำขั้นตอนต่อไป

จากนั้นให้กำหนดค่าเฉพาะกับ Navio โดยใช้

./waf กำหนดค่า --board=navio2

จากนั้นคุณสามารถคอมไพล์ด้วย

./waf --targets bin/arducopter

3. ตอนนี้เราสามารถติดตั้งซอร์สโค้ดไปยัง Navio. ได้แล้ว

ขั้นแรกให้นำทางไปยังไดเร็กทอรีที่ถูกต้อง

cd/etc/systemd/system

จากนั้นแก้ไขไฟล์

sudo vi arducopter.service

ที่ที่มันบอกว่า ExecStart ให้แทรกสิ่งต่อไปนี้แทนสิ่งที่มีอยู่แล้ว

ExecStart=/bin/sh -c "/home/pi/src/arducopter/build/navio2/bin/arducopter ${ARDUPILOT_OPTS}"

ตอนนี้ เพื่อนำซอร์สโค้ด ardupilot ไปใช้จริง เราสามารถใช้

sudo systemctl daemon-reload

จากนั้นเราสามารถเริ่มต้นใหม่ด้วย

sudo systemctl รีสตาร์ท arducopter

ในขั้นตอนสุดท้าย ในที่สุดเราก็ตั้งค่า ArduPilot บนโดรนของเราเสร็จแล้ว

4. การติดตั้ง DroneKit

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

เราสามารถติดตั้งแพ็คเกจหลามด้วย

pip ติดตั้ง dronekit==2.9.1

นี่อาจเป็นหรือไม่ใช่เวอร์ชันใหม่ล่าสุด แต่เป็นเวอร์ชันที่ฉันใช้เพื่อให้สามารถช่วยในการแก้ไขปัญหาได้

เพื่อตรวจสอบว่าติดตั้งหรือไม่ เราสามารถทำได้ a

pip แช่แข็ง | grep dronekit

ในที่สุดเราก็พร้อมที่จะสร้างสคริปต์หลามตัวแรกของเราแล้ว

5. takeoff_and_land.py

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

##อย่าสร้างไดเร็กทอรีเพื่อเก็บรหัสนี้ก่อน

cd dk ##ถ้าคุณต้องการทำเอง ให้ใช้ vi takeoff_and_land.py ## เพื่อสร้างโปรแกรม

มิฉะนั้น คุณสามารถดูหรือใช้ไฟล์ที่แนบมาและใช้โปรโตคอลการถ่ายโอนไฟล์ เราสามารถลองใช้โปรแกรมนี้ได้ในภายหลัง ก่อนอื่นต้องชี้แจงว่าเป็นไฟล์ python ที่เราต้องใช้

chmod +x takeoff_and_land.py

จากนั้นให้ลองใช้รหัสต่อไปนี้เพื่อเรียกใช้

หลาม takeoff_and_land.py --connect 127.0.0.1:14550

ครั้งแรกมันไม่ได้ผลสำหรับฉันเช่นกัน หากมีการหมดเวลาของลิงก์ ก็ไม่ต้องกังวลว่ามีบางอย่างที่คุณสามารถทำได้ เปิดพรอมต์อื่นและ ssh คุณสามารถลองติดตั้งสิ่งที่เรียกว่า mavproxy แล้วลองใช้งาน หลังจากนั้น คุณสามารถเรียกใช้ทั้งสองอย่างพร้อมกันได้ สิ่งนี้จะช่วยเชื่อมต่อโดรน เมื่อเสร็จแล้วฉันมีความท้าทายสำหรับคุณ ลองคิดดูว่าโปรแกรมอื่น (set_velocity_body.py) ทำอะไรได้บ้างและจะใช้งานได้อย่างไร ถ้าทำได้ก็ดี

6. เป็นต้นไป!

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

ขั้นตอนที่ 5: การใช้ Amazon Alexa และ Amazon Web Services เพื่อผสานรวมการควบคุมด้วยเสียง

การใช้ Amazon Alexa และ Amazon Web Services เพื่อผสานรวมการควบคุมด้วยเสียง
การใช้ Amazon Alexa และ Amazon Web Services เพื่อผสานรวมการควบคุมด้วยเสียง
การใช้ Amazon Alexa และ Amazon Web Services เพื่อผสานรวมการควบคุมด้วยเสียง
การใช้ Amazon Alexa และ Amazon Web Services เพื่อผสานรวมการควบคุมด้วยเสียง

ขั้นตอนนี้เป็นหนึ่งในขั้นตอนที่มีเอกสารน้อยกว่า ซึ่งหมายความว่าจะเป็นการแก้ไขปัญหาที่ยากที่สุด เพิ่งเริ่มทำงานใช้เวลาประมาณหนึ่งเดือนหรืออาจมากกว่านั้น สิ่งสำคัญที่สุดคือต้องอดทน คุณลักษณะนี้หากนำไปใช้ในชีวิตจริงอาจเปลี่ยนแปลงชีวิตได้ คุณสามารถบอกให้ Alexa ซื้อของให้คุณแทนที่จะไปเอง ลองนึกภาพว่า! เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มกันเลย!

1. การลงทะเบียน Raspberry Pi เป็นสิ่งของบน AWS IoT

ในการใช้ IoT (Internet of Things) เราต้องการสิ่งใดสิ่งหนึ่ง เราจึงต้องเข้าสู่ระบบ AWS Console เพื่อใช้ AWS IoT ก่อน จากนั้นไปที่ IoT Core เมื่อถึงที่นั่น คุณควรคลิก จัดการ แล้วสร้างสิ่งต่างๆ หลังจากเพิ่มชื่อแล้ว เราต้องการใบรับรองเพื่อเชื่อมต่อ ฉันอยากจะแนะนำให้คลิกการรับรองแบบคลิกเดียว หลังจากเห็นหน้าจอใบรับรองแล้ว อย่าลืมดาวน์โหลดทุกคีย์รวมถึงรูท CA จากนั้นคุณสามารถไปสร้างสิ่งนั้นให้เสร็จได้ ต่อไปเราต้องสร้างนโยบาย กลับไปที่ IoT Core จากนั้นคลิกที่นโยบายความปลอดภัยและคลิก จากนั้นกดสร้างนโยบาย จากนั้นคุณสามารถสร้างชื่อและเพิ่มทรัพยากรได้ ภายใต้การดำเนินการ ให้พิมพ์ iot* และพิมพ์ * ใต้ทรัพยากร แล้วกดอนุญาตให้มีผล จากนั้นกลับไปที่สิ่งของของคุณและไปที่ใบรับรองของคุณ เมื่ออยู่ที่นี่ ให้คลิกที่นโยบาย จากนั้นคุณสามารถแนบกรมธรรม์ของคุณสำหรับสิ่งนั้นและก็พร้อมแล้ว!

2. การตั้งค่าโค้ดบน Raspberry Pi และโต้ตอบกับ IoT

ในส่วนนี้ คุณจะต้องมีไคลเอ็นต์ SFTP (ฉันใช้ WinSCP) สำหรับการถ่ายโอนไฟล์ เมื่อเชื่อมต่อกับ Raspberry Pi เราจะต้องมีคีย์ใบรับรองในมือ คุณต้องถ่ายโอนไฟล์คีย์ไปยัง Raspberry Pi คุณควร pip ติดตั้ง AWSIoTPythonSDK บน Raspberry Pi จากนั้นไปที่ไดเร็กทอรี dk บน Raspberry Pi คุณใช้ไฟล์ Alexa Drone Control ที่ฉันให้ไว้เพื่อสื่อสารกับ IoT ในการใช้ไฟล์นี้ ฉันใช้ Shell Script เพื่อเริ่มต้น ฉันจะแสดงรหัสด้านล่างเนื่องจากฉันไม่สามารถอัปโหลดไฟล์ได้ด้วยเหตุผลบางประการ หากโปรแกรมไม่รับข้อความจาก AWS IoT ขณะทดสอบ ไม่ต้องกังวล! นี่อาจเป็นความผิดของฉันเนื่องจากไฟล์ควบคุม Alexa Drone อาจไม่เหมาะกับสิ่งของของคุณ ดังนั้น หากต้องการแก้ไข ให้กลับไปที่ AWS IoT แล้วกดเรียนรู้ที่แผงด้านซ้าย ทำตามคำแนะนำและคุณอาจต้องรีสตาร์ท ขอโทษสำหรับเรื่องนั้น. เมื่อ IoT ของคุณเริ่มทำงานกับโปรแกรมบน RasPi แล้ว คุณสามารถรวมรหัสโดรนจากไฟล์ Alexa Drone Control ที่ฉันให้มา หลังจากนั้น ใช้ Shell Script ที่ฉันให้พร้อมกับใบรับรองและ Rest API Endpoint จาก IoT

# หยุดสคริปต์บนชุดข้อผิดพลาด -e # ตรวจสอบว่ามีไฟล์รูท CA อยู่หรือไม่ ให้ดาวน์โหลดหากไม่ใช่ [! -f./root-CA.crt]; จากนั้น printf "\nกำลังดาวน์โหลดใบรับรอง AWS IoT Root CA จาก AWS…\n" curl https://www.amazontrust.com/repository/AmazonRoot…> > root-CA.crt fi # ติดตั้ง AWS Device SDK สำหรับ Python หากยังไม่ได้ติดตั้ง ถ้า [! -d./aws-iot-device-sdk-python]; จากนั้น printf "\nกำลังติดตั้ง AWS SDK…\n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py ติดตั้ง popd fi

# เรียกใช้แอพตัวอย่าง p/sub โดยใช้ใบรับรองที่ดาวน์โหลดในแพ็คเกจ

printf "\nกำลังเรียกใช้แอปพลิเคชันตัวอย่าง pub/sub…\n" python dk/AlexaDroneControl.py --connect 127.0.0.1:14550 -e "Your IoT ARN" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

วิธีนี้ใช้ไม่ได้กับทุกคนเนื่องจากชื่อต่างกัน แทนที่จะเป็นคีย์ที่ฉันใช้แทนที่ด้วยชื่อคีย์ของคุณเมื่อคุณโอนไฟล์ อย่าลืมออกจาก dk ก่อนถ่ายโอนไฟล์! นั่นควรเป็นทั้งหมดที่คุณต้องทำในตอนนี้

3. สร้างทักษะ Alexa ของคุณ

ขั้นตอนนี้ดูยากกว่าที่เป็นจริงมาก ขั้นแรก เราต้องลงชื่อเข้าใช้คอนโซล Alexa Developer จากนั้นเพียงแค่กดสร้างทักษะ เมื่อระบบขอให้เลือกโมเดลสำหรับทักษะของคุณ เพียงแค่กดกำหนดเอง เมื่อระบบขอเลือกวิธีการ ให้กดเลือกวิธีการของคุณเอง คุณสามารถตั้งชื่ออะไรก็ได้ที่คุณต้องการ ไม่จำเป็นต้องมีเทมเพลต ดังนั้นให้เลือกเริ่มจากศูนย์ ถัดไป หลังจากสร้างทักษะของคุณแล้ว คุณควรมาถึงหน้าจอตัวสร้างทักษะพร้อมรายการตรวจสอบทางด้านขวา จากที่นี่ เราสามารถเริ่มสร้างทักษะของเราได้ อันดับแรกในรายการตรวจสอบคือชื่อเรียก นี่คือสิ่งที่คุณจะบอกให้ Alexa เรียกใช้ทักษะของคุณ สำหรับฉัน ฉันแค่ใส่ชื่อเรียกของฉันเป็นเสียงพึมพำ ตอนนี้เราสามารถไปที่เจตนา คำพูด และช่องของเรา ที่นี่ คุณสามารถสั่งโดรนได้ เช่น ขึ้น 1 เมตร หรือไปทางขวาหรือลง ของฉันใช้งานได้จริงเพียงเมตรเดียวในตอนนี้ คุณสามารถคลิกตัวแก้ไข JSON ที่ด้านล่างของแผงด้านซ้าย จากนั้นคุณสามารถวางโค้ดต่อไปนี้ลงไปได้

{ "interactionModel": { "languageModel": { "invocationName": "drone", "intents": [{ "name": "AMAZON. FallbackIntent", "samples": }, { "name": "AMAZON". CancelIntent", "samples": }, { "name": "AMAZON. HelpIntent", "samples": }, { "name": "AMAZON. StopIntent", "samples": }, { "name": "AMAZON. NavigateHomeIntent", "samples": }, { "name": "GoIntent", "slots": [{ "name": "Direction", "type": "Direction" }, { "name": "Distance", "type": "AMAZON. NUMBER" }, { "name": "Unit", "type": "Unit" }], "samples": ["ไป {Direction} {ระยะทาง} {หน่วย}", "ไป {ระยะทาง} {หน่วย} {ทิศทาง}"] }, { "ชื่อ": "CommandIntent", "ช่อง": [{ "ชื่อ": "งาน", "ประเภท": "Task" }], "samples": ["Command drone to {Task}"] }, { "name": "TurnIntent", "slots": [{ "name": "Direction", "type": " Direction" }, { "name": "Rotation", "type": "AMAZON. NUMBER" }], "samples": ["Turn {Direction} {Rotation} องศา"] }], "types": [{ "name": "Direction", "values": [{ "name": { "value": "Straight", "synonyms": ["Forw" ards", "Forward"] } }, { "name": { "value": "Back", "synonyms": ["Backwards", "Backward"] } }, { "name": { "value": "ขวา" } }, { "ชื่อ": { "ค่า": "ซ้าย" } }, { "ชื่อ": { "ค่า": "ลง" } }, { "ชื่อ": { "ค่า": "ขึ้น " } }] }, { "name": "Unit", "values": [{ "name": { "value": "Meters", "synonyms": ["Meter"] } }, { "name": { "value": "Yards", "synonyms": ["Yard"] } }, { "name": { "value": "Feet", "synonyms": ["Foot"] } }] }, { "name": "Task", "values": [{ "name": { "value": "Land" } }, { "name": { "value": "Hold" } }, { "name": { "value": "Stay" } }, { "name": { "value": "RTL", "synonyms": ["Return to Launch"] } }] }] } } }

หลังจากวางโค้ดลงในตัวแก้ไข JSON แล้ว คุณสามารถคลิกที่ขั้นตอนที่สามของรายการตรวจสอบ จากนั้นระบบจะสร้างโมเดลการโต้ตอบให้กับคุณ ด้วยขั้นตอนนี้ คุณจะเสร็จสิ้นในตอนนี้ คุณสามารถเว้นช่องจุดปลายว่างไว้ได้ในตอนนี้!

ขั้นตอนที่ 4: สร้างฟังก์ชันแลมบ์ดาของคุณ

ตอนนี้ ขั้นตอนนี้เป็นสิ่งที่คุณจะต้องคิดออกเอง ฉันจะบอกวิธีเชื่อมต่อกับ Alexa Skill แต่คุณจะต้องเขียนโค้ดด้วยตัวเอง ไปที่คอนโซลการจัดการ AWS ก่อน จากนั้นไปที่แลมบ์ดา จากนั้นคุณสามารถสร้างฟังก์ชันที่ตั้งชื่ออะไรก็ได้ที่คุณต้องการ ตรวจสอบให้แน่ใจว่าได้เขียนมันตั้งแต่เริ่มต้น และสร้างรันไทม์ตามภาษาการเขียนโปรแกรมที่คุณต้องการ ฉันใช้ Node.js หากต้องการเพิ่ม Alexa Skill ให้เพิ่มทริกเกอร์และเลือก Alexa Skills Kit (ASK) คัดลอก Lambda ARN ของคุณและกลับไปที่ Alexa Skill ตอนนี้ไปที่จุดสิ้นสุด คุณสามารถวาง ARN บันทึก และสร้างโมเดลใหม่ได้ จากนั้นใช้ Alexa Skill ID และวางลงในส่วนทริกเกอร์ที่จะถามคุณในแลมบ์ดา ถัดไป เลื่อนลงมาที่ Lambda และค้นหาการตั้งค่าพื้นฐานและทำการหมดเวลา 10 วินาที ตอนนี้ มันขึ้นอยู่กับคุณแล้วที่จะหารหัส สำหรับคำแนะนำ คุณสามารถเว็บไซต์ด้านล่าง

github.com/aws/aws-iot-device-sdk-js

www.hackster.io/veggiebenz/voice-controlle…

และคุณสามารถใช้ไฟล์ที่ฉันแนบมา แต่มันไม่สมบูรณ์และใช้งานไม่ได้

/** * ควบคุม APM / Pixhawk quadcopter ด้วยเสียงของคุณ โดยใช้ Amazon Alexa, Lambda, 2lemetry MQTT*/ var awsIot = ต้องการ ('aws-iot-device-sdk'); var config = ต้องการ ("./config"); var deviceName = "EchoDroneControl"; // อุปกรณ์นี้เป็นตัวควบคุมจริงๆ var mqtt_config = { "keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, //+ "-Lambda-" + (new Date().getTime()), "region":"us-east-1", "debug":true }; var ctx = null; ไคลเอ็นต์ var = null; // กำหนดเส้นทางคำขอขาเข้าตามประเภท (LaunchRequest, IntentRequest เป็นต้น) เนื้อหา JSON ของคำขอมีอยู่ในพารามิเตอร์เหตุการณ์ exports.handler = function (เหตุการณ์, บริบท) { ลอง { console.log ("event.session.application.applicationId=" + event.session.application.applicationId); ctx = บริบท; if (event.session.application.applicationId !== app_id) { ctx.fail ("ID แอปพลิเคชันไม่ถูกต้อง"); } ลูกค้า = awsIot.device(mqtt_config); client.on("connect", function(){ console.log("Connected to AWS IoT"); // โทรกลับ (); });

ถ้า (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") { onLaunch(event.request, event.session); } else if (event.request.type === "IntentRequest") { onIntent (event.request, event.session); } else if (event.request.type === "SessionEndedRequest") { onSessionEnded (event.request, event.session); ctx.succeed(); } } catch (e) { console.log ("ข้อยกเว้นในตัวจัดการ: " + e); ctx.fail("ข้อยกเว้น:" + e); } }; /** * เรียกเมื่อเซสชั่นเริ่มต้น */ ฟังก์ชั่น onSessionStarted (sessionStartedRequest, เซสชัน) { console.log ("onSessionStarted requestId=" + sessionStartedRequest.requestId + ", sessionId=" + session.sessionId); }

/**

* เรียกเมื่อผู้ใช้เปิดสกิลโดยไม่ระบุสิ่งที่ต้องการ */ ฟังก์ชั่น onLaunch (launchRequest, session, callback) { console.log ("onLaunch requestId=" + launchRequest.requestId + ", sessionId=" + session.sessionId); // ส่งไปที่การเปิดตัวทักษะของคุณ getWelcomeResponse(โทรกลับ); } /** * เรียกเมื่อผู้ใช้ระบุเจตนาสำหรับทักษะนี้ */ ฟังก์ชั่น onIntent (intentRequest, เซสชัน) { //, โทรกลับ) { console.log ("onIntent requestId=" + IntentRequest.requestId + ", sessionId=" + session.sessionId); ความตั้งใจ var = IntentRequest.intent, IntentName = IntentRequest.intent.name; console.log("REQUEST to string =" + JSON.stringify(intentRequest)); var โทรกลับ = null; // ส่งไปยังตัวจัดการความตั้งใจของทักษะของคุณหาก ("GoIntent" === ชื่อเจตนา) { doGoIntent (เจตนา, เซสชัน); } อื่น if ("CommandIntent" === เจตนา) { doCommandIntent (เจตนา เซสชัน); } else if ("TurnIntent" === IntentName) { doTurnIntent (เจตนา เซสชัน); } else if ("HelpIntent" === เจตนา) { getWelcomeResponse(); } อื่น { โยน "เจตนาไม่ถูกต้อง"; } } /** * เรียกเมื่อผู้ใช้สิ้นสุดเซสชัน * ไม่ถูกเรียกเมื่อทักษะกลับมา shouldEndSession=true */ ฟังก์ชั่น onSessionEnded (sessionEndedRequest เซสชัน) { console.log ("onSessionEnded requestId=" + sessionEndedRequest.requestId + ", sessionId=" + session.sessionId); // เพิ่มตรรกะการล้างข้อมูลที่นี่ } // --------------- ฟังก์ชั่นที่ควบคุมพฤติกรรมของทักษะ -------------------- --- ฟังก์ชัน getWelcomeResponse() { // หากเราต้องการเริ่มต้นเซสชันเพื่อให้มีคุณสมบัติบางอย่าง เราสามารถเพิ่มสิ่งเหล่านั้นได้ที่นี่ var sessionAttributes = {}; var cardTitle = "ยินดีต้อนรับ"; var speechOutput = "ยินดีต้อนรับสู่ DRONE CONTROL"; // สิ่งที่ต้องทำ: โดรนออนไลน์หรือออฟไลน์? หากออนไลน์ จะเป็น ARMED หรือไม่? var repromptText = "โดรนพร้อมสำหรับคำสั่ง"; var shouldEndSession = เท็จ; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } /** * จัดการเจตนาของ GO */ ฟังก์ชั่น doGoIntent (เจตนา, เซสชัน, โทรกลับ) { // var cardTitle = "Drone GO…"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = เท็จ; var speechOutput = ""; ทิศทาง var = Intent.slots. Direction.value; ระยะทาง var = Intent.slots. Distance.value; หน่วย var = เจตนา.slots. Unit.value; var validDirections = ["ไปข้างหน้า", "ไปข้างหน้า", "ถอยหลัง", "ย้อนกลับ", "ขวา", "ซ้าย", "ขึ้น", "ลง", "ตรง", "ไปข้างหน้า", "ตรงไปข้างหน้า"]; var validUnits = ["foot", "feet", "meter", "meters", "yard", "yards"]; repromptText = "บอกฉันทีว่าจะไปได้ไกลแค่ไหนและไปในทิศทางใด "; var ล้มเหลว = เท็จ; // ตรวจสอบอินพุต if (!(parseInt(distance) >= 1)) { speechOutput = "ฉันไม่เข้าใจระยะทางที่คุณต้องการให้ฉันเดินทาง "; ล้มเหลว = จริง; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf(direction) == -1) { speechOutput = "ฉันไม่เข้าใจทิศทางที่คุณต้องการให้ฉันเดินทาง "; ล้มเหลว = จริง; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf(unit) == -1) { speechOutput = "ฉันไม่เข้าใจหน่วยที่คุณต้องการให้ฉันเดินทาง "; ล้มเหลว = จริง; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (!fail) { var cardTitle = "Drone go" + ทิศทาง + " " + ระยะทาง + " " + หน่วย; speechOutput = "ไป" + ทิศทาง + " " + ระยะทาง + " " + หน่วย; mqttPublish(เจตนา, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

ฟังก์ชั่น doCommandIntent (เจตนา, เซสชัน, โทรกลับ) {

// var cardTitle = "คำสั่งโดรน…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = เท็จ; var speechOutput = ""; repromptText = "บอกฉันว่าคำสั่งของโดรนคืออะไร"; var task = เจตนา.slots. Task.value; var validTasks = ["launch", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "abort"]; if (validTasks.indexOf(task) == -1) { speechOutput = "ฉันไม่เข้าใจคำสั่ง"; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else { var cardTitle = "กำลังดำเนินการคำสั่ง Drone" + งาน; speechOutput = "กำลังดำเนินการคำสั่ง" + งาน; mqttPublish(เจตนา, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

ฟังก์ชั่น doTurnIntent (เจตนา, เซสชัน, โทรกลับ) {

// var cardTitle = "โดรนเลี้ยว…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = เท็จ; var speechOutput = ""; repromptText = "บอกฉันว่าคุณต้องการหมุนโดรนอย่างไร"; ทิศทาง var = Intent.slots. Direction.value; var validDirections = ["ขวา", "ซ้าย", "รอบๆ"]; if (validDirections.indexOf(direction) == -1) { speechOutput = "ฉันไม่เข้าใจทิศทางของการเลี้ยว"; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } อื่น { var cardTitle = "โดรนหมุน" + ทิศทาง; speechOutput = "เลี้ยว" + ทิศทาง; mqttPublish(เจตนา, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

ฟังก์ชัน mqttPublish(เจตนา, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession)

{ var strIntent = JSON.stringify (เจตนา); console.log("mqttPublish: INTENT text = " + strIntent); // client.publish("ikw1zr46p50f81z/drone/echo", strIntent, เท็จ); client.publish(config.topic, strIntent, เท็จ); client.end(); client.on("close", (function () { console.log("MQTT CLIENT CLOSE - คิดว่าเสร็จแล้ว สำเร็จ "); ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); })); client.on ("ข้อผิดพลาด", (ฟังก์ชัน (ผิดพลาด ได้รับ) { console.log ("MQTT CLIENT ERROR!! " + err); })); }

// --------------- ตัวช่วยที่สร้างคำตอบทั้งหมด -----------------------

ฟังก์ชั่น buildSpeechletResponse (ชื่อ, เอาต์พุต, repromptText, shouldEndSession) { ส่งคืน { outputSpeech: { ประเภท: "PlainText", ข้อความ: เอาต์พุต }, การ์ด: { ประเภท: "Simple", หัวข้อ: ชื่อ, เนื้อหา: output }, reprompt: { outputSpeech: { ประเภท: "PlainText", ข้อความ: repromptText } }, shouldEndSession: shouldEndSession } } ฟังก์ชั่น buildResponse (sessionAttributes, speechletResponse) { ส่งคืน { รุ่น: "1.0", sessionAttributes: sessionAttributes, การตอบสนอง: speechletResponse } }

แนะนำ: