PC Kendali Geser dengan Arduino dan Python – Operasi Tanpa Tangan
Komponen dan Perlengkapan
Arduino UNO – 1 unit
Sensor Ultrasonik - HC-SR04 (Umum) – 2 unit
Kabel jumper (umum) – 1 unit
Aplikasi dan Layanan Online
Arduino IDE – 1 unit
Python IDLE – 1 unit
PySerial Library – 1 unit
Pyautogui Library – 1 unit
Tentang Proyek Ini
Dalam proyek ini, kita akan belajar cara membangun laptop atau komputer dengan kontrol geser. Ini didasarkan pada penggunaan kombinasi Arduino dan Python.
Alih-alih menggunakan keyboard, mouse atau joystick, kita dapat menggunakan gerakan tangan untuk mengontrol beberapa fungsi komputer seperti memutar/jeda video, geser kiri/kanan dalam slideshow foto, gulir atas/bawah di halaman web dan banyak lagi. Itulah sebabnya saya memutuskan untuk mengontrol VLC Media Player sebagai proyek gerakan tangan.
Ide di balik proyek ini cukup mudah dengan menggunakan dua Sensor Ultrasonik (HC-SR04) dengan Arduino. Kami akan menempatkan dua sensor di atas layar laptop dan menghitung jarak antara tangan dan sensor. Menghitung informasi dari Arduino yang dikirim ke Python melalui port serial, informasi ini kemudian akan dibaca oleh Python yang berjalan pada komputer untuk melakukan tindakan tertentu.
Komponen Hardware:
Arduino
Dua Sensor Ultrasonik (HC-SR04)
Beberapa kabel
Aplikasi Perangkat Lunak:
Arduino IDE
Python IDLE
Perpustakaan PySerial (Kami akan menggunakan untuk berkomunikasi dengan port serial).
Perpustakaan PyAutogui (Kami akan menggunakan untuk melakukan tindakan).
Jadi saya asumsikan Anda telah menginstal Python dan perpustakaan PySerial dan telah berhasil melakukan beberapa proyek dasar. Jika tidak, jangan khawatir; saya menyarankan Anda untuk mengikuti tutorial saya sebelumnya (Memprogram Arduino Menggunakan Python). Juga jika Anda ingin mengenal Sensor Ultrasonik Anda dapat melihat (di sini).
Langkah 1: Tonton Video untuk Detail Lebih Lanjut
Langkah 2: Tujuan Gerakan Tangan
Berikut adalah 5 perintah gerakan tangan yang saya program untuk tujuan demonstrasi.
Gerakan tangan pertama: Ini memungkinkan kita untuk 'Play/Pause' VLC dengan menempatkan kedua tangan di depan sensor ultrasonik kanan/kiri pada jarak jauh tertentu.
Gerakan kedua: Ini memungkinkan kita untuk 'Rewind' video dengan menempatkan tangan di depan sensor kiri pada jarak jauh tertentu.
Gerakan ketiga: Ini memungkinkan kita untuk 'Forward' video dengan menempatkan tangan di depan sensor kanan pada jarak jauh tertentu.
Gerakan keempat: Ini memungkinkan kita untuk 'Meningkatkan Volume' video dengan menempatkan tangan di depan sensor kiri pada jarak jauh tertentu dan menjauh dari Sensor.
Gerakan kelima: Ini memungkinkan kita untuk 'Menurunkan Volume' video dengan menempatkan tangan di depan sensor kiri pada jarak jauh tertentu dan mendekati sensor.
Langkah 3: Skematik
Skematik cukup sederhana, Anda hanya perlu mengikuti instruksi di bawah ini. Jadi setiap sensor memiliki 4 pin:
Vcc - pin ini terhubung ke 5V+.
Trig - Anda perlu mendefinisikan pin ini dalam program Anda.
Echo - pin ini sama dengan Trig, Anda juga perlu mendefinisikannya.
GND - pin ini terhubung ke ground.
Langkah 4: Memprogram Python
1. Instal Python IDLE
Anda dapat melewati langkah ini jika Anda telah menginstal Python IDLE di komputer Anda. Jika ya, maka pergi ke langkah 2, atau lihat instruksi berikut ini.
Pergi ke situs web python dan unduh (di sini).
Setelah selesai, Anda melanjutkan ke instalasi dengan menyimpan direktori tempat python diinstal secara default.
CATATAH: Bahkan jika komputer Anda beroperasi pada 64-bit, Anda dapat menggunakan Python 32-bit itu sendiri karena kurangnya kompatibilitas dengan perpustakaan Arduino.
2. Instal Perpustakaan PySerial
PySerial adalah modul API Python yang digunakan untuk membaca dan menulis data serial ke Arduino atau Mikrokontroler lainnya. Untuk menginstal di Windows, kunjungi Halaman Unduhan PySerial dan ikuti langkah-langkah di bawah ini:
Unduh PySerial dari tautan di atas.
Instal dengan menjaga pengaturan sebagai default Anda harus yakin bahwa Pyserial bekerja dengan benar. Untuk melakukannya; ketikkan:
import serial
Jika Anda tidak mengalami kesalahan, Anda siap. Jika tidak, saya menyarankan Anda untuk memeriksa instalasi dan ekstensi Python IDLE Anda.
3. Instal Perpustakaan PyAutogui
Tujuan PyAutoGUI adalah untuk menyediakan modul Python lintas platform untuk otomatisasi GUI untuk manusia. API dirancang untuk semudah mungkin dengan pengaturan yang masuk akal. Ikuti langkah-langkah di bawah ini untuk menginstal pyautogui untuk Windows. (Untuk mengikuti langkah-langkah ini Anda seharusnya telah menginstal Python IDLE.)
Jika Anda menggunakan platform lain, saya menyarankan Anda untuk melihat di sini.
Buka Windows Command
Ketikkan perintah berikut
cd C:\Python27
Kemudian ketik:
python –m pip install –upgrade pip
Perintah terakhir adalah:
python –m pip install pyautogui
CATATAH: Untuk yakin bahwa pyautogui bekerja dengan benar cukup ketikkan:
import pyautogui
Jika Anda tidak mengalami kesalahan, Anda siap.
Langkah 5: Kode Arduino
Untuk memulai koneksi dengan Arduino dari Python, kita terlebih dahulu harus mengetahui port COM mana tempat Arduino berada. Tugas ini dilakukan dengan mudah oleh lingkungan pemrograman Arduino seperti yang saya catat di gambar di atas.
const int trigger1 = 2; //Trigger pin of 1st Sesnor const int echo1 = 3; //Echo pin of 1st Sesnor const int trigger2 = 4; //Trigger pin of 2nd Sesnor const int echo2 = 5;//Echo pin of 2nd Sesnor long time_taken; int dist,distL,distR; void setup() { Serial.begin(9600); pinMode(trigger1, OUTPUT); pinMode(echo1, INPUT); pinMode(trigger2, OUTPUT); pinMode(echo2, INPUT); } /*###Function to calculate distance###*/ void calculate_distance(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH); dist= time_taken*0.034/2; if (dist>60) dist = 60; } void loop() { //infinite loopy calculate_distance(trigger1,echo1); distL =dist; //get distance of left sensor calculate_distance(trigger2,echo2); distR =dist; //get distance of right sensor //Pause Modes -Hold if ((distL >40 && distR>40) && (distL <60 && distR<60)) //Detect both hands {Serial.println("Play/Pause"); delay (500);} calculate_distance(trigger1,echo1); distL =dist; calculate_distance(trigger2,echo2); distR =dist; //Control Modes //Lock Left - Control Mode if (distL>=13 && distL<=17) { delay(100); //Hand Hold Time calculate_distance(trigger1,echo1); distL =dist; if (distL>=13 && distL<=17) { Serial.println("Left Locked"); while(distL<=40) { calculate_distance(trigger1,echo1); distL =dist; if (distL<10) //Hand pushed in {Serial.println ("Volume Increased"); delay (300);} if (distL>20) //Hand pulled out {Serial.println ("Volume Decreased"); delay (300);} } } } //Lock Right - Control Mode if (distR>=13 && distR<=17) { delay(100); //Hand Hold Time calculate_distance(trigger2,echo2); distR =dist; if (distR>=13 && distR<=17) { Serial.println("Right Locked"); while(distR<=40) { calculate_distance(trigger2,echo2); distR =dist; if (distR<10) //Right hand pushed in {Serial.println ("Rewind"); delay (300);} if (distR>20) //Right hand pulled out {Serial.println ("Forward"); delay (300);} } } } delay(200); }
Jika Anda membaca kode Arduino, Anda akan mengamati 5 perintah yang mengontrol beberapa fungsi keyboard untuk mencapai tugas yang diperlukan.
arduino_pythogui.ino Unduh
arduino_pythogui.ino
Langkah 6: Kode Python
Pertama, kita perlu program sederhana untuk membuat Python mengirim data melalui port serial.
import serial #Serial imported for Serial communication import time #Required to use delay functions import pyautogui #Required to to perform actions ArduinoSerial = serial.Serial('com15',9600) #Create Serial port object called arduinoSerialData time.sleep(2) #wait for 2 seconds for the communication to get established while 1: incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line print incoming if 'Play/Pause' in incoming: pyautogui.typewrite(['space'], 0.2) if 'Rewind' in incoming: pyautogui.hotkey('ctrl', 'left') if 'Forward' in incoming: pyautogui.hotkey('ctrl', 'right') if 'Volume Incresaed' in incoming: pyautogui.hotkey('ctrl', 'down') if 'Volume Decreased' in incoming: pyautogui.hotkey('ctrl', 'up') incoming = "";
Kode
Cuplikan Kode #5
Cuplikan Kode #6
Cuplikan Kode #5Plain text
const int trigger1 = 2; //Trigger pin of 1st Sesnor const int echo1 = 3; //Echo pin of 1st Sesnor const int trigger2 = 4; //Trigger pin of 2nd Sesnor const int echo2 = 5;//Echo pin of 2nd Sesnor long time_taken; int dist,distL,distR; void setup() { Serial.begin(9600); pinMode(trigger1, OUTPUT); pinMode(echo1, INPUT); pinMode(trigger2, OUTPUT); pinMode(echo2, INPUT); } /*###Function to calculate distance###*/ void calculate_distance(int trigger, int echo) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); time_taken = pulseIn(echo, HIGH); dist= time_taken*0.034/2; if (dist>60) dist = 60; } void loop() { //infinite loopy calculate_distance(trigger1,echo1); distL =dist; //get distance of left sensor calculate_distance(trigger2,echo2); distR =dist; //get distance of right sensor //Pause Modes -Hold if ((distL >40 && distR>40) && (distL <60 && distR<60)) //Detect both hands {Serial.println("Play/Pause"); delay (500);} calculate_distance(trigger1,echo1); distL =dist; calculate_distance(trigger2,echo2); distR =dist; //Control Modes //Lock Left - Control Mode if (distL>=13 && distL<=17) { delay(100); //Hand Hold Time calculate_distance(trigger1,echo1); distL =dist; if (distL>=13 && distL<=17) { Serial.println("Left Locked"); while(distL<=40) { calculate_distance(trigger1,echo1); distL =dist; if (distL<10) //Hand pushed in {Serial.println ("Volume Increased"); delay (300);} if (distL>20) //Hand pulled out {Serial.println ("Volume Decreased"); delay (300);} } } } //Lock Right - Control Mode if (distR>=13 && distR<=17) { delay(100); //Hand Hold Time calculate_distance(trigger2,echo2); distR =dist; if (distR>=13 && distR<=17) { Serial.println("Right Locked"); while(distR<=40) { calculate_distance(trigger2,echo2); distR =dist; if (distR<10) //Right hand pushed in {Serial.println ("Rewind"); delay (300);} if (distR>20) //Right hand pulled out {Serial.println ("Forward"); delay (300);} } } } delay(200); }
Cuplikan Kode #6Plain text
import serial #Serial imported for Serial communication import time #Required to use delay functions import pyautogui #Required to to perform actions ArduinoSerial = serial.Serial('com15',9600) #Create Serial port object called arduinoSerialData time.sleep(2) #wait for 2 seconds for the communication to get established while 1: incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line print incoming if 'Play/Pause' in incoming: pyautogui.typewrite(['space'], 0.2) if 'Rewind' in incoming: pyautogui.hotkey('ctrl', 'left') if 'Forward' in incoming: pyautogui.hotkey('ctrl', 'right') if 'Volume Incresaed' in incoming: pyautogui.hotkey('ctrl', 'down') if 'Volume Decreased' in incoming: pyautogui.hotkey('ctrl', 'up') incoming = "";