สารบัญ:
- ขั้นตอนที่ 1: ปัญหา
- ขั้นตอนที่ 2: บริบทโครงการ
- ขั้นตอนที่ 3: ชิ้นส่วน / เครื่องมือที่จำเป็น
- ขั้นตอนที่ 4: กลยุทธ์ทางเทคนิค
- ขั้นตอนที่ 5: รหัส
- ขั้นตอนที่ 6: วิดีโอ
วีดีโอ: NeckCrusher (แป้นเหยียบกีต้าร์): 6 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
Dale Rosen, Carlos Reyes และ Rob Koch
DATT 2000
ขั้นตอนที่ 1: ปัญหา
แป้นเหยียบกีต้าร์จำกัดนักดนตรีไว้ที่แท่นเหยียบ วิธีแก้ไข: สร้างและฝังฟังก์ชันแป้นเหยียบกีตาร์ลงในตัวกีตาร์เอง วิธีนี้ทำให้นักดนตรีสามารถเคลื่อนที่ข้ามเวทีได้อย่างอิสระ โดยใช้คอกีตาร์เป็นอินเทอร์เฟซแทนที่จะจำกัดอยู่ที่ตำแหน่งของแป้นเหยียบ เราจะสำรวจแนวคิดนี้โดยการสร้างอุปกรณ์เอฟเฟกต์อัตราบิตบด/ตัวอย่าง
ขั้นตอนที่ 2: บริบทโครงการ
มีแป้นเหยียบกีตาร์จำนวนมากที่นักดนตรีใช้เพื่อปรับแต่งเสียงกีตาร์ของพวกเขา สิ่งเหล่านี้ส่วนใหญ่มักจะอยู่ในยูนิตแบบแร็คหรือสต็อมป์บ็อกซ์ ดังนั้นจึงจำกัดการควบคุมเอฟเฟกต์ไปยังตำแหน่งของยูนิตเอฟเฟกต์ การติดตั้งอุปกรณ์บนกีตาร์ทำให้ผู้เล่นสามารถควบคุมพารามิเตอร์ของเอฟเฟกต์ที่ใดก็ได้บนเวที ซึ่งหมายความว่าพวกเขาจะไม่ถูกจำกัดและมีอิสระที่จะเคลื่อนไหวเพื่อการแสดงของพวกเขา
เนื่องจาก Arduino มีความสามารถด้านเสียง 8 บิตเท่านั้น จึงเป็นไปไม่ได้ที่จะทำการประมวลผลสัญญาณที่มีความเที่ยงตรงสูง นี่คือเหตุผลที่เราเลือกเอฟเฟกต์ที่เราทำ เนื่องจากสร้างเสียงที่มีความเที่ยงตรงต่ำและบิดเบี้ยว นี่เป็นเอฟเฟกต์เดียวที่เป็นไปได้กับ Arduino
ขั้นตอนที่ 3: ชิ้นส่วน / เครื่องมือที่จำเป็น
● สว่านกระแทก
● เครื่องตัดลวด
● เครื่องปอกสายไฟ
● หัวแร้ง
● ปืนกาวร้อน
● ปั๊มหลอมละลาย
● กีตาร์● สิ่งที่ส่งมาด้วย
● ประสาน
● กาวร้อน
● Arduino
● โปรโตบอร์ด
● ลวดเคลือบ
● แจ็คเสียง (x2)
● โพเทนชิโอมิเตอร์ (x3)
● ตัวเก็บประจุ: 2.2 ยูเอฟ (x2)
● ลวดทองแดงสัมผัส
● สกรู (M3.5 *8)
● ตัวต้านทาน: 1 k, 10 k, 1.2 k, 1.5 k, 390 k
● * ออปแอมป์ (LM358) / * ทรานซิสเตอร์ (2N3442)
ขั้นตอนที่ 4: กลยุทธ์ทางเทคนิค
วงจรภายใน
อินพุต/เอาต์พุต
เราจำเป็นต้องแปลงสัญญาณเสียงที่มาจากกีตาร์เป็นสิ่งที่ Arduino สามารถใช้และแก้ไขได้ จากนั้นเราจะต้องแปลงสัญญาณที่มาจาก Arduino กลับเป็นสัญญาณเสียง Arduino อ่านแรงดันไฟฟ้าตั้งแต่ 0V ถึง 5V สัญญาณเสียงอยู่ระหว่าง -1V ถึง 1V การแปลงเหล่านี้ทำได้โดยใช้ตัวต้านทาน สัญญาณจะถูกแปลงในวงจรเอาท์พุตเช่นกัน
ห้องสมุด Arduino: ArduinoDSP
รายละเอียดโครงการ (ส่วนต่อประสาน)
ปุ่มลูกบิด 1: อัตราการสุ่มตัวอย่าง
ลูกบิด 2: Bit Crusher
ลูกบิด 3: ตัวเปลี่ยนบิต
ขั้นตอนที่ 5: รหัส
#รวม "dsp.h"
#define cbi(sfr บิต) (_SFR_BYTE(sfr) &= ~_BV(บิต)) #define sbi(sfr บิต) (_SFR_BYTE(sfr) |= _BV(บิต))
บูลีน div32; บูลีน div16;
f_sample บูลีนที่ระเหยได้; ไบต์ระเหย badc0; ไบต์ระเหย badc1; ไบต์ที่ระเหยได้ ibb;
int fx1; int fx2; int fx3; int fx4;
int cnta; int icnt; int icnt1; int icnt2; int cnt2; int iw; int iw1; int iw2; ไบต์ bb;
ไบต์ dd[512]; // Audio Memory Array 8-Bit
การตั้งค่าเป็นโมฆะ () { setupIO ();
// รีโหลดเวฟหลังจาก 1 วินาที fill_sinewave();
// ตั้งค่า adc prescaler เป็น 64 สำหรับความถี่สุ่มตัวอย่าง 19kHz cbi (ADCSRA, ADPS2); sbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); // 8-Bit ADC ใน ADCH Register sbi (ADMUX, ADLAR); sbi(ADMUX, REFS0); cbi (ADMUX, REFS1); cbi(ADMUX, MUX0); cbi(ADMUX, MUX1); cbi(ADMUX, MUX2); cbi (ADMUX, MUX3); // Timer2 PWM Mode ตั้งค่าเป็น PWM cbi แบบเร็ว (TCCR2A, COM2A0); sbi (TCCR2A, COM2A1); sbi (TCCR2A, WGM20); sbi (TCCR2A, WGM21); //การตั้งค่าสำหรับ Timer2 cbi (TCCR2B, WGM22); // Timer2 Clock Prescaler ถึง: 1 sbi (TCCR2B, CS20); ซีบีไอ (TCCR2B, CS21); ซีบีไอ (TCCR2B, CS22); // Timer2 พอร์ต PWM เปิดใช้งาน sbi (DDRB, 3); //คลิ(); cbi (TIMSK0, TOIE0); sbi (TIMSK2, TOIE2); iw1 = badc1;
}
วงเป็นโมฆะ () {
// ตรวจสอบสถานะของโพเทนชิออมิเตอร์เอฟเฟกต์และสวิตช์โรตารี่ readKnobs();
// ************* // ***ปกติ*** // *************
ถ้า (fx1 == 0 && fx2 == 0 && fx3 == 0 && fx4 == 0) { ไบต์อินพุต = analogRead (ซ้าย); เอาต์พุต (ซ้าย, อินพุต); }
// ************* // ***เฟสเซอร์*** // *************
ถ้า (fx4 > 100) {
fx1 = 0; fx2 = 0; fx3 = 0;
ในขณะที่ (!f_sample) { // รอค่าตัวอย่างจาก ADC } // รอบ 15625 KHz = 64uSec PORTD = PORTD | 128; f_sample = เท็จ; bb = badc1; dd[icnt1] = bb; // เขียนไปยังบัฟเฟอร์ fx4 = iw * badc0 / 255; // สเกลตัวอย่างล่าช้าด้วยโพเทนชิออมิเตอร์ iw1 = dd[icnt2]; // อ่านบัฟเฟอร์ล่าช้า badc0 = badc0 / 20; // จำกัดค่าไว้ที่ 512 icnt1++; icnt2 = icnt1 - badc0; icnt2 = icnt2 & 511; // จำกัดดัชนี 0.. icnt1 = icnt1 & 511; // จำกัดดัชนี 0..511 iw2 = iw1 + bb; iw2 = iw2 / 2; bb = iw2; OCR2A = บีบี; // ค่าตัวอย่างเป็นเอาต์พุต PWM
PORTD = PORTD ^ 128; เอาต์พุต (ซ้าย PORTD); // เอาท์พุต }
// ************* // ***Flanger*** // ************* ถ้า (fx3 > 100) {
fx1 = 0; fx2 = 0; fx4 = 0;
ในขณะที่ (!f_sample) { // รอค่าตัวอย่างจาก ADC } // รอบ 15625 KHz = 64uSec
PORTD = PORTD | 128; f_sample = เท็จ; bb = dd[icnt]; // อ่านบัฟเฟอร์หน่วงเวลา iw = 127 - bb; // หักลบออฟเซ็ต fx3 = iw * badc0 / 255; // ขนาดตัวอย่างล่าช้าด้วยโพเทนชิออมิเตอร์ iw1 = 127 - badc1; // ลบออฟเซ็ตจากตัวอย่างใหม่ iw1 = iw1 + iw; // เพิ่มตัวอย่างที่ล่าช้าและตัวอย่างใหม่หาก (iw1 127) iw1 = 127; // ตัวจำกัดเสียง bb = 127 + iw1; // เพิ่มออฟเซ็ต dd[icnt] = bb; // เก็บตัวอย่างในบัฟเฟอร์เสียง icnt++; icnt = icnt & 511; // จำกัดบัฟเฟอร์ดัชนี 0..511 OCR2A = bb; // ค่าตัวอย่างเป็นเอาต์พุต PWM
PORTD = PORTD ^ 128; เอาต์พุต (ซ้าย PORTD); // เอาท์พุต
} }
เป็นโมฆะ readKnobs () { fx1 = analogRead (1); fx2 = analogRead (2); fx3 = analogRead (3); fx4 = analogRead(4);
}
เป็นโมฆะ fill_sinewave () { float pi = 3.141592; ลอย dx; ลอย fd; ลอย fcnt; dx = 2 * pi / 512; // เติมบัฟเฟอร์ขนาด 512 ไบต์สำหรับ (iw = 0; iw <= 511; iw++) { // มี 50 จุด sinewawe fd = 127 * sin (fcnt); // โทนเสียงพื้นฐาน fcnt = fcnt + dx; // ในช่วง 0 ถึง 2xpi และเพิ่มขึ้นทีละ 1/512 bb = 127 + fd; // เพิ่ม dc offset ให้กับ sinewawe dd[iw] = bb; // เขียนค่าลงในอาร์เรย์
} }
//****************************************************** ****************** // Timer2 Interrupt Service ที่ 62.5 KHz // ที่นี่สัญญาณเสียงและสัญญาณ Pot จะถูกสุ่มตัวอย่างในอัตรา: 16Mhz / 256 / 2 / 2 = 15625 เฮิร์ตซ์ ISR (TIMER2_OVF_vect) {
PORTB = PORTB | 1;
div32 = !div32; // แบ่งความถี่ timer2 / 2 ถึง 31.25kHz ถ้า (div32) { div16 = !div16; ถ้า (div16) { // ตัวอย่างช่อง 0 และ 1 สลับกัน ดังนั้นแต่ละช่องจะถูกสุ่มตัวอย่างด้วย 15.6kHz badc0 = ADCH; // รับช่อง ADC 0 sbi(ADMUX, MUX0); // ตั้งค่ามัลติเพล็กเซอร์เป็นช่อง 1 } อื่น ๆ { badc1 = ADCH; // รับ ADC ช่อง 1 cbi (ADMUX, MUX0); // ตั้งค่ามัลติเพล็กเซอร์เป็นช่อง 0 f_sample = true; } ibb++; ไอบ์--; ไอบีบี++; ไอบ์--; // หน่วงเวลาสั้น ๆ ก่อนเริ่มการแปลง sbi (ADCSRA, ADSC); // เริ่มการแปลงครั้งต่อไป }
}
ขั้นตอนที่ 6: วิดีโอ
ปัญหาที่อาจเกิดขึ้น ● ปิ๊กอัพอ่อนเกินไปสำหรับวงจรจ่ายไฟ - ต้องใช้ออปแอมป์ - ในวิดีโอเราใช้ตัวขยายสัญญาณ (กล่องสีเทาวางอยู่บนโต๊ะ)
แนะนำ:
DIY 37 Leds เกมรูเล็ต Arduino: 3 ขั้นตอน (พร้อมรูปภาพ)
DIY 37 Leds เกมรูเล็ต Arduino: รูเล็ตเป็นเกมคาสิโนที่ตั้งชื่อตามคำภาษาฝรั่งเศสหมายถึงวงล้อเล็ก
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-
แป้นเหยียบกีตาร์ Nintendo Advantage: 7 ขั้นตอน
Nintendo Advantage Guitar Pedal: ในโปรเจ็กต์นี้ ฉันใช้ตัวควบคุม Nintendo Advantage ที่ชำรุดและชุดแป้นเหยียบกีต้าร์ที่ขยายสัญญาณเพื่อสร้างสิ่งที่ฉันชอบเรียกว่า "power-up" สิ่งที่คุณต้องการ: Nintendo Advantage Controller Guitar Pedal Kit (ส่วนใหญ่ควรพอดีภายใน