สารบัญ:

NeckCrusher (แป้นเหยียบกีต้าร์): 6 ขั้นตอน (พร้อมรูปภาพ)
NeckCrusher (แป้นเหยียบกีต้าร์): 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: NeckCrusher (แป้นเหยียบกีต้าร์): 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: NeckCrusher (แป้นเหยียบกีต้าร์): 6 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: อะไรทำให้ผมหยุดซื้อเอฟเฟคก้อน? 2024, พฤศจิกายน
Anonim
NeckCrusher (แป้นเหยียบกีต้าร์)
NeckCrusher (แป้นเหยียบกีต้าร์)

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: วิดีโอ

ปัญหาที่อาจเกิดขึ้น ● ปิ๊กอัพอ่อนเกินไปสำหรับวงจรจ่ายไฟ - ต้องใช้ออปแอมป์ - ในวิดีโอเราใช้ตัวขยายสัญญาณ (กล่องสีเทาวางอยู่บนโต๊ะ)

แนะนำ: