- Eerste vereisten
- Schakelschema
- Processtroom voor de Air Mouse
- Programmeren van de Arduino voor Air Mouse
- Python-stuurprogrammascript
- De Arduino Air Mouse testen
Ooit afgevraagd hoe onze wereld op weg is naar de meeslepende realiteit. We vinden voortdurend nieuwe manieren en methoden om met onze omgeving om te gaan met behulp van virtual reality, mixed reality, augmented reality enz. Elke dag komen er nieuwe apparaten uit met deze snelle stimulatietechnologieën om indruk op ons te maken door hun nieuwe interactieve technologieën.
Deze meeslepende technologieën worden gebruikt bij gaming, interactieve activiteiten, entertainment en vele andere toepassingen. In deze tutorial maken we kennis met een dergelijke interactieve methode die je een nieuwe manier geeft om met je systeem te communiceren in plaats van een saaie muis te gebruiken. Onze game-geeks moeten weten dat een paar jaar geleden Nintendo, een gamebedrijf, een idee van een interactieve 3D-methode voor interactie met hun consoles verkoopt met behulp van een handheld-controller die bekend staat als de Wii-controller. Het gebruikt de versnellingsmeter om uw gebaren voor een game te lokaliseren en deze draadloos naar het systeem te verzenden. Als u meer wilt weten over deze technologie, kunt u hun patent EP1854518B1 bekijken, dit geeft u een volledig idee van hoe deze technologie werkt.
Geïnspireerd door dit idee gaan we een "luchtmuis" maken, om met systemen te communiceren door de console in de lucht te bewegen, maar in plaats van driedimensionale coördinatenreferenties te gebruiken, gaan we alleen tweedimensionale coördinaatreferenties gebruiken, dus we kunnen de acties van de computermuis nabootsen, aangezien de muis in twee dimensies X en Y werkt.
Het concept achter deze Wireless 3D Air Mouse is heel eenvoudig, we zullen een accelerometer gebruiken om de waarde te krijgen van de versnelling van de acties en bewegingen van de "Air mouse" langs de x- en y-as, en dan gebaseerd op de waarden van de versnellingsmeter zullen we de muiscursor besturen en bepaalde acties uitvoeren met behulp van de python-softwarestuurprogramma's die op de computer worden uitgevoerd.
Eerste vereisten
- Arduino Nano (elk model)
- Versnellingsmeter ADXL335 Module
- Bluetooth HC-05-module
- Drukknoppen
- Python Geïnstalleerde computer
Volg de vorige tutorial over Arduino-Python LED Controlling voor meer informatie over het installeren van python op de computer.
Schakelschema
Om je computer te besturen met de bewegingen van je hand heb je een accelerometer nodig die de acceleratie langs de X- en Y-as aangeeft en om het hele systeem draadloos te maken wordt een bluetooth module gebruikt om het signaal draadloos naar je systeem over te brengen.
Hier wordt een ADXL335-versnellingsmeter gebruikt, het is een MEMS-gebaseerde drieassige module die de versnelling langs de X-, Y- en Z-as uitvoert, maar zoals eerder verteld voor het besturen van de muis, zouden we alleen de versnelling alleen langs de X- en Y-as nodig hebben. Lees meer over het gebruik van de ADXL335-versnellingsmeter met Arduino met onze eerdere projecten:
- Op Arduino gebaseerd waarschuwingssysteem voor voertuigongevallen met behulp van GPS, GSM en Accelerometer
- Pingpongspel met Arduino en Accelerometer
- Op versnellingsmeter gebaseerde handgebaren bestuurde robot met Arduino
- Aardbevingsdetectoralarm met Arduino
Hier zijn de Xout- en Yout-pin van de versnellingsmeter verbonden met de Analog-, A0- en A1-pins van Arduino en voor het verzenden van de signalen van de Arduino naar het systeem wordt Bluetooth-module HC-05 gebruikt, aangezien Bluetooth werkt via de Tx en Rx pin-verbindingen, dus we gebruiken software seriële pinnen D2 en D3. Het is verbonden met behulp van Software-serieel, want als we de Bluetooth verbinden met hardware-serieel en de metingen via de python-console beginnen te krijgen, zou het fouten vertonen voor de niet-overeenkomende baudrate, aangezien de Bluetooth zou communiceren met de python op zijn eigen baudrate. Leer meer over het gebruik van de Bluetooth-module door verschillende op Bluetooth gebaseerde projecten te doorlopen met verschillende microcontrollers, waaronder Arduino.
Hier hebben we drie drukknoppen gebruikt - een voor het activeren van de luchtmuis en twee andere voor links- en rechtsklikken, zoals weergegeven in de onderstaande afbeelding:
Processtroom voor de Air Mouse
Het stroomschema toont de processtroom van de op Arduino gebaseerde Air Mouse:
1. Het systeem controleert continu of de mechanische trigger wordt ingedrukt totdat deze niet wordt ingedrukt. We kunnen normaal trainen met de computermuis.
2. Wanneer het systeem het indrukken van een knop detecteert, wordt de besturing voor de muis overgebracht naar de luchtmuis.
3. Als de triggerknop wordt ingedrukt, begint het systeem de meetwaarden van de muis naar de computer over te brengen. De systeemuitlezing bestaat uit de uitlezingen van de versnellingsmeter en de uitlezingen voor de linker- en rechterklik.
4. De systeemuitlezingen bestaan uit de datastroom van 1 byte of 8 bits, waarbij de eerste drie bits bestaan uit de X-coördinaten, de tweede drie bits bestaan uit de Y-coördinaten, de voorlaatste bit is de statusbit voor het verkrijgen van de status van de linkermuisknop en het laatste bit is de statusbit voor het verkrijgen van de status van de rechterklik.
5. De waarde van de eerste drie bits, dwz X-coördinaat, kan variëren van 100 <= Xcord <= 999, terwijl de waarde voor de Y-coördinaat kan variëren van 100 <= Ycord <= 800. De waarden voor de rechterklik en de linkerklik zijn de binaire waarden 0 of 1, waarbij 1 aangeeft dat de klik is gemaakt en 0 dat de klik niet door de gebruiker wordt gemaakt.
6. Om het stuiteren van de knop de positie van de cursor niet te laten beïnvloeden, wordt een bekende vertraging van 4 seconden aangehouden na elke klik op de triggerknop van de muis.
7. Voor de rechter- en linkerklik in de luchtmuis moeten we eerst op de linker- of rechterdrukknop drukken en daarna op de triggerknop om naar de positie van de luchtmuis te gaan waar we willen.
Programmeren van de Arduino voor Air Mouse
De Arduino moet worden geprogrammeerd om de versnellingswaarden in de X- en Y-as te lezen. Het volledige programma wordt aan het einde gegeven, hieronder staan de belangrijke fragmenten uit de code.
De globale variabelen instellen
Zoals eerder vermeld, zullen we de Bluetooth-module aansluiten op de seriële pinnen van de software. Dus om de software-serie in te stellen, moeten we de bibliotheek met software-serieel declareren en de pinnen voor Tx en Rx instellen. In Arduino Nano en Uno kunnen Pin 2 en 3 werken als een software-serie. Vervolgens declareren we het Bluetooth-object uit de seriële softwarebibliotheek om de pin voor de Tx en Rx in te stellen.
# omvatten
Ongeldige setup ()
In de setup- functie gaan we de variabelen instellen om het programma te vertellen of ze als input of output zullen fungeren. De triggerknop zou worden ingesteld als invoer-pull-up, en de linker- en rechterklikken worden gedeclareerd als invoer en ingesteld als Hoog om ze te laten fungeren als invoer-pullups.
Stel ook de baudrate voor de seriële en Bluetooth-communicatie in op 9600.
leegte setup () { pinMode (x, INPUT); pinMode (y, INPUT); pinMode (trigger, INPUT_PULLUP) pinMode (lclick, INPUT); pinMode (klik, INPUT); pinMode (led, OUTPUT); digitalWrite (lclick, HIGH); digitalWrite (rclick, HIGH); Serial.begin (9600); bluetooth.begin (9600); }
Ongeldige lus ()
Omdat we een triggerknop nodig hebben om aan te geven wanneer we het systeem de datastroom moeten sturen, stellen we de hele code in de while- lus die continu de digitale status van de pull-up-trigger bewaakt, als deze laag gaat, zal hij geef het verder door voor de verwerking.
Omdat we een LED hebben bevestigd om ons de status van het systeem te laten weten voor wanneer de triggerknop wordt ingedrukt, hebben we de led in eerste instantie ingesteld op laag buiten de while- lus als standaardconditie en hoog in de while- lus, waardoor de led oplicht telkens wanneer de triggerknop wordt ingedrukt.
Om de status van de linker- en rechterklikknop te lezen, hebben we globaal twee variabelen gedefinieerd: lclick en rclick waarvan de waarden aanvankelijk waren ingesteld op 0.
En stel in de loop de waarde van die variabelen in volgens de digitale status van de linker- en rechterklikknop om te controleren of de knoppen zijn ingedrukt of niet.
We zouden de waarden van de X- en Y-out-pinnen van de versnellingsmeter aflezen met behulp van de analogRead- functie en die waarden toewijzen aan de schermgrootte om de muisaanwijzer over het hele scherm te laten bewegen. Omdat de schermgrootte de pixels in het scherm zijn, moeten we het dienovereenkomstig instellen en omdat we de uitvoerwaarde uit drie cijfers willen hebben, hebben we het bereik voor de X opzettelijk ingesteld als 100 <= X <= 999 en evenzo de waarde voor de Y als 100 <= Y <= 800. Onthoud dat de pixels worden gelezen vanuit de linkerbovenhoek, dwz de linkerbovenhoek heeft de waarde (0,0), maar aangezien we drie cijfers hebben gedeclareerd voor de x en y, zouden onze waarden worden gelezen vanaf het punt (100,100).
Druk verder de waarde van de coördinaten en de status van de klik over de serie en Bluetooth af met behulp van de functies Serial.print en bluetooth.print die ze helpen bij het verkrijgen van de waarden op een seriële monitor en via uw systeem via Bluetooth.
Eindelijk, als gevolg van het stuiteren van een knop kan een enkele waarde worden herhaald waardoor een muiscursor boven een enkele positie blijft hangen, dus om hiervan af te komen, moeten we deze vertraging toevoegen.
void loop () { digitalWrite (led, LOW); while (digitalRead (trigger) == LOW) { digitalWrite (led, HIGH); lstate = digitalRead (lklik); rstate = digitalRead (klik op); xh = analogRead (x); yh = analogRead (y); xcord = kaart (xh, 286.429.100.999); ycord = kaart (yh, 282.427.100.800); Serial.print (xcord); Serial.print (ycord); if (lstate == LOW) Serial.print (1); anders Serial.print (0); if (rstate == LOW) Serial.print (1); anders Serial.print (0); bluetooth.print (xcord); bluetooth.print (ycord); if (lstate == LOW) bluetooth.print (1); anders bluetooth.print (0); if (rstate == LOW) bluetooth.print (1); anders bluetooth.print (0); vertraging (4000); }}
Python-stuurprogrammascript
Vanaf nu zijn we klaar met de hardware en het firmwaregedeelte, om de luchtmuis te laten werken, hebben we een stuurprogramma nodig dat de signalen van de luchtmuis kan decoderen in de cursorbewegingen, dus hiervoor hebben we gekozen Python. Python is een scripttaal en met scripting bedoelen we hier dat het ons helpt om de controle over het andere programma te krijgen, aangezien we hier de muiscursor besturen.
Dus open je python-shell en installeer de volgende bibliotheken met behulp van onderstaande opdrachten:
pip install seriële pip install pyautogui
Het seriële is een bibliotheek voor python die ons helpt om de gegevens van seriële interfaces zoals com-poorten te krijgen en ons ook laat manipuleren, terwijl pyautogui een bibliotheek is voor python om controle te krijgen over de GUI-functies, in dit geval de muis.
Laten we nu naar de code voor de stuurprogramma's gaan, het eerste wat we moeten doen is de seriële en pyautogui-bibliotheken importeren, en vervolgens vanuit de seriële bibliotheek moeten we de com-poort voor de communicatie instellen met een baudrate van 9600, de hetzelfde als Bluetooth . serie werkt op. Hiervoor moet je de Bluetooth-module op je systeem aansluiten en vervolgens in de systeeminstellingen kijken op welke com-poort het is aangesloten.
Het volgende is om de seriële communicatie van de Bluetooth naar het systeem te lezen en om deze continu gaande te houden, houdt de rest van de code in een continue lus met behulp van while 1.
Zoals eerder gezegd verzendt Arduino 8 bits, eerst 6 voor de coördinaten en de laatste twee voor de status van de klikknoppen. Dus lees alle bits met behulp van ser.read en stel de lengte in op 8 bits.
Verdeel vervolgens de bits voor de cursorcoördinaten en klikken door ze over te snijden, en vervolgens de cursorbits verder in afzonderlijke X- en Y-coördinaten. Hetzelfde geldt voor de linker- en rechterklik.
Nu krijgen we uit de communicatie een bytestring en we moeten deze omzetten in een geheel getal zodat ze passen bij de coördinaten, we doen dit door ze te decoderen en ze vervolgens in gehele getallen te typen.
Om de cursor nu te verplaatsen gebruiken we de functie pyautogui moveto , die als argumenten die integer-coördinaten aanneemt en de cursor naar die positie verplaatst.
Vervolgens controleren we op de klikken, we doen dit door de laatste twee bits en de klikfunctie van pyautogui te gebruiken, de standaardklik is de linkerklik, maar we kunnen deze naar rechts zetten door de knopwaarde naar rechts te declareren, we kunnen ook het aantal klikken definiëren zet het op een dubbelklik door de klikparameter in te stellen op 2.
Hieronder staat de volledige Python-code die op de computer moet worden uitgevoerd:
import seriële import pyautogui ser = serial.Serial ('com3', 9600) while 1: k = ser.read (8) cursor = k klik = k x = cursor y = cursor l = klik r = klik xcor = int (x.decode ('utf-8')) ycor = int (y.decode ('utf-8')) pyautogui.moveTo (xcor, ycor) if l == 49: pyautogui.click (klikken = 2) elif r = = 49: pyautogui.click (knop = 'rechts', klikken = 2)
De Arduino Air Mouse testen
Sluit daarom een voedingsbron aan om de Air Mouse te bedienen. Het kan van de Arduino Nano USB-sleuf zijn of van de 5v gereguleerde voeding met behulp van 7805 IC. Voer vervolgens het python-stuurprogrammascript uit door de com-poort in te stellen waarmee uw Bluetooth is verbonden. Terwijl het script wordt uitgevoerd, ziet u een vertraging in het knipperen van Bluetooth, dit betekent dat het is verbonden met uw systeem. Klik dan om het te bedienen op de triggerknop en je zou zien dat de positie van de coördinaten zou veranderen en als je de linker- of rechterklik wilt, druk dan eerst de linker- of rechterdrukknop en de triggerknop samen in, je zou de actie zien van de klik op een gewijzigde locatie van de cursor.
Bekijk de gedetailleerde werkende video hieronder.