バララむカを挔奏するためのペダルファヌムりェアを開発しおいたす

ビデオチュヌトリアルが倧奜きです。 䜕らかの理由で、私は個人的にテキストからの情報を非垞にひどく知芚しおいたす。 しかし、玙にはあたり情報がないものがありたす。 たずえば、バララむカの挔奏のレッスンを考えおみたしょう。YouTubeでは、このメロディたたはそのメロディ興味のある方は「Sergey Vorontsov」を探しおいたすの挔奏方法に぀いお玠晎らしい議論がありたすが、ストリヌミングビデオのシヌケンスを繰り返し蚘憶するこずは困難です。 玙に曞き留めるレッスン䞭のコメントから刀断しお、そうする人もいたすか、远加の資料を賌入する必芁がありたすしかし、私は貪欲ではありたせんが、手䜜りです。







䞀般に、私のバララむカの堎合、および他の倚くの堎合、私はこのように行かなければなりたせん断片を芋お、それを䞀時停止し、著者の埌にそれを数回繰り返し、芋続けたした。 䜕かが明確ではない堎合-巻き戻し、より密接に芋えた。 しかし、あなたの手が忙しい堎合、それをすべお巻き䞊げる方法は さらに、私の堎合、巚倧なアコヌディオンではなくおも、いく぀かはあるがバララむカでは忙しい。 だから、あなたは自分の足で䜜業する必芁がありたす。



䜕幎も前、進歩的な人類党員がPS / 2キヌボヌドを䜿甚しおいたずき、圌らはプロゞェクトのために䜕十ものUSBキヌボヌドを持っおきたした。 もちろん、それらを1台のマシンに接続し、1台でCtrlを抌し、2台目でAltを抌し、3台目でDelを抌したした。 効果が達成されたした。 それ以来、USBキヌボヌドは完党に䞊列に動䜜するこずを知っおいるので、別のキヌボヌドを接続しおメむンキヌボヌドを助け、代わりにいく぀かのコヌドを送信できたす。



そこで、キヌボヌドのふりをしお、プレヌダヌの制埡コヌドを送信するペダルを䜜るずいうアむデアが生たれたした。 プレヌダヌずしお、最初はVLCプレヌダヌを遞択したした。これは、コントロヌルボタンが十分に文曞化されおいるためですが、埌で遞択したコヌドは、フルスクリヌンモヌドでYouTubeのビデオを芋るずきにたったく同じ目的を持぀こずがわかりたした。 これは良いこずです。耇数のオンラむンビュヌでは、広告の印象に察しお、䜕かが䜜者の頭に浮かぶようです。 ダりンロヌドされた動画を芋るのはそれほど倫理的ではありたせん。



そのため、デバむスの蚭蚈を開始したす。



䜜業ロゞック



最初は、いく぀かのペダルを䜜りたいず思いたした。それぞれが独自の機胜を備えおいたす。 最初に、これらの機胜の3〜4をカりントしたした。オン、オフ、そこでの颚、颚の戻り。 しかし、それから私はそれがどれくらいのプラスチックを必芁ずするかを考え出したした-タッチでペダルを理解する方法、そしお悲しかったです。 そのため、ロゞック党䜓を根本的に修正するこずが決定されたした。 どんな機胜が必芁ですか スタヌトストップ。ただし、倚くの堎合、同じキヌ、通垞はスペヌスでハングしたす。 そしお巻き戻し。 VLC Playerには「Shift +巊」がありたす。 結局のずころ、YouTubeも刀明したした。 そしお、あなたがそう思うなら、それ以䞊の機胜はありたせん。



いいね ペダルに「スタヌト-ストップ」機胜を短時間䜿甚させ、長い-「巻き戻し」機胜を䜿甚させたしょう。



将来的には、機胜を拡匵できたす。 モヌルス信号を認識するようにペダルをトレヌニングできたす。 この考えを知った劻は、アむリッシュダンスの芁玠を䜿甚しお制埡むンパルスをコヌディングするこずを提案したした...䞀般に、必芁に応じお機胜を拡匵できたす。 しかし、1぀のこずは明らかです。1぀のペダルで十分です。 さお、今は長抌しず短抌しの認識を行いたす。



力孊



家でスリッパで歩く人には、非垞に簡単な解決策がありたすThingiverseのWebサむトで芋぀けたした。 盎埄が1センチを超えるボタンを取り、箱型のオブゞェクトにねじ蟌み、ペダルを取埗したす。 問題は、私はスリッパが奜きではないずいうこずです。そのため、このオプションは個人的には適しおいたせん。 足が痛くないように、より広い面が必芁です。



倧量のペダルがアリ゚クスプレスで販売されおいたす。フットスむッチずいう単語を怜玢する必芁がありたす。 そこの䟡栌は30ルヌブルから始たりたすが、この䟡栌では配送費甚は玄400ルヌブルになりたす。 怜玢した埌、「䟡栌ず配送料」の合蚈が150ルヌブルになるペダルを芋぀けるこずが可胜であるこずがわかりたした。 ただし、平均で数か月埅たなければなりたせん最近3か月間SDカヌドを賌入したした。



それで、私はより速い方法で行きたした3Dプリンタヌでペダルを䜜りたした。 個人的な経隓およびThingiverseのすべおのオプションは、軞が金属でなければならないこずを瀺しおいたす。そうでなければ、すべおがすぐに壊れおしたいたす。 ナットが取り付けられた既存のM6x60家具甚ボルトず、隣接するラゞオパヌツにあるボタンPSW-13を取り、できる限りプラスチックのように茪郭を描きたした。 これが゜ヌス資料の芋た目です







䞋半分に挿入されおいたす。 ご芧のずおり、䞻な蚭蚈䞊の特城は、少なくずも4ミリメヌトルの厚さの壁です。 これらのパラメヌタヌを䜿甚するず、穏やかなプロトタむパヌでも非垞に耐久性が高くなりたす。 ボタンは、ナットなしで取り付けられたす。その䞋に空の郚分があるず、プラスチックが砎損し、非垞によく保持されたす。







これはほずんどコンパむルされたバヌゞョンです







ペダルアセンブリは次のずおりです。







原則ずしお、STLファむルを添付したすが、解決策は完党ではありたせんでした。 それでも、誰でもそれを繰り返すこずができたす察応するナットずPSW-13ボタンが付いたM6x60ボルトを芋぀けた堎合。 はじめお十分です-メカニックにスタンプを抌しおALIで泚文できたす。



USBデバむス



最近PSoCを積極的に宣䌝しおいたすが、ペダルでPSoCを䜿甚するこずは前䟋のない無駄です。 最良の゜リュヌションはSTM32F103C8T6に基づいたブレッドボヌドであり、ALI Expressで玄120ルヌブル配送を含むで泚文できるようになりたした。







もちろん、AVRに基づいた安䟡なボヌドがあるず掚枬できたすが、䟡栌差はそれほど倧きくなく、STM32はJTAGを介したデバッグにより開発時間が倧幅に短瞮されたす。 1時間自宅でも-費甚もかかりたす。 したがっお、「デバむスの䟡栌+人件費」ずいう総合基準によれば、STM32F103はこのタスクに最適なオプションです。 さらに、このような堎合に備えお、このようなモックアップを12ダヌス甚意しおいるので、配達埅機時間はれロになりたした。



このチップをベヌスにした既補のUSBキヌボヌドのネットサヌフィンをしたした。 Habrに関する蚘事でUSBマりスの䜜り方を芋぀けたした。 しかし、キヌボヌドが必芁です。 キヌボヌドのトピックに぀いおは、フォヌラムでたくさんの賢いヒントを芋぀けたしたしかし、䜕か準備ができおいたらよかったです。 しかし、求める者は垞に芋぀けたす。 必芁なものがすべお揃っおいる玠晎らしい蚘事を次に瀺したすコヌドには1぀ありたすが、この非ロシア語ずいう朜圚的なDeadLockを恐れおいたせんが、独自のコヌドを䜜成したす。 䞻なこずは、すべおの手順が明確に蚘述されおいるこずです。CubeMXで䜜成された完成した「魚」からUSBキヌボヌドを取埗する方法です。 著者がしなかった唯䞀のこずは、キヌコヌドを公開しないこずでした。 ここに远加したす







軟膏のパは、最新バヌゞョンのCube MXでは、ファむル、関数、さらには定数の名前もその蚘事で指定されたものずわずかに異なりたすが、類掚によっおすべおがすぐに芋぀かりたす。 新しいバヌゞョンのテキストを曞くこずはできたすが、開発者が再びすべおを倉曎しないずいう保蚌はどこにありたすか 圌らはそれをするのが奜きです。 䞀般的に、私の䟋ではアナログを芋るこずができたす。



だから。 Cube MXで基本プロゞェクトを䜜成し、䞊蚘の蚘事で掚奚されおいるすべおの倉曎を加えたした。 次は 次に、ボタンポヌトの説明を远加したす。 PB12を遞択したした察応する連絡先がブレッドボヌドの隅にあるためです。 私は垞にKonstantin Chizhovのmcucppラむブラリを䜿甚しお鉄を扱うため、プロゞェクトプロパティの「-C99」マクロ定矩を削陀し、 main.cの名前をmain.cppに倉曎しおから、宣蚀を远加したす。



typedef Mcucpp::IO::Pb12 pedal1;
      
      





main関数にポヌト初期化を远加したすポヌトクロッキングを有効にし、脚の方向を蚭定し、サスペンダヌをオンにしたす



 pedal1::ConfigPort::Enable(); pedal1::SetDirRead(); pedal1::SetPullUp (pedal1::Port::PullUp);
      
      





実際には、すべおが初期化されたす。 Verilogプロセスのむメヌゞで本䜓を䜜成するこずにしたした。 理由がわかりたせん、ただしたかっただけです。 このプロセスは通垞、クロックパルスで呌び出されたす。 システムティックは完党にティックずしお取埗されるこずにしたした。 そのため、 stm32f1xx_it.cファむルのシステムティックハンドラヌの通垞の機胜が次のように远加されたした。







同じテキスト
 void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); /* USER CODE BEGIN SysTick_IRQn 1 */ TickProcess(); /* USER CODE END SysTick_IRQn 1 */ }
      
      







TickProcess関数自䜓をmainに配眮したす。 cpp 。 最初に党䜓を怜蚎し、次に郚分的に怜蚎したす。



完党な機胜は次のずおりです。
 uint8_t report [8] = {0,0,0,0,0,0,0,0}; uint32_t* pReport = (uint32_t*)report; extern "C" void TickProcess() { //      20!!! static const int shortTime = 700; //      static const int longTime = 2000; //    static int localTick = 0; static int tickDuringButton = 0; static bool bButtonStatePrev; bool bButtonState = pedal1::IsSet(); //     if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; } //     if (bButtonState && (!bButtonStatePrev)) { //       //  ,  50  () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { //    report [2] = 0x2C; } } //    if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { //  Shift+ report [0] = 2; // Shift report [2] = 0x50; //  } } //    bButtonStatePrev = bButtonState; tickDuringButton += 1; if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; } }
      
      







このハンドラヌで実装される最初のタスクは簡単です。 20ミリ秒ごずに、抌されたボタンに関する情報を含むレポヌトを送信したすボタンがない堎合は、れロだけで送信したす。 関数はミリ秒ごずに呌び出されるため、レポヌトは20の呌び出しのいずれかに送信する必芁がありたす。 これを行うには、関数の先頭に倉数がありたす。



  static int localTick = 0;
      
      





最埌のコヌドデヌタを送信した埌、次のセッションかられロの送信を開始するためにバッファヌを消去したす



  if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; }
      
      





2番目のタスクはより耇雑です。 ペダルを螏む性質を远跡し、埌続の提出のためにレポヌトを埋めたす。 むデオロギヌはVerilogに䌌おいるず蚀ったのはなぜですか 私はい぀もそのような蚀語の違いをキャッチしおいるので、ボタンの珟圚の状態を栌玍する倉数がありたす



  bool bButtonState = pedal1::IsSet();
      
      





たた、以前の状態が保存される倉数がありたす思い出すように、以前の状態は、1 msタむマヌからの以前の割り蟌み凊理䞭のボタンの状態です。



  static bool bButtonStatePrev;
      
      





抌されたボタンの倀はfalse 、抌されたボタンの倀はtrueです。 したがっお、ボタンの動的な状態に぀いおはい぀でも結論付けるこずができたす。



bButtonState bButtonStatePrev 状態
本圓 本圓 長いリリヌス
本圓 停 前のメゞャヌでリリヌス
停 本圓 前の小節で抌された
停 停 長抌し


2぀の定数を導入したす。 短抌しの時間を蚭定したす。 プレスの持続時間が700ミリ秒未満の堎合は、短呜です。 2番目は、自動リピヌトがオンになる時間を蚭定したす。 700ミリ秒埌にキヌコヌドの送信を開始するず、プレヌダヌは急激に巻き始めたす。 これは経隓的に特定されおいたす。 したがっお、䜜業のロゞックは次のずおりです。700ミリ秒埌、単䞀のコヌド「Shift + Left」が送信され、その埌、ナヌザヌはペダルを攟す機䌚を䞎えられたす。 ペダルを抌し続けおいる堎合、2秒からは、ペダルが攟されるたでこのコヌドの継続的な送信が既に開始されおいたす。



  const int shortTime = 700; //      const int longTime = 2000; //   
      
      





ボタンが抌されおいる時間は倉数に保存されたす



  static int tickDuringButton = 0;
      
      





ボタンが抌されたばかりの堎合、この倉数をれロにしお、新しい期間の枬定を開始したす。



  //     if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; }
      
      





ボタンがリリヌスされたばかりの堎合は、抌された時間を確認したす。 ほんの少し今では「100ミリ秒未満」ず衚瀺されおいたす-これはおしゃべりです。 これはカりントされたせん。 このクリックは無芖しおください。 短抌しの時間を超えお䜕もしない堎合、長抌しが䞋で凊理されたす。 短抌しで、バッファにレポヌトを䜜成したすスペヌスが空いた状態でレポヌトが䜜成されたす。



  //     if (bButtonState && (!bButtonStatePrev)) { //       //  ,  100  () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { //    report [2] = 0x2C; } }
      
      





ボタンが長抌しされおいる堎合、次の2぀の堎合に「Shift +巊」を送信したす。





  //    if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { //  Shift+ report [0] = 2; // Shift report [2] = 0x50; //  } }
      
      





実際、それがすべおです。 このコヌドは、Cube MXが䜜成した「魚」ずは違いたせん。 組み立お、フラッシュ...いいえ、゚ラヌなしでは䞍可胜ですここではすべお捕たえられたしたが、最初はそれらなしではできたせんでした、JTAGデバッグAVRにこんにちはを介しお10分でそれらを識別し、瞫補しおいたす、私たちは幞せです...



代替蚭蚈



䞀般的に、そのようなこずはバララむカたたはビデオチュヌトリアルの他の芖聎なしで䟿利です。 特に、私はベッドの䞊に暪たわり、腹郚にラップトップを眮いおニュヌスを読むのが奜きです。 テキストをスクロヌルするには、垞に右手を曲げおおく必芁があり、これはひじの痛みに぀ながりたす。 したがっお、長い間、腕を曲げずにペヌゞをスクロヌルできる倧きな赀いボタンを倢芋おきたした。 実際には、家具のボルトを少量のホットグルヌに眮き換えお、ペダルず同じコンポヌネントで䜜るこずができたす。 合蚈PSW13ボタン、STM32F103C8T6ブレッドボヌド、3Dプリンタヌ甚プラスチック、ホットメルト接着剀。 さお、「ファヌムりェア」では、短抌しで「PgDn」に、長抌しで「Up」にコヌドを眮き換えたした。











おわりに



足を䜿っお、手が忙しいずきにビデオチュヌトリアルの衚瀺を制埡できたす。 これを行うには、USBキヌボヌドの操䜜をシミュレヌトする1​​぀のペダルだけです。 1぀のペダルで耇数のキヌコヌドを送信し、さたざたなタむプのキヌストロヌクに基づいお遞択できたす。 この蚘事では、2぀のタむプ短抌しず長抌しを解析するペダルに぀いお怜蚎したす。



メカニズムは、アリ゚クスプレスの「フットスむッチ」ずいう蚀葉で芋぀けるこずができ、3Dプリンタヌで印刷するこずもできたす。 電子機噚ずしお、ブレッドボヌドSTM32F103C8T6を䜿甚できたす。 「ファヌムりェア」は、STM32コントロヌラヌのメヌカヌのCube MXによっお䜜成された「魚」に基づいお1時間以内に実行されたす。 远加のコヌドは、テキストのいく぀かの画面を占有したす2Kの解像床-1画面。



䞀般に、デバむス党䜓機械+「ファヌムりェア」は1晩で完党に蚭蚈され、3Dプリンタヌでメカニックを印刷するのに玄4時間かかりたした。



ペダル印刷甚の準備ができたSTLファむルはここからダりンロヌドできたす 倚数のサポヌトを避けるために、トップ芁玠を0.4 mm䞋げるこずが望たしいです衚面がわずかに䞞くなっおいるこずが刀明し、モデルを䞋げるず、印刷郚分が平らになりたす。



「倧きな赀いボタン」のSTLファむルは、 ここからダりンロヌドできたす 。



プロゞェクトの既補の゜ヌスファむルずファヌムりェアのHEXファむルは、 ここからダりンロヌドできたす 。



この蚘事の公開日は偶然ではありたせん。 評議䌚は、そのようなこずに関する蚘事をその日、深刻なサむトに掲茉する方が良いず刀断したした。 しかし実際には、「Alexey Arkhipovsky」、「Dmitry Kalinin」、「Cranberry Show」、「Alexey Kodenko」ずいうフレヌズで芋぀かったビデオを芋るず、アカデミックバララむカはアセンブラヌのようなものであるこずが明らかになりたす。 そこには、絶察的なシンプルさず必死の衚珟力が組み合わされおいたす。 「Sergey Vorontsov」ずいうフレヌズにより、このツヌルの䜿甚方法を孊ぶこずができたす。



加算



8か月操䜜した埌、PSW-13ボタンは倚くの機胜のうち1぀で機胜し始め、非垞に匷い圧力がかかった。 亀換しようずするず、非垞に興味深い詳现が刀明したした。 前のボタンず同時に賌入した新しいボタンは、たったく異なるパワヌリザヌブを持ち、たったく異なる䜍眮で動䜜したす。 その結果、圌女はい぀も私のペダルを螏んでいたした。 ドレメルでそれを挜かなければなりたせんでした。 誰が私の力孊を繰り返すのか-芚えおおいおください。 ボタンをファむルで修正するか、その逆を行う必芁がある堎合がありたす-増加させるために、電気テヌプをスカルプトしたす。 このボタンのプラスチック郚分の再珟性はそれほど高くありたせんでした。 しかし、䞀般的に-そのような改蚂の埌、すべおが再び動䜜したす。



All Articles