Mục lục:

Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812: 7 bước
Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812: 7 bước

Video: Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812: 7 bước

Video: Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812: 7 bước
Video: DIY LED Car Door Welcome and Safety Animation Light | Arduino | WS2812B Pixel LED 2024, Tháng mười hai
Anonim
Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812
Một đèn LED tâm trạng $ 1 với ATtiny13 và WS2812

Bởi arduinocelentano

Máy chủ CalDAV cá nhân trên máy tính một bo mạch
Máy chủ CalDAV cá nhân trên máy tính một bo mạch
Máy chủ CalDAV cá nhân trên máy tính một bo mạch
Máy chủ CalDAV cá nhân trên máy tính một bo mạch
LCD Invaders: Trò chơi giống như những kẻ xâm lược không gian trên Màn hình ký tự LCD 16x2
LCD Invaders: Trò chơi giống như những kẻ xâm lược không gian trên Màn hình ký tự LCD 16x2
LCD Invaders: Trò chơi giống như những kẻ xâm lược không gian trên Màn hình ký tự LCD 16x2
LCD Invaders: Trò chơi giống như những kẻ xâm lược không gian trên Màn hình ký tự LCD 16x2
Octarine: Trò chơi so khớp màu với đèn LED RGB WS2812
Octarine: Trò chơi so khớp màu với đèn LED RGB WS2812
Octarine: Trò chơi so khớp màu với đèn LED RGB WS2812
Octarine: Trò chơi so khớp màu với đèn LED RGB WS2812

Đây là loại đèn tâm trạng giá rẻ với bốn chế độ.

1. Tia lửa cầu vồng. Một tia sáng chuyển động lên trên hết lần này đến lần khác và đổi màu dần dần.

2. Cầu vồng phát sáng. Ánh sáng ổn định thay đổi dần màu sắc.

3. Mô phỏng ngọn lửa nến.

4. Tắt.

Bạn có thể chuyển đổi các chế độ bằng cách nhấn vào một nút cảm ứng ở trên cùng. Chế độ hiện tại được lưu trong bộ nhớ EEPROM sau khi tắt nguồn.

ATtiny13 nhỏ như thế nào?

Ý tưởng là để có được các tính năng tối đa từ phần cứng tối thiểu, một thứ phức tạp hơn công tắc hoặc nhiệt kế tự động, một dự án gần với bộ vi điều khiển nhỏ bé này. Rốt cuộc, những hạn chế khiến bạn suy nghĩ sáng tạo, phải không? Chà, nó giống như lúc ban đầu.

Thử thách nhất trong dự án này là nhập tất cả mã vào ATtiny13. Bộ vi điều khiển có flash 1K byte và RAM chỉ 64 byte. Có, khi tôi nói "byte", tôi muốn nói đến những thứ bao gồm tám bit. 64 byte cho tất cả các biến cục bộ của bạn và ngăn xếp cuộc gọi. Để làm rõ hơn, hãy xem xét chúng ta phải điều khiển 8 đèn LED RGB. Mỗi người trong số họ được xác định bởi 3 byte (một cho kênh đỏ, xanh lá cây và xanh lam tương ứng). Vì vậy, chỉ để lưu trữ trạng thái của 8 đèn LED, chúng ta sẽ cần triển khai một mảng 8 cấu trúc, mỗi cấu trúc 3 byte và một con trỏ đến đầu mảng này sẽ mất thêm một byte. Như vậy, 25 trong số 64 byte đã hết. Chúng tôi mới chỉ sử dụng 39% RAM và vẫn chưa thực sự bắt đầu. Ngoài ra, để lưu trữ bảy màu cầu vồng cơ bản, bạn sẽ cần 7 × 3 = 21 byte, do đó, 72% RAM đã hết. Đối với các màu cơ bản, tôi cường điệu: chúng ta không cần tất cả chúng cùng một lúc trong RAM và chúng không bao giờ thay đổi, vì vậy chúng có thể được triển khai dưới dạng một mảng không đổi được lưu trữ trong flash thay vì RAM. Dù sao, nó mang lại một ấn tượng tổng thể về phần cứng đã qua sử dụng.

Nhớ lại tuyên bố của Knuth về tối ưu hóa sớm, tôi bắt đầu từ việc tạo mẫu riêng biệt ba chế độ đèn để xem điều gì sẽ xảy ra. Tôi đã kiểm tra chúng riêng biệt để đảm bảo chúng hoạt động bình thường và mỗi cái phù hợp với bộ vi điều khiển của tôi. Phải mất một vài buổi tối để hoàn thành nó và mọi thứ diễn ra tốt đẹp… cho đến khi tôi cố gắng kết hợp chúng lại với nhau bên trong câu lệnh switch. tiện ích avr-size đã báo cáo kích thước phần văn bản 1,5 Kb (với cờ -s của avr-gcc). Tại thời điểm đó, ý định ban đầu của tôi là lấy một số ATtiny25 với flash 2Kb và đó có thể là kết thúc có hậu của câu chuyện này.

Nhưng bằng cách nào đó, tôi cảm thấy rằng sau khi tối ưu hóa đáng kể, tôi có thể xoay sở để thu nhỏ đoạn mã tồi tệ đó thành 1Kb. Tuy nhiên, phải mất thêm một tuần để nhận ra rằng điều đó là không thể và dù sao cũng phải mất thêm một tuần nữa để hoàn thành. Tôi đã phải cắt cầu vồng thành năm màu cơ bản (không có sự khác biệt đáng kể về mặt hình ảnh). Tôi đã loại bỏ các câu lệnh trường hợp và sử dụng một chuỗi if-then-if để giảm kích thước mã nhị phân. Hoạt ảnh lửa cần một trình tạo số giả ngẫu nhiên khá cồng kềnh, vì vậy tôi đã triển khai phiên bản đơn giản hóa của LFSR với giá trị ban đầu không đổi. Tôi không quan tâm đến độ dài chu kỳ đầy đủ của PRNG và chỉ tìm kiếm sự cân bằng giữa kích thước mã và “hoạt ảnh cháy thực tế”. Tôi cũng đã triển khai rất nhiều tối ưu hóa nhỏ mà tôi không thể nhớ ngay bây giờ và thậm chí đã quản lý để cài đặt tất cả các chế độ ngoại trừ lửa vào chip. Khi tôi hết ý tưởng, tổng số mã của tôi là khoảng 1200 byte.

Tôi đã mất thời gian chờ và đã đọc rất nhiều về cách tối ưu hóa mã AVR. Tôi đã gần từ bỏ và viết lại mọi thứ bằng hợp ngữ nhưng đã cho nó cơ hội cuối cùng. Trong thời gian gấp rút tối ưu hóa cuối cùng, tôi đã cắt cầu vồng thành ba màu cơ bản và làm cho những màu khác được tính toán nhanh chóng, tôi kiểm tra mọi thứ và làm theo các đề xuất tối ưu hóa AVR và cuối cùng…

avrdude: ghi flash (1004 byte):

Viết lách | ##################################################### | 100% 0,90 giây

Không cần phải nói rằng tôi đã sử dụng gần như tất cả RAM và chỉ một byte EEPROM để lưu trữ chế độ hiện tại. Tôi không ngụ ý rằng đây là một cách thực hiện lý tưởng và cuối cùng. Nó chỉ hoạt động và phù hợp với vi điều khiển. Tôi chắc chắn, bạn có thể làm điều đó tốt hơn. Tôi thực sự là như vậy. Tôi chỉ muốn chia sẻ niềm vui khi giải quyết một vấn đề dường như không thực tế mà bạn cho là gần như không thể ngay từ đầu. “Vì vậy, hack có nghĩa là khám phá giới hạn của những gì có thể…” --Richard Stallman.

Quân nhu:

1x ATtiny13 MCU ($ 0,28 = $ 0,24 cho MCU trong gói SOP-8 và $ 0,04 cho Bộ điều hợp DIP8)

8x WS2812 đèn LED RGB (Tôi khuyên bạn nên dùng bảng hoặc một miếng LED sọc) ($ 0,42)

1x nút cảm ứng TTP223 ($ 0,10)

1x Bộ chuyển đổi Micro USB sang DIP ($ 0,14)

1x điện trở 10kΩ (<0,01 đô la)

Tụ gốm 1x 100nF (<0,01 đô la)

Tụ điện 1x 10–47µF (<0,01 đô la)

Tổng <$ 0,97

Bước 1: Thiết lập phần mềm

Thiết lập phần mềm
Thiết lập phần mềm

Bạn sẽ cần chuỗi công cụ avr-gcc để biên dịch mã nguồn và tiện ích avrdude để tải lên ROM của vi điều khiển. Quá trình cài đặt khá đơn giản và dễ hiểu, nhưng nó phụ thuộc vào hệ điều hành của bạn. Nếu bạn sử dụng một số loại GNU / Linux, có thể bạn đã có các gói thích hợp trong cây kho lưu trữ của mình. Mã nguồn của dự án này có thể được tải xuống tại đây:

github.com/arduinocelentano/t13_ws2812_lamp

Bạn cũng sẽ cần một thư viện light_ws2812:

github.com/cpldcpu/light_ws2812

Khi bạn đã có chuỗi công cụ avr-gcc và các nguồn dự án, hãy chạy thiết bị đầu cuối của bạn và nhập mã sau:

đường dẫn cd / đến / dự án

chế tạo

Bước 2: Lập trình vi điều khiển

Lập trình vi điều khiển
Lập trình vi điều khiển
Lập trình vi điều khiển
Lập trình vi điều khiển
Lập trình vi điều khiển
Lập trình vi điều khiển

Nếu bạn có một số loại lập trình USBASP, chỉ cần kết nối nó với Attiny theo sơ đồ chân của nó. Thông thường nó sẽ trông như thế này nhưng tôi thực sự khuyên bạn nên kiểm tra sơ đồ chân thực của mình!

Ngoài ra, bạn có thể sử dụng bảng Arduino làm lập trình viên. Mở Arduino IDE và tìm ví dụ về Arduino ISP trong menu “Tệp → Ví dụ”. Sau khi tải lên bản phác thảo, bảng Arduino của bạn hoạt động như một lập trình viên. Các nhận xét trong mã phác thảo sẽ cung cấp cho bạn manh mối về sơ đồ chân.

Bây giờ chạy

làm đèn flash

để flash MCU và

làm cầu chì

để thiết lập các bit cầu chì.

Bước 3: Sơ đồ

Đề xuất: