สารบัญ:

Disco-pi: 8 ขั้นตอน (พร้อมรูปภาพ)
Disco-pi: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Disco-pi: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Disco-pi: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: PDP-8/e OS/8 Bootstrap Loader Test 2024, กรกฎาคม
Anonim
ดิสโก้ปี่
ดิสโก้ปี่

คำแนะนำนี้แสดงวิธีใช้ Raspberry Pi เพื่อควบคุมแถบ LED สีตามเพลงที่เล่นจากเว็บเบราว์เซอร์

แสดงวิธีสร้างเว็บไซต์พื้นฐานโดยใช้ Node.js ผ่าน HTTPS และใช้ socket.io ผ่าน WSS (Secure Websocket)

เว็บไซต์มีหน้าเดียวซึ่งมีรูปแบบพื้นฐาน หน้าเว็บจะแสดงรายการแบบหล่นลงพร้อมไฟล์เพลง ซึ่งอยู่ในโฟลเดอร์สาธารณะ/เสียงบนเซิร์ฟเวอร์ การเลือกตัวเลือกในรายการจะเล่นไฟล์เพลงในหน้าเว็บโดยใช้องค์ประกอบเสียง HTML 5 ขณะเล่นไฟล์เพลง หน้าเว็บจะใช้อินเทอร์เฟซ AudioContext เพื่อวิเคราะห์เพลง จากนั้นจะถูกส่งไปยังเซิร์ฟเวอร์ผ่านการเชื่อมต่อ websocket ที่ปลอดภัย

เซิร์ฟเวอร์ที่ทำงานบน Raspberry Pi ใช้ไลบรารี Node RPI WS281x Native (ห่อไลบรารี WS281X ของ Jeremy Garff) เพื่อเปลี่ยนสีของ LED บนแถบ LED WS2811 ตามข้อมูลที่ส่งผ่าน websocket

โค้ดตัวอย่างสามารถพบได้ที่นี่: disco-pi

ขั้นตอนที่ 1: อุปกรณ์

  1. Raspberry Pi - ฉันใช้ Raspberry Pi 2B ที่ฉันใช้อยู่ แต่คุณสามารถหาซื้อ Raspberry Pi 3 Starter Kit ได้ในราคาประมาณ 100 ดอลลาร์แคนาดา
  2. WS2811 LED Strip - ฉันกำลังเล่นกับ ALITOVE 16.4ft 150 Pixels WS2811 มาพร้อมคอนโทรลเลอร์และพาวเวอร์ซัพพลายในราคาประมาณ 45-50. ดอลลาร์แคนาดา
  3. Barrel Jack Connector - ฉันซื้อจากร้านขายอุปกรณ์อิเล็กทรอนิกส์ในพื้นที่ของฉัน ประมาณนี้ เพียงตรวจสอบให้แน่ใจว่าเหมาะกับแหล่งจ่ายไฟของคุณหรือไม่
  4. Jumper Connectors / Wire - ฉันมีสายเชื่อมต่อแบบ Female to Male และสายเชื่อมต่อแบบแข็ง 22 เกจวางอยู่รอบ ๆ

ขั้นตอนที่ 2: การตั้งค่า Raspberry Pi

ระบบปฏิบัติการ

ปกติฉันใช้ Raspbian build ล่าสุด ดาวน์โหลดรูปภาพและเขียนลงในการ์ด SD หากคุณใช้คอมพิวเตอร์ Windows คุณสามารถใช้ Win32 Disk Imager เพื่อเขียนภาพลงในการ์ด SD

Node.js

ติดตั้ง Node.js เวอร์ชันล่าสุด ในขณะที่เขียนฉันกำลังใช้ 8.9.1

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E ทุบตี -

sudo apt-get ติดตั้ง nodejs

ติดตั้ง git

sudo apt-get ติดตั้ง git

ขั้นตอนที่ 3: การตั้งค่าโค้ดตัวอย่าง

ลอกโค้ดตัวอย่าง

1. ตั้งค่าโฟลเดอร์ฐานที่จะติดตั้งลงใน

cd /opt

sudo mkdir com.jonhaydock sudo chown pi:pi com.jonhaydockcd com.jonhaydock

2. โคลนที่เก็บ git ตัวอย่าง

โคลน git

หรือ

โคลน git [email protected]:haydockjp/disco-pi.git

3. ติดตั้งการพึ่งพา

cd ดิสโก้ปี่

npm ติดตั้ง

อาจใช้เวลา 2-3 นาที

ขั้นตอนที่ 4: สร้างใบรับรอง SSL ที่ลงชื่อด้วยตนเอง

1. สร้างไฟล์คีย์ส่วนตัว

cd /opt/com.jonhaydock/disco-pi/certs

openssl genrsa -out disco-pi-key.pem 2048

2. สร้าง CSR (คำขอลงนามใบรับรอง)

openssl req -new -key disco-pi-key.pem -out disco-pi-csr.pem

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

ชื่อประเทศ (รหัส 2 ตัวอักษร) [AU]:CA

ชื่อรัฐหรือจังหวัด (ชื่อเต็ม) [Some-State]:ชื่อสถานที่ในบริติชโคลัมเบีย (เช่น เมือง) :ชื่อองค์กรของแวนคูเวอร์ (เช่น บริษัท) [Internet Widgits Pty Ltd]:ชื่อหน่วยขององค์กร Disco Pi (เช่น ส่วน) : ชื่อสามัญ (เช่น เซิร์ฟเวอร์ FQDN หรือชื่อของคุณ) :disco-pi ที่อยู่อีเมล :[email protected] รหัสผ่านท้าทาย : ชื่อบริษัทที่ไม่บังคับ :

ในตัวอย่างนี้ เพียงกดย้อนกลับเพื่อเว้นรหัสผ่านท้าทายว่างไว้

3. สร้างใบรับรอง

openssl x509 -req -days 1095 -in disco-pi-csr.pem -signkey disco-pi-key.pem -out disco-pi-cert.pem

4. เพื่อความปลอดภัยเป็นพิเศษ เราจะสร้างไฟล์พารามิเตอร์ Diffie Hellman ด้วย

openssl dhparam -out dh_2048.pem 2048

อาจใช้เวลา 15-20 นาที

ขั้นตอนที่ 5: การเชื่อมต่อฮาร์ดแวร์

การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์
การเชื่อมต่อฮาร์ดแวร์

การเปิดเครื่องแถบ LED

แถบ LED ใช้พลังงานจาก 12 โวลต์ Raspberry Pi สามารถส่งสัญญาณออกได้เพียง 3.3v หรือ 5v และไม่สามารถส่งสัญญาณออกที่ใดก็ได้ใกล้กับแอมป์ที่จำเป็นในการขับ LED จำนวนมาก

สิ่งสำคัญคือต้องไม่เชื่อมต่อแหล่งจ่ายไฟ 12 โวลต์กับ Raspberry Pi

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

ดำเนินการขั้นตอนต่อไปด้วยความเสี่ยงของคุณเอง ฉันไม่รับผิดชอบต่อสิ่งที่อาจผิดพลาด

แถบ LED

แถบ LED ของฉันมีสามสาย:

สีแดง - +12 โวลต์

สีดำ - พื้น

สีเขียว - ดาต้า

หมายเหตุ: มี Din และ Dout - Data In และ Data Out ตรวจสอบให้แน่ใจว่าคุณกำลังทำงานกับส่วนท้ายของแถบ LED ที่ระบุว่า Din

ตรวจสอบให้แน่ใจว่า Barrel Jack ไม่ได้เชื่อมต่อกับแหล่งจ่ายไฟ

1. ต่อสายสีแดงจากแถบ LED ไปที่ด้าน + ของ Barrel Jack

ฉันใช้สายเบ็ดสีขาว 22 เกจ

วางลวดลงในช่อง + ในแม่แรงบาร์เรลแล้วขันให้เข้าที่

ดันปลายอีกด้านของสายไฟเข้าไปในซ็อกเก็ตบน LED ตรวจสอบให้แน่ใจว่าคุณกำลังเชื่อมต่อกับสายสีแดง

2. ต่อสายสีดำจากแถบ LED เข้ากับด้าน - ของ Barrel Jack

ฉันใช้สายเบ็ดสีดำ 22 เกจ

วางลวดเข้าไปในช่อง - ในแม่แรงแบบบาร์เรล ณ จุดนี้ให้วางปลายด้านหนึ่งของสายต่อ (สายสีน้ำตาลในรูป) ลงในรูเดียวกันและขันให้เข้าที่

ดันปลายสายสีดำอีกด้านเข้ากับซ็อกเก็ตบน LED

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

3. ต่อสายสีเขียวจากแถบ LED

ใช้สายต่อตัวเมียกับตัวผู้ตัวใดตัวหนึ่ง ในรูปถ่ายของฉันนี่คือลวดสีเขียว

วางปลายตัวผู้เข้ากับซ็อกเก็ต LED ด้วยลวดสีเขียว

นี่คือสายเคเบิลข้อมูล

ราสเบอร์รี่ปี่

1. ใช้สายเชื่อมต่อสีเขียวและเชื่อมต่อกับ Raspberry Pi GPIO

คุณต้องเชื่อมต่อกับ PCM_CLK (พิน 12 / GPIO 18)

2. ใช้สายเชื่อมต่อสีดำและเชื่อมต่อกับ Raspberry Pi GPIO

คุณต้องเชื่อมต่อกับบริเวณใดบริเวณหนึ่ง ฉันแนะนำให้คุณใช้พิน 14 แต่คุณสามารถใช้พิน 6, 9, 20, 25, 30, 34 หรือ 39 ได้

หมายเหตุ: เพื่อให้ใช้งานได้กับแหล่งพลังงาน LED และ Raspberry Pi ต้องมีพื้นร่วม โปรดทราบว่าคุณต้องไม่เชื่อมต่อ 12 โวลต์ + (สายสีแดง) กับ Raspberry Pi

ไฟ LED

คุณไม่ควรเชื่อมต่อแหล่งจ่ายไฟ 12 โวลต์ของคุณกับแจ็คแบบบาร์เรล

ไฟ LED ทั้งหมดบนแถบ LED ของคุณควรสว่างขึ้น WHITE

ขั้นตอนที่ 6: รหัสฝั่งเซิร์ฟเวอร์

เรียกใช้โค้ดฝั่งเซิร์ฟเวอร์

cd /opt/com.jonhaydock/disco-pi

sudo npm เริ่ม

การดำเนินการนี้จะเริ่มต้นเว็บเซิร์ฟเวอร์และเริ่มรับฟังคำขอ HTTPS และ WSS

พอร์ตดีฟอลต์คือ 443 แต่คุณสามารถแทนที่ได้โดยการตั้งค่าตัวแปรสภาพแวดล้อมก่อนเริ่มโค้ด ตัวอย่างเช่น

ส่งออก DISCO_PI_PORT=1443

แถบ LED ของฉันมีไฟ LED 150 ดวง สิ่งเหล่านี้ถูกควบคุมในกลุ่มสาม ซึ่งหมายความว่าฉันไม่สามารถควบคุม LED ทุกดวงแยกกันได้ และฉันต้องส่งข้อมูลให้เพียงพอเพื่อควบคุม 50

หาก LED ของคุณมีมากหรือน้อย คุณสามารถแทนที่จำนวน LED ที่คุณควบคุมได้โดยการส่งผ่านพารามิเตอร์ไปยังการเริ่มต้น ตัวอย่างเช่น หากคุณสามารถควบคุม LED ได้เพียง 10 ดวง

sudo npm เริ่ม 10

รหัสเซิร์ฟเวอร์หลักสามารถพบได้ในไฟล์ app.js ไฟล์นี้เริ่มต้นเว็บเซิร์ฟเวอร์ HTTPS และเพิ่มใน socket.io เพื่อรับฟังคำขอ websocket บนพอร์ตเดียวกัน

ในการเข้าถึงเว็บไซต์ คุณควรเปิดเว็บเบราว์เซอร์บนคอมพิวเตอร์หลักของคุณ (ฉันได้ทดสอบสิ่งนี้ใน Chrome เท่านั้น) และใช้ที่อยู่ IP ของ Raspberry Pi เช่น

10.0.1.2/

คุณสามารถค้นหาที่อยู่ IP ของคุณได้จากบรรทัดคำสั่ง Raspberry Pi

ifconfig

เว็บเซิร์ฟเวอร์จะให้บริการเนื้อหาใด ๆ ภายใต้โฟลเดอร์สาธารณะ เป็นค่าเริ่มต้นที่จะแสดงหน้า index.html

มีจุดสิ้นสุด API หนึ่งจุด - /api/audio จุดสิ้นสุดนี้จะค้นหาไฟล์ใดๆ ภายใต้โฟลเดอร์สาธารณะ/เสียงและส่งคืนรายการ ตัวอย่างเช่น

["GYAKO.mp3", "Havana (feat. Young Thug).mp3", "Queen_Bohemian_Rhapsody.mp3", "Set It All Free.mp3", "This Is What You Came For (feat. Rihanna).mp3"]

หากต้องการเพิ่มเพลงเป็นตัวเลือก ให้คัดลอกไฟล์ไปยังโฟลเดอร์นี้ โดยส่วนตัวแล้วฉันใช้ Filezilla กับ ssh โฟลเดอร์ที่คุณต้องการเพิ่มไฟล์คือ /opt/com.jonhaydock/disco-pi/public/audio

ขั้นตอนที่ 7: รหัสเว็บไซต์

รหัสเว็บไซต์
รหัสเว็บไซต์

เมื่อคุณเข้าชมเว็บไซต์ คุณควรเห็นสิ่งนี้

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

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

หากคุณเลือกตัวเลือกไม่มี เพลงจะหยุดเล่น

ขณะเล่นไฟล์เพลง หน้าเว็บจะใช้อินเทอร์เฟซ AudioContext เพื่อวิเคราะห์เพลง จากนั้นจะถูกส่งไปยังเซิร์ฟเวอร์ผ่านการเชื่อมต่อ websocket ที่ปลอดภัย

ข้อความเป็นประเภทที่ socket.io บนเซิร์ฟเวอร์ได้รับการตั้งค่าให้รับฟัง "ws2811" ประกอบด้วยอาร์เรย์ 50 องค์ประกอบซึ่งอยู่ระหว่าง 0 ถึง 255

"ws2811", {"0":251, "1":252, "2":241, "3":217, "4":193, "5":164, "6":148, "7":139, "8":110, "9":96, "10":81, "11":67, "12":72, "13":66, "14":60, "15":60, "16":63, "17":54, "18":37, "19":30, "20":31, "21":26, "22":13, "23":3, " 24":10, "25":7, "26":6, "27":0, "28":0, "29":0, "30":1, "31":8, "32":12, "33":3, "34":2, "35":2, "36":0, "37":0, "38":0, "39":0, "40":0, "41":0, "42":0, "43":0, "44":0, "45":0, "46":0, "47":0, "48":0, " 49":0}

เซิร์ฟเวอร์ใช้ไลบรารี Node RPI WS281x Native (ห่อไลบรารี WS281X ของ Jeremy Garff) เพื่อเปลี่ยนสีของ LED บนแถบ LED WS2811 ตามข้อมูลที่ส่งผ่าน websocket

ขั้นตอนที่ 8: ในที่สุด

Image
Image

คุณควรเห็นไฟ LED บนแถบเปลี่ยนสีพร้อมกับเพลง ตามการวิเคราะห์ Fast Fourier Transform ที่ทำในหน้าเว็บ

ฉันหวังว่าคุณจะสนุกกับสิ่งนี้ ให้ทายว่าเอาไปทำอะไร!

หมายเหตุ: หากคุณมีปัญหาใด ๆ

เนื่องจากไลบรารีนี้และออดิโอออนบอร์ด Raspberry Pi ใช้ PWM จึงไม่สามารถใช้ร่วมกันได้

คุณอาจต้องขึ้นบัญชีดำโมดูลเคอร์เนลเสียงของ Broadcom โดยสร้างไฟล์ /etc/modprobe.d/snd-blacklist.conf ด้วย

บัญชีดำ snd_bcm2835

หากอุปกรณ์เสียงยังคงโหลดหลังจากขึ้นบัญชีดำ คุณอาจต้องแสดงความคิดเห็นในไฟล์ /etc/modules ในระบบ headless คุณอาจต้องบังคับเสียงผ่าน hdmi

แก้ไข config.txt และเพิ่ม:

hdmi_force_hotplug=1

hdmi_force_edid_audio=1

จำเป็นต้องรีบูตเพื่อให้การเปลี่ยนแปลงนี้มีผล

แนะนำ: