Mục lục:

Chớp mắt, Hát, Marioman: 5 bước
Chớp mắt, Hát, Marioman: 5 bước

Video: Chớp mắt, Hát, Marioman: 5 bước

Video: Chớp mắt, Hát, Marioman: 5 bước
Video: Hướng Dẫn Bài MẮT NAI CHA CHA CHA / LINE DANCE / Leo( Bài Khớp Nhạc BẤM 🔽 ) 2024, Tháng mười một
Anonim
Chớp mắt, Ca hát, Marioman
Chớp mắt, Ca hát, Marioman

Sử dụng một attiny13a, hai đèn LED và một loa thiệp chúc mừng để tạo ra một Marioman nhấp nháy phát bài hát chủ đề của Super Mario Brothers. các nốt của bài hát được tạo ra bởi một sóng vuông phát ra trên một chân duy nhất của vi điều khiển AVR. Các đèn LED xen kẽ trên mỗi nốt nhạc được kết nối với 2 chân của mỗi con chip giống nhau.

Bước 1: Vật liệu và kết cấu

Vật liệu và kết cấu
Vật liệu và kết cấu

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3dChi phí: $ 1,40

  • 2 đèn LED - bất kỳ đèn LED nào sẽ làm được
  • 1 pin di động đồng xu lithium

www.sparkfun.com/commerce/product_info.php?products_id=338Chi phí: $ 2,00

1 ngăn đựng ô đồng xu

www.sparkfun.com/commerce/product_info.php?products_id=8822Chi phí: $ 1,25

1 loa nhỏ từ thiệp chúc mừng âm nhạc

Tổng chi phí vật liệu ~ $ 5 Hai đèn LED được gắn trực tiếp vào hai chân của mỗi attiny13A. Hai chân được sử dụng cho mỗi đèn LED, chân thứ hai được đặt ở mức thấp để sử dụng như một kết nối đất. Dòng loa được sử dụng là điển hình của một loại được tìm thấy trong thiệp chúc mừng âm nhạc, bất kỳ loa nhỏ nào cũng vậy, với điều kiện là loa này đang phát ra âm sóng vuông, không quá quan trọng phải lo lắng về việc điều khiển loa hay chất lượng âm thanh.

Bước 2: Hàn AVR với đèn LED và loa

Hàn AVR với đèn LED và loa
Hàn AVR với đèn LED và loa
Hàn AVR với đèn LED và loa
Hàn AVR với đèn LED và loa

Để các đèn LED vươn ra ngoài giống như các cánh tay, một chân được uốn cong trên AVR mỗi bên. Định hướng AVR theo cách này giúp bạn dễ dàng kết nối với loa (hình ảnh thứ hai) vì các kết nối nằm ở hai chân phía dưới. nó được gắn.

Bước 3: Lập trình Attiny13a

Lập trình Attiny13a
Lập trình Attiny13a

Có rất nhiều tùy chọn khác nhau để lập trình AVR. Đối với dự án này, USBtiny đã được sử dụng, có sẵn như một bộ công cụ từ trang web của ladyadahttps://www.ladyada.net/make/usbtinyisp/index.htmlĐể kết nối AVR với lập trình viên, bạn có thể hoặc gắn dây vào ổ cắm cái và cắm chúng vào breadboard hoặc tốt hơn là có được một bộ điều hợp lập trình AVR giá rẻ như thế này..

Bước 4: Tạo Firmware cho Marioman

Tạo chương trình cơ sở cho Marioman
Tạo chương trình cơ sở cho Marioman

Attiny13A có 1K flash có thể lập trình và 64byte SRAM. Tệp tar đính kèm có tệp nguồn cũng như phần sụn đã biên dịch để tải xuống. 3 mảng trong mã c được sử dụng để tạo nhạc

  • freq - tần số của mỗi nốt nhạc
  • length - độ dài của mỗi ghi chú
  • delay - tạm dừng giữa mỗi nốt nhạc

Mảng tần số không có tần số thực tế mà là giá trị để đưa vào thanh ghi TTCROB để tạo ra sóng vuông từ chân PB0. Dưới đây là tóm tắt ngắn gọn về các tính toán và cấu hình chân để tạo sóng vuông:

  • Attiny13A có bộ dao động bên trong được đặt thành 9,6MHz
  • Đồng hồ bên trong cho IO là bộ dao động chia cho 8 hoặc 1,2MHz
  • Một bộ đếm thời gian bên trong được thiết lập trong một thanh ghi 8 bit để đếm lên mỗi chu kỳ đồng hồ với tỷ lệ đặt trước là 8.
  • Điều này dẫn đến một tích tắc bằng 1 / (1,2MHz / 8) = 0,006667ms
  • Attiny13A được cấu hình để so sánh những gì có trong thanh ghi TCCR0B 8bit với bộ đếm thời gian và chuyển đổi một chân khi chúng khớp với nhau.
  • Ví dụ, để tạo ra một sóng vuông ở tần số 524Hz (một quãng tám trên giữa C) có chu kỳ là 1,908ms.

1.908ms = 286 tích tắc đồng hồ (1.908 /.0067) Chia 286 cho 2 để chuyển đổi chân ở t / 2 (286/2 = 143) Đặt 143 vào thanh ghi TTCR0B để tạo ghi chú này. Đây là tất cả mã cần thiết để thiết lập bộ đếm thời gian, hãy thực hiện so sánh và xuất ra một làn sóng vuông:

TCCR0A | = (1 << WGM01); // cấu hình bộ định thời 1 cho chế độ CTC TCCR0A | = (1 << COM0A0); // chuyển đổi OC0A khi so sánh đối sánh TCCR0B | = (1 << CS01); // clk / 8 tỷ lệ đặt trước TTCR0B = 143; // tạo ra một sóng vuông ở tần số 524HzĐể trì hoãn các âm báo và thời gian tạm dừng giữa chúng, một chức năng trì hoãn đơn giản đã được sử dụng

void sleep (int ms) {int cnt; for (cnt = 0; cnt <(ms); cnt ++) {int i = 150; while (i--) {_asm ("NOP"); }}}Điều này đếm ngược từ 150 trong đó mỗi chu kỳ NOP xấp xỉ 0,006667ms. Điều cuối cùng mã làm là lặp qua các mảng, tạo nhạc và nhấp nháy hai đèn LED. Điều này được thực hiện trong một vòng lặp liên tục với đoạn mã sau

const uint8_t freq PROGMEM = {… data}; const uint8_t length PROGMEM = {… data}; const uint8_t delay PROGMEM = {… data};… while (1) {for (cnt = 0; cnt < 156; cnt ++) {OCR0A = pgm_read_byte (& freq [cnt]); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); ngủ (pgm_read_byte (& length [cnt])); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // bộ định thời dừng TCCR0B = 0; sleep (pgm_read_word (& delay [cnt])); // khởi động bộ định thời TCCR0B | = (1 << CS01); // clk / 8 prescale}}Có 156 phần tử trong mảng tần số / độ dài / độ trễ, vòng lặp này đi qua chúng. Pin PB3 và PB4 đều được bật tắt vì vậy chúng sẽ luân phiên theo từng nốt. Giấc ngủ đầu tiên là độ dài của nốt chúng ta chơi sau khi đặt thanh ghi OCR0A thành giá trị thích hợp. Giấc ngủ thứ hai là khoảng dừng giữa các nốt nhạc mà chúng ta chơi. Trong đoạn mã trên, bạn có thể nhận thấy hai hàm pgm_read_byte () và pgm_read_word () cũng như từ khóa PROGMEM. Với một chip nhúng như attiny, số lượng SRAM rất hạn chế, trong trường hợp này chỉ là 64byte. Các mảng chúng tôi đang sử dụng cho tất cả dữ liệu tần số / độ trễ / độ dài lớn hơn nhiều so với 64byte và do đó không thể tải vào bộ nhớ. Bằng cách sử dụng chỉ thị PROGMEM avr-gcc đặc biệt, các mảng dữ liệu lớn này bị ngăn tải vào bộ nhớ, thay vào đó chúng được đọc từ flash.

Bước 5: Thả lỏng Marioman

Đoạn video trên cho thấy Marioman đang hoạt động. Mức tiêu thụ điện năng trung bình khoảng 25mA nên anh ta có thể nhấp nháy và tạo ra tiếng ồn trong khoảng 10 giờ trước khi tháo pin đồng xu lithium. rất thích hợp cho việc này. Một công tắc có thể được thêm vào nhưng có điều gì đó cần được nói để giữ cho nó đơn giản.

Đề xuất: