Szigszalag helyett Lego: így takard le kamerád az Arduinóval

|

Le szoktad fedni laptopod kameráját, mert tartasz a kéretlen kíváncsi tekintetektől? Megmutatjuk, hogyan automatizálhatod ezt a folyamatot az Arduinóval.

Webkamerád az elmúlt év home office-ban töltött időszakának köszönhetően napi rendszerességgel használt komponenssé vált, ám míg a külső eszközöket egy USB-s leválasztást követően egyszerűen eltávolíthatod, megakadályozva, hogy illetéktelenek észrevétlenül betekintést nyerjenek mindennapjaidba, addig a laptopok beépített kamerája már más módszert igényel. Sok felhasználó dönt úgy, hogy valamilyen módon leragasztja a többnyire a képernyő tetején csücsülő optikát, de ez nem feltétlenül a legelegánsabb megoldás.

Természetesen akadnak olyan gyártók is, amelyek alapból elrejtik a képalkotót (ablakot helyeznek elé, a billentyűzetbe süllyesztik stb.), ám ha az asztalodat nem egy ilyen megoldásokkal szerelt modell ékesíti, akkor ideje kreatív megoldás után nézned. Szerencsére mikrovezérlők segítségével nemcsak a takarást, hanem annak feloldását is egyszerűen élesítheted, mindössze néhány komponens elég is egy ilyen biztonsági lépcső felállításához.

 Előkészületek

Mielőtt bármi másba belekezdenél, ajánlott összegyűjteni a hardveres hozzávalókat. Túl sok kiegészítőre nem lesz szükséged, mindössze egy szervomotor kell ahhoz, hogy gond nélkül belevághass az alkotási folyamatba. Persze előbb még gondoskodnod kell arról, hogy a motort megfelelően rögzíteni lehessen a kamera felett, ehhez építs valamilyen tokozást a komponensnek, és a hozzá tartozó karra helyezz fel valamit, ami alkalmas a képrögzítő lefedésére.

A legegyszerűbb dolgod talán akkor lesz, ha ez utóbbit kartonból vágod ki, de természetesen egyéb megoldások is szóba jöhetnek (mi például legókockákat vetettünk be). Ha elkészült a szervomotorhoz tartozó tokozás, akkor jöhet a szoftveres komponensek telepítése. Először is módot kell találnod arra, hogy a rendszerfolyamatokat valamiképp monitorozni tudd - mi a Python bevetését javasoljuk.

Amennyiben nem található meg a számítógépeden a hozzá tartozó fejlesztői könyvtár, akkor telepíts a hivatalos oldaláról egy 3-as főverziójú csomagot, mert így a cikkünkben említett komponensek mindegyike garantáltan a rendelkezésedre áll majd a fejlesztés során. Amint sikeresen végeztél az installálással, sort keríthetsz a további kiegészítők felrakására. Ehhez nyiss egy parancssori ablakot (a Start menü keresőjébe gépeld be a CMD kulcsszót), és ellenőrizd a Python csomagtelepítőjét a pip -version utasítás segítségével.

Sajnos ha itt nem kapsz eredményt, akkor pluszlépésként még ezt a csomagot is installálnod kell: ehhez használd a python -m ensurepip --default-pip parancsot. Amikor már minden megfelelően működik, csak annyi a teendőd, hogy telepíted a soros monitoron keresztüli kommunikációt felkínáló pyserialt (pip install pyserial), valamint a rendszerfolyamatok monitorozására is képes psutilt (pip install psutil). Ezzel minden akadály elhárult az elől, hogy fejest ugorhass a fejlesztésbe.

Kódbűvölés

Amit kódokkal most el szeretnél érni, az nem más, mint hogy a Windows beépített kameraalkalmazásának élesítését követően a szervomotor megszüntesse a takarást, kilépéskor pedig visszaálljon eredeti, kamerát lefedő pozíciójába. Elsőként a Python-kódban kell jobban elmélyedned, mert a két elem közül ez fogja majd adatokkal bombázni az Arduinót. Nyiss egy szerkesztőablakot a programhoz (mi Notepad++-t használtunk, de igény szerint egyéb fejlesztői környezetet is bevethetsz), majd mentsd el az üres fájlt webcam.py néven.

Az állomány első két sorában hivatkozz a használni kívánt külső csomagokra (import serial és import psutil), majd élesítsd a soros monitort a monitor = serial.Serial('COM3') és a monitor.baudrate = '9600' utasítások segítségével. Figyelj oda arra, hogy a 'COM3' érték helyén az a kommunikációs port szerepeljen, amelyiken keresztül az Arduino üzenetet vált a számítógépeddel. Ezek után szükséged lesz két változóra.

Alkalmazásukkal akadályozhatod meg az üzenetek záporozását (first=0 és second=0). Hogy ne kelljen minden egyes ellenőrzéshez újraindítani a szoftvert, muszáj végtelen ciklusba helyezned a kód többi részét (while True:), itt pedig minden egyes ismétlődés esetén vizsgáld a Windows beépített kameraalkalmazásának aktiválását (if "WindowsCamera.exe" in (i.name() for i in psutil.process_iter()):).

Ha ez igaz értékkel tér vissza, akkor nézd meg a first változó aktuális értékét, és amennyiben itt 0 fogad (if first==0:), írj ki egy üzenetet a parancssorba (print("Message: slider on")), küldj egy 0-t a soros monitorra (monitor.write(b"0")), állíts be egy 1-es értéket a first-re (first=1), valamint 0-t a secondra (second=0).

Ezt követően a kamera élesítését vizsgáló kódhoz készíts egy else ágat is, ahol vizsgáld a second aktuálisan felvett értékét, ha pedig ez 0 (if second==0:), akkor az előzőekben látottakhoz hasonlóan írj egy üzenetet a parancssorba (print("Message: slider off")), valamint a soros monitorra (monitor.write(b"1")),végül pedig a secondöt állítsd 1-re, a first értékét 0-ra.

Ezzel el is készült a Python-kódod, amit tesztelve láthatod, hogy a kameraalkalmazás élesítése és bezárása után a megfelelő üzenet jelenik meg a parancssorban.

Aktivált motor

Az Arduino IDE-felületén hozz létre egy új, üres kódot, és rögtön az első sorába emeld be a szervóhoz tartozó könyvtárcsomagot (#include <Servo.h>), majd hozz létre a kódban egy példányt ebből a komponensből (Servo myservo;), továbbá aktiválj egy változót, amelynek segítségével figyeled és tárolod a bejövő adatokat (int incomingData;).

A setup belsejében elsőként aktiváld a soros monitort (Serial.begin(9600);), és a kódban is csatold a motort a kiszemelt pinhez (myservo.attach(A0);), valamint állíts be egy kezdőértéket a takaráshoz (myservo.write(25);). Érdemes kísérletezni a számokkal, mivel a motor aktuális pozíciójától nagyban függ, hogy mekkora lesz az ideális érték.

Ha ezzel megvagy, figyeld egy ciklusban a soros monitor elérhetőségét (while (!Serial.available());), majd olvasd be a bejövő adatokat az incomingData = Serial.readString().toInt(); utasítás segítségével. Ha ezzel is végeztél, nincs más teendőd, mint egy feltételben vizsgálni, hogy 0 vagy 1 érkezett, és a megfelelő pozícióba forgatni a motort (if(incomingData==0){myservo.write(100); } if(incomingData==1){ myservo.write(25); }).

Itt is figyelj a számértékekre, és különösen arra, hogy az 1-es érkezése esetén ugyanazt a kiinduló pozíciót add meg, amit a setupban is használtál. Ezzel az Arduinóra szánt szoftvered is elkészült, a feltöltést követően pedig már tesztelheted is a képességeit.

Fejlesztési opciók

Számtalan módosítási lehetőség rejlik ebben a megoldásban; a legizgalmasabb talán az, ha a Python-kódot kiegészíted további szoftverekkel, így ugyanis elérheted, hogy olyan alkalmazások indításakor, amelyek igényt tarthatnak webkamerádra (Zoom, Skype), szintén automatikusan félrehúzódjon az optikát takaró "függöny".

Arra kiemelten figyelned kell, hogy az alkalmazáshoz tartozó futtatható állomány nevét pontosan add meg, ezt az ikonjához tartozó tulajdonságok alapján vagy a Feladatkezelő részletes leírásának segítségével is kiderítheted. Hasonlóan fejlesztheted az Arduinót is, egy dedikált gomb hozzáadásával akár a manuális nyitás/zárás is lehetővé válik.

A tokozást is igényeid szerint alakíthatod, hogy a legkielégítőbb végeredményt kapd, sőt ha kellően elszánt vagy - és módodban áll - akár még 3D-nyomtatással is készíthetsz házat a projekthez.

Kód 1

#include <Servo.h>

Servo myservo; int incomingData;

void setup() { Serial.begin(9600); myservo.attach(A0); myservo.write(25); }

void loop() { while (!Serial.available());incomingData = Serial.readString().toInt();

if(incomingData==0){ myservo.write(100); }

if(incomingData==1){myservo.write(25);} }

Kód 2

import serial

import psutil

monitor = serial.Serial('COM3')

monitor.baudrate = '9600'

first=0

second=0

while True:

            if "WindowsCamera.exe" in (i.name() for i in psutil.process_iter()):

                        if first==0:

                                    print("Message: slider on")

                                    monitor.write(b"0")

                                    first=1

                                    second=0

            else:

                        if second==0:

                                    print("Message: slider off")

                                    monitor.write(b"1")

                                    second=1

                                    first=0

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.