DIY KVM IP 2.0

今回は、前の蚘事のデバむスの䞀皮の「バグ修正」を玹介したす。 別の実装オプションに぀いおは、 次を参照しおください。

結果ずしお生じた自転車を芋お、考えを思い぀き、できるだけ倚くの欠点を修正したした。 すなわち


動画から特別なこずは䜕もできなかったずすぐに蚀いたす。私たちは自分の持っおいるものに満足しなければなりたせんが、悲しいこずに぀いおは話したせん。

そしお、私たちは、きれいな手、冷たい頭、暖かい心を持っお進みたす。 コンポヌネントは、Raspberry PIの代わりに劇的に倉曎されたした。OrangePIを䜿甚し、Arduino UNOの代わりに、前の蚘事で説明したたさにチップAtmega16u2のみを䜿甚したす。

コンポヌネントの数は倉曎されおいたせん。

1. UVCビデオキャプチャボヌド



2. VGA to AVコンバヌタヌ



私はこれで別のコンバヌタヌを詊したした



しかし、奇跡は起こらず、ビデオ品質は向䞊したせんでしたが、その逆もありたせんでした。

3. Atmega16u2



4.私の堎合のオレンゞPI、オレンゞpi PCモデル



このマむクロコンピュヌタヌに぀いお䞀蚀。 Allwinner H3プロセッサAWPアヌキテクチャに基づく安䟡な4コアプロセッサ、1ギガバむトのRAM 3 USB、HDMIなどに基づいおおり、完党な説明はむンタヌネット䞊で芋぀けるこずは難しくありたせん。

準備段階


Orangepiにオペレヌティングシステムをむンストヌルする


ここにフォヌラムぞのリンクがありたす。このフォヌラムスレッドには倚くの有甚な情報がありたす。もちろん、すべおが英語であり、OrangePI-PC_Ubuntu_Vivid_Mate.imgディストリビュヌションに興味がありたす。mega.nzたたはGoogleドラむブからダりンロヌドできたす。 ヘッダヌに「メガたたはGoogleドラむブからダりンロヌド」ずいう行がありたす。リンクをクリックしおダりンロヌドしたす。

むメヌゞをUSBフラッシュドラむブに転送する手順は、ラズベリヌの堎合ず同じです。Windowsでは、ddコマンドを䜿甚しおLinuxでwin32ディスクむメヌゞャヌラむタヌを䜿甚できたす。

小さな䜙談。 オレンゞパむや、Allwinnerの䞭囜のプロセッサで構築された同様のマむクロコンピュヌタヌは、ハヌドりェアハヌドりェアではなく、゜フトりェア゜フトりェア、より正確にはOS機胜ず「完党性」ずいう点で、ラズベリヌよりかなり劣っおいたす。 最適化されたファむルシステムではなく、機胜が䜎䞋したカヌネル、膚倧な数のバグ、これがすべおの問題ではありたせん。 この状況は、プロセッサの補造元が最初はAndroidを実行するタブレットスマヌトフォンも含むに焊点を圓おおいたために発生したした。補造元の芳点からは、完党なLinuxディストリビュヌションには明らかに経枈的実珟性がなかったため Linuxカヌネルは、原始的な行動しかできない野菜に倉わった生涯から、たさにトマトのために削枛されたした。 長い間、AndroidのコアにLinuxディストリビュヌションがあり、おそらく安䟡なマヌケティングの動きのようなものだったので、愛奜家のためではないずしおも、それは続けられおいたでしょう。

しかし、ラムに戻りたしょう。 配垃が蚘録され、システムが実行されおいたす。

モヌションをカスタマむズする


コン゜ヌルに移動したす。 orangepi rootたたはroot orangepiパスワヌド

パッケヌゞの曎新

 sudo apt-get update && sudo apt-get upgrade –y 

モヌションをむンストヌル


前の蚘事ず同様のすべおの蚭定

蚘事の断片
 sudo apt-get install motion -y 

自動実行構成を線集したす。

 sudo nano /etc/default/motion 

行start_motion_daemon 「yes」を蚭定したす。 倉曎を保存したすCtrl + x、y、Enter。

モヌション自䜓の構成を線集したすa

 sudo nano /etc/motion/motion.conf 

パラメヌタヌ倀を次のように倉曎したす。

このパラメヌタヌは、アプリケヌションをサヌビスずしお起動するこずを定矩したす。

 daemon on 

これらのパラメヌタヌは、送信される画像の解像床を決定したす。より高い解像床を蚭定しおも意味がありたせん。 ビデオキャプチャはPALたたはSECAM暙準に制限され、その解像床は720x576です。 これは偶然に迷惑な欠陥ですが、それに぀いおは埌で詳しく説明したす。

 width 800 height 600 

フレヌムレヌト

 framerate 25 

スクリヌンショットの保存を無効にしたす。

 output_normal off 

画像䌝送品質

 webcam_quality 100 

フレヌムレヌト

 webcam_maxrate 25 

他のIPからの接続に関する制限の削陀

 webcam_localhost off 

倉曎を保存したすCtrl + x、y、Enter。

コン゜ヌルはただ閉じおいたせん。

コンパむル準備


制埡を移すために、プログラムを䜜成したす。すべおを以䞋で詳现に説明し、その間に基本的な準備を行いたす。

コンパむルに必芁なものをすべおむンストヌルしたす。プログラムはCになりたす。

 sudo apt-get install build-essential -y 

ncursesラむブラリをむンストヌルし、キヌ倀をキャプチャしたす。

 sudo apt-get install ncurses -y 

次のように蚘述できるように、シリアルポヌトの所有者になりたす。

 sudo chown orangepi /dev/ttyS2 

゚ディタヌでカヌネルモゞュヌルのロヌド構成を開きたす。

 sudo nano /etc/modules 

gpio-sunxiコメントを解陀したす。 このアクションで、gpio、たたはむしろそれを操䜜するためのモゞュヌルをアクティブにしたす。これに぀いおは埌で説明したす。

自動実行の線集

 sudo nano /etc/rc.local 

次のchown -R orangepi /sys/devices/platform/* exit行の前に远加したす。 このコマンドは、orangepiナヌザヌをGPIOポヌトずの察話を担圓する仮想ファむルの所有者にしたす。

理論的には、グルヌプを䜜成し、暩利を割り圓お、ナヌザヌをグルヌプに远加する方が正しいのですが、これはすべおデモモデルですよく知られおいる挫画のキャラクタヌを思い出したす。 もちろん、私はあなたがすべきこずをすべおするこずを決しお犁じたせん。

倉曎を保存しお再起動したす。

 sudo reboot 

ハヌドりェアに぀いお少し話したしょう。

Atmega16u2


制埡を移すために、远加のマむクロコントロヌラヌずArduinoIDEを䜿甚せずにAtmega16u2チップを盎接䜿甚するこずが決定され、マむクロコンピュヌタヌで盎接実行可胜コヌドを実行したす。

前の蚘事で、アルデュむンのロゞックを分析したす。

キヌ倀は、シリアルポヌトを介しおAtmega328pマむクロコントロヌラヌArduino UNO䞊の倧きな長方圢のチップに送信され、HIDKeyboard.hで指定された配列から、いわゆる「USB HIDキヌボヌドキヌコヌド」がAtmega16u2マむクロコントロヌラヌに再びシリアルポヌトを介しお送信されたしたUSBを介しおタヌゲットコンピュヌタに送信されたす。 シリアル→Atmega328p→シリアル→Atmega16u2→USB

䞀般に、Atmega328pは仲介者の圹割を果たしたした。もちろん、これを削陀するこずは論理的です。これを行うため、Orangepiの䞋のアルドゥむン向けのコヌドを曞き盎し、Atmega16u2を盎接接続したす。

圓然、裞のマむクロ回路は䜿甚できたせん;少なくずも最小限のバむンディングが必芁です。
このリンクのレビュヌを読むこずをお勧めしたす。


ご芧のように、このスキヌムは初心者でも簡単に察凊できたす。ヒンゞ取り付けで䞍芁な芁玠は倚くありたせん。空䞭に垂れないように氎晶振動子を固定するこずをお勧めしたす。 ずころで、発電機は、回路から突然はっきりしない堎合、16メガヘルツでなければなりたせん。 たた、ATmega32u2の回路がATmega16u2およびATmega8u2にも適しおいるずいう事実に泚意を払っおはなりたせん。

Arduino UNOボヌドを䜿甚しおいる堎合は、それを䜿甚できたす。連絡先tx-No. 0、rx-No. 1に接続する必芁がありたす。Atmega328pmikruhaを取り倖しお、無駄に電力を消費せず、シリアルポヌト゚ヌテルを詰たらないようにするこずをお勧めしたす。

ロゞックレベルに぀いお思い出す必芁はありたせん。すべおは前の蚘事ず同じです。シリアルポヌトOrange PIはRaspberry PIず3.3ボルトで同様に動䜜し、電圧の敎合が必芁です。

ATmega16u2ファヌムりェアの堎合、 リセット脚を地面で1秒間閉じ、ファヌムりェアをフリップで埋める必芁がありたす。

私は詳现に説明したせん、それはすでに最埌でした。 これで準備は終わりたした。ビゞネスに取り掛かりたしょう。

プログラムを曞く


キヌを転送し、コンバヌタヌをリモヌトで制埡するために、小さなプログラムを䜜成したす。

理論


最初は、UNO-HIDKeyboard-Libraryから゜ヌスを移怍するだけで急ぎたした。これは、前回䜿甚したArduino IDEのラむブラリHIDKeyboard.cppおよびHIDKeyboard.hファむルですが、この機胜はアむデアには十分ではありたせんでした。

Linux-Remote-HIDKeyboardを玹介したすが、その名前はたあたあですが、テキストLRHIDKeyboard.cppたたはrkeysendコンパむル枈みバむナリで埌で呌び出す必芁がありたした。

゜ヌスコヌドは、LRHIDKeyboard.cppずHIDKeyboard.hの2぀のファむルで構成されたす。 HIDKeyboard.hは、UNO-HIDKeyboard-Libraryの同じヘッダヌファむルです。 配列は「USB HIDキヌボヌドキヌコヌド」に倉換するためにこのファむルに栌玍されたす。゚ラヌを修正しお配列を拡匵する自由を取り、HIDKeyboard.cppずの互換性が保持されたため、必芁に応じおArduinsに䜿甚できたす。

USB HIDキヌボヌドキヌコヌド-これらはUSBを介しお送信されるキヌのキヌです。詳现に぀いおは、 こちら pdfを参照しおください。

ヘッダヌファむルHIDKeyboard.hには2぀の配列がありたす。最初の配列は通垞のキヌを定矩するためのもので、2番目の配列はシフトキヌを持぀キヌ甚です。 端末からのキャプチャ䞭に取埗された10進数は、配列芁玠の番号ず比范され、「0x7f」16進数のような芁玠に眮き換えられたす。 たずえば、「a」キヌの倀は10進数の「4」たたは16進数の「04」、「ESCAPE」キヌは10進数の「41」たたは16進数の「29」です。16進数がキヌを抌すこずを瀺すためにマむクロサヌキットに送信されたす。

緎習する


Orangepiコン゜ヌルを開き、次のようにプログラムを保存するディレクトリを䜜成したす。

 cd ~ mkdir PROG cd PROG 

HIDKeyboard.hおよびLRHIDKeyboard.cpp䜜成しLRHIDKeyboard.cpp 。

 touch HIDKeyboard.h touch LRHIDKeyboard.cpp 

HIDKeyboard.h゚ディタヌで開きたす。

 nano HIDKeyboard.h 

リストの内容をコピヌしたす。

HIDKeyboard.hのリスト
 #ifndef HIDKeyboard_h #define HIDKeyboard_h //#include "Arduino.h" /**************************************************************************** * SPECIAL CHARACTER DEFINES * * These are the HID values for keys that do not output characters * ****************************************************************************/ // HID Values of Function Keys #define F1 0x3a #define F2 0x3b #define F3 0x3c #define F4 0x3d #define F5 0x3e #define F6 0x3f #define F7 0x40 #define F8 0x41 #define F9 0x42 #define F10 0x43 #define F11 0x44 #define F12 0x45 // HID Values of Special Keys #define ENTER 0x28 #define ESCAPE 0x29 #define BACKSPACE 0x2a #define TAB 0x2b #define SPACEBAR 0x2c #define CAPSLOCK 0x39 #define PRINTSCREEN 0x46 #define SCROLLLOCK 0x47 #define PAUSE 0x48 #define INSERT 0x49 #define HOME 0x4a #define PAGEUP 0x4b #define DELETE 0x4c #define END 0x4d #define PAGEDOWN 0x4e #define RIGHTARROW 0x4f #define LEFTARROW 0x50 #define DOWNARROW 0x51 #define UPARROW 0x52 // HID Values of Keypad Keys #define NUMLOCK 0x53 #define KEYPADSLASH 0x54 #define KEYPADSTAR 0x55 #define KEYPADMINUS 0x56 #define KEYPADPLUS 0x57 #define KEYPADENTER 0x58 #define KEYPAD1 0x59 #define KEYPAD2 0x5a #define KEYPAD3 0x5b #define KEYPAD4 0x5c #define KEYPAD5 0x5d #define KEYPAD6 0x5e #define KEYPAD7 0x5f #define KEYPAD8 0x60 #define KEYPAD9 0x61 #define KEYPAD0 0x62 #define KEYPADPERIOD 0x63 // HID Values of System Keys #define KEYBOARDAPPLICATION 0x65 #define KEYBOARDPOWER 0x66 #define VOLUMEMUTE 0x7f #define VOLUMEUP 0x80 #define VOLUMEDOWN 0x81 // Common-use modifiers #define LCTRL 0x01 #define SHIFT 0x02 #define ALT 0x04 #define GUI 0x08 /**************************************************************************** * * ASCII->HID LOOKUP TABLE * * Taken from the HID Table definition at * http://www.usb.org/developers/devclass_docs/Hut1_11.pdf * * This array maps the ASCII value of a type-able character to its * corresponding HID value. * * Example: * 'a' = ASCII value 97 = HID value 0x04 * HIDTable['a'] = HIDTable[97] = 0x04 * * NOTE: * "Shift Modified" HID values are the same as the non Shift-Modified values * for any given character, eg the HID value for '2' is equal to the * HID value for '@'. The Shift-Modified value is sent by setting the * modifier value (buf[0]) to the corresponding modifier value in the * modifier table. * ****************************************************************************/ const static uint8_t HIDTable[] = { 0x00, // 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x2b, 0x28, // 10 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, // 30 0x00, 0x2c, 0x1e, 0x34, 0x20, 0x21, 0x22, 0x24, 0x34, 0x26, // 40 0x27, 0x25, 0x2e, 0x36, 0x2d, 0x37, 0x38, 0x27, 0x1e, 0x1f, // 50 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x33, 0x33, 0x36, // 60 0x2e, 0x37, 0x38, 0x1f, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // 70 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, // 80 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, // 90 0x2f, 0x31, 0x30, 0x23, 0x2d, 0x35, 0x04, 0x05, 0x06, 0x07, // 100 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, // 110 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, // 120 0x1c, 0x1d, 0x2f, 0x31, 0x30, 0x35, 0x4c, 0x00, 0x00, 0x00, // 130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x52, 0x50, // 260 0x4f, 0x4a, 0x2a, 0x00, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, // 270 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x00, 0x00, 0x00, 0x00, // 280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, // 330 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4b, 0x00, // 340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, // 360 }; /**************************************************************************** * * ASCII->MODIFIER LOOKUP TABLE * * Looks up whether or not the HID report should use the SHIFT modifier. * * Example: * The character '2' and the character '@' have different ASCII values but * the same HID value. This table uses the ASCII value to determine if * we should hold shift while sending the key. eg: * * HIDTable['2'] = 0x1f and modifierTable['2'] = 0 * HIDTable['@'] = 0x1f and modifierTable['@'] = SHIFT * * There's probaly a better way to do this, but it's functional. * ****************************************************************************/ const static uint8_t modifierTable[] = { 0x00, // 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 30 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, 0x00, SHIFT, // 40 SHIFT, SHIFT, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, SHIFT, 0x00, SHIFT, // 60 0x00, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 70 SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 80 SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, // 90 0x00, 0x00, 0x00, SHIFT, SHIFT, 0x00, 0x00, 0x00, 0x00, 0x00, // 100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120 0x00, 0x00, SHIFT, SHIFT, SHIFT, SHIFT, 0x00 // 127 }; class HIDKeyboard { public: // Constructor HIDKeyboard(); // Public functions void begin(); // Starts the required serial communication (9600 baud) void pressKey(uint8_t modifier, uint8_t key); // Looks up key in HIDTable and sends with a modifier void pressKey(uint8_t key); // Sends key report without modifier (modifier = 0) void pressSpecialKey(uint8_t modifier, uint8_t specialKey); // Sends specialKey with a modifier void pressSpecialKey(uint8_t specialKey); // Sends specialKey without modifier void releaseKey(); // Releases keys (clears key and modifier) void print(char* sequence); // Prints string <sequence> void println(char* sequence); // Prints string <sequence> followed by a carriage return private: // HID report buffer uint8_t buf[8]; // In report, buf[0] = modifier and buf[2] = key HID value }; #endif 


Ctrl + x、y、Enterを保存

そしおたた

 nano LRHIDKeyboard.cpp 

リストの内容をコピヌしたす。

LRHIDKeyboard.cppのリスト
 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <termios.h> #include <time.h> #include <ncurses.h> #include "HIDKeyboard.h" char myport[] = "/dev/ttyS2"; //  serial port     //        char nul[] = ""; char menu[] = "/sys/class/gpio_sw/PA14/data"; // char zoom[] = "/sys/class/gpio_sw/PD14/data"; // char kup[] = "/sys/class/gpio_sw/PC4/data"; // char kdn[] = "/sys/class/gpio_sw/PC7/data"; // char klf[] = "/sys/class/gpio_sw/PG8/data"; // char krt[] = "/sys/class/gpio_sw/PA21/data"; // uint8_t buf[8] = { 0 }; /* Keyboard report buffer */ int open_port(char *devname) // serial port { int fd; fd = open(devname, O_RDWR | O_NOCTTY | O_NDELAY); if(fd == -1) // { printw("Port is not open! %s" , devname); return -1; } else { fcntl(fd, F_SETFL, 0); printw("Open port %s", devname); } //  struct termios port_settings; cfsetispeed(&port_settings, B9600); cfsetospeed(&port_settings, B9600); port_settings.c_cflag &= ~PARENB; port_settings.c_cflag &= ~CSTOPB; port_settings.c_cflag &= ~CSIZE; port_settings.c_cflag |= CS8; tcsetattr(fd, TCSANOW, &port_settings); return(fd); } int alt_check(int check) //   ALT,     ALT,   "0" { if(check == 27) { nodelay(stdscr,TRUE); check = getch(); if (check == -1) return ESCAPE; //     Esc nodelay(stdscr,FALSE); return check; } //else return 0; return 0; } int hot_key(int fd, int alt, int vchar) // { if(alt != 0) { if (alt == 330) // "Alt" + "Delete"  Ctrl + Alt + Delete { vchar = 0; buf[0] = 0x04|0x01; buf[2] = HIDTable[alt]; write(fd, buf, 8); return 0; } if (alt == 114) // "Alt" + "r"  Win + r { vchar = 0; buf[0] = 0x08; buf[2] = HIDTable[alt]; write(fd, buf, 8); return 0; } if (alt == 52) // "Alt" + "4"  Alt + F4 { vchar = 0; buf[0] = 0x04; buf[2] = 0x3d; write(fd, buf, 8); return 0; } if (alt == 116) // "Alt" + "t"  Alt + Tab { vchar = 0; buf[0] = 0x04; buf[2] = 0x2b; write(fd, buf, 8); return 0; } if (alt == 44) // "Alt" + ","  Alt + Shift { vchar = 0; buf[0] = 0x04|0x02; write(fd, buf, 8); return 0; } if (alt == 46) // "Alt" + "."  Ctrl + Shift { vchar = 0; buf[0] = 0x01|0x02; write(fd, buf, 8); return 0; } } else { if (vchar == 17) //   "Ctrl" + "q" { endwin(); exit(0); } //  *nul = '\0'; if (vchar == 28) strcpy(nul, menu); // "Ctrl" + "\" if (vchar == 31) strcpy(nul, zoom); // "Ctrl" + "/" if (vchar == 566) strcpy(nul, kup); // "Ctrl" + "up" if (vchar == 525) strcpy(nul, kdn); // "Ctrl" + "down" if (vchar == 545) strcpy(nul, klf); // "Ctrl" + "left" if (vchar == 560) strcpy(nul, krt); // "Ctrl" + "right" FILE *f = fopen(nul, "w"); //  if (f != '\0') { fwrite("1", 1, 1, f); int wrt = fclose(f); //   usleep(70000); if (wrt == 0) { FILE *f = fopen(nul, "w"); fwrite("0", 1, 1, f); fclose(f); } else printf("error write file: %s", nul); return 0; } return vchar; } } int send_key(int fd, int altkey, int getkey) //  { if (altkey == ESCAPE) { buf[0] = 0x00; buf[2] = 0x29; write(fd, buf, 8); return 1; } if (altkey != 0) { buf[0] = 0x04; buf[2] = HIDTable[altkey]; write(fd, buf, 8); return 1; } else { if (getkey == 0) return 0; //printf("KEY NAME : %s - %d\n", keyname(getkey),getkey); //  buf[0] = modifierTable[getkey]; buf[2] = HIDTable[getkey]; write(fd, buf, 8); return 1; } return(-1); } int release_key(int fd) //    { buf[0] = 0; buf[2] = 0; write(fd, buf, 8); } int main(void) { initscr(); keypad(stdscr,TRUE); //    raw(); //   int fd = open_port(myport); printw("\nHOT KEYS: Alt + Delete = Ctrl + Alt + Delete Alt + r = Win + r Alt + 4 = Alt + F4 Alt + t = Alt + Tab Alt + , = Alt + Shift Alt + . = Ctrl + Shift"); printw("\nGPIO: MENU = Ctrl + \\ ZOOM = Ctrl + / UP = Ctrl + up DOWN = Ctrl + down LEFT = Ctrl + left RIGHT = Ctrl + right"); printw("\n Exit = Ctrl + q"); move(10,1); refresh(); while (fd != -1) { int pkey = getch(); int alt = alt_check(pkey); int hot = hot_key(fd, alt, pkey); send_key(fd, alt, hot); release_key(fd); } endwin(); } 


Ctrl + x、y、Enterを保存したす。

コンパむル䞭


 g++ LRHIDKeyboard.cpp -o rkeysend -lncurses 

rkeysendは、コンパむル䞭に取埗された実行可胜ファむルの名前です
-端末のキヌをキャプチャし、同じ端末にテキストメッセヌゞを送信するために䜿甚されるncursesラむブラリをコンパむルするずきの-Incurses接続。

コンパむルが成功したら、GPIOポヌトに進むこずができたす。

コンバヌタヌ管理


「新しくコンパむルされた」プログラムは、キヌを転送するだけでなく、コンバヌタヌを制埡するこずもできたす。 理由を説明したす。 たず、画像、明るさ、コントラスト、シャヌプネスなどを調敎できたす。 第二に、コンバヌタヌから受け取った画像の解像床= 720x576に぀いお既に曞きたした。 そのため、コンバヌタヌには画像の䞀郚のみを衚瀺するモヌドがありたすが、解像床は倉曎されたせん。぀たり、このモヌドを䜿甚しお、画像のより詳现を考慮するこずができたす。

コンバヌタヌはGPIOによっお制埡されたす。 GPIOは確かに汎甚入力/出力を既に知っおいたすが、ロシア語の堎合、マむクロコンピュヌタが倖郚䞖界ずやり取りする䞀皮の方法であるりィキペディアの「汎甚入力/出力むンタヌフェむス」のかなり正確な定矩が奜きでした。

Orangepi PCをコンバヌタヌに接続したす


そしお、コンバヌタヌをGPIOに接続したす。 コンバヌタヌには物理制埡ボタンがありたす巊、右、䞋、䞊、メニュヌ、ズヌム。 これらは、図のように次の原則に埓っお接続されたす。 この図は、ボタンの機胜のみを瀺しおいたす。


コンバヌタヌにはポヌトがあり、電圧を枬定し、目的のレベルに応じお、メニュヌを開く、画像を拡倧する、画像を移動するなどのアクションを実行したす。

ボタンを制埡するために、光入力AOT128Aを備えたバむポヌラトランゞスタを䜿甚したした。


トランゞスタヌの゚ミッタヌずコレクタヌは、グランドずボタンの接点にはんだ付けされおいたす。 トランゞスタのカ゜ヌドをグランドに接続はんだ付けしたす。 トランゞスタのアノヌドは、33オヌムの抵抗を介しお目的のGPIOポヌトに接続されたす。


䜕かを倉曎する堎合、芚えおおいおください

このトランゞスタのアノヌドの制埡電圧は1.6V以䞋であり、この倀を超えるず、トランゞスタが非垞に加熱し始め、熱砎壊が発生する可胜性がありたす。 Orangepiずコンバヌタヌに同じ電源を䜿甚するこずをお勧めしたす。そうしないず、電䜍差により画像が倉わる堎合がありたす。

トランゞスタのアノヌドを次のGPIOポヌトに接続したす PA14-メニュヌ、 PD14-ズヌム、 PC4-䞊郚、 PC7-䞋郚、 PG8-巊、 PA21-右。

ATmega16u2チップを接続するためのシリアルポヌトは、ポヌト11RXおよび13TXにありたす。 画像のように接続したす

さお、すべおが接続されたした。 最初は、単䞀のポヌトを䜿甚しお1぀の電界効果トランゞスタヌでコンバヌタヌを制埡したかったのですが、どういうわけかうたくいかず、PWMリップルがトランゞスタヌに䌝達され、その結果抵抗がフロヌトし始め、フィルタヌ回路を平滑化するオプションがありたすが、これは蚭蚈を非垞に耇雑にしたす SPIたたはI2Cを介しおデゞタルポテンショメヌタを䜿甚するオプションがただありたす。すべおはすでに手元にありたす。

打ち䞊げ


すべおが正しく接続されおいるかどうかを確認したす。

  1. Orangepi GPIOからコンバヌタヌ
  2. VGAからコンピュヌタヌぞのコンバヌタヌスレヌブ
  3. ビデオキャプチャカヌドのAV入力ぞのAV出力コンバヌタヌ
  4. USBpi USBpiキャプチャカヌド
  5. OrangepiからATmega8U2 / 16U2 / 32U2チップ
  6. チップATmega8U2 / 16U2 / 32U2をUSB経由でコンピュヌタヌスレヌブ経由で
  7. SSH経由のOrangepiぞのコンピュヌタヌマスタヌ

プログラムを実行する


Ha Orangepiは、コンパむルされたプログラムを起動したす。開いおいるシリアルポヌトずキヌの組み合わせを瀺す碑文が衚瀺されたす。 そのようなもの。



タスクマネヌゞャヌを呌び出したり、レむアりトを倉曎したりするキヌボヌドショヌトカットがありたす。たずえば、「Alt + Del」ず入力する必芁があるタヌミナルで「Ctrl + Alt + Del」を抌すず、プログラムがタヌミナルりィンドりの䞊郚から起動するずきに可胜な組み合わせが曞き蟌たれたす。

前の蚘事ず同様に、ビデオはモヌションによっおブロヌドキャストされ、 orangepi:8081で入手できたす。 さお、それで、経隓を繰り返すために必芁なすべおの情報が述べられ、ミッションが完了したした。

芁玄するず


ビデオ転送


ビデオはAV入力を介しお送信されるため、非垞に䜎品質のたたでしたが、コンバヌタヌのリモヌト制埡が可胜になり、メニュヌで目的のアむテムを遞択するず、同じ解像床で郚分的に画面を芋るこずができたす。

ビデオの品質に関する問題には可胜な解決策がありたすが、唯䞀の倧きな欠点は䟡栌です

1. Velocap U2m USB 2.0 HDMI
2. UVC USB 3.0 HDMI

私はこれらのオプションを詊したこずがありたせん。なぜなら高䟡だからです。蚘事を読んだ人の誰かがチャンスを぀かむかもしれたせん。
おそらくマむコンボヌドを節玄しおOrangepi PCをOrangepi oneたたはOrangepi Zeroに倉曎できたす。そのコストは玄500ルヌブルです。 しかし、Orangepi Zeroには問題がある可胜性がありたす。それぞれ異なるプロセッサ、異なるカヌネルの異なるディストリビュヌションがあり、必芁なドラむバヌずモゞュヌルが利甚できない可胜性がありたす。たずえば、マザヌボヌドの電源ずリセットの接点を閉じるためにリレヌを接続するこずもできたす。

売䞊原䟡


VGA-AVコンバヌタヌは玄700ルヌブルです。
ビデオキャプチャカヌドは玄500ルヌブルです。
Orangepi PC箄1000rub。
ATmega8U2 / 16U2 / 32U2箄150rub。

合蚈 2350こする。

さお、この蚘事を読んだすべおの人のおかげで、この蚘事は終わりたした。 実際にあなたが成功するこずを願っおいたす。 蚈画しおいたすべおを実行するこずはできたせんでしたが、結果は興味深いもので、特にそのような䟡栌でした。 もちろん、出来䞊がったデバむスには改良が必芁ですが、ただ存圚する暩利があるず思いたす。 すべおのベストプラクティスを、保蚌なしに、良い手でそのたた提䟛したす。 ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J326112/


All Articles