Բովանդակություն:

Arduino Youtube հեռակառավարման ռեժիմ քնելու համար (Leobot Electronics) ՝ 4 քայլ
Arduino Youtube հեռակառավարման ռեժիմ քնելու համար (Leobot Electronics) ՝ 4 քայլ

Video: Arduino Youtube հեռակառավարման ռեժիմ քնելու համար (Leobot Electronics) ՝ 4 քայլ

Video: Arduino Youtube հեռակառավարման ռեժիմ քնելու համար (Leobot Electronics) ՝ 4 քայլ
Video: EBYTE LoRa մոդուլի ակնարկ և կազմաձևում 2024, Հուլիսի
Anonim
Arduino Youtube հեռակառավարման ռեժիմ ՝ քնելու համար (Leobot Electronics)
Arduino Youtube հեռակառավարման ռեժիմ ՝ քնելու համար (Leobot Electronics)

Arduino Youtube հեռակառավարիչ

Եթե դուք օգտագործում եք Youtube- ը ՝ ֆիլմ կամ երաժշտություն տրամադրելու համար ՝ քնած ժամանակ, ապա, անշուշտ, ձեզ կարթնացնեին բեռնված գովազդը կամ ձայնի տարբեր մակարդակները, երբ նոր ֆիլմ սկսվի: Ավելորդ է ասել, որ սա կարող է բավականին նյարդայնացնել:

Այսպիսով, իմ լուծումը, որը ես ձեզ ապացուցում եմ այստեղ, ինքներդ ձեզ համար կառուցելու համար Arduino- ի վրա հիմնված հեռակառավարման վահանակ է ՝ հեռավորության վրա Youtube- ի հետ փոխազդելու համար: Հեռակառավարիչը պետք է փոխի իմ համակարգչի հիմնական ձայնի ձայնը, բաց թողնի գովազդները Youtube- ում և բաց թողնի տեսանյութերը Youtube- ում:

Բացի այդ, ներառված է աուդիո մակարդակի տվիչ `որոշելու, թե իրականում որքան բարձր է բարձրախոսը, որն իր հերթին կարող է օգտագործվել ձայնի մակարդակը ինքնաբերաբար իջեցնելու համար` բարձրագոչ ընդհատումները հայտնաբերելու դեպքում, ինչպիսին է գովազդը:

Վերջապես, ես համակարգչային հավելվածում ավելացրի գծապատկեր `ցուցադրված ձայնի մակարդակները ցուցադրելու համար:

Լուծումը կարող է ավելի լավ ճշգրտվել, բայց ինձ համար այն կատարում է առաջադրանքը:

Քայլ 1: Անհրաժեշտ բաղադրիչներ

Այս բոլոր բաղադրիչները մատակարարվում են Leobot Electronics- ի կողմից (https://leobot.net)

1) Arduino UNO R3

leobot.net/viewproduct.aspx?id=530

2) 4 ԱԼԻՔԻ ՀԵՌՈ (315 ՄՀց) + ՌԵՍԻՎԵՐԻ ՄՈԴՈLEԼ (315 ՄՀց)

leobot.net/viewproduct.aspx?id=521

3) Միկրոֆոնի ձայնի և ձայնի հայտնաբերման սենսորային մոդուլ (KY-037)

leobot.net/viewproduct.aspx?id=217

Ծրագրային ապահովում

1) Visual Studio

visualstudio.microsoft.com/

2) Arduino IDE

www.arduino.cc/hy/main/software

Քայլ 2: Սարքավորման կարգավորում

1) Միացրեք 4-ալիք ստացողի մոդուլը Arduino- ին:

4-ալիք ստացողի Pin-> Arduino Uno Pin

GND-> GND

5V-> 5V

D0-> Թվային 2

D1-> Թվային 3

D2-> Թվային 4

D3-> Թվային 5

2) Խոսափողը KY-037 մոդուլը միացրեք Arduino- ին

Խոսափող KY-037 Pin-> Arduino Uno Pin

GND-> GND

+-> 3.3 Վ

A0-> Անալոգային 3

Քայլ 3: Arduino կոդ

Ակնարկ

Տրամաբանությունը, որին պետք է հետևի Arduino- ն, հետևյալն է.

Ա) Ստուգեք, արդյոք ստացողը ազդանշան է տալիս որևէ կապում:

Բ) Կախված այն բանից, թե որ IO նավահանգստում է ազդանշանը ստացվում, ինչ հրաման է ուղարկվելու ԱՀ:

Գ) Հեռակառավարման բոլոր գործողությունները կատարելուց հետո հայտնաբերեք խոսափողի ձայնային մակարդակը և ուղարկեք այն ԱՀ:

Դ) ԱՀ ուղարկված բոլոր հրամանները ունեն ձև ՝ նախ ունենալով բնույթ, այնուհետև արժեք (եթե դրա արժեքը անհրաժեշտ է):

Ե) Arduino- ից համակարգիչ ուղարկված հինգ հրաման կա

ա «U» - ձայնի բարձրացում

բ. «Դ» - ձայնի նվազում

գ. «Ս» - Բաց թողնել ավելացումը

դ. «V» - Բաց թողնել տեսանյութը

ե. «Ա» - հայտնաբերված աուդիո մակարդակը, որին հաջորդում է արժեքը

Arduino կոդը:

Ներբեռնեք Arduino կոդը այստեղ ՝

int in1 = 2;

int in2 = 3;

int in3 = 4;

int in4 = 5;

void setup () {

Serial.begin (9600);

pinMode (A3, INPUT);

pinMode (in1, INPUT);

pinMode (in2, INPUT);

pinMode (in3, INPUT);

pinMode (in4, INPUT);

}

դատարկ շրջան () {

եթե (digitalRead (in1))

{

Serial.println ("u");

ուշացում (100);

}

եթե (digitalRead (in2))

{

Serial.println («դ»);

ուշացում (100);

}

եթե (digitalRead (in3))

{

Serial.println («ներ»);

ուշացում (100);

}

եթե (digitalRead (in4))

{

Serial.println ("v");

ուշացում (100);

}

int readVal = analogRead (A3);

Serial.println (Լարային («ա»)+ Լարային (readVal));

ուշացում (50);

}

Քայլ 4: Համակարգչի հավելվածի ծածկագիր (C#. NET)

PC հավելվածի ծածկագիր (C#. NET)
PC հավելվածի ծածկագիր (C#. NET)

Հավելվածը կլսի COM (USB) պորտով և կարձագանքի `կախված այն բանից, թե ինչ հրաման է ստացվել: ԱՀ -ում ձայնը բարձրացնելու և իջեցնելու ամենապարզ միջոցը Interrop ծառայություններից օգտվելն է `Windows OS- ի հետ անմիջականորեն խոսելու համար: Մենք նաև օգտագործում ենք Interrop ծառայությունները ՝ մկնիկը էկրանին որոշակի դիրքի տեղափոխելու և սեղմելու համար: Որպեսզի թույլատրվի տարբեր էկրանների և դիտումների չափսեր, մենք թույլ ենք տալիս օգտվողին նշել վիդեո կոճակների բաց թողնել և բաց թողնելը:

Մենք օգտագործում ենք ստանդարտ.net աղյուսակ `ստացված ցանկացած աուդիո հրամաններ ցուցադրելու համար:

Windows կոդ:

Ներբեռնեք ամբողջական նախագիծը այստեղ ՝

leobot.net/audioadjust.zip

օգտագործելով համակարգ;

օգտագործելով System. Collections. Generic;

օգտագործելով System. ComponentModel;

օգտագործելով System. Data;

օգտագործելով System. Drawing;

օգտագործելով System. Linq;

օգտագործելով System. Text;

օգտագործելով System. Windows. Forms;

օգտագործելով System. Runtime. InteropServices;

օգտագործելով System. IO. Ports;

օգտագործելով System. Threading;

անունների տարածքը AudioAdjust

{

հանրային մասնակի դասարան Ձև 1: Ձև

{

[DllImport ("User32. Dll")]

հանրային ստատիկ արտաքին երկար SetCursorPos (int x, int y);

[DllImport ("User32. Dll")]

հանրային ստատիկ արտաքին bool ClientToScreen (IntPtr hWnd, ref POINT point);

[DllImport ("user32.dll", CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall)]

հանրային ստատիկ արտաքին դատարկություն mouse_event (uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

// Մկնիկի գործողություններ

մասնավոր կոնստրուկտոր MOUSEEVENTF_LEFTDOWN = 0x02;

մասնավոր կոնստրուկտոր MOUSEEVENTF_LEFTUP = 0x04;

մասնավոր կոնստրուկտոր MOUSEEVENTF_RIGHTDOWN = 0x08;

մասնավոր կոնստրուկտոր MOUSEEVENTF_RIGHTUP = 0x10;

[DllImport ("user32.dll")]

ստատիկ արտաքին անվավեր keybd_event (բայթ bVk, բայթ bScan, uint dwFlags, int dwExtraInfo);

Պատահական aRand = նոր Պատահական ();

public int LastLevel = 0;

հանրային int MaxLevel = 255;

ստատիկ SerialPort _serialPort;

int adX = 1281;

int adY = 706;

int vidX = 250;

int vidY = 780;

bool enableAudioChange = կեղծ;

հանրային ձև 1 ()

{

InitializeComponent ();

}

մասնավոր անվավեր Form1_Load (օբյեկտ ուղարկող, EventArgs ե)

{

տող անուններ = System. IO. Ports. SerialPort. GetPortNames ();

comboBoxPort. Items. AddRange (անուններ);

comboBoxPort. SelectedIndex = 0;

}

int currentPoint = 0;

private void button1_Click (օբյեկտ ուղարկող, EventArgs ե)

{

_serialPort = նոր SerialPort ();

_serialPort. DataReceived += նոր SerialDataReceivedEventHandler (_serialPort_DataReceived);

_serialPort. PortName = comboBoxPort. SelectedItem. ToString (); // Սահմանեք ձեր տախտակի COM

_serialPort. BaudRate = 9600;

եթե (_serialPort. IsOpen) _serialPort. Close ();

ուրիշ

{

_serialPort. Open ();

}

// keybd_event ((բայթ) Keys. VolumeDown, 0, 0, 0); // նվազեցնել ծավալը

}

void _serialPort_DataReceived (օբյեկտ ուղարկող, SerialDataReceivedEventArgs ե)

{

փորձիր

{

string fullval = _serialPort. ReadLine ();

string com = fullval [0]. ToString ();

անջատիչ (com)

{

դեպք «ա»:

{

{

// աուդիո մակարդակ

տող val = fullval. Փոխարինել ("a", "");

int valInt = int. Վերլուծել (val);

AddData (valInt);

}

ընդմիջում;

}

դեպք «u»:

{

// աուդիո բարձրացում

keybd_event ((բայթ) Keys. VolumeUp, 0, 0, 0); // նվազեցնել ծավալը

ընդմիջում;

}

դեպք «դ»:

{

// ձայնի անջատում

keybd_event ((բայթ) Keys. VolumeDown, 0, 0, 0); // նվազեցնել ծավալը

ընդմիջում;

}

case "s":

{

//բաց թողնել Գովազդ

MoveCursorSkipAd ();

Թեման. Քուն (10);

DoMouseClick ();

ընդմիջում;

}

դեպք «v»:

{

//բաց թողնել Գովազդ

MoveCursorSkipVideo ();

Թեման. Քուն (10);

DoMouseClick ();

ընդմիջում;

}

}

}

բռնել

{

}

// նետել նոր NotImplementedException ();

}

մասնավոր դատարկություն MoveCursorSkipAd ()

{

Կուրսորը: Դիրքը = նոր կետ (1140, 725);

Cursor. Position = նոր կետ (adX, adY);

}

մասնավոր դատարկություն MoveCursorSkipVideo ()

{

Կուրսորը: Դիրքը = նոր կետ (1140, 725);

Cursor. Position = նոր կետ (vidX, vidY);

}

հրապարակային դատարկ DoMouseClick ()

{

// Callանգահարեք ներմուծված գործառույթը կուրսորի ընթացիկ դիրքով

uint X = (uint) Cursor. Position. X;

uint Y = (uint) Cursor. Position. Y;

mouse_event (MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);

mouse_event (MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

}

անվավեր AddData (int մակարդակ)

{

եթե (enableAudioChange)

{

եթե (մակարդակ> = MaxLevel)

{

keybd_event ((բայթ) Keys. VolumeDown, 0, 0, 0); // նվազեցնել ծավալը

keybd_event ((բայթ) Keys. VolumeDown, 0, 0, 0); // նվազեցնել ծավալը

keybd_event ((բայթ) Keys. VolumeDown, 0, 0, 0); // նվազեցնել ծավալը

}

ուրիշ

{

եթե (մակարդակ <MaxLevel - 0)

{

keybd_event ((բայթ) Keys. VolumeUp, 0, 0, 0); // նվազեցնել ծավալը

}

}

}

SetChart (մակարդակ);

currentPoint ++;

}

պատվիրակել անվավեր SetTextCallback (int val);

մասնավոր դատարկ SetChart (int val)

{

// InvokeRequired պահանջվում է համեմատել թելի ID- ն

// թեմա կանչելը ստեղծող շարանի թելի ID- ին:

// Եթե այս թելերը տարբեր են, այն վերադառնում է ճշմարիտ:

եթե (սա. գրաֆիկ 1. InvokeRequired)

{

SetTextCallback d = նոր SetTextCallback (SetChart);

this. Ivoke (d, new object {val});

}

ուրիշ

{

գրաֆիկ 1. Սերիաներ [0]. Կետեր. AddXY (0, val);

եթե (ընթացիկ կետ> = 10)

{

գծապատկեր 1. Սերիաներ [0]. Կետեր. Հեռացնել (0);

}

}

}

մասնավոր դատարկ textBoxLevel_TextChanged (օբյեկտ ուղարկող, EventArgs ե)

{

փորձիր

{

MaxLevel = int. Parse (textBoxLevel. Text);

}

բռնել

{

textBoxLevel. Text = MaxLevel + "";

}

}

մասնավոր դատարկության կոճակ TestSkip_Click (օբյեկտ ուղարկող, EventArgs ե)

{

MoveCursorSkipAd ();

Թեման: Քուն (10);

DoMouseClick ();

}

մասնավոր անվավեր textBoxXpos_TextChanged (օբյեկտ ուղարկող, EventArgs ե)

{

փորձիր

{

adX = int. Parse (textBoxXpos. Text);

}

բռնել

{

textBoxXpos. Text = adX + "";

}

}

մասնավոր անվավեր textBoxYpos_TextChanged (օբյեկտ ուղարկող, EventArgs ե)

{

փորձիր

{

adY = int. Parse (textBoxYpos. Text);

}

բռնել

{

textBoxYpos. Text = adY + "";

}

}

մասնավոր դատարկության կոճակ SkipVideo_Click (օբյեկտ ուղարկող, EventArgs ե)

{

MoveCursorSkipVideo ();

Թեման: Քուն (10);

DoMouseClick ();

}

մասնավոր անվավեր textBoxXposVid_TextChanged (օբյեկտ ուղարկող, EventArgs ե)

{

փորձիր

{

vidX = int. Parse (textBoxXposVid. Text);

}

բռնել

{

textBoxXposVid. Text = vidX + "";

}

}

մասնավոր դատարկ textBoxYposVid_TextChanged (օբյեկտ ուղարկող, EventArgs ե)

{

փորձիր

{

vidY = int. Parse (textBoxYposVid. Text);

}

բռնել

{

textBoxYposVid. Text = vidY + "";

}

}

մասնավոր դատարկ ստուգումBoxEnable_CheckedChanged (օբյեկտ ուղարկող, EventArgs ե)

{

enableAudioChange = checkBoxEnable. Checked;

}

}

[StructLayout (LayoutKind. Sequential)]

հանրային կառուցվածքի ԿԵՏ

{

հանրային int x;

հանրային int y;

}

}

Խորհուրդ ենք տալիս: