สารบัญ:

กระพริบตา ร้องเพลง Marioman 5 ขั้นตอน
กระพริบตา ร้องเพลง Marioman 5 ขั้นตอน

วีดีโอ: กระพริบตา ร้องเพลง Marioman 5 ขั้นตอน

วีดีโอ: กระพริบตา ร้องเพลง Marioman 5 ขั้นตอน
วีดีโอ: พริบตา - BIRD THONGCHAI X STAMP【OFFICIAL LYRIC VIDEO】 2024, พฤศจิกายน
Anonim
กระพริบตา ร้องเพลง Marioman
กระพริบตา ร้องเพลง Marioman

ใช้ attiny13a ไฟ LED สองดวง และลำโพงการ์ดอวยพรเพื่อสร้าง Marioman ที่กะพริบและเล่นเพลงธีม Super Mario Brothers นี่อาจเป็นโครงการราคาประหยัดที่ง่ายสำหรับทุกคนที่กำลังมองหาวิธีสนุก ๆ ในการเจาะเข้าสู่การเขียนโปรแกรม AVR! โน้ตของเพลงถูกสร้างขึ้นโดยคลื่นสี่เหลี่ยมที่ส่งออกบนขาเดียวของไมโครคอนโทรลเลอร์ AVR ไฟ LED ที่สลับกันในแต่ละโน้ตจะเชื่อมต่อกับ 2 พินของชิปตัวเดียวกัน

ขั้นตอนที่ 1: วัสดุและการก่อสร้าง

วัสดุและการก่อสร้าง
วัสดุและการก่อสร้าง

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3dCost: $1.40

  • ไฟ LED 2 ดวง - ไฟ LED ใด ๆ จะทำ
  • แบตเตอรี่ลิเธียมแบบเหรียญ 1 ก้อน

www.sparkfun.com/commerce/product_info.php?products_id=338ค่าใช้จ่าย: $2.00

ที่ใส่เหรียญ 1 อัน

www.sparkfun.com/commerce/product_info.php?products_id=8822ต้นทุน: $1.25

1 ลำโพงขนาดเล็กจากการ์ดอวยพรดนตรี

ต้นทุนรวมของวัสดุ ~ $5ไฟ LED สองดวงถูกต่อเข้ากับหมุดสองตัวของ attiny13A แต่ละตัวโดยตรง LED แต่ละตัวใช้พินสองตัว พินที่สองถูกตั้งค่าให้ต่ำเพื่อใช้เป็นการเชื่อมต่อกราวด์ ขีดจำกัดปัจจุบันของพิน I/O บน AVR จะป้องกันไม่ให้ไฟ LED ดึงมากเกินไป ดังนั้นจึงไม่จำเป็นต้องเชื่อมต่อตัวต้านทาน ซีรีส์ ลำโพงที่ใช้เป็นเรื่องปกติของหนึ่งในการ์ดอวยพรดนตรี ลำโพงขนาดเล็กใดๆ ก็ตาม เนื่องจากเป็นเอาต์พุตเสียงคลื่นสี่เหลี่ยม ไม่ต้องกังวลเกี่ยวกับการขับรถของลำโพงหรือคุณภาพเสียงมากนัก

ขั้นตอนที่ 2: บัดกรี AVR กับ LED และลำโพง

บัดกรี AVR กับ LED และลำโพง
บัดกรี AVR กับ LED และลำโพง
บัดกรี AVR กับ LED และลำโพง
บัดกรี AVR กับ LED และลำโพง

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

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

การเขียนโปรแกรม Attiny13a
การเขียนโปรแกรม Attiny13a

มีตัวเลือกมากมายสำหรับการเขียนโปรแกรม AVR สำหรับโครงการนี้ USBtiny ถูกใช้ซึ่งมีให้ใช้งานเป็นชุดจากไซต์ของ ladyadahttps://www.ladyada.net/make/usbtinyisp/index.htmlในการเชื่อมต่อ AVR กับโปรแกรมเมอร์ คุณสามารถ ต่อสายไฟเข้ากับเต้ารับตัวเมียแล้วเสียบเข้ากับเขียงหั่นขนมหรือควรซื้ออะแดปเตอร์เขียนโปรแกรม AVR ราคาถูกแบบนี้.

ขั้นตอนที่ 4: การสร้างเฟิร์มแวร์สำหรับ Marioman

การสร้างเฟิร์มแวร์สำหรับ Marioman
การสร้างเฟิร์มแวร์สำหรับ Marioman

attiny13A มีแฟลชที่ตั้งโปรแกรมได้ 1K และ SRAM ขนาด 64 ไบต์ ไฟล์ tar ที่แนบมามีไฟล์ต้นฉบับรวมถึงเฟิร์มแวร์ที่คอมไพล์สำหรับการดาวน์โหลด อาร์เรย์สามอาร์เรย์ในรหัส c ถูกใช้เพื่อสร้างเพลง

  • freq - ความถี่ของโน้ตแต่ละตัว
  • length - ความยาวของแต่ละโน้ต
  • ล่าช้า - หยุดชั่วคราวระหว่างโน้ตแต่ละตัว

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

  • attiny13A มีออสซิลเลเตอร์ภายในตั้งไว้ที่ 9.6MHz
  • นาฬิกาภายในสำหรับ IO คือออสซิลเลเตอร์หารด้วย 8 หรือ 1.2MHz
  • ตัวจับเวลาภายในถูกตั้งค่าในการลงทะเบียน 8 บิตเพื่อนับรอบนาฬิกาทุกรอบด้วยพรีสเกล 8
  • ส่งผลให้หนึ่งขีดเท่ากับ 1 / (1.2MHz / 8) =.006667ms
  • attiny13A ได้รับการกำหนดค่าเพื่อเปรียบเทียบสิ่งที่อยู่ในรีจิสเตอร์ 8 บิต TCCR0B กับตัวจับเวลาและสลับพินเมื่อจับคู่
  • ตัวอย่างเช่น เพื่อสร้างคลื่นสี่เหลี่ยมที่ 524Hz (หนึ่งอ็อกเทฟเหนือ C กลาง) ซึ่งมีคาบ 1.908ms

1.908ms = 286 นาฬิกาติ๊ก (1.908/.0067) หาร 286 ด้วย 2 เพื่อสลับพินที่ t/2 (286/2 = 143) ใส่ 143 ในการลงทะเบียน TTCR0B เพื่อสร้างบันทึกย่อนี้ นี่คือรหัสทั้งหมดที่จำเป็น ในการตั้งค่าตัวจับเวลา ให้เปรียบเทียบและส่งออกคลื่นสี่เหลี่ยม:

TCCR0A |= (1<<WGM01); // กำหนดค่าตัวจับเวลา 1 สำหรับโหมด CTC TCCR0A |= (1<<COM0A0); // สลับ OC0A เมื่อเปรียบเทียบการแข่งขัน TCCR0B |= (1<<CS01); // clk/8 พรีสเกล TTCR0B = 143; // สร้างคลื่นสี่เหลี่ยมที่ 524Hzในการหน่วงเวลาเสียงและการหยุดชั่วคราวระหว่างกัน มีการใช้ฟังก์ชันหน่วงเวลาอย่างง่าย

โมฆะสลีป (int ms) { int cnt; สำหรับ (cnt=0; cnt<(ms); cnt++) { int i = 150; ในขณะที่ (i--) { _asm ("NOP"); } }}นับถอยหลังจาก 150 โดยที่แต่ละรอบ NOP จะอยู่ที่ประมาณ.006667 มิลลิวินาที สิ่งสุดท้ายที่โค้ดทำคือวนซ้ำในอาร์เรย์ สร้างเพลง และกะพริบไฟ LED สองดวง การดำเนินการนี้ทำแบบวนซ้ำต่อเนื่องกันโดยใช้โค้ดต่อไปนี้

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); สลีป(pgm_read_byte(&ความยาว[cnt])); output_toggle(PORTB, PB3); output_toggle(PORTB, PB4); // หยุดจับเวลา TCCR0B = 0; สลีป (pgm_read_word(&delay[cnt])); // เริ่มจับเวลา TCCR0B |= (1<<CS01); // clk/8 พรีสเกล }}มี 156 องค์ประกอบในอาร์เรย์ความถี่/ความยาว/การหน่วงเวลา ลูปนี้จะข้ามผ่านพวกมัน พิน PB3 และ PB4 ถูกสลับกันดังนั้นพวกเขาจะสลับกับโน้ตแต่ละตัว การนอนหลับครั้งแรกคือความยาวของโน้ตที่เราเล่นหลังจากตั้งค่าการลงทะเบียน OCR0A เป็นค่าที่เหมาะสม การนอนหลับครั้งที่สองเป็นการหยุดชั่วคราวระหว่างโน้ตที่เราเล่น ในโค้ดด้านบน คุณอาจสังเกตเห็นสองฟังก์ชัน pgm_read_byte() และ pgm_read_word() รวมถึงคีย์เวิร์ด PROGMEM ด้วยชิปฝังตัวเช่น attiny จำนวน SRAM นั้นจำกัดมาก ในกรณีนี้มีเพียง 64 ไบต์เท่านั้น อาร์เรย์ที่เราใช้สำหรับข้อมูลความถี่/ความล่าช้า/ความยาวทั้งหมดมีขนาดใหญ่กว่า 64 ไบต์มาก ดังนั้นจึงไม่สามารถโหลดลงในหน่วยความจำได้ โดยการใช้คำสั่งพิเศษ PROGMEM avr-gcc อาร์เรย์ข้อมูลขนาดใหญ่เหล่านี้จะป้องกันไม่ให้โหลดเข้าสู่หน่วยความจำ แต่จะอ่านจากแฟลชแทน

ขั้นตอนที่ 5: ปล่อยให้ Marioman Loose

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

แนะนำ: