สารบัญ:

Alexa Raspberry Pi Relay Controller: 6 ขั้นตอน
Alexa Raspberry Pi Relay Controller: 6 ขั้นตอน

วีดีโอ: Alexa Raspberry Pi Relay Controller: 6 ขั้นตอน

วีดีโอ: Alexa Raspberry Pi Relay Controller: 6 ขั้นตอน
วีดีโอ: Alexa Echo Dot with Raspberry Pi3: Control GPIO Pins 2024, กรกฎาคม
Anonim
ตัวควบคุมรีเลย์ Alexa Raspberry Pi
ตัวควบคุมรีเลย์ Alexa Raspberry Pi
ตัวควบคุมรีเลย์ Alexa Raspberry Pi
ตัวควบคุมรีเลย์ Alexa Raspberry Pi
ตัวควบคุมรีเลย์ Alexa Raspberry Pi
ตัวควบคุมรีเลย์ Alexa Raspberry Pi

ฉันสร้างคำแนะนำนี้เพื่อแบ่งปันประสบการณ์ของฉันกับการผสานรวมอุปกรณ์ IOT กับ Alexa ของ Amazon

โครงการนี้อนุญาตให้ควบคุมบอร์ดรีเลย์ที่เชื่อมต่อกับราสเบอร์รี่ pi จากตัวควบคุมสมาร์ทโฮม

ได้รับการทดสอบกับ Alexa แล้ว แต่ดูเหมือนว่าจะทำงานได้ดีกับ Samsung Smartthings และอินเทอร์เฟซการควบคุมอื่นๆ เนื่องจากจำลองซ็อกเก็ต Belkin Wemo หลายชุด

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

ฉันไม่ต้องการที่จะไปที่ส่วนลึกของโค้ดแลมบ์ดาบน Amazon.com ดังนั้นฉันจึงทำให้มันง่ายจริงๆ

ฉันได้โพสต์แหล่งที่มาและบันทึกย่อบน Github:

github.com/Switchdoctorstu/StuPiMo

กวดวิชานี้มีเนื้อหาครอบคลุมถึงวิธีการทำงานและเผยแพร่บันทึกย่อของฉันในกรณีที่ช่วยเหลือผู้อื่น

ขั้นตอนที่ 1: วัสดุสิ้นเปลืองและการเชื่อมต่อ

วัสดุและการเชื่อมต่อ
วัสดุและการเชื่อมต่อ
วัสดุและการเชื่อมต่อ
วัสดุและการเชื่อมต่อ
วัสดุและการเชื่อมต่อ
วัสดุและการเชื่อมต่อ

สิ่งที่คุณต้องการมีอยู่ใน Amazon / EBay:

  • ราสเบอร์รี่ PI *
  • Pi พาวเวอร์ซัพพลาย
  • ขั้วต่อดูปองท์
  • บอร์ดรีเลย์
  • ไมโคร USB แบบเก่า (สำหรับตัดไฟสำหรับการ์ดรีเลย์)

ราสเบอร์รี่ Pi ใด ๆ ก็ใช้ได้ ฉันได้ทดสอบสิ่งนี้กับรุ่น B และ Zero แล้ว

*หากใช้ Pi Zero คุณจะต้องมีอะแดปเตอร์เครือข่าย OTG (เว้นแต่คุณจะซื้อรุ่น 'W' พร้อม buit ใน WiFi)

คุณจะต้องเชื่อมต่อ Pi กับเครือข่าย

ใช้ตัวเชื่อมต่อดูปองท์เพื่อเชื่อมต่อการ์ดรีเลย์กับ Pi

โปรดทราบว่าการ์ดรีเลย์ควรใช้ไฟภายนอก (ถอดลิงค์และเชื่อมต่อกับภายนอก 5v) มันจะทำงานโดยใช้พลังงานจาก PI แต่ไม่แนะนำสำหรับการทำงานจริง

สำหรับการตั้งค่าของฉัน ฉันใช้ USB HUB ที่ใช้พลังงานจากภายนอก สิ่งนี้ให้พลังแก่ PI

ฉันยังตัดปลายสาย USB เก่าและจ่ายไฟรีเลย์จากการเชื่อมต่อ USB ครั้งที่ 2 ไปยังฮับเพื่อความปลอดภัย เวอร์ชัน 'การผลิต' ของฉันใช้แหล่งจ่ายไฟโหมดสวิตช์ 5V 5A ขนาดเล็ก อีกครั้งฉันเพิ่งตัดสาย USB ลงครึ่งหนึ่งเพื่อจ่ายไฟให้กับ Pi ผ่าน Micro-USB และตัดตัวเชื่อมต่อดูปองท์สองตัวเพื่อจ่ายไฟให้กับบอร์ดรีเลย์ สาย USB มี 4 สาย ส่วนใหญ่ใช้สีแดง/ดำเพื่อระบุแหล่งจ่ายไฟ 5v แต่ถ้าไม่แน่ใจ ให้ใช้มิเตอร์ตรวจสอบให้แน่ใจว่าคุณได้สายไฟที่ถูกต้อง

หมุดรีเลย์บนบอร์ดเชื่อมต่อกับพิน GPIO ที่เกี่ยวข้องบนส่วนหัว PI

รหัสช่วยให้คุณเลือกพิน GPIO ได้ แต่ค่าเริ่มต้นที่ฉันใช้คือ:

  1. รีเลย์พิน 1 - กราวด์
  2. รีเลย์พิน 2 - รีเลย์ 1 - GPIO 0
  3. รีเลย์พิน 3 - รีเลย์ 2 - GPIO 1
  4. รีเลย์พิน 4 - รีเลย์ 3 - GPIO 2
  5. รีเลย์พิน 5 - รีเลย์ 4 - GPIO 3
  6. รีเลย์พิน 6 - รีเลย์ 5 - GPIO 4
  7. รีเลย์พิน 7 - รีเลย์ 6 - GPIO 5
  8. รีเลย์พิน 8 - รีเลย์ 7 - GPIO 6
  9. รีเลย์พิน 9 - รีเลย์ 8 - GPIO 7
  10. รีเลย์พิน 10 - +5v สำหรับลอจิก

ขั้นตอนที่ 2: ตั้งค่า PI

ฉันจะไม่สร้างบทช่วยสอนใหม่เกี่ยวกับวิธีทำให้ PI ของคุณทำงานและเชื่อมต่อกับเครือข่าย

มีมัคคุเทศก์มากมายรวมถึงคำแนะนำที่ยอดเยี่ยมที่:

www.instructables.com/id/Ultimate-Raspberr…

คุณจะต้องทำให้ตัวเองไปถึงจุดที่มองเห็น PI บนเครือข่ายและเชื่อมต่อได้

ไม่สำคัญว่าจะผ่านอีเทอร์เน็ตหรือไร้สาย

โครงการนี้สามารถทำได้โดยใช้ Raspberry PI โดยใช้ Geany Programmers Editor แต่โดยส่วนตัวแล้วฉันคิดว่าการเตรียมโค้ดของฉันบนพีซีโดยใช้ Visual Studio หรือ Eclipse (หรือแม้แต่ Notepad++) นั้นง่ายกว่าโดยส่วนตัวแล้วอัปโหลดไปยัง PI สำหรับการดีบักโดยใช้ การเชื่อมต่อ VNC อีกครั้งที่ฉันจะไม่พูดถึงเรื่องนี้เนื่องจากมีคำแนะนำที่ยอดเยี่ยมมากมายในการตั้งค่า VNC บน RPi

สิ่งที่คุณต้องมีคือไปยังจุดที่คุณสามารถอัปโหลดและคอมไพล์โค้ดได้

หมายเหตุสำคัญประการหนึ่งคือเนื่องจากตัวจัดการ UPNP ต้องการ UDP multicast อินเทอร์เฟซที่ใช้ต้องตั้งค่าเป็นโหมด 'Promiscuous'

สามารถทำได้บนบรรทัดคำสั่ง:

pi@raspberrypi:~ $ ifconfig eth0 promisc

และ / หรือ

pi@raspberrypi:~ $ ifconfig wlan0 promisc

สิ่งนี้จะต้องทำให้ถาวรดังนั้นฉันจึงแก้ไข /etc/rc.local

sudo nano \etc\rc.local

เพื่อรวมบรรทัด:

sudo ifconfig eth0 promisc

หลังจากชุดแรกของแบนเนอร์ # บรรทัดเพื่อให้แน่ใจว่าอินเทอร์เฟซได้รับการตั้งค่าเมื่อเริ่มต้น

ขั้นตอนที่ 3: การดาวน์โหลดและคอมไพล์โค้ด

โค้ดนั้นอยู่ในที่เก็บ Github ของฉัน

github.com/Switchdoctorstu/StuPiMo/blob/ma…

ในขณะที่มีวิธี 'ถูกต้อง' ในการโคลนที่เก็บ ฉันพบว่าง่ายกว่าเพียงแค่เปิดตัวแก้ไข Geany บนเดสก์ท็อป Pi แล้ววางโค้ดลงไป

ในทำนองเดียวกัน หากคุณกำลังใช้บรรทัดคำสั่ง

สร้างไดเร็กทอรีใหม่

mkdir Stu

เปลี่ยนเป็นมัน

cd Stu

สร้างไฟล์ข้อความใหม่

nano StuPiMo.c

คัดลอกโค้ดจาก Github raw และวางลงในไฟล์ใหม่

บันทึกและออก.

เมื่อคุณมีไฟล์เป็นออบเจกต์ซอร์สโค้ด C แล้ว คุณสามารถคอมไพล์โดยใช้

gcc -o StuPiMo StuPiMo.c -l การเดินสายPi

โปรดทราบว่าจำเป็นต้องมี "-l wiringPi" เพื่อให้แน่ใจว่าคอมไพเลอร์ลิงก์ในไลบรารี wiringPi ที่จำเป็น

รหัสสามารถเรียกใช้ได้โดยใช้

./StuPiMo

อีกครั้ง หากคุณต้องการให้สิ่งนี้ทำงานเมื่อเริ่มต้น ให้ใช้คำสั่ง:

sudo nano /etc/rc.local

เพื่อเพิ่มบรรทัดต่อไปนี้

sudo /home/pi/Stu/StuPiMo &

ไปยังไฟล์ /etc/rc.local ของคุณ อย่าลืมบันทึกไฟล์ของคุณเมื่อออก

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

ขั้นตอนที่ 4: การใช้มัน

เมื่อคุณเรียกใช้โค้ดแล้ว ให้ขอให้ alexa 'Discover Devices' และเธอจะพบอุปกรณ์ Wemo เสมือนทั้ง 8 เครื่อง

จากนั้นก็เป็นเพียงกรณีที่พูดว่า: "Alexa เปิดซ็อกเก็ต 1" หรือ "Alexa ปิดซ็อกเก็ต 6" เป็นต้น และรีเลย์ที่เกี่ยวข้องจะเปลี่ยนไป

ขั้นตอนที่ 5: วิธีการทำงานของรหัส

โค้ดนี้ทำงานโดยเลียนแบบชุดอุปกรณ์ซ็อกเก็ต Belkin Wemo

เพื่อให้บรรลุสิ่งนี้จะต้องจัดการ 2 หน้าที่หลัก

  • ตัวจัดการการออกอากาศการค้นพบ UPNP
  • 'ตัวจัดการอุปกรณ์' (หนึ่งตัวต่ออุปกรณ์เสมือน) เพื่อจัดการคำสั่งที่ส่งไปยังอุปกรณ์และการตอบสนองที่จำเป็น

คุณลักษณะ 'โบนัส' คือเผยแพร่หน้าเว็บเพื่ออนุญาตให้ควบคุมอุปกรณ์ได้

ตัวจัดการ UPNP

ตัวจัดการ UPNP เปิดซ็อกเก็ตเพื่อตรวจสอบแพ็คเก็ตโปรโตคอล SSDP บน 239.255.255.250 พอร์ต 1900

มันตอบสนองต่อการสืบค้น 'M-SEARCH' ที่มาพร้อมกับแพ็คเก็ตการตอบสนองการค้นพบที่ประกาศตัวจำลอง wemo แต่ละรายการให้กับทุกคนที่ถาม

ตัวจัดการอุปกรณ์

ตัวจัดการอุปกรณ์ (หนึ่งตัวต่ออุปกรณ์เสมือน) ตรวจสอบชุดของพอร์ต IP และตอบสนองต่อคำขอ

มันจะให้บริการการตอบกลับ setup.xml เมื่อถูกถาม

มันจะให้บริการไฟล์คำอธิบายเหตุการณ์เมื่อถูกถาม

มันจะตอบสนองต่อคำขอ GETBINARYSTATE

จะประมวลผลและตอบสนองต่อคำขอ SETBINARYSTATE

เว็บเซิร์ฟเวอร์

เว็บเซิร์ฟเวอร์เป็นกิจวัตรง่ายๆ ที่สร้างรูปแบบ HTML ที่มีปุ่มต่อรีเลย์

มันจะตอบสนองต่อการกดปุ่มและสลับสถานะของรีเลย์ตามลำดับ

ขั้นตอนที่ 6: การปรับแต่งและชื่อที่เป็นมิตร

การปรับแต่งและชื่อที่เป็นมิตร
การปรับแต่งและชื่อที่เป็นมิตร

ฉันไม่ได้คลั่งไคล้โค้ดในการทำให้มันง่ายและแก้ไข

พื้นฐานสามารถปรับแต่งได้ตามคำจำกัดความที่จุดเริ่มต้นของโค้ด:

// global definitions#define WEBPORT 5353 // port เพื่อรันเว็บเซิร์ฟเวอร์บน

#define NUMDEVICES 8 // จำนวนอุปกรณ์เสมือนที่จะสร้าง

#define PORTBASE 43450 // พอร์ต IP พื้นฐานเพื่อเพิ่มจาก

WEBPORT คือหมายเลขพอร์ตที่เว็บเซิร์ฟเวอร์ในตัวทำงานอยู่ สิ่งนี้สามารถทำให้นั่งที่ 80 เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น แต่ฉันพบว่ามันขัดแย้งกับ tomcat หรือบริการอื่น ๆ ที่ทำงานในเครื่อง

NUMDEVICES กำหนดจำนวนอีมูเลเตอร์ WEMO แต่ละรายการที่จะเปิดตัว หากคุณมีการ์ดรีเลย์ 2 พอร์ตให้ตั้งค่านี้เป็น 2, 4 พอร์ต = 4 เป็นต้น

ชื่อที่จำง่ายสำหรับอุปกรณ์ถูกกำหนดในรูทีนที่เรียกว่า setup_names:

int setup_names (เป็นมิตรกับอักขระ [NUMDEVICES][NAMELEN]) { int i = 0;

// ใช้ลูปนี้

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

sprintf(friendly, "Socket %d", i + 1);

}

// หรือตารางคู่มือต่อไปนี้เพื่อเติมชื่ออุปกรณ์

/*

strcpy(friendly[0], "ทีวีในห้องนอน");

strcpy(เป็นมิตร[1], "ผ้าห่มไฟฟ้า");

strcpy(เป็นมิตร[2], "โคมไฟห้องนอน");

strcpy(เป็นมิตร[3], "ซ็อกเก็ต 4");

strcpy(เป็นมิตร[4], "ซ็อกเก็ต 5");

strcpy(เป็นมิตร[5], "ซ็อกเก็ต 6");

strcpy(เป็นมิตร[6], "ซ็อกเก็ต 7");

strcpy(เป็นมิตร[7], "ซ็อกเก็ต 8");

*/

กลับฉัน;

}

ฉันใช้การวนซ้ำเพื่อเรียกอุปกรณ์แต่ละเครื่องว่า 'Socket n' แต่คุณสามารถลบลูปนี้และเพิ่มชื่อที่เป็นมิตรของคุณเองแทนได้ (เพียงตรวจสอบให้แน่ใจว่าคุณเพิ่มหมายเลขเดียวกันกับ NUMDEVICES) หากคุณลบ /* */

อย่าลืมคอมไพล์โค้ดใหม่หากคุณทำการเปลี่ยนแปลงใดๆ

แนะนำ: