Wir entwickeln eine Pedal-Firmware, um das Balalaika-Spielen zu lernen

Ich liebe Video-Tutorials wirklich. Aus irgendeinem Grund nehme ich die Informationen aus dem Text persönlich sehr, sehr schlecht wahr. Aber es gibt Dinge, in denen es nicht viele Informationen auf dem Papier gibt. Nehmen wir zum Beispiel die Lektionen des Balalaika-Spielens: Auf YouTube gibt es wunderbare Diskussionen darüber, wie man diese oder jene Melodie spielt (wer interessiert ist, wir suchen nach „Sergey Vorontsov“), aber es ist schwierig, die Sequenz aus dem Streaming-Video zu wiederholen und auswendig zu lernen. Es ist notwendig, entweder auf Papier zu schreiben (nach den Kommentaren in den Lektionen zu urteilen, manche tun dies) oder zusätzliche Materialien zu kaufen (aber ich bin nicht gierig, aber heimelig).



Im Allgemeinen muss ich in meinem Balalaika-Fall und bei vielen anderen so vorgehen: Ich schaute auf das Fragment, hielt es an, wiederholte es mehrmals hinter dem Autor und schaute weiter zu. Wenn etwas nicht klar ist - zurückgespult, genauer hinsehen. Aber wie kann man alles aufwickeln, wenn die Hände beschäftigt sind? Außerdem sind sie in meinem Fall beschäftigt, wenn auch nicht mit einem riesigen Knopfakkordeon, aber immer noch mit einigen, aber mit einer Balalaika. Sie müssen also mit Ihren Beinen arbeiten.

Vor vielen, vielen Jahren, als alle fortschrittlichen Menschen PS / 2-Tastaturen verwendeten, brachten sie uns Dutzende von USB-Tastaturen für das Projekt. Natürlich haben wir sie an eine Maschine angeschlossen, bei einer von ihnen Strg, bei der zweiten Alt und bei der dritten Taste Entf gedrückt. Der Effekt wurde erreicht. Seitdem weiß ich, dass USB-Tastaturen vollständig parallel arbeiten, sodass Sie eine andere anschließen können, um der Haupttastatur zu helfen, die stattdessen einige Codes sendet.

So entstand die Idee, ein Pedal zu bauen, das sich als Tastatur ausgibt und Spielersteuercodes sendet. Als Player habe ich mich zunächst für VLC Player entschieden, da dieser über gut dokumentierte Steuertasten verfügt. Später stellte sich jedoch heraus, dass die von mir ausgewählten Codes beim Ansehen von Videos auf YouTube im Vollbildmodus genau den gleichen Zweck hatten. Dies ist gut, da bei mehreren Online-Ansichten für die Eindrücke der Werbung etwas in den Sinn des Autors zu fallen scheint. Das Herunterladen anzusehen wäre nicht so ethisch.

Also fangen wir an, das Gerät zu entwerfen.

Arbeitslogik


Zuerst wollte ich mehrere Pedale bauen, jedes für seine eigene Funktion. Anfangs habe ich 3-4 dieser Funktionen gezählt: Ein, Aus, Wind dort, Wind zurück. Aber dann fand ich heraus, wie viel Plastik es kosten würde und wie ich die Pedale durch Berühren verstehen würde, und war traurig. Daher wurde beschlossen, die gesamte Logik radikal zu überarbeiten. Welche Funktionen werden überhaupt benötigt? Start-Stopp, aber es hängt oft an derselben Taste, normalerweise an einem Leerzeichen. Und zurückspulen. Der VLC-Player verfügt über "Umschalt + Links". Wie sich herausstellte, auch YouTube. Und wenn Sie so denken, gibt es keine Funktionen mehr.

Großartig! Lassen Sie das Pedal kurz die Funktion "Start-Stopp" und lange die Funktion "Rücklauf" verwenden.

In Zukunft können Sie die Funktionalität erweitern. Sie können das Pedal trainieren, um den Morsecode zu erkennen. Nachdem meine Frau von der Idee erfahren hatte, schlug sie vor, Steuerimpulse mit Elementen irischer Tänze zu codieren ... Im Allgemeinen können Sie die Funktionalität nach Belieben erweitern. Eines ist jedoch klar: Ein Pedal reicht aus. Nun werden wir lange und kurze Pressen erkennen.

Die Mechanik


Für diejenigen, die zu Hause in Hausschuhen gehen, gibt es eine sehr einfache Lösung (ich habe sie auf der Thingiverse-Website gefunden). Wir nehmen einen Knopf mit einem Durchmesser von mehr als einem Zentimeter, schrauben ihn in ein kastenförmiges Objekt und bekommen ein Pedal. Das Problem ist, dass ich keine Hausschuhe mag, daher passt diese Option nicht zu mir persönlich. Ich brauche eine größere Oberfläche, damit der Fuß nicht weh tut.

Pedale in großen Mengen werden bei Ali Express verkauft, Sie sollten nach dem Wort Fußschalter suchen. Die Preise dort beginnen bei 30 Rubel, aber bei diesem Preis können die Versandkosten etwa vierhundert Rubel betragen. Nach der Suche stellte ich fest, dass es durchaus möglich ist, ein Pedal zu finden, für das die Summe „Preis plus Lieferung“ 150 Rubel beträgt. Aber Sie müssen durchschnittlich ein paar Monate warten (ich habe hier vor kurzem alle drei Monate auf eine SD-Karte gewartet).

Also ging ich den schnelleren Weg: machte ein Pedal auf einem 3D-Drucker. Persönliche Erfahrungen (und alle Optionen mit Thingiverse) zeigen, dass die Achse aus Metall sein muss, sonst bricht alles schnell. Ich nahm meine vorhandene M6x60-Möbelschraube mit der daran befestigten Mutter sowie den Knopf (PSW-13) in den angrenzenden Radioteilen und kreiste sie so plastisch wie möglich ein. So sahen die Ausgangsmaterialien aus:



Hier werden sie in die untere Hälfte eingesetzt. Wie Sie sehen können, sind die Wände mindestens vier Millimeter dick. Mit diesen Parametern wird sogar ein sanfter Prototyp sehr langlebig. Der Knopf ist ohne Mutter installiert, da jede Leere darunter zum Bruch des Kunststoffs führt und ziemlich gut hält.



Hier ist eine fast kompilierte Version:



Und hier ist die Pedalbaugruppe:



Im Prinzip werde ich die STL-Dateien anhängen, aber die Lösung war nicht perfekt. Trotzdem kann es jeder wiederholen (wenn er die M6x60-Schraube mit der entsprechenden Mutter und der PSW-13-Taste findet). Genug zum ersten Mal und dann - Sie können Mechanik stempeln und bei ALI bestellen.

USB-Gerät


Obwohl ich in letzter Zeit aktiv für PSoC geworben habe, ist die Verwendung auf den Pedalen eine unerhörte Verschwendung. Ich halte die beste Lösung für ein Steckbrett auf Basis von STM32F103C8T6, das jetzt bei ALI Express für ca. 120 Rubel (einschließlich Lieferung) bestellt werden kann.



Natürlich können wir spekulieren, dass es billigere Boards gibt, die auf AVR basieren, aber der Preisunterschied ist dort nicht signifikant, und STM32 hat aufgrund des Debuggens über JTAG deutlich weniger Entwicklungszeit. Eine Stunde Zeit (auch zu Hause) - es kostet auch etwas. Nach dem Gesamtkriterium „Gerätepreis + Arbeitskosten“ ist STM32F103 die beste Option für diese Aufgabe. Darüber hinaus habe ich anderthalb Dutzend solcher Modelle für einen solchen Fall auf Lager, sodass die Wartezeit für die Lieferung für mich jetzt Null ist.

Ich habe im Internet nach fertigen USB-Tastaturen gesucht, die auf diesem Chip basieren. Ich habe einen Artikel über Habr gefunden, wie man eine USB-Maus herstellt. Aber ich brauche eine Tastatur. Zum Thema Tastaturen fand ich in den Foren viele clevere Tipps (aber ich wollte etwas fertiges) und ein paar fertige, aber komplexe Projekte auf GitHub (aber ich wollte etwas klares). Aber wer sucht, wird immer finden. Hier ist ein wunderbarer Artikel, in dem alles enthalten ist, was benötigt wird (obwohl es einen im Code gibt, habe ich keine Angst vor diesem nicht-russischen Wort, einem potenziellen DeadLock, aber ich werde meinen eigenen Code schreiben). Die Hauptsache ist, dass alle Schritte darin klar beschrieben sind, wie man eine USB-Tastatur von einem fertigen „Fisch“ aus Cube MX erhält. Das einzige, was der Autor nicht tat, war, die Schlüsselcodes nicht zu veröffentlichen. Fügen Sie sie hier hinzu:



Die Fliege in der Salbe ist, dass in der modernen Version von Cube MX die Namen von Dateien, Funktionen und sogar Konstanten geringfügig von den in diesem Artikel angegebenen abweichen, aber analog ist alles schnell gefunden. Ich könnte eine neue Version des Textes schreiben, aber wo ist die Garantie, dass die Entwickler nicht alles wieder ändern werden? Sie machen es gerne. Im Allgemeinen können Sie die Analoga in meinem Beispiel sehen.

Also. Ich habe in Cube MX ein Basisprojekt erstellt und alle im oben genannten Artikel empfohlenen Änderungen vorgenommen. Was weiter? Fügen Sie als Nächstes eine Beschreibung des Schaltflächenanschlusses hinzu. Ich habe mich für PB12 entschieden (nur weil sich der entsprechende Kontakt an der Ecke des Steckbretts befindet). Da ich in der mcucpp-Bibliothek von Konstantin Chizhov immer mit Eisen arbeite, entfernen wir die Makrodefinition „-C99“ in den Projekteigenschaften, benennen main.c in main.cpp um und fügen dann die Deklaration hinzu:

typedef Mcucpp::IO::Pb12 pedal1; 

Wir fügen der main () -Funktion eine Portinitialisierung hinzu (Aktivieren der Portuhr, Einstellen der Beinrichtung, Einschalten des Hosenträgers):

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

Eigentlich ist alles initialisiert. Ich beschloss, den Hauptteil nach dem Vorbild des Verilog-Prozesses zu bauen. Ich weiß nicht warum, ich wollte nur. Der Prozess wird normalerweise bei Taktimpulsen aufgerufen. Ich entschied, dass System-Ticks perfekt als Ticks verstanden werden. Daher wurde die reguläre Funktion des System- Tick-Handlers in der Datei stm32f1xx_it.c wie folgt hinzugefügt:



Gleicher Text:
 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 */ } 


Ich habe die TickProcess () -Funktion selbst in main gesetzt. cpp . Betrachten Sie es zuerst in seiner Gesamtheit, dann in Teilen.

Hier ist die volle Funktion:
 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; } } 


Die erste Aufgabe, die in diesem Handler implementiert wird, ist einfach. Alle 20 Millisekunden senden wir einen Bericht mit Informationen zu den gedrückten Tasten (wenn keine Tasten vorhanden sind, senden wir trotzdem nur mit Nullen). Da die Funktion jede Millisekunde aufgerufen wird, sollte der Bericht an einen seiner zwanzig Aufrufe gesendet werden. Dazu steht am Anfang der Funktion eine Variable:

  static int localTick = 0; 

und den Code am Ende (wir senden die Daten, danach löschen wir den Puffer, um ab der nächsten Sitzung Nullen zu senden):

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

Die zweite Aufgabe ist komplizierter. Es verfolgt die Art des Drückens des Pedals und füllt den Bericht für die spätere Einreichung. Warum habe ich gesagt, dass Ideologie wie Verilog ist? Weil ich immer Unterschiede in dieser Sprache sehe: Ich habe eine Variable, in der der aktuelle Status der Schaltfläche platziert ist:

  bool bButtonState = pedal1::IsSet(); 

und es gibt eine Variable, in der ihr vorheriger Zustand gespeichert ist (wie wir uns erinnern, ist der vorherige Zustand der Zustand der Taste während der vorherigen Interrupt-Verarbeitung vom 1-ms-Timer):

  static bool bButtonStatePrev; 

Die gedrückte Taste gibt den Wert false an , die gedrückte Taste - true . Somit können wir immer auf den dynamischen Zustand der Schaltfläche schließen:

bButtonStatebButtonStatePrevZustand
wahrwahrLange veröffentlicht
wahrfalschFreigegeben auf der vorherigen Maßnahme
falschwahrBei vorheriger Maßnahme gedrückt
falschfalschLange gedrückt

Wir führen zwei Konstanten ein. Man stellt die kurze Presszeit ein. Wenn die Presse weniger als 700 ms dauerte, ist sie von kurzer Dauer. Die Sekunde legt die Zeit fest, zu der die automatische Wiederholung aktiviert ist. Wenn Sie kurz nach siebenhundert Millisekunden mit dem Senden des Schlüsselcodes beginnen, beginnt der Player zu abrupt zu wickeln. Dies wird empirisch identifiziert. Daher lautet die Arbeitslogik wie folgt: Nach 700 ms wird ein einzelner Code „Shift + Left“ gesendet, wonach der Benutzer die Möglichkeit erhält, das Pedal loszulassen. Wenn das Pedal weiterhin gehalten wird, beginnt bereits ab der zweiten Sekunde das ständige Senden dieses Codes, bis das Pedal losgelassen wird.

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

Die Zeit, während der die Taste gedrückt wird, wird in einer Variablen gespeichert:

  static int tickDuringButton = 0; 

Wenn die Taste gerade gedrückt wurde, setzen wir diese Variable auf Null und beginnen, einen neuen Zeitraum zu messen:

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

Wenn die Taste gerade losgelassen wurde, überprüfen wir die Uhrzeit, zu der sie gedrückt wurde. Wenn auch nur ein bisschen (jetzt heißt es "weniger als 100 ms") - das ist ein Geschwätz. Dies zählt nicht. Ignorieren Sie diesen Klick. Wenn wir nicht mehr als die Dauer der kurzen Presse tun, werden die langen Pressen unten verarbeitet. Wenn wir innerhalb kurzer Zeit einen Bericht im Puffer mit einem Leerzeichen erstellen (der gesendet wird, wenn die Zeit dafür gekommen ist):

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

Wenn die Taste längere Zeit gedrückt gehalten wurde, senden wir in zwei Fällen „Umschalt + Links“:

  • die Taste wird genau 700 ms gehalten (Einzelpaket);
  • Die Taste wird länger als 2 Sekunden gedrückt gehalten (jeder nachfolgende Bericht wird gesendet, bis die Taste losgelassen wird).

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

Das ist in der Tat alles. Dieser Code unterscheidet sich nicht mehr von dem „Fisch“, den Cube MX für uns gemacht hat. Wir montieren, flashen ... Nein, es ist unmöglich ohne Fehler (hier sind sie alle gefangen, aber ich konnte anfangs nicht ohne sie auskommen), wir identifizieren sie in 10 Minuten per JTAG-Debugging (Hallo an AVR), wir nähen, wir sind glücklich ...

Alternatives Design


Im Allgemeinen sind solche Dinge ohne Balalaika (oder andere Betrachtung von Video-Tutorials) nützlich. Insbesondere lese ich gerne die Nachrichten, im Bett liegend, mit einem Laptop auf dem Bauch. Um den Text zu scrollen, müssen Sie Ihre rechte Hand die ganze Zeit gebeugt halten, was zu Schmerzen im Ellbogen führt. Daher habe ich lange von einem großen roten Knopf geträumt, der Seiten scrollen kann, ohne meinen Arm zu beugen. Tatsächlich kann es aus den gleichen Komponenten wie das Pedal hergestellt werden, wobei die Möbelschraube durch eine kleine Menge Heißkleber ersetzt wird. Gesamt: PSW13-Taste, STM32F103C8T6-Steckbrett, Kunststoff für 3D-Drucker, Schmelzkleber. Nun, in der "Firmware" habe ich die Codes durch kurzes Drücken durch "PgDn" und durch langes Drücken durch "Up" ersetzt.





Fazit


Sie können Ihre Beine verwenden, um die Anzeige von Video-Tutorials zu steuern, wenn Ihre Hände beschäftigt sind. Dazu nur ein Pedal, das die Bedienung der USB-Tastatur simuliert. Ein Pedal kann mehrere Tastencodes senden und diese basierend auf verschiedenen Arten von Tastenanschlägen auswählen. Der Artikel betrachtet ein Pedal, das zwei Typen analysiert (kurzes und langes Drücken).

Die Mechanik finden Sie in Ali Express unter dem Wort Fußschalter oder können auf einem 3D-Drucker gedruckt werden. Als Elektronik kann das Steckbrett STM32F103C8T6 verwendet werden. "Firmware" wird in weniger als einer Stunde auf der Grundlage des von Cube MX vom Hersteller der Steuerungen STM32 erstellten "Fischs" erstellt. Zusätzlicher Code belegt mehrere Textbildschirme (für eine Auflösung von 2K - ein Bildschirm).

Im Allgemeinen wurde das gesamte Gerät (Mechanik + „Firmware“) an einem Abend vollständig entworfen. Außerdem dauerte das Drucken der Mechanik auf einem 3D-Drucker etwa vier Stunden.

Hier können fertige STL-Dateien für den Pedaldruck heruntergeladen werden (es ist wünschenswert, das obere Element um 0,4 mm abzusenken, um eine große Anzahl von Stützen zu vermeiden: Die Oberfläche ist leicht gerundet, wodurch das Modell abgesenkt wird, wird das gedruckte Teil flach gemacht).

STL-Dateien des "großen roten Knopfes" können hier heruntergeladen werden .

Hier können vorgefertigte Quelldateien für das Projekt und die HEX-Datei für die Firmware heruntergeladen werden .

Das Datum der Veröffentlichung dieses Artikels wurde nicht zufällig ausgewählt. Der Rat entschied, dass es besser ist, an diesem Tag einen Artikel über solche Dinge auf einer seriösen Website zu veröffentlichen. Wenn Sie sich jedoch die Videos ansehen, die in den Sätzen „Alexey Arkhipovsky“, „Dmitry Kalinin“, „Cranberry Show“ und „Alexey Kodenko“ zu finden sind, wird klar, dass die akademische Balalaika wie ein Assembler ist. Sowohl dort als auch dort verbinden sich absolute Einfachheit und hektische Ausdruckskraft. Und unter dem Satz "Sergey Vorontsov" können Sie verstehen, wie man lernt, wie man dieses Werkzeug benutzt.

Ergänzung


Nach 8 Monaten Betrieb begann der PSW-13-Knopf einmal von vielen zu funktionieren, und zwar nur mit sehr starkem Druck. Beim Versuch zu ersetzen stellte sich ein sehr interessantes Detail heraus. Der neue Knopf, der gleichzeitig mit dem vorherigen gekauft wurde, hat eine völlig andere Gangreserve und arbeitet in einer völlig anderen Position. Infolgedessen war sie immer auf meinem Pedal gedrückt. Ich musste es mit einem Dremel mahlen. Wer wird meine Mechanik wiederholen - denken Sie daran. Möglicherweise müssen Sie die Schaltfläche mit einer Datei ändern oder umgekehrt - formen Sie ein elektrisches Klebeband darauf, um sie zu vergrößern. Die Wiederholbarkeit des Kunststoffteils dieses Knopfes war nicht sehr. Aber im Allgemeinen - nach einer solchen Überarbeitung funktioniert alles wieder.

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


All Articles