สารบัญ:

หมวก LED แฟนซี: 5 ขั้นตอน (พร้อมรูปภาพ)
หมวก LED แฟนซี: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: หมวก LED แฟนซี: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: หมวก LED แฟนซี: 5 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: สอนศิลป์ : หมวกหมีน้อย (21 พ.ย. 57) [HD] 2024, กรกฎาคม
Anonim
Image
Image
หมวก LED แฟนซี
หมวก LED แฟนซี

ฉันอยากทำโปรเจ็กต์ Arduino มาตลอด แต่ไม่เคยมีไอเดียดีๆ เลย จนกระทั่งครอบครัวของฉันได้รับเชิญไปงานปาร์ตี้หมวกแฟนซี ด้วยระยะเวลารอคอยสองสัปดาห์ ฉันอยากรู้ว่าฉันสามารถวางแผนและดำเนินการหมวกแอนิเมชั่น LED ที่ไวต่อการเคลื่อนไหวได้หรือไม่ ปรากฎว่าฉันทำได้! ฉันอาจจะลงน้ำเล็กน้อย แต่โครงการทั้งหมดมีราคาประมาณ 80 เหรียญ ด้วยการทดลองและการเข้ารหัสบางอย่าง คุณสามารถทำได้โดยมีค่าใช้จ่ายน้อยลง

เป้าหมายกับหมวกมีดังต่อไปนี้:

  1. ให้ชุดไฟเคลื่อนจากตรงกลางหน้าหมวกไปด้านหลัง ข้างละดวงหนึ่งดวง
  2. เปลี่ยนความเร็วของการเดินทางของแสงที่กำหนดโดยความเอียงของหมวกด้านหน้าไปด้านหลัง
  3. ปล่อยให้ไฟถอยหลังเมื่อเอียงสายคาดหมวกลง (เช่น จำลองผลกระทบของแรงโน้มถ่วงที่มีต่อไฟ)
  4. เปลี่ยนสีตามความเอียงของหมวกจากซ้ายไปขวา
  5. สัมผัสได้ถึงแรงกระแทกและแสดงผลพิเศษ
  6. สัมผัสผู้สวมใส่หมุนและแสดงเอฟเฟกต์พิเศษ
  7. ใส่หมวกให้ครบ

ขั้นตอนที่ 1: อะไหล่ที่จำเป็น

อะไหล่ที่จำเป็น
อะไหล่ที่จำเป็น
อะไหล่ที่จำเป็น
อะไหล่ที่จำเป็น
อะไหล่ที่จำเป็น
อะไหล่ที่จำเป็น

ฉันใช้ส่วนประกอบหลักต่อไปนี้ (รวมลิงก์ที่ไม่ใช่แอฟฟิลิเอตของ Amazon):

  • ไมโครคอนโทรลเลอร์ Teensy LC - ฉันเลือกสิ่งนี้มากกว่า Arduino ทั่วไปเนื่องจากมีขนาดเล็ก และมีการเชื่อมต่อพิเศษสำหรับควบคุม LED ของฉัน รวมถึงการสนับสนุนไลบรารีที่แข็งแกร่งและชุมชน
  • เซ็นเซอร์ตำแหน่งตาม Bosch BNO055 - หนึ่งในคนแรกที่ฉันพบเอกสารประกอบ มีตัวเลือกที่ถูกกว่ามาก แต่เมื่อคุณเข้าใจ Bosch แล้ว คุณจะไม่ต้องทำอะไรมากในโค้ด
  • WS2812 แถบ LED ที่กำหนดแอดเดรสได้ - ฉันเลือกความยาว 1 เมตรพร้อมไฟ LED 144 ดวงต่อเมตร การมีความหนาแน่นนั้นจะช่วยให้แสงดูเหมือนกำลังเคลื่อนที่มากกว่าที่จะให้แต่ละองค์ประกอบสว่างขึ้นตามลำดับ

และส่วนประกอบย่อยดังต่อไปนี้:

  • หมวก - หมวกใด ๆ ที่มีสายรัดหมวกจะทำ นี่คือหมวกราคา $ 6 จากร้านค้าในพื้นที่ หากมีรอยต่อด้านหลัง จะทำให้เดินสายไฟได้ง่ายขึ้น สังเกตให้ดีว่าสายรัดหมวกติดอยู่หรือไม่ เพราะนั่นจะทำให้เกิดปัญหาขึ้นเช่นกัน ตัวนี้เย็บด้านบน แต่ด้านล่างดึงขึ้นง่าย
  • ตัวต้านทาน 4.7K โอห์ม
  • กล่องใส่แบตเตอรี่ AAA 3 ก้อน - ใช้แบตเตอรี่ AAA 3 ก้อนเพื่อจ่ายไฟให้อยู่ในช่วงที่อุปกรณ์อิเล็กทรอนิกส์ต้องการ ซึ่งทำให้สิ่งต่างๆ ง่ายขึ้น AAA พอดีกับหมวกได้ง่ายกว่า AA และยังมีเวลาทำงานที่ยอดเยี่ยม
  • ลวดเกจขนาดเล็ก - ฉันใช้ลวดแข็งที่ฉันวางไว้จากโปรเจ็กต์ LED ก่อนหน้านี้
  • หัวแร้งและหัวแร้ง
  • ผ้าสแปนเด็กซ์บางตัวที่เข้ากับสีด้านในหมวกและด้าย

แนะนำแต่ไม่บังคับ:

  • ขั้วต่อแบบเร็วสำหรับสายแบตเตอรี่
  • Helping Hands tool สิ่งเหล่านี้มีขนาดเล็กมากและบัดกรียาก

ขั้นตอนที่ 2: แก้ไข Hat

แก้ไขหมวก
แก้ไขหมวก
แก้ไข Hat
แก้ไข Hat
แก้ไขหมวก
แก้ไขหมวก
แก้ไข Hat
แก้ไข Hat

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

กระเป๋าถูกหว่านด้วยด้ายที่เข้ากับสีของหมวก ตลอดแนวมงกุฎ ขึ้นอยู่กับสไตล์ของหมวกและวัสดุที่ทำมาจาก YMMV ด้วยเทคนิคนี้

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

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

ขั้นตอนที่ 3: วางสาย

วางสาย
วางสาย

บอร์ด Teensy และไฟ LED จะทำงานร่วมกับที่ใดก็ได้ตั้งแต่ 3.3v ถึง 5v สำหรับพลังงาน นี่คือเหตุผลที่ฉันเลือกใช้แบตเตอรี่ AAA 3 ก้อน แรงดันเอาท์พุต 4.5v อยู่ในช่วงนั้นอย่างดี และพวกมันมีรันไทม์มากมายสำหรับวิธีที่ฉันตั้งโปรแกรม LED ให้ทำงาน คุณควรจะสามารถรันไทม์ได้มากกว่า 8 ชั่วโมง

เดินสายไฟ

ฉันต่อสายขั้วบวกและขั้วลบจากกล่องแบตเตอรี่และไฟ LED เข้าด้วยกัน จากนั้นจึงบัดกรีเข้ากับ Teensy ในตำแหน่งที่เหมาะสม ขั้วบวกจากแบตเตอรี่จะต้องเชื่อมต่อกับพินขวาบนของ Teensy ในไดอะแกรม (มีป้ายกำกับว่า Vin บนกระดาน) และขั้วลบสามารถต่อเข้ากับพินใดก็ได้ที่มีป้ายกำกับ GND สะดวกตรงที่ฝั่งตรงข้ามของบอร์ดหรือติดกับพิน Vin แผนภาพพินเอาต์แบบเต็มสำหรับบอร์ดสามารถดูได้ที่ด้านล่างของหน้านี้ และในบางกรณี สำเนากระดาษจะรวมอยู่ด้วยเมื่อคุณสั่งซื้อกระดาน

หากคุณกำลังวางแผนที่จะรันโค้ดที่เปิดไฟ LED เพียงไม่กี่ดวงในคราวเดียว คุณสามารถจ่ายไฟให้ LED จาก Teensy ได้โดยใช้เอาต์พุต 3.3v และ GND อย่างไรก็ตาม หากคุณพยายามดึงพลังงานมากเกินไป คุณสามารถทำได้ ทำให้บอร์ดเสียหาย ดังนั้น เพื่อให้ตัวเองมีตัวเลือกมากที่สุด ควรต่อสายไฟ LED กับแหล่งแบตเตอรี่ของคุณโดยตรง

การเดินสายไฟ LED

ฉันเลือก Teensy LC สำหรับโปรเจ็กต์นี้ เนื่องจากมีพินที่ช่วยให้ต่อสายไฟ LED ที่ระบุแอดเดรสได้ง่ายขึ้นมาก ที่ด้านล่างของบอร์ดพินที่สองจากกระจกด้านซ้ายพิน #17 แต่มี 3.3v อยู่ด้วย สิ่งนี้เรียกว่าการดึงขึ้นและบนกระดานอื่น ๆ คุณจะต้องต่อสายตัวต้านทานเพื่อให้แรงดันไฟฟ้านั้น ในกรณีของ Teensy LC คุณสามารถต่อสายจากพินนั้นตรงไปยังสายข้อมูล LED ของคุณ

การเดินสายไฟเซ็นเซอร์ตำแหน่ง

บอร์ด BNO055 บางตัวที่มีจำหน่ายนั้นเข้มงวดกว่ามากในด้านแรงดันไฟฟ้าและต้องการเพียง 3.3v เท่านั้น ด้วยเหตุนี้ ฉันจึงเชื่อมต่อ Vin บนบอร์ด BNO055 จากเอาต์พุต 3.3v เฉพาะบน Teensy ซึ่งเป็นพินที่ 3 ทางด้านขวา จากนั้นคุณสามารถเชื่อมต่อ GND บน BNO055 กับ GND ใดก็ได้บน Teensy

เซ็นเซอร์ตำแหน่ง BNO055 ใช้ I2c เพื่อพูดคุยกับ Teensy I2c ต้องการ pull-ups ดังนั้นฉันจึงต่อตัวต้านทาน 4.7K ohm สองตัวจากเอาต์พุต 3.3v บน Teensy ไปยังพิน 18 และ 19 จากนั้นฉันก็ต่อพิน 19 เข้ากับพิน SCL บนบอร์ด BNO055 และ 18 กับพิน SDA

เคล็ดลับ/เทคนิคการเดินสายไฟ

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

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

ขั้นตอนที่ 4: การเขียนโปรแกรม

เมื่อประกอบทุกอย่างเรียบร้อยแล้ว คุณจะต้องใช้เครื่องมือการเขียนโปรแกรมที่เข้ากันได้กับ Arduino ฉันใช้ Arduino IDE จริง (ใช้งานได้กับ Linux, Mac และ PC) คุณจะต้องใช้ซอฟต์แวร์ Teensyduino เพื่อเชื่อมต่อกับบอร์ด Teensy โปรเจ็กต์นี้ใช้ไลบรารี FastLED อย่างมากในการเขียนโปรแกรมสีและตำแหน่งของ LED

สอบเทียบ

สิ่งแรกที่คุณต้องทำคือไปที่ที่เก็บ GitHub ที่ยอดเยี่ยมของ Kris Winer สำหรับ BNO055 และดาวน์โหลดแบบร่าง BNO_055_Nano_Basic_AHRS_t3.ino ของเขา ติดตั้งโค้ดนั้นโดยที่ Serial Monitor ทำงานอยู่ และมันจะบอกคุณว่าบอร์ด BNO055 ออนไลน์อย่างถูกต้องและผ่านการทดสอบตัวเองหรือไม่ นอกจากนี้ยังจะแนะนำคุณตลอดการปรับเทียบ BNO055 ซึ่งจะทำให้คุณได้ผลลัพธ์ที่สม่ำเสมอมากขึ้นในภายหลัง

เริ่มต้นใช้งาน Sketch LED แฟนซี

มีการแนบรหัสสำหรับหมวกแฟนซี LED โดยเฉพาะและในที่เก็บ GitHub ของฉันด้วย ฉันวางแผนที่จะปรับแต่งโค้ดเพิ่มเติม และจะโพสต์ใน GitHub repo ไฟล์ที่นี่สะท้อนถึงรหัสเมื่อมีการเผยแพร่คำแนะนำนี้ หลังจากดาวน์โหลดและเปิดภาพสเก็ตช์แล้ว มีบางสิ่งที่คุณต้องเปลี่ยนแปลง ค่าที่สำคัญที่สุดในการเปลี่ยนแปลงจะอยู่ด้านบนสุดของคำสั่ง #define:

บรรทัดที่ 24: #define NUM_LEDS 89 - เปลี่ยนเป็นจำนวน LED จริงบนแถบ LED ของคุณ

บรรทัดที่ 28: #define SERIAL_DEBUG false - คุณอาจต้องการทำให้สิ่งนี้เป็นจริง เพื่อให้คุณเห็นเอาต์พุตบนจอภาพอนุกรม

รหัสตรวจจับตำแหน่ง

การตรวจจับตำแหน่งและการปรับแต่งส่วนใหญ่ของคุณเริ่มต้นที่บรรทัด 742 และผ่าน 802 เราได้รับข้อมูล Pitch, Roll และ Yaw จากเซ็นเซอร์ตำแหน่งและใช้เพื่อตั้งค่า คุณอาจต้องเปลี่ยนอุปกรณ์เหล่านี้ ทั้งนี้ขึ้นอยู่กับวิธีการติดตั้งอุปกรณ์อิเล็กทรอนิกส์ของคุณ หากคุณติดตั้งเซ็นเซอร์ตำแหน่งโดยให้ชิปอยู่ที่ด้านบนของหมวก และลูกศรถัดจาก X ที่พิมพ์บนกระดานชี้ไปที่ด้านหน้าของหมวก คุณจะเห็นสิ่งต่อไปนี้:

  • พิชพยักหน้า
  • ม้วนตัวเอียงศีรษะของคุณเช่น เอาหูแตะไหล่
  • หันเหเป็นทิศไหน คุณกำลังเผชิญ (เหนือ ตะวันตก ฯลฯ)

หากบอร์ดของคุณติดตั้งในทิศทางอื่น คุณจะต้องสลับ Pitch/Roll/Yaw เพื่อให้มีพฤติกรรมตามที่คุณต้องการ

ในการปรับการตั้งค่าม้วน คุณสามารถเปลี่ยนค่า #define ต่อไปนี้:

  • ROLLOFFSET: โดยให้หมวกของคุณมั่นคงและอยู่ตรงกลางเท่าที่จะทำได้ ถ้าม้วนไม่ใช่ 0 ให้เปลี่ยนสิ่งนี้ด้วยความแตกต่าง เช่น. หากคุณเห็นการหมุนที่ -20 เมื่อหมวกของคุณอยู่ตรงกลาง ให้สร้าง 20
  • ROLLMAX: ค่าสูงสุดที่จะใช้สำหรับการวัดแบบม้วน หาได้ง่ายที่สุดโดยการสวมหมวกและขยับหูขวาไปทางไหล่ขวา คุณต้องใช้สาย USB ยาวเพื่อดำเนินการนี้ขณะใช้จอภาพแบบอนุกรม
  • ROLLMIN: ค่าต่ำสุดที่จะใช้สำหรับการวัดการหมุนเมื่อคุณเอียงศีรษะไปทางซ้าย

ในทำนองเดียวกันสำหรับ Pitch:

  • MAXPITCH - ค่าสูงสุดเมื่อคุณกำลังมองหา
  • MINPITCH - ค่าต่ำสุดเมื่อคุณกำลังมองลง
  • PITCHCENTER - ค่า pitch เมื่อคุณมองตรงไปข้างหน้า

หากคุณตั้งค่า SERIALDEBUG เป็น true ที่ด้านบนของไฟล์ คุณควรเห็นค่าปัจจุบันสำหรับเอาต์พุต Roll/Pitch/Yaw ไปยังมอนิเตอร์แบบอนุกรมเพื่อช่วยปรับแต่งค่าเหล่านี้

พารามิเตอร์อื่น ๆ ที่คุณอาจต้องการเปลี่ยน

  • MAX_LED_DELAY 35 - อนุภาค LED เคลื่อนที่ได้ช้าที่สุด นี่คือหน่วยมิลลิวินาที เป็นความล่าช้าจากการย้ายจาก LED หนึ่งไปยังอีกดวงหนึ่งในสตริง
  • MIN_LED_DELAY 10 - การถือศีลอดที่อนุภาค LED สามารถเคลื่อนที่ได้ ด้านบนเป็นมิลลิวินาที

บทสรุป

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

ขั้นตอนที่ 5: ขั้นสูงและเป็นทางเลือก: ภายในโค้ด

การตรวจจับแรงกระแทกและการหมุน

การตรวจจับการกระแทก/การหมุนทำได้โดยใช้ฟังก์ชันเซ็นเซอร์ G สูงของ BNO055 คุณสามารถปรับแต่งความไวของมันได้ด้วยบรรทัดต่อไปนี้ใน initBNO055():

  • บรรทัด #316: BNO055_ACC_HG_DURATION - งานจะนานแค่ไหน
  • บรรทัด #317: BNO055_ACC_HG_THRESH - อิมแพคต้องหนักแค่ไหน
  • บรรทัด #319: BNO055_GYR_HR_Z_SET - ขีดจำกัดความเร็วในการหมุน
  • บรรทัด #320: BNO055_GYR_DUR_Z - การหมุนจะต้องคงอยู่นานแค่ไหน

ค่าทั้งสองเป็นไบนารี 8 บิต ปัจจุบันตั้งค่าผลกระทบเป็น B11000000 ซึ่งเท่ากับ 192 จาก 255

เมื่อตรวจพบการกระแทกหรือการหมุน BNO055 จะตั้งค่าที่โค้ดจะมองหาที่จุดเริ่มต้นของลูป:

// ตรวจจับการขัดจังหวะที่ทริกเกอร์ เช่น เนื่องจาก G byte intStatus สูง = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { ผลกระทบ (); } else if(intStatus > 0) { หมุน (); }

มองหาบรรทัด void impact() ด้านบนในโค้ดเพื่อเปลี่ยนพฤติกรรมเมื่อกระทบ หรือ void spin() เพื่อเปลี่ยนพฤติกรรมการหมุน

ผู้ช่วย

ฉันได้สร้างฟังก์ชันตัวช่วยอย่างง่าย (เป็นโมฆะ setAllLeds()) สำหรับการตั้งค่า LED ทั้งหมดเป็นสีเดียวอย่างรวดเร็ว หนึ่งใช้เพื่อปิดทั้งหมด:

setAllLeds(CRGB::สีดำ);

หรือคุณสามารถเลือกสีใดก็ได้ที่ไลบรารี FastLED รู้จัก:

setAllLeds(CRGB::สีแดง);

นอกจากนี้ยังมีฟังก์ชัน fadeAllLeds() ที่จะหรี่ไฟ LED ทั้งหมดลง 25%

ระดับอนุภาค

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

/* * ตัวแปรและคอนเทนเนอร์สำหรับ LED */ ไฟ LED CRGB[NUM_LEDS]; คงที่ unsigned int curLedDelay = MAX_LED_DELAY; คงที่ int centerLed = NUM_LEDS / 2; สแตติก int maxLedPos = NUM_LEDS / 2; บูลแบบคงที่ oddLeds = 0; อนุภาคบูลแบบคงที่ Dir = 1; สแตติกบูล speedDir = 1; dirCount ยาวที่ไม่ได้ลงนาม; hueCount แบบยาวที่ไม่ได้ลงนาม

และรหัสบางส่วนในการตั้งค่า ():

ถ้า (NUM_LEDS % 2 == 1) { oddLeds = 1; maxLedPos = NUM_LEDS/2; } อื่น ๆ { oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

ถ้าเรามีเลขคี่ เราต้องการใช้ 1/2 จุดเป็นจุดกึ่งกลาง มิฉะนั้น เราต้องการ 1/2 จุด - 1 ซึ่งมองเห็นได้ง่ายด้วยไฟ LED 10 หรือ 11 ดวง:

  • ไฟ LED 11 ดวง: 11/2 ที่มีจำนวนเต็มควรประเมินเป็น 5 และคอมพิวเตอร์นับจาก 0 ดังนั้น 0 - 4 คือครึ่งหนึ่ง 6 - 10 คืออีกครึ่งหนึ่งและ 5 อยู่ระหว่างพวกเขา เราปฏิบัติต่อ #5 ในกรณีนี้ราวกับว่ามันเป็นส่วนหนึ่งของทั้งสอง นั่นคือ #1 สำหรับสตริงเสมือนของ LED ทั้งสอง
  • ไฟ LED 10 ดวง: 10/2 คือ 5 แต่เนื่องจากคอมพิวเตอร์นับจาก 0 เราจึงต้องลบหนึ่งอัน จากนั้นเรามี 0 - 4 สำหรับครึ่งหนึ่งและ 5 - 9 สำหรับอีกครึ่งหนึ่ง #1 สำหรับสตริงเสมือนแรกจะเป็น 4 และ #1 สำหรับสตริงเสมือนที่สองจะเป็น #5

จากนั้นในรหัสอนุภาคของเรา เราต้องทำการนับจากตำแหน่งโดยรวมของเราไปยังตำแหน่งจริงบนสตริง LED:

ถ้า (oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } อื่น ๆ { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

รหัสยังมีเงื่อนไขที่อนุภาคสามารถเปลี่ยนทิศทางได้ ดังนั้นเราจึงต้องคำนึงถึงสิ่งนั้นด้วย:

if (particleDir) { if ((currPos == NUM_LEDS/2) && oddLeds) {currPos = 0; } else if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){currPos = 0; } อื่น ๆ {currPos++; } } อื่น { if((currPos == 0) && oddLeds){currPos = centerLed; } else if((currPos == 0) && (!oddLeds)){currPos = centerLed - 1; } อื่น ๆ {currPos--; } }

ดังนั้นเราจึงใช้ทิศทางที่ตั้งใจไว้ (particleDir) เพื่อคำนวณว่า LED ใดควรติดไฟต่อไป แต่เราต้องพิจารณาด้วยว่าเรามาถึงจุดสิ้นสุดที่แท้จริงของ LED string หรือจุดศูนย์กลางของเรา ซึ่งทำหน้าที่เป็นจุดสิ้นสุดด้วย แต่ละสตริงเสมือน

เมื่อเราคิดออกทั้งหมดแล้ว เราจะจุดไฟถัดไปตามความจำเป็น:

if (particleDir) { ถ้า (oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } อื่น ๆ { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; } } อื่น { if(oddLeds) { Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } อื่น ๆ { Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; } } ไฟ LED[Pos1] = CHSV(currHue, 255, 255); ไฟ LED[Pos2] = CHSV(currHue, 255, 255); FastLED.show();}

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

แนะนำ: