Herkenning van spraakopdrachten op een microcontroller. LED-spraakbesturing maken met Arduino

Weet je nog hoe een paar jaar geleden (en misschien zelfs nu) het idee om het licht in een kamer te regelen door in je handen te klappen populair was? Maar het is erg handig, je ligt in bed, te lui om op te staan ​​en het licht uit te doen met een klap in je handen, of we gaan naar huis, het is donker, het duurt lang om de schakelaar te vinden, en dan vanaf de drempel klinkt een klap of twee en het licht is al aan. Het lijkt mij dat dit concept nog steeds relevant is, maar het kan op meer worden toegepast hoge technologie vergeleken met wat het 5 jaar, 10 jaar geleden was. Nu kun je voor een relatief klein bedrag meerdere onderdelen kopen en het ontwerp erop programmeren soortgelijke functies, die hieronder zullen worden besproken.

Vandaag zullen we kijken naar een module die is ontworpen om te herkennen spraakopdrachten(inclusief alleen stemmen binnen een opgenomen spraakopdracht) – Spraakherkenningsmodule V3.1 (V3) of de veel voorkomende coderingsnaam FZ0475.

Het leveringspakket bevat de module zelf ( PCB Erg goede kwaliteit), een microfoon op een flexibele poot met een 3,5 mm jack-connector en hoekige PLS-contacten met een steek van 2,56 mm voor het modulebord (deze kunnen niet worden gebruikt als ze op een andere manier op de modulecontacten zijn aangesloten).

Tegenwoordig zijn er verschillende soorten modules met vergelijkbare functionaliteit. verschillende fabrikanten en ontwikkelaars of uitvoeringen. Deze spraakherkenningsmodule heeft naar mijn mening een bepaalde balans tussen kosten, functionaliteit en gemak. De EasyVR-module zal krachtiger en aanzienlijk duurder zijn. Modules gebaseerd op de LD3320 zullen goedkoper en ongemakkelijker zijn (in ieder geval ongemakkelijk omdat het niet eenvoudig is om er een normale beschrijving voor te vinden, maar de rest is subjectief).

Kenmerken van de Spraakherkenningsmodule V3.1 (V3):

  • Voedingsspanning – 5 volt
  • Stroomverbruik – tot 40 mA
  • Interfaces – UART, GPIO
  • Herkenningsnauwkeurigheid – 99% (onder ideale omstandigheden)
  • Bereik - hangt af van de gebruikte microfoon, voor de standaardmicrofoon die in de kit zit is het bereik 0,5 - 1 meter maximale afstand bij voldoende luide stem, maar als de stem zacht is, moet u de microfoon dichter bij uw mond brengen

De module is een klein, netjes bord waarop de hoofdmicrocontroller (zwarte vlek), een 3,5 mm jack-connector voor het aansluiten van een microfoon en een microschakeling zich bevinden flash-geheugen, GPIO, UART en stroomcontacten, een paar LED's en de rest van de benodigde apparatuur die nodig is voor de werking van het circuit - weerstanden, condensatoren, kwarts. Compact formaat board kunt u de module eenvoudig integreren eigen ontwikkelingen. Om het bereik van stemcommando's te vergroten is het vermoedelijk noodzakelijk om een ​​versterkte microfoon te gebruiken. Zodra een acceptabel bereik is bereikt, is de module geschikt voor gebruik in systemen slim huis. Zonder aanpassingen om het werkingsbereik te verbeteren, kan de module worden gebruikt desktopsystemen beheer, evenals in beveiligingssystemen (toegangscontrole en -beperking). Bij een standaardmicrofoon is het vanwege het korte bereik het meest betrouwbaar om de spraakherkenningsmodule als headset te gebruiken draadloos opdrachten verzenden naar een controller die iets bestuurt met behulp van een batterij en draadloze modules (bijvoorbeeld HC-05 of HC-12 of andere geschikte modules). De module kan zonder externe microcontroller werken, omdat de fabrikant functionele onafhankelijkheid biedt; u hoeft slechts één keer spraakopdrachten op te nemen en de instellingen hiervoor in te stellen zelfstandig werk met de hulp extern apparaat(PC of MK).

Om met de spraakherkenningsmodule te kunnen gaan werken, moeten we deze dus aansluiten op een computer (je hebt een USB-UART-adapter nodig) of op een microcontroller (je moet deze ontwikkelen programmacode om de module te besturen).

Er is geen fundamenteel verschil bij het beheren en configureren van de module tussen het aansluiten op een computer of een microcontroller, dus voor de duidelijkheid zullen we een pc gebruiken voor de configuratie. De instructies beschrijven de opdrachten voor de module in hexadecimale vorm, dus voor het gemak heb je ook een terminal nodig die bytes in hexadecimale vorm verzendt, bijvoorbeeld AccessPort (kan worden gedownload aan het einde van het artikel). Daarnaast richt de fabrikant zich op gebruikers van het Arduino-platform en levert een bibliotheek voor het gebruik van deze module en instructies voor het gebruik van deze bibliotheek. Velen van ons zijn echter veel meer geïnteresseerd in het rechtstreeks werken met de module zelf dan via de Arduino-wrapper.

Laten we, voordat we met het werk beginnen, naar het bord kijken. Aan de uiteinden van het bord bevindt zich rechts een aansluiting voor het aansluiten van een microfoon, aan de andere kant bevinden zich vier contacten van de UART-interface. Aan de onderkant bevinden zich acht contacten die worden gebruikt om signalen uit te voeren die worden veroorzaakt door de herkenning van spraakopdrachten. Bovenaan worden vier pinnen geconfigureerd als signaalinvoer gebruikt om te schakelen tussen groepen (van elk zeven spraakopdrachten) met opdrachten, als een dergelijke functie wordt gebruikt. En de resterende zes pinnen aan de bovenkant worden waarschijnlijk gebruikt om verbinding te maken met het geheugen van de module.

Voor de bediening en configuratie van de module wordt een commandosysteem gebruikt. Algemeen beeld het kader ziet er als volgt uit:

De eerste vier commando's 00, 01, 02, 03 worden gebruikt om de modulestatus en de instellingen ervan te controleren. De volgende zes commando's 10, 11, 12, 13, 14, 15 worden gebruikt om de module-instellingen te wijzigen, inclusief uitgangspoortcontrole en instellingen voor automatisch laden. Vervolgens worden drie commando's 20,21,22 gebruikt om spraakcommando's op te nemen. De volgende drie commando's 30,31,32 worden gebruikt om de herkenning van spraakcommando's te besturen. Commando's 0A, 0D, FF worden alleen gebruikt als gegevens door de module zelf worden geretourneerd. Er zijn eigenlijk niet veel commando's en dit alles is niet zo eng als het op het eerste gezicht lijkt in de documentatie voor de module. Laten we eens kijken naar de commando's die nodig zijn om met de spraakherkenningsmodule te werken. Niet allemaal bestaande ploegen zijn van praktische aard.

Het is opmerkelijk dat de module kan werken zonder een externe besturingsmicrocontroller, en ook zelfstandig iets kan besturen met zijn uitgangspoorten. Om dit te doen, moet u ze configureren (opdrachten 12, 13, 14).

Team 12 – uitvoerpoorten configureren. Met deze opdracht configureert u de bedrijfsmodus van de uitgangspoorten van de spraakherkenningsmodule.

Formaat: | AA | 03 | 12 | MODUS | 0A |

Waar MODE vier waarden kan aannemen: 0 – pulsmodus (wanneer een spraakcommando wordt geactiveerd, zal de uitgang die overeenkomt met het commando van status veranderen gedurende de tijd die is ingesteld door commando 13), 1 – schakelmodus (toggle of flip) (elke keer een spraakcommando wordt geactiveerd, de uitgang die overeenkomt met het spraakcommando wordt omgekeerd), 2 – aan-modus (wanneer het spraakcommando wordt geactiveerd, gaat de uitgang naar de logische één-status en gaat niet langer naar de logische nul-status, reset is uitgevoerd door commando 14), 3 – uit-modus (vergelijkbaar met de aan-modus, alleen in tegendeel, wanneer het spraakcommando wordt geactiveerd, gaat de uitgang naar een logische nulstatus).

Het meest praktisch is de schakelmodus, waarvoor geen onnodige opdrachten nodig zijn. Pulsmodus zou goed zijn, maar de logica van deze modus is zodanig dat wanneer een spraakcommando wordt geactiveerd, deze één keer een logisch commando geeft, gedurende een tijd van 10 ms tot 1 s. Dit is niet genoeg. Hoewel het, afhankelijk van de vereisten voor deze modus, nuttig kan zijn. De aan- en uit-modi zijn ongemakkelijk geïmplementeerd, omdat ze de uitvoering van extra opdrachten vereisen.

Team 13 – instellen van de pulsduur van de overeenkomstige modus.

Formaat: | AA | 03 | 13 | NIVEAU | 0A |

Waarbij LEVEL een waarde aanneemt van 00 tot 0F (overeenkomend met een duur van 10 ms tot 1 s).

NIVEAU duur
0x00 10 ms
0x01 15 ms
0x02 20 ms
0x03 25 ms
0x04 30 ms
0x05 35 ms
0x06 40 ms
0x07 45 ms
0x08 50 ms
0x09 75 ms
0x0A 100 ms
0x0B 200 ms
0x0C 300 ms
0x0D 400 ms
0x0E 500 ms
0x0F 1 sec

Team 14 – reset de uitgangspoorten naar de staat gespecificeerd door de aan- of uit-modi.

Formaat: | AA| 03 | 14 | FF | 0A | - reset alle uitgangspoorten

| AA| 03+n | 14 | IO0 | ... | IAan | 0A | - reset geselecteerde uitgangspoorten

Waar n het aantal pinnen is dat selectief wordt gereset, is I00...IOn een lijst van deze pinnen in het gegevensverzendframe.

Om vervolgens spraakopdrachten uit te kunnen voeren, moeten deze in de module worden opgenomen (train de module). Er is hier een beperking. Er kunnen slechts zeven opdrachten tegelijk worden herkend, hoewel er nog veel meer kunnen worden opgenomen. Om het bereik van spraakopdrachten die worden herkend uit te breiden, wordt een groeperingssysteem (opdracht 32) gebruikt, dat wordt bestuurd door de ingangspoorten van de module. Door de signaalconfiguratie op deze pinnen in te stellen, selecteert u de groep commando's die worden herkend. Dit komt door de beperkte prestaties van de stemcontroller van de module.

Team 20 - het opnemen van een of meer spraakopdrachten.

Formaat: | AA| 03+n | 20 | R0 | ... | Rn | 0A |

Waarbij n het aantal opgenomen spraakcommando's is (als één commando n=0 is opgenomen, twee commando's n=1 enzovoort in overeenstemming met het algemene formaat voor het verzenden van commando's Lengte - lengte), R0...Rn aantallen spraakcommando's (AA 03 20 03 0A - commando voor het opnemen van het derde spraakcommando).

Team 21 - neem één spraakopdracht op en stel er een handtekening voor in.

Formaat: | AA| 03+SIGLEN | 21 | OPNEMEN | SIG | 0A |

Waar RECORD het stemcommandonummer is, is SIG de handtekening (kan uit meerdere bytes bestaan, zodat elke byte indien nodig kan corresponderen met een alfabetische tekencodering), SIGLEN is het aantal bytes waaruit de handtekening bestaat.

Ploeg 22 - voeg een handtekening toe of verwijder deze voor de geselecteerde spraakopdracht.

Formaat: | AA | 03+SIGLEN | 22 | OPNEMEN | SIG | 0A | - het toevoegen van een handtekening

| AA | 03 | 22 | OPNEMEN | 0A | - handtekening verwijderen

Bij het opnemen van spraakopdrachten moet u zich laten leiden door LED-signalen. Na het invoeren van het commando dat het opnameproces start, begint de gele (oranje) LED snel te knipperen. Zodra de rode LED oplicht, moet u een stemcommando in de microfoon zeggen. Als dit lukt, gaat de gele (oranje) LED branden en vervolgens weer rood. U moet het spraakcommando bevestigen en nogmaals uitspreken. Als dit lukt, lichten beide LED's op - het spraakcommando is opgeslagen.

Zodra spraakopdrachten in de module zijn opgenomen, gebeurt er niets totdat deze opdrachten in de “Herkenner” van de module worden geplaatst. Om dit te doen, moet u commando 30 gebruiken. Na het uitvoeren van dit commando begint de module te wachten tot het spraakcommando overeenkomt met de opgeslagen samples. Er kunnen slechts zeven commando's tegelijk worden herkend. In dit geval zal de gele (oranje) LED op de modulekaart langzaam knipperen.

Ploeg 30 - records laden in de Recognizer van de module.

Formaat: | AA| 2+n | 30 | R0 | ... | Rn | 0A |

Het antwoordformaat is als volgt: | AA | 07 | 0D | 00 | GRPM | R | RI | SIGLEN | SIG | 0A |

Waar GRPM informatie is over de groep waartoe het commando behoort (indien gebruikt), is R het herkende spraakcommando (met behulp van deze gegevens kun je commando's van elkaar onderscheiden als er geen handtekeningen worden gebruikt), RI is de commando-index in de herkenner , SIGLEN is de lengte van de handtekening in bytes, SIG - handtekening (indien gebruikt).

En ten slotte, als de module onafhankelijk zou moeten werken, dan moet je commando 15 gebruiken automatisch starten volgens de presets van de herkenner. In dit geval werkt de spraakherkenningsmodule zelfstandig zonder dat initialisatie na het inschakelen nodig is.

Team 15 - de herkenner instellen op automatisch starten wanneer deze wordt ingeschakeld.

Formaat: | AA| 03 | 15 | 00 | 0A | - schakel de autorun-functie uit

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - instellen van de autorun-functie

Om de juiste uitvoering van opdrachten te controleren, heeft elk zijn eigen reactie. Indien nodig zijn alle gegevens te vinden in de documentatie voor de spraakherkenningsmodule aan het einde van het artikel. Vergeet dat niet alles numerieke waarden binnen gepresenteerd hexadecimaal formulier.

Zo kunt u met het commandosysteem de spraakherkenningsmodule flexibel configureren voor gebruik voor verschillende doeleinden. Als eenvoudige bediening Omdat de module-uitgangspoorten niet voldoende zijn, kan de spraakherkenningsmodule via UART of GPIO op andere apparaten worden aangesloten. Voor draadloze verbinding U kunt gebruik maken van de eerder besproken modules.

Met behulp van draadloze modules kunt u de spraakherkenningsmodule verbinden met elk apparaat waar dit nodig is. Laten we hem bijvoorbeeld aansluiten op een microcontroller, die de LED's aanstuurt op basis van de ontvangen gegevens over de herkenning van spraakopdrachten. Draadloze modules zorgen ervoor dat gegevens in twee richtingen kunnen worden overgedragen, dus indien nodig kunt u code voor de microcontroller schrijven om de spraakmodule te initialiseren en spraakopdrachten op te nemen. In ons geval zijn er onder pc-besturing al verschillende spraakopdrachten in de module opgenomen en is automatische herkenning geconfigureerd wanneer de stroom wordt ingeschakeld, dus voor de microcontroller zullen we alleen gegevensontvangst en LED-besturing registreren met betrekking tot deze gegevens. De STM32F103C8T6-microcontroller gebruikt USART1 om gegevens te ontvangen en pinnen PB10...PB15 geconfigureerd als uitgang, die de LED's aanstuurt. De broncode bevindt zich in de bijlage aan het einde van het artikel.

Iets over de resultaten

Spraakherkenning is niet helemaal nauwkeurig. Het hangt af van de geselecteerde commando's en de stem van de gebruiker. Tijdens het testen heb ik er meerdere gevonden negatieve punten. Bij het aanleren van de moduleopdrachten zijn de stemopdrachten “één” en “twee” geselecteerd. Het “twee”-commando werd altijd duidelijk doorgegeven, maar het “één”-commando werd vaak geïdentificeerd als een “twee”-commando en de code van het tweede commando werd dienovereenkomstig uitgevoerd. Bovendien werd bij pogingen om stemcommando's in het Engels te geven (en deze werden niet opgenomen in de spraakmodule) het commando 'één' bijna altijd gedefinieerd als 'twee'. Misschien gaat het allemaal om uitspraak, intonatie en andere aspecten van de menselijke stem, ingebed in het algoritme voor het coderen van de stemmodule van gesproken opdrachten. Echter, deze geheimenfabrikanten open toegang ze geven het niet. Bovendien wordt de kwaliteit van de herkenning beïnvloed door externe geluidsomstandigheden - lawaai van de straat, ventilatorgeluid, willekeurige geluiden, enz. De fabrikant vestigt de aandacht op het feit dat hoog niveau herkenningsnauwkeurigheid vindt plaats onder ideale omstandigheden. Het idee om een ​​microfoon met versterker te gebruiken zal uiteraard het werkbereik van het apparaat vergroten, maar ook de kans op fouten vergroten, aangezien de versterking van de stem ook de ruis zal vergroten.

Als resultaat, als u lage eisen stelt aan stemherkenning en uitvoering van spraakopdrachten, dan zal deze module eerlijk het geld dat eraan wordt besteed, uitbetalen.

Lijst met radio-elementen

Aanduiding Type Denominatie Hoeveelheid OpmerkingWinkelMijn notitieblok
IC1 MK STM32

STM32F103C8

1 Naar notitieblok
VR1 Lineaire regelaar

AMS1117-3.3

1 Naar notitieblok
MOD1, MOD3 Draadloze moduleHC-122 Naar notitieblok
MOD2 SpraakherkenningsmoduleVR3.11 Naar notitieblok
Z1 Kwarts8 MHz1

In dit project combineerde ik een gezichtsdetectiedetector en een volgsysteem.

In het kort de essentie van het project: een webcam geïnstalleerd op een draaimechanisme is verbonden met een computer die wordt bestuurd door de operatiekamer Windows-systemen en met geïnstalleerd software OpenCV. Als het programma een gezicht in het gezichtsveld van de webcam detecteert, wordt het midden van het gezicht berekend. De X- en Y-coördinaten worden naar de Arduino-controller gestuurd, die via USB op de computer is aangesloten. Op zijn beurt bestuurt de Arduino-controller, volgens de ontvangen commando's, twee servomotoren: langs de X-coördinaat en langs de Y-coördinaat, d.w.z. er is een volgsysteem aanwezig.

OpenCV-bibliotheek ( Open bron Computer Vision-bibliotheek) kan worden gedownload. De bibliotheek is multi-platform en bestaat momenteel voor de volgende besturingssystemen: Windows, Linux, Android, Mac OS en zelfs iOS. De bibliotheek biedt real-time beeldverwerking. Geschreven in C/C++.

Dat. dit project is een mengsel van zachte en harde oplossingen. Het beeld wordt op een computer verwerkt en de servo wordt bestuurd met behulp van een controller.

Dus wat ik voor het project heb gebruikt:

Software:

Ijzer:

computer met Windows 7 SP1

Arduino Uno of compatibel + PSU

2 servo's

USB-webcam

Dus laten we gaan.

Stap 1: Installeer de software

1) Als u een Windows-besturingssysteem heeft, download dan het bestand OpenCV-2.3.1-win-superpack.exe (of meer latere versie) en installeer de bibliotheek.

2) Download en installeer Microsoft Visual C++ 2010 Express. Als je een 64-bits Windows-versie, dan moet je ook de Windows SDK downloaden (maar er kunnen problemen zijn voor de 64-versie; ik kon OpenCV niet laten werken onder Windows 7 x64).

Lees het proces van het instellen van OpenCV voor Visual C++ op de officiële website.

Stap 2. Camera en servo's monteren

Ik heb het ontwerp niet ‘duurzaam’ gemaakt, want na het behalen van het einddoel demonteer ik alles voor een volgend project.

Ik heb de webcam aan de X-as-servomotor bevestigd, en deze op zijn beurt aan de Y-as-servomotor. En ik heb deze hele structuur in een "derdehands" klem vastgezet.

Stap 3: Verbinding

Servomotoren aansluiten:

De gele pin van de X-as servo is verbonden met pin 9 Arduino-controller

De gele pin van de Y-as servo is verbonden met pin 10 van de Arduino-controller

Rode Vcc-pin van servo wordt aangesloten op 5V-pin

De zwarte GND-pin van de servo is verbonden met de GND-pin van de Arduino-controller

Webcam-verbinding:

De webcam maakt verbinding met de computer via USB-interface. Het C++-programma identificeert de webcam aan de hand van het USB-poortnummer. Mogelijk moet u de poort in het programma opgeven.

De Arduino UNO-controller aansluiten:

De controller wordt ook via een USB-interface op de computer aangesloten. Er verschijnt een virtuele COM-poort in het systeem, die in C++ aan de programmacode moet worden toegevoegd.

Projectbestanden downloaden

Origineel artikel over Engels(vertaling door A.V. Koltykov voor de website cxem.net)

  • DIY of doe het zelf
  • Hallo Giktimes!

    Zoals de titel al doet vermoeden, zal dit artikel zich richten op het herkennen van getallen op een microcontroller. Ik wil graag meteen een reservering maken waarin dit artikel niet voorziet broncode, technologie of herkenningsalgoritme wordt overwogen, ik zal alleen zeggen dat er ideeën worden gebruikt systematische aanpak. Sommigen van hen worden beschreven in onze artikelen (en hier). Dit komt doordat onze aanpak originaliteit nastreeft, maar op sommige punten verduidelijking vereist. Iemand zou kunnen zeggen: “weer een artikel over het programmeren van microcontrollers.” Helemaal niet, de zoektocht naar soortgelijke projecten leverde geen duidelijke resultaten op, met uitzondering hiervan video. Uit discussies op forums is één ding duidelijk: het idee om te krijgen soortgelijk apparaat(camera + microcontroller = uitvoerherkenningsresultaat, niet alleen een gemaakte foto) kwam bij veel mensen terecht, maar bleef zonder implementatie. Ja, en erkenning, door algemene mening, vereist veel computerbronnen en vooral microcontrollers zijn hier niet geschikt voor, er waren uitspraken over Arduino dat dit over het algemeen onmogelijk is; Als u geïnteresseerd bent, zie cat.

    Om voor de hand liggende vragen te vermijden, laten we ze beantwoorden:

    • Nee, dit is geen beeldherkenningsservice.
    • Nee, dit is niet OpenCV
    • Nee, dit zijn geen neurale netwerken
    • Er wordt gebruik gemaakt van morfologische analyse van de objecten waaruit het getal bestaat
    • Ja, de herkenning gebeurt door de microcontroller!

    Idee

    Kortom, het begon allemaal met de wens om mijn ideeën op het gebied van beeldherkenning uit te proberen en te testen. Tijdens het gesprek kwamen we tot de conclusie dat we met klein wel rond konden komen rekenkracht om dit probleem op te lossen. Om voor de hand liggende redenen zullen we de details van deze discussies niet beschrijven.

    Installatie

    De taak is dus vastgelegd, implementatie is nodig. Zonder af te wijken van het reeds bestaande
    we nemen wat we bij de hand hebben. En ik had een paar Arduino Uno's, een oude optische muis en een cd-station bij de hand. Waar zou jij de sensor trouwens voor gebruiken? optische muis Als camera voor het verkrijgen van een beeld werden we ingegeven door iets dat we lang geleden lazen, en in feite door al de rest van het ‘muis’-materiaal. Het enige dat we moesten doen was de sensor en de hele kabelboom losmaken voor gebruiksgemak, en er ook een lens op lijmen, die we voorzichtig uit het cd-station "scheurden". Dit was nodig om de afstand van het onderwerp tot de camera te vergroten, anders zouden de cijfers van ons formaat niet passen klein deel. We hebben trouwens geprobeerd de optiek van de webcamera voor de lens van het cd-station te bevestigen, maar op de een of andere manier lukte het niet.

    Meer


    Toen rees de vraag hoe je deze camera over het onderwerp moest positioneren. Hier werden we enorm geholpen door een oude kapotte microscoop die stil lag. We hebben het podiumcontrolemechanisme er respectvol uit gehaald. Dankzij dit mechanisme konden we de camera in slechts twee assen bewegen; het idee ontstond meteen om de laserkopgeleider van het cd-station te gebruiken. Dit alles werd vastgezet in de behuizing van de lankmoedige cd-drive. Als resultaat kregen we een cool camerapositioneringsmechanisme.

    Meer


    Totaal: we hebben een zogenaamde camera, er is een positioneringsmechanisme, het enige dat overblijft is een vel papier met een nummer erop plaatsen en een beeld van de camera krijgen. Dit is waar de “problemen” begonnen. Omdat de eigenschappen van de optische sensor "muis" erg slecht zijn voor gebruik als camera, begonnen ze te improviseren met tegenlicht.

    Meer


    Het werd duidelijk dat het niet mogelijk zou zijn om simpelweg de intensiteit van het externe licht te benadrukken; Ik moest een andere Arduino inschakelen om de intensiteit van de achtergrondverlichting te regelen ( Uiteraard was het mogelijk om het op een andere manier te bedienen, maar vervolgens niet alleen door de achtergrondverlichting, maar ook door van nummer op de indicator te wisselen). Uiteindelijk bleek dat fotograferen in het licht veel beter is. En als je bijvoorbeeld een gloeiende indicator met zeven segmenten als doelwit gebruikt, dan ziet de sensor dat prima. Dus nu hebben we een indicator en een strook met witte cijfers gevuld met een zwarte achtergrond als schietobjecten.

    aan de linkerkant is een grijswaardenbeeld verkregen van de indicator (we ontvangen een dergelijk beeld van de sensor), aan de rechterkant is het gebinairiseerd.

    Meer


    Algemeen beeld van de gemonteerde installatie


    optie voor vroege installatie


    Herkenning blok


    Een belangrijke rol in onze installatie wordt gespeeld door de zogenaamde herkenningseenheid (op de foto hierboven). Zoals je ziet bestaat deze uit een Arduino Uno en een bekende wifi-zender ESP8266. Laat het me uitleggen, we hebben een wifi-zender nodig om het herkenningsresultaat op de tablet te zien. De applicatie op de tablet verzendt een verzoek, de Arduino "legt" bij ontvangst van het verzoek het beeld van de muissensor vast en binariseert het vervolgens. Na binarisatie vindt herkenning plaats en na voltooiing ervan wordt een reactie gegenereerd. In het antwoord sturen we het herkenningsresultaat en 41 bytes om voor de duidelijkheid een binair beeld op het tabletscherm te construeren.

    Als je terugkijkt, heeft de Arduino best goede functionaliteit: werken met de camera, herkenning en werken met de esp8266. Wat het werk wel kon beïnvloeden, was dat we te maken hadden met een gebrek aan geheugen. Ik had nooit gedacht dat ik ooit elke byte geheugen zou moeten terugwinnen.

    Demonstratie van het herkenningsproces

    In plaats van een conclusie

    Dat is alles. Er is nog veel werk te doen. En de eerste taak: het herkennen van getallen (reeksen van getallen) vastgelegd door een ‘menselijke’ camera (en niet een ‘muissensor’) en het overbrengen van de ontwikkelde technologie naar de ESP8266 en het verminderen van de intensiteit van de strijd om elke byte geheugen.

    Wij beantwoorden graag uw vragen.

    In dit project combineerde ik een gezichtsdetectiedetector en een volgsysteem.

    In het kort de essentie van het project: een webcam geïnstalleerd op een roterend mechanisme is verbonden met een computer met het Windows-besturingssysteem en met geïnstalleerde software OpenCV. Als het programma een gezicht in het gezichtsveld van de webcam detecteert, wordt het midden van het gezicht berekend. De X- en Y-coördinaten worden naar de Arduino-controller gestuurd, die via USB op de computer is aangesloten. Op zijn beurt bestuurt de Arduino-controller, volgens de ontvangen commando's, twee servomotoren: langs de X-coördinaat en langs de Y-coördinaat, d.w.z. er is een volgsysteem aanwezig.

    De OpenCV-bibliotheek (Open Source Computer Vision Library) kan worden gedownload. De bibliotheek is multi-platform en bestaat momenteel voor de volgende besturingssystemen: Windows, Linux, Android, Mac OS en zelfs iOS. De bibliotheek biedt real-time beeldverwerking. Geschreven in C/C++.

    Dat. Dit project is een mix van zachte en harde oplossingen. Het beeld wordt op een computer verwerkt en de servo wordt bestuurd met behulp van een controller.

    Dus wat ik voor het project heb gebruikt:

    Software:
    Arduino IDE 1.0 voor Windows

    Microsoft Visual C++ 2010 Express SP1
    Seriële C++-bibliotheek voor Win32 (door Thierry Schneider)

    Ijzer:
    computer met Windows 7 SP1
    Arduino Uno of compatibel + PSU
    2 servo's
    USB-webcam

    Dus laten we gaan.

    Stap 1: Installeer de software

    1) Als u een Windows-besturingssysteem heeft, download dan het bestand OpenCV-2.3.1-win-superpack.exe (of een latere versie) en installeer de bibliotheek.

    2) Download en installeer Microsoft Visual C++ 2010 Express. Als je een 64-bits versie van Windows hebt, moet je ook de Windows SDK downloaden (maar voor de 64-versie kunnen er problemen zijn; ik kon OpenCV niet laten werken onder Windows 7 x64).

    Lees het proces van het instellen van OpenCV voor Visual C++ op de officiële website.

    Stap 2. Camera en servo's monteren

    Ik heb het ontwerp niet ‘duurzaam’ gemaakt, want na het behalen van het einddoel demonteer ik alles voor een volgend project.
    Ik heb de webcam aan de X-as-servomotor bevestigd, en deze op zijn beurt aan de Y-as-servomotor. En ik heb deze hele structuur in een "derdehands" klem vastgezet.

    Stap 3: Verbinding

    Servomotoren aansluiten:
    De gele pin van de X-as servo is verbonden met pin 9 van de Arduino-controller
    De gele pin van de Y-as servo is verbonden met pin 10 van de Arduino-controller
    Rode Vcc-pin van servo wordt aangesloten op 5V-pin
    De zwarte GND-pin van de servo is verbonden met de GND-pin van de Arduino-controller

    Webcam-verbinding:
    De webcam wordt via een USB-interface op de computer aangesloten. Het C++-programma identificeert de webcam aan de hand van het USB-poortnummer. Mogelijk moet u de poort in het programma opgeven.

    De Arduino UNO-controller aansluiten:
    De controller wordt ook via een USB-interface op de computer aangesloten. Er verschijnt een virtuele COM-poort in het systeem, die in C++ aan de programmacode moet worden toegevoegd.

    Op de een of andere manier ontstond het idee om een ​​stem te maken Arduino-besturing, maar Arduino alleen is niet genoeg, omdat... Voor een smart home-systeem moet je ook communiceren met de computer en zijn systemen.

    Een oplossing vinden:

    BitVoicer
    Ik kwam verschillende artikelen tegen waarin BitVoicer in combinatie met Arduino werd gebruikt, maar het probleem is dat BitVoicer alleen op Windows werkt, en dit maakt het gebruik van het systeem op Windows niet mogelijk. eenvoudige apparaten zoals Rasberry Pi met Unix.
    Arduino-spraakherkenning
    Arduino kan ook met spraak worden bestuurd dankzij de spraakherkenningsmodule, maar tot nu toe heb ik niet het plezier om hem aan te schaffen en er zijn een aantal ongemakken bij het gebruik van deze module: een beperkt aantal commando's, vervelende training, nieuwe commando's vereisen het flashen van de module, wat al een nadeel is als het systeem wordt gedebugd en geïnstalleerd.

    Oplossing

    Ik ging op zoek naar een platformonafhankelijke oplossing waarmee het systeem op meerdere platforms kon werken besturingssystemen. Dit gevonden: Spraak-naar-tekstbibliotheek voor Java/verwerking. Het complex wordt geïmplementeerd op basis van de taal Verwerking (Java) En Google Speach-API Er is al eerder over de kat geschreven. Deze beslissing Maakt realtime spraaktracking mogelijk schakelAutoRecord() in, geef de volumelimiet aan schakelAutoThreshold() in, verbinden externe microfoons getLineIn(), geef de herkenningstaal op setTaal(String). Volledige lijst mogelijkheden en details staan ​​op de website van de ontwikkelaar: http://stt.getflourish.com. Voor werk hebben we nodig Google-spraak API-sleutel. Hoe u dit kunt verkrijgen, wordt hier beschreven: www.chromium.org/developers/how-tos/api-keys. De enige negatief punt Het probleem is dat je met Google Speech slechts 50 verzoeken per dag kunt verwerken, maar in de praktijk worden er ruim 500 verzoeken verwerkt.

    Om het navigeren in de toekomst gemakkelijker te maken, voeg ik alle bronnen toe, die al spraakopdrachten bevatten, een verbinding met het Arduino-bord, een schets voor Arduino-borden, stembevestiging van zinnen en al het andere dat nu beschikbaar is en werkt: broncodes. Na het downloaden plaatsen we de map GoogleTTS in de Processing-bibliotheken. De schets voor Arduino bevindt zich in de map GoogleTTS/ArduinoSerial. Alles is geschreven in Processing 3.0a4, beschikbaar in pre-release op de officiële website.

    Uitvoering(“Luister naar mijn bevel!”):
    We hebben besloten tot erkenning. Nu moeten we de commando's opvangen die we nodig hebben en daarover beslissingen nemen. Hiervoor is de sectie verantwoordelijk:
    void commands() ( if (result.equals("arduino")) ( // Op zoek naar een match // Voer commando uit wanneer een match is ontvangen) else if (result.equals("hoe laat is het")) ( / / Voer opdracht uit wanneer een match wordt ontvangen) )
    Stemreactie
    Nu hebben we een tool nodig die met een menselijke stem op ons reageert als er een match wordt gevonden. Het gekozen implementatieinstrument was Google Vertalen, of beter gezegd een module die tekst omzet in stem. De tekst wordt op verzoek naar de server van Google verzonden en omgezet in geluidsbestand en naar ons teruggestuurd in mp3-formaat. Hiervoor is de sectie verantwoordelijk:
    void googleTTS(String txt, String taal) ( // tekst wordt omgezet in geluid met behulp van de opdracht googleTTS("text", "taal") String u = "http://translate.google.com/translate_tts?tl="; u = u + taal + "&q=" + txt; u = u.replace(" ", "%20"); URL-URL= nieuwe URL(u);

    try ( URLConnection-verbinding = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatibel; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.0.3705; .NET CLR 1.1.4322; . NET CLR 1.2.30703)"); connectie.connect(); InputStream is = connectie.getInputStream(); Bestand f = nieuw bestand(sketchPath + "/" + txt + ".mp3"); OutputStream out = nieuw FileOutputStream( f); byte buf = nieuwe byte; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close("Bestand gemaakt : " + txt + ".mp3" ) catch (IOException e) ( e.printStackTrace(); ) ) catch (MalformedURLException e) ( e.printStackTrace(); )
    De sectie is verantwoordelijk voor het rechtstreeks verwerken van tekstzinnen:

    void voicer(String s) ( // Uitgevoerd door het commando voicer("text") println(s); // gebruikt om tekst te monitoren Bestand f = new File(sketchPath + "/" + s + ".mp3"); // Het bestand controleren // Als het bestand al bestaat, speel het dan af if(f.exists())( println("Het bestand bestaat al! Ik speel het bestand af!"); player = minim.loadFile(s + ".mp3"); player.play ( ); // Als het bestand nog niet bestaat, maak het dan anders ( println("Het bestand bestaat nog niet! Ik ben het aan het maken!"); googleTTS(s, "ru"); speler = minim.loadFile(s + ".mp3"); speler.play();
    Voorbeeldimplementatie van herkenning en stembevestiging:
    void commands() ( if (result.equals("computer")) ( // Op zoek naar een match-voicer ("Listen"); // Spraakbevestiging ontvangen // Voer commando uit wanneer een match is ontvangen ) )

    Hij leeft!

    Verwerking + Arduino
    Nou, het lijkt te hebben gewerkt, maar er ontbreekt iets. Laten we nu “vrienden maken” met Arduino. We initialiseren de seriële verbinding in Processing om gegevens naar Arduino te sturen (voor Mac-gebruikers
    en Unix):

    Tekenreeks poortnaam = Serieel.lijst(); myPort = nieuwe serieel(dit, poortnaam, 9600); mijnPort.bufferUntil("\n"); Voor:
    Windows-gebruikers

    String myPort = nieuwe serieel(dit, "Uw COM-poort", 9600); mijnPort.bufferUntil("\n");
    En stuur daar een commando als er een stemmatch wordt gevonden:

    void commands() ( if (result.equals("doe het licht aan")) ( // Als de gesproken zin wordt herkend als "doe het licht aan", voer dan het verzoek uit myPort.write("High"); / / Stuurt het High-commando naar de seriële verbinding voicer("Doe het licht aan"); // Stembevestiging van de uitvoering van het commando ) else if (result.equals("Doe het licht uit")) ( myPort.write("Low "); // Stuurt het Low-commando naar de seriële verbindingsvoicer ("Het licht uitschakelen"); // Bevestiging // Voer het commando uit wanneer een match wordt ontvangen) ) Arduino-bord. We moeten naar de seriële poort luisteren en wanneer we een opdracht in de lijst vinden, voer dan de vereiste actie uit volgens de opdracht. De schets is heel eenvoudig:
    int-led = 13; // LED-pin op het bord void setup() (Serial.begin(9600); // Initialiseer de seriële verbinding pinMode(led, OUTPUT); // LED-pin verzendt gegevens) void loop() ( int i=0; / / variabele om een ​​string in de buffer char buffer te plaatsen; // een bufferarray om de string erin te plaatsen if(Serial.available())( // Controleer de seriële poort op de aanwezigheid van datavertraging(100); // plaats wat er is gelezen in de buffer while(Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Alle. Laten we het controleren.

    Problemen en plannen:

    Omdat Ik heb nog niet eerder geprogrammeerd, ik begrijp sommige dingen in het foutopsporingsproces niet volledig. Ik zou dankbaar zijn als iemand mij zou kunnen vertellen hoe ik de onderstaande problemen kan oplossen:

    Het meest fundamentele probleem is dat niet de hele stemfrase wordt uitgesproken. De laatste letters verdwijnen. Hoewel het geluidsbestand wordt geleverd met Google-servers V normale vorm. Zoals ik de situatie begrijp: er is een probleem met de audiospeler, maar waar precies is nog niet duidelijk.
    - Ik schreef al dat de Google Speech API een limiet heeft van 50 verzoeken per dag, maar in werkelijkheid blijkt het meer te zijn. Dit is in ieder geval niet genoeg. Ik ben van plan om de lokale herkenning van het hoofdcommando te registreren en pas nadat het is herkend, de rest van de tekst te verzenden voor verwerking door Google. Ik ben op zoek naar een oplossing.
    - Ik denk dat het geen kwaad kan om opdrachten naar het Arduino Ethernet-schild te sturen, omdat... Sommige systemen kunnen zich op aanzienlijke afstand van de hostcomputer bevinden en een seriële verbinding zal hier niet langer werken. Ik zal deze beslissing een dezer dagen bespreken, omdat... Ik heb geen router om een ​​Arduino met een Ethernet-shield op aan te sluiten.

    Dat is alles! Oordeel niet strikt op basis van regels code! Ik ben net begonnen deze springplank te bestuderen en ik zal je enorm dankbaar zijn als je mij in de neus wrijft over hoe het niet moet en me laat zien hoe ik het wel moet doen. Ik zal ook blij zijn als anderen zich bij dit project aansluiten geïnteresseerde partijen- altijd open voor communicatie!