สารบัญ:

โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812: 7 ขั้นตอน
โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812: 7 ขั้นตอน

วีดีโอ: โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812: 7 ขั้นตอน

วีดีโอ: โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812: 7 ขั้นตอน
วีดีโอ: $1 PUSH LIGHT HACKS | Genius things you can do with Dollar Tree push lights 2024, ธันวาคม
Anonim
โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812
โคมไฟ LED Mood ราคา $1 พร้อม ATtiny13 และ WS2812

โดย arduinocelentanoติดตามเพิ่มเติมโดยผู้เขียน:

เซิร์ฟเวอร์ CalDAV ส่วนบุคคลบนคอมพิวเตอร์บอร์ดเดียว
เซิร์ฟเวอร์ CalDAV ส่วนบุคคลบนคอมพิวเตอร์บอร์ดเดียว
เซิร์ฟเวอร์ CalDAV ส่วนบุคคลบนคอมพิวเตอร์บอร์ดเดียว
เซิร์ฟเวอร์ CalDAV ส่วนบุคคลบนคอมพิวเตอร์บอร์ดเดียว
LCD Invaders: Space Invaders Like Game บนจอแสดงผล LCD ขนาด 16x2
LCD Invaders: Space Invaders Like Game บนจอแสดงผล LCD ขนาด 16x2
LCD Invaders: Space Invaders Like Game บนจอแสดงผล LCD ขนาด 16x2
LCD Invaders: Space Invaders Like Game บนจอแสดงผล LCD ขนาด 16x2
Octarine: เกมจับคู่สีพร้อมไฟ LED WS2812 RGB
Octarine: เกมจับคู่สีพร้อมไฟ LED WS2812 RGB
Octarine: เกมจับคู่สีพร้อมไฟ LED WS2812 RGB
Octarine: เกมจับคู่สีพร้อมไฟ LED WS2812 RGB

นี่คือโคมไฟอารมณ์ราคาประหยัดที่มีสี่โหมด

1. ประกายรุ้ง ประกายไฟจะเคลื่อนขึ้นด้านบนครั้งแล้วครั้งเล่าและค่อยๆ เปลี่ยนสี

2. เรืองแสงสีรุ้ง เรืองแสงคงที่ซึ่งค่อยๆเปลี่ยนสี

3. การจำลองไฟเทียน

4. ปิด

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

ATtiny13 มีขนาดเล็กแค่ไหน?

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

ความท้าทายที่สุดในโปรเจ็กต์นี้คือการใส่โค้ดทั้งหมดลงใน ATtiny13 ไมโครคอนโทรลเลอร์มีแฟลช 1K ไบต์และ RAM เพียง 64 ไบต์ ใช่ เมื่อฉันพูดว่า "ไบต์" ฉันหมายถึงสิ่งที่ประกอบด้วยแปดบิต 64 ไบต์สำหรับตัวแปรในเครื่องและ call stack ทั้งหมดของคุณ เพื่อให้ชัดเจน พิจารณาว่าเราต้องควบคุมไฟ LED RGB 8 ดวง แต่ละรายการถูกกำหนดโดย 3 ไบต์ (หนึ่งรายการสำหรับช่องสีแดง สีเขียว และสีน้ำเงินตามลำดับ) ดังนั้น เพื่อจัดเก็บสถานะของ LED 8 ดวง เราจำเป็นต้องใช้โครงสร้างอาร์เรย์ 8 โครงสร้าง 3 ไบต์แต่ละอัน และตัวชี้ไปยังจุดเริ่มต้นของอาร์เรย์นี้จะใช้เวลาเพิ่มอีก 1 ไบต์ ดังนั้น 25 จาก 64 ไบต์จึงหมด เราเพิ่งใช้ RAM 39% และยังไม่ได้เริ่มจริงๆ นอกจากนี้ ในการจัดเก็บสีรุ้งพื้นฐานเจ็ดสี คุณจะต้องมี 7×3 = 21 ไบต์ ดังนั้น RAM ถึง 72% จะหมด สำหรับสีพื้นฐาน ฉันพูดเกินจริง: เราไม่ต้องการสีทั้งหมดพร้อมกันใน RAM และสีไม่เคยเปลี่ยน ดังนั้นสีเหล่านี้จึงอาจถูกนำมาใช้เป็นอาร์เรย์คงที่เพื่อเก็บไว้ในแฟลชแทนที่จะเป็น RAM อย่างไรก็ตาม มันให้ความประทับใจโดยรวมเกี่ยวกับฮาร์ดแวร์ที่ใช้

เมื่อนึกถึงคำกล่าวของ Knuth เกี่ยวกับการเพิ่มประสิทธิภาพก่อนกำหนด ฉันเริ่มจากการสร้างต้นแบบโหมดหลอดไฟสามโหมดแยกกันเพื่อดูว่าจะเกิดอะไรขึ้น ฉันได้ทดสอบแยกกันเพื่อให้แน่ใจว่าทำงานได้อย่างถูกต้องและแต่ละอันพอดีกับไมโครคอนโทรลเลอร์ของฉัน ใช้เวลาสองสามเย็นกว่าจะสำเร็จ และทุกอย่างเป็นไปด้วยดี… จนกระทั่งฉันพยายามรวมมันเข้าด้วยกันในคำสั่ง switch ยูทิลิตี้ขนาด avr รายงานขนาดส่วนข้อความ 1.5 Kb (พร้อมแฟล็ก -s ของ avr-gcc) ในขณะนั้นความตั้งใจเดิมของฉันคือการคว้า ATtiny25 ด้วยแฟลช 2Kb และนั่นอาจเป็นจุดจบของเรื่องนี้อย่างมีความสุข

แต่อย่างใดฉันรู้สึกว่าหลังจากการเพิ่มประสิทธิภาพอย่างมากฉันสามารถย่อโค้ดเส็งเคร็งนั้นให้เหลือ 1Kb ได้ อย่างไรก็ตาม มันต้องใช้เวลาอีกหนึ่งสัปดาห์กว่าจะรู้ว่ามันเป็นไปไม่ได้ และอีกหนึ่งสัปดาห์กว่าจะสำเร็จ ฉันต้องตัดรุ้งเป็นสีพื้นฐานห้าสี ฉันกำจัดคำสั่ง case และใช้ chain ของ if-then-if เพื่อลดขนาดโค้ดไบนารี แอนิเมชั่นไฟต้องใช้ตัวสร้างตัวเลขสุ่มปลอมซึ่งค่อนข้างเทอะทะ ดังนั้นฉันจึงใช้ LFSR เวอร์ชันที่เรียบง่ายพร้อมค่าเริ่มต้นคงที่ ฉันไม่สนใจความยาวเต็มรอบของ PRNG และเพียงแค่มองหาความสมดุลระหว่างขนาดโค้ดและ "แอนิเมชั่นไฟที่สมจริง" ฉันยังใช้การเพิ่มประสิทธิภาพเล็กๆ น้อยๆ มากมายที่ฉันจำไม่ได้ในตอนนี้ และยังสามารถแฟลชโหมดทั้งหมดได้ ยกเว้นไฟในชิป เมื่อฉันไม่มีไอเดีย โค้ดทั้งหมดของฉันอยู่ที่ประมาณ 1200 ไบต์

ฉันหมดเวลาและได้อ่านเกี่ยวกับการเพิ่มประสิทธิภาพโค้ด AVR มามากแล้ว ฉันเกือบจะยอมแพ้และเขียนทุกอย่างใหม่ในภาษาแอสเซมบลี แต่ให้โอกาสเป็นครั้งสุดท้าย ในระหว่างการเร่งรีบในการเพิ่มประสิทธิภาพขั้นสุดท้าย ฉันได้ตัดรุ้งเป็นสีพื้นฐานสามสี และทำให้สีอื่นๆ คำนวณได้ทันที ฉันตรวจสอบทุกอย่างและทำตามคำแนะนำในการปรับ AVR ให้เหมาะสม และสุดท้าย…

avrdude: กำลังเขียนแฟลช (1004 ไบต์):

การเขียน | ####################################################### | 100% 0.90s

ไม่จำเป็นต้องบอกว่าฉันใช้ RAM เกือบทั้งหมดและ EEPROM เพียงหนึ่งไบต์ในการจัดเก็บโหมดปัจจุบัน ฉันไม่ได้หมายความว่านี่เป็นการนำไปใช้ในอุดมคติและขั้นสูงสุด มันใช้งานได้และพอดีกับไมโครคอนโทรลเลอร์ ฉันแน่ใจว่าคุณทำได้ดีกว่านี้ ฉันเป็นจริงๆ ฉันแค่ต้องการแบ่งปันความสนุกในการแก้ปัญหาที่ดูเหมือนทำไม่ได้จริง ซึ่งคุณคิดว่าแทบจะเป็นไปไม่ได้เลยในตอนเริ่มต้น “ดังนั้น การแฮ็กหมายถึงการสำรวจขีดจำกัดของสิ่งที่เป็นไปได้…” -Richard Stallman

เสบียง:

1x ATtiny13 MCU (0.28 ดอลลาร์ = 0.24 ดอลลาร์สำหรับ MCU ในแพ็คเกจ SOP-8 และ 0.04 ดอลลาร์สำหรับอะแดปเตอร์ DIP8)

8x WS2812 RGB LEDs (ฉันแนะนำบอร์ดหรือแถบ LED หนึ่งชิ้น) ($0.42)

1x ปุ่มสัมผัส TTP223 (0.10 เหรียญ)

1x Micro USB เข้ากับอะแดปเตอร์ DIP ($ 0.14)

ตัวต้านทาน 1x10kΩ (<$0.01)

ตัวเก็บประจุเซรามิก 1x 100nF (<$0.01)

ตัวเก็บประจุอิเล็กโทรไลต์ 1x 10–47µF (<$0.01)

รวม <$0.97

ขั้นตอนที่ 1: การตั้งค่าซอฟต์แวร์

การติดตั้งซอฟต์แวร์
การติดตั้งซอฟต์แวร์

คุณจะต้องมี avr-gcc toolchain เพื่อคอมไพล์ซอร์สโค้ดและยูทิลิตี้ avrdude สำหรับการอัปโหลด ROM ของไมโครคอนโทรลเลอร์ ขั้นตอนการติดตั้งค่อนข้างง่ายและตรงไปตรงมา แต่ขึ้นอยู่กับระบบปฏิบัติการของคุณ หากคุณใช้ GNU/Linux บางประเภท คุณอาจมีแพ็คเกจที่เหมาะสมอยู่แล้วในแผนผังที่เก็บของคุณ ซอร์สโค้ดของโครงการนี้สามารถดาวน์โหลดได้ที่นี่:

github.com/arduinocelentano/t13_ws2812_lamp

คุณจะต้องมีไลบรารี light_ws2812 ด้วย:

github.com/cpldcpu/light_ws2812

เมื่อคุณมี avr-gcc toolchain และแหล่งที่มาของโปรเจ็กต์แล้ว ให้รันเทอร์มินัลแล้วพิมพ์โค้ดต่อไปนี้:

เส้นทาง cd/to/project

ทำ

ขั้นตอนที่ 2: การเขียนโปรแกรมไมโครคอนโทรลเลอร์

การเขียนโปรแกรมไมโครคอนโทรลเลอร์
การเขียนโปรแกรมไมโครคอนโทรลเลอร์
การเขียนโปรแกรมไมโครคอนโทรลเลอร์
การเขียนโปรแกรมไมโครคอนโทรลเลอร์
การเขียนโปรแกรมไมโครคอนโทรลเลอร์
การเขียนโปรแกรมไมโครคอนโทรลเลอร์

หากคุณมีโปรแกรมเมอร์ USBASP เพียงเชื่อมต่อกับ Attiny ตาม pinout โดยปกติแล้วจะมีลักษณะเช่นนี้ แต่ฉันขอแนะนำอย่างยิ่งให้ตรวจสอบพินเอาต์จริงของคุณ!

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

ตอนนี้วิ่ง

ทำแฟลช

เพื่อแฟลช MCU และ

ทำฟิวส์

เพื่อตั้งค่าบิตฟิวส์

ขั้นตอนที่ 3: แผนผัง

แนะนำ: