ఎయిర్ గిటార్ ప్లే చేయడం వంటి రెండు చేతులతో నియంత్రించగలిగే ధరించగలిగే వర్చువల్ గిటార్ను నిర్మించడం ఇక్కడ ఆలోచన. వద్ద రెండు వారాల ప్రాజెక్ట్ సమయంలో ఇది సృష్టించబడింది మరియు నమూనా చేయబడింది
నిజమైన గిటార్ వాయించే అనుభూతిని పొందడమే లక్ష్యం. AIRduino గిటార్ ఒక చేతి తొడుగు మరియు ఒక కర్రతో తయారు చేయబడింది.ధ్వనిని ప్రేరేపించడానికి టోన్ మరియు స్టిక్ సెట్ చేయడానికి గ్లోవ్ ఉపయోగించబడుతుంది.
అటువంటి ట్రిక్ చేయడానికి, మేము యాక్సిలెరోమీటర్ మరియు అల్ట్రా-సోనిక్ సెన్సార్ను ఉపయోగించాము (కాన్సెప్ట్ వివరణ కోసం దశ 1 చూడండి).
ఇది ఎలా పనిచేస్తుందనే దాని గురించి మరింత ఖచ్చితమైన ఆలోచన పొందడానికి వీడియో డెమోని చూడండి మరియు మీ స్వంతంగా నిర్మించడానికి పని చేయండి!
AIRduino బృందం:
డేవిడ్ ఫౌర్నియర్, జీన్ లూయిస్ గియోర్డానో, మోనిరేహ్ సనాయ్, మజియార్ షెల్బాఫ్ మరియు గుస్తావ్ సోహ్టెల్.
సామాగ్రి:
దశ 1: కాన్సెప్ట్ వివరణ
ఎయిర్ గిటార్ కుడి చేతి గిటార్ వలె పని చేయాల్సి ఉంది.
గిటార్ కంట్రోలర్ ఎడమ చేతి నియంత్రిక మరియు కుడి చేతి నియంత్రిక అని రెండు భాగాలుగా విభజించబడింది.
ఎడమ చేతి నియంత్రిక ద్వారా ఆటగాడు తన వేళ్లను వంచి, టోన్ యొక్క పిచ్ను మార్చడానికి చేతి తొడుగును నొక్కవచ్చు.
కుడి చేతి నియంత్రిక ఒక కర్ర ద్వారా ప్రాతినిధ్యం వహిస్తుంది, ఇది గాలి-గిటార్ యొక్క ధ్వనిని ప్రేరేపించడానికి కదిలించాలి.
టోన్లను పిచ్ చేయడానికి ప్లేయర్ కుడి చేతి మరియు ఎడమ చేతి మధ్య దూరాన్ని కూడా మార్చవచ్చు, గిటార్ మెడలోని విభిన్న ఫ్రీట్లను అనుకరిస్తుంది.
అటువంటి ఉపాయాలు చేయడానికి, ప్రధాన భాగాలు స్టిక్ షేక్ను "అనుభూతి చెందడానికి" యాక్సిలెరోమీటర్, కుడి చేతి మరియు కర్ర మధ్య దూరాన్ని కొలవడానికి హ్యాక్ చేయబడిన అల్ట్రా-సోనిక్ సెన్సార్ మరియు చేతి తొడుగును నిర్మించడానికి వాహక బట్ట.
మొత్తం మీద, బొమ్మను నిర్మించడం చాలా సులభం. గమ్మత్తైన భాగం అల్ట్రా-సోనిక్ సెన్సార్ హాక్, దీనికి కొంత సామర్థ్యం అవసరం. సూచనలను అర్థం చేసుకోవడానికి మీకు కొన్ని ప్రాథమిక ఎలక్ట్రానిక్ నైపుణ్యాలు అవసరం, మరియు మీరు ఏదైనా గందరగోళంలో ఉన్నప్పుడు మీరు ఏమి తప్పు చేశారో తెలుసుకోవడానికి మరియు చివరికి గిటార్ పనిచేయదు. మేము అక్కడ ఉన్నాము. :-)
దశ 2: షాపింగ్ జాబితా
మీ స్వంత AIRduino గిటార్ను నిర్మించాల్సిన అవసరం ఉన్న జాబితా ఇక్కడ ఉంది:
1. వైర్లు: దురదృష్టవశాత్తు ఈ ప్రోటోటైప్ వెర్షన్ కోసం చాలా. రెండు చేతి తొడుగులు మరియు ఆర్డునో భాగాలను కలిపి కనెక్ట్ చేయడానికి ఇవి ఉపయోగించబడ్డాయి. వైర్లెస్గా చేయడం ద్వారా డిజైన్ యొక్క ఈ భాగాన్ని మెరుగుపరచడానికి సంకోచించకండి!
2. యాక్సిలెరోమీటర్: వణుకుతున్నట్లు గుర్తించడానికి మీ కుడి చేతిలో ఉన్న కర్రలో ఉపయోగించబడుతుంది. మేము మూడు-అక్షం అసిల్లెరోమీటర్ను ఉపయోగించాము, కాని ఒక అక్షం సరిపోతుంది
3. అల్ట్రాసోనిక్ సెన్సార్: ప్లేయర్ యొక్క రెండు చేతుల మధ్య దూరాన్ని కొలవడానికి ఉపయోగిస్తారు, మేము పారలాక్స్ # 28015 ను ఉపయోగించాము
4. కండక్టివ్ మరియు స్ట్రెచ్ ఫాబ్రిక్: గ్లోవ్ నిర్మించడానికి,
5. ఆర్డునో: ప్రతిదీ నిర్వహించే గిటార్ యొక్క కోర్. ఒక ఆర్డునో డిసిమిలా బాగా పనిచేస్తుంది.
6. పొటెన్టోమీటర్లు: కొన్ని సెట్టింగులను సర్దుబాటు చేయడానికి, 1KOhm-1MOhm నుండి గరిష్టంగా ఏదైనా ఉన్న పొటెన్షియోమీటర్ సరే.
7. హాట్ మెల్ట్ గ్లూ: వస్తువులను కలిసి ఉంచడానికి అనుకూలమైన మార్గం,
8. 3.5 మిమీ ఫిమేల్ జాక్: ఆడియో అవుట్పుట్ కోసం ఉపయోగిస్తారు,
9. క్లాసిక్ ఎలక్ట్రానిక్ స్టఫ్: రెసిస్టర్లు (10 కె), కెపాసిటర్ (10 యుఎఫ్), ఎల్ఇడిలు మరియు ఆర్డునోకు కొంత విద్యుత్ సరఫరా. (9 వి బ్యాటరీ బాగానే ఉంది).
దశ 3: స్కీమాటిక్స్
AIRduino గిటార్ కోసం ఎలక్ట్రానిక్ స్కీమాటిక్స్ ఇక్కడ ఉన్నాయి.
మీరు గమనిస్తే, అర్థం చేసుకోవడం చాలా సులభం మరియు అందువల్ల నిర్మించడం కూడా చాలా సులభం.
ఏ భాగం ఎక్కడికి వెళుతుందనే ఆలోచన మీకు కావాలంటే చిత్రాన్ని చూడండి. మీరు బహుశా అర్థం చేసుకున్నట్లుగా, ఇది ఏ విధంగానైనా స్కేల్ చేయకూడదు. తంతులు స్కీమాటిక్లో చూపించిన దానికంటే చాలా పొడవుగా ఉన్నాయి.
అల్ట్రా-సోనిక్ సెన్సార్ యొక్క ఉద్గారిణి కర్రపై ఉందని మరియు రిసీవర్ ఎడమ చేతిలో ఉందని మీరు గమనించవచ్చు. ఇది నేను ఇంతకు ముందు చెప్పిన గమ్మత్తైన భాగం: సెన్సార్ బోర్డు నుండి వేరు చేయడానికి మీరు అల్ట్రా-సోనిక్ సెన్సార్ యూనిట్ నుండి అల్ట్రా-సోనిక్ ఉద్గారిణిని అన్సోల్డర్ చేయాలి.
తరువాతి దశల్లో దాని గురించి మరింత. ఇప్పుడు పని చేద్దాం!
దశ 4: గ్లోవ్ నిర్మించడం
గ్లోవ్లో ఒక అల్ట్రా-సోనిక్ రిసీవర్ మరియు నాలుగు బటన్లు ఉన్నాయి. అంతే!
అల్ట్రా-సోనిక్ రిసీవర్ క్రింద ఉన్న కొన్ని చిత్రాలలో కనిపించే బ్లాక్ బాక్స్లో ఉంది.
గ్లోవ్ ఒక పెద్ద ప్రాంతాన్ని కలిగి ఉంది, ఇది ఆర్డునో బోర్డులో భూమికి అనుసంధానించబడి ఉంది. అరచేతికి వ్యతిరేకంగా ఒక వేలు నొక్కినప్పుడు, వేలు మరియు అరచేతిపై వాహక బట్ట మధ్య సంబంధం ఏర్పడుతుంది.
క్రింద రెండు వేర్వేరు గ్లోవ్ మోడళ్ల చిత్రం ఉన్నాయి. ఒకదానిలో వేరు చేయగలిగిన వేళ్లు ఉన్నాయి, ఇది చాలా చిన్న మరియు చాలా పెద్ద చేతులతో ఆటగాళ్లను అనుమతిస్తుంది. ఇతర మోడల్ ప్రామాణిక చేతి తొడుగుపై కుట్టినది. నేను రెండవ సంస్కరణను సిఫారసు చేస్తాను, నిర్మించడం సులభం మరియు ధరించడం సులభం.
దశ 5: కోడ్
అవసరమైన Arduino కోడ్ ఇక్కడ ఉంది:
రియల్ టైమ్ సౌండ్ జనరేషన్ భాగం ఈ గొప్ప ట్యుటోరియల్ నుండి తీసుకోబడింది.
------------------------------------------------------
// తరంగ రూపాన్ని కలిగి ఉన్న శ్రేణి
// గిటార్ సౌండ్
చార్ వేవ్ఫార్మ్ =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};
// మేము మార్చడానికి ఈ తరంగ రూపాన్ని ఉపయోగిస్తాము
అవుట్పుట్ యొక్క // వాల్యూమ్
చార్ వేవ్ఫార్మ్ వోల్యూమ్ =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};
// నివారించడానికి బఫర్గా ఉపయోగించే శ్రేణి
// తప్పు సమయ వ్యవధి
// కొలతలు
సంతకం చేయని పూర్ణాంక దూరం_బఫర్ = 000 16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000};
const int దూరం_ పొడవు = 3;
పూర్ణాంక దూరం_ఇండెక్స్ = 0;
// 2 అష్టపదులు కోసం ఓవర్ఫ్లో విలువలు
పూర్ణాంక పౌన encies పున్యాలు = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// ప్రారంభ పిచ్
పూర్ణాంక పిచ్ = 160;
// ప్రారంభ వాల్యూమ్ మరియు త్వరణం
// పరామితి
int lastAcc = 0;
ఫ్లోట్ వాల్యూమ్ = 0;
పిన్ 3 లో // ఆడియో ప్లేబ్యాక్
బైట్ స్పీకర్పిన్ = 3;
లో స్థానం కోసం // ఇండెక్స్ వేరియబుల్
// waveform
అస్థిర బైట్ వేవ్ఇండెక్స్ = 0
అస్థిర బైట్ ప్రస్తుత విలువ = 0;
// అల్ట్రా-సోనిక్ సెన్సార్ కోసం పిన్ ఉపయోగించబడుతుంది
const int pingPin = 7;
పొటెన్షియోమీటర్లకు // పిన్స్
const intustainPin = 1;
const int సున్నితత్వం పిన్ = 2;
// ఎడమ ప్రతి వేలికి పిన్స్
// చేతి
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
పూర్ణాంక వేలు విలువ = 0;
దీర్ఘకాలం, అంగుళాలు, సెం.మీ;
శూన్య సెటప్ () {
pinMode (3, అవుట్పుట్); // పిన్ 3 పై స్పీకర్
pinMode (finger1, INPUT);
pinMode (finger2, INPUT);
pinMode (finger3, INPUT);
pinMode (finger4, INPUT);
/**************************
PWM ఆడియో కాన్ఫిగరేషన్
****************************/
// టైమర్ 2 ను ఫాస్ట్ పిడబ్ల్యుఎం మోడ్కు సెట్ చేయండి
// (రెట్టింపు PWM ఫ్రీక్వెన్సీ)
బిట్సెట్ (టిసిసిఆర్ 2 ఎ, డబ్ల్యుజిఎం 21);
బిట్సెట్ (టిసిసిఆర్ 2 బి, సిఎస్ 20);
బిట్క్లీర్ (టిసిసిఆర్ 2 బి, సిఎస్ 21);
బిట్క్లీర్ (టిసిసిఆర్ 2 బి, సిఎస్ 22);
// ఇప్పుడు నమోదు చేసిన అంతరాయాలను ప్రారంభించండి
// సెట్ చేయబడ్డాయి
సీ ();
/*************************
టైమర్ 1 అంతరాయ ఆకృతీకరణ
*************************/
// అంతరాయాలను నిలిపివేయి
// రిజిస్టర్లు కాన్ఫిగర్ చేయబడ్డాయి
CLI ();
/ * సాధారణ పోర్ట్ ఆపరేషన్, పిన్స్ డిస్కనెక్ట్ చేయబడింది
టైమర్ ఆపరేషన్ నుండి (pwm బ్రేకింగ్) * /
బిట్క్లీర్ (TCCR1A, COM1A1);
బిట్క్లీర్ (TCCR1A, COM1A1);
బిట్క్లీర్ (TCCR1A, COM1A1);
బిట్క్లీర్ (TCCR1A, COM1A1);
/ * మోడ్ 4, రిజిస్టర్ ద్వారా సెట్ చేయబడిన TOP తో CTC
OCR1A. కోసం వేరియబుల్ టైమింగ్ సెట్ చేయడానికి మాకు అనుమతిస్తుంది
క్రొత్త విలువలను వ్రాయడం ద్వారా అంతరాయం
OCR1A. * /
బిట్క్లీర్ (టిసిసిఆర్ 1 ఎ, డబ్ల్యుజిఎం 10);
బిట్క్లీర్ (టిసిసిఆర్ 1 ఎ, డబ్ల్యుజిఎం 11);
బిట్సెట్ (టిసిసిఆర్ 1 బి, డబ్ల్యుజిఎం 12);
బిట్క్లీర్ (టిసిసిఆర్ 1 బి, డబ్ల్యుజిఎం 13);
/ * క్లాక్ ప్రెస్కాలర్ను / 8 కు సెట్ చేయండి. * /
బిట్క్లీర్ (టిసిసిఆర్ 1 బి, సిఎస్ 10);
బిట్సెట్ (టిసిసిఆర్ 1 బి, సిఎస్ 11);
బిట్క్లీర్ (టిసిసిఆర్ 1 బి, సిఎస్ 12);
/ * ఫోర్స్ అవుట్పుట్ను ఆపివేయి
ఛానెల్లు A మరియు B. * /
బిట్క్లీర్ (TCCR1C, FOC1A);
బిట్క్లీర్ (టిసిసిఆర్ 1 సి, ఎఫ్ఓసి 1 బి);
/ * అవుట్పుట్ పోలికను ప్రారంభిస్తుంది
సెట్ చేయడానికి 160 వద్ద A ని నమోదు చేయండి
ప్రారంభ పిచ్ * /
OCR1A = 160;
// ఇన్పుట్ క్యాప్చర్ అంతరాయాన్ని నిలిపివేయండి
బిట్క్లీర్ (TIMSK1, ICIE1);
// అవుట్పుట్ను నిలిపివేయండి
// B మ్యాచ్ అంతరాయాన్ని పోల్చండి
బిట్క్లీర్ (TIMSK1, OCIE1B);
// అవుట్పుట్ను ప్రారంభించండి
// మ్యాచ్ అంతరాయాన్ని పోల్చండి
బిట్సెట్ (TIMSK1, OCIE1A);
// ఓవర్ఫ్లో అంతరాయాన్ని నిలిపివేయండి
బిట్క్లీర్ (TIMSK1, TOIE1);
// ఇప్పుడు అంతరాయాలను ప్రారంభించండి
// రిజిస్టర్లు సెట్ చేయబడ్డాయి
సీ ();
}
// టైమర్ ఓవర్ఫ్లో హ్యాండ్లర్
ISR (TIMER1_COMPA_vect) {
/ * టైమర్ 1 ISR. ప్రతిసారీ అది
దీనిని స్పీకర్పిన్ను సెట్ చేస్తుంది
తరంగ రూపంలో తదుపరి విలువ . తరచుదనం
మాడ్యులేషన్ మార్చడం ద్వారా జరుగుతుంది
యొక్క వరుస కాల్స్ మధ్య సమయం
ఈ ఫంక్షన్, ఉదా. 1KHz టోన్ కోసం,
టైమింగ్ను సెట్ చేయండి, తద్వారా ఇది నడుస్తుంది
తరంగ రూపం ద్వారా 1000 సార్లు
ఒక క్షణం. * /
// వేవ్ఇండెక్స్ చేరినట్లయితే దాన్ని రీసెట్ చేయండి
// శ్రేణి ముగింపు
if (waveindex> 102) {
waveindex = 0;
}
// అవుట్పుట్ విలువను సెట్ చేయండి
if (వాల్యూమ్> 0.03) {
analogWrite (speakerpin,
waveformVolume waveindex);
}
waveindex ++;
// పిచ్ను నవీకరించండి
OCR1A = పిచ్;
}
శూన్య లూప్ ()
{
// ఇంటర్పుట్లను నిష్క్రియం చేయండి, పింగ్ పంపండి
// సందేశం మరియు సమాధానం కోసం వేచి ఉండండి.
CLI ();
పిన్మోడ్ (పింగ్పిన్, అవుట్పుట్);
డిజిటల్ రైట్ (పింగ్ పిన్, తక్కువ);
delayMicroseconds (2);
డిజిటల్ రైట్ (పింగ్ పిన్, హై);
delayMicroseconds (5);
డిజిటల్ రైట్ (పింగ్ పిన్, తక్కువ);
వ్యవధి = పల్స్ఇన్ (పింగ్పిన్, హైగ్, 2000);
సీ ();
// సమయాన్ని దూరం గా మార్చండి
// సెంటీమీటర్లలో
// మరియు బఫర్లో నిల్వ చేయండి
distance_buffer distance_index ++
% దూరం_ పొడవు = వ్యవధి / 20;
// అతి తక్కువ బఫర్లో కనుగొనండి
// దూరం కొలుస్తారు
cm = 16000;
(int i = 0; i <distance_length; i ++) {
cm = min (cm, distance_buffer i);
}
// ఏ వేళ్లు నొక్కిందో తనిఖీ చేయండి
వేలు విలువ = 5;
ఉంటే (! digitalRead (finger4)) {
వేలు విలువ = 4;
}
ఉంటే (! digitalRead (finger3)) {
వేలు విలువ = 3;
}
ఉంటే (! digitalRead (finger2)) {
వేలు విలువ = 2;
}
ఉంటే (! digitalRead (finger1)) {
వేలు విలువ = 1;
}
// నిలకడను నవీకరించండి మరియు
// సున్నితత్వ విలువలు
ఫ్లోట్ నిలబెట్టు =
మ్యాప్ (అనలాగ్ రీడ్ (సస్టైన్ పిన్), 0,
1024, 101, 130) / 100.0;
పూర్ణాంక సున్నితత్వం =
మ్యాప్ (analogRead (sensitivityPin),
0, 1024, 100, 200);
// వాల్యూమ్ను నవీకరించండి
వాల్యూమ్ = వాల్యూమ్ / నిలబెట్టుకోవడం;
if (వాల్యూమ్ <0) {
వాల్యూమ్ = 0;
}
// యాక్సిలెరోమీటర్ను తనిఖీ చేయండి
int acc = అనలాగ్ రీడ్ (0);
int accDiff = lastAcc - acc;
// వాల్యూమ్ విలువను నవీకరించండి
if (accDiff> 5 * (200 - సున్నితత్వం)) {
వాల్యూమ్ + = (ఫ్లోట్)
పౌ (accDiff,
సున్నితత్వం / 100.0) / 50000;
}
lastAcc = acc;
// వాల్యూమ్ 1 కంటే ఎక్కువగా లేదని తనిఖీ చేయండి
if (వాల్యూమ్> .95) {
వాల్యూమ్ = .95;
}
// తరంగ రూపంలో వాల్యూమ్ను నవీకరించండి
(int i = 0; i <= 102; i ++) {
waveformVolume i =
((తరంగ రూపం i - 127) * వాల్యూమ్) + 127;
}
// దూరం ప్రకారం పిచ్ సెట్ చేయండి
// రెండు చేతుల మధ్య మరియు
// వేళ్లు నొక్కినప్పుడు
if (cm <102 && cm> 0) {
if (cm> 30) {
పిచ్ = పౌన encies పున్యాలు 7 +
(((సెం.మీ - 30) / 24) * 4 + వేలు విలువ - 1);
} Else {
పిచ్ = మ్యాప్ (సెం.మీ., 0, 30, 39, 79);
}
} Else {
పిచ్ = పౌన encies పున్యాలు 7 +
(((102 - 30) / 24) * 4 + వేలు విలువ - 1);
}
// బౌన్స్ సిగ్నల్స్ నివారించడానికి ఆలస్యం
ఆలస్యం (50);
}
------------------------------------------------------