Kami mengendarai Xiaomi Vacuum Cleaner

Jadi liburan Tahun Baru tiba, dan dengan mereka banyak waktu luang, dan bahkan penyedot debu pintar jatuh ke tangan saya. Segera setelah saya melihat kontrol manual dalam aplikasi MiHome, saya segera menyadari apa yang ingin saya lakukan: kami akan mengontrol penyedot debu menggunakan gamepad Dualshock v4!

Langkah 1, menyeret token, berkedip (opsional)


Kami meletakkan aplikasi MiHome yang ditambal, yang akan menunjukkan kepada kita token, lalu pilih root firmware, unduh, instal python-miio (pip instal python-miio), coba instal firmware menggunakan mirobo --ip %ip% --token %token% update-firmware %filename% dan pada titik ini semuanya rusak. Penyedot debu dengan putus asa menolak untuk diperbarui, setelah beberapa jam googling, saya mencoba untuk melihat hasil debug dari mirobo dan lihatlah! Karena kenyataan bahwa saya memiliki beberapa adaptor yang diinstal pada laptop saya, ia mencoba mendistribusikan firmware pada jaringan adaptor VirtualBox Host-Only. Selanjutnya, saya baru saja mengangkat file server dan mirobo --ip=%ip% --token=%token% raw-command miIO.ota '{"mode":"normal", "install":"1", "app_url":"http://%my_ip:port%/%filename%.pkg", "file_md5":"%md5%","proc":"dnld install"}' perintah ini: mirobo --ip=%ip% --token=%token% raw-command miIO.ota '{"mode":"normal", "install":"1", "app_url":"http://%my_ip:port%/%filename%.pkg", "file_md5":"%md5%","proc":"dnld install"}' . Firmware bangun di suatu tempat dalam 10 menit, akses ssh bekerja

Langkah 2, cobalah naik robot


 import miio ip = '' token = '' bot = miio.vacuum.Vacuum(ip, token) bot.manual_start() bot.manual_control(0, 0.3, 2000) # move forward with max speed for 2 seconds bot.manual_control(90, 0, 1000) # rotate bot.manual_stop() 

Pada titik ini, penyedot debu seharusnya mengatakan Menggunakan kendali jarak jauh (atau sesuatu yang serupa tergantung pada firmware), berkedut dan berhenti

Langkah 3, sambungkan Dualshock


Setelah sedikit riset, diputuskan untuk menggunakan pygame
Kami melihat tombol / stiker apa yang bertanggung jawab

 BUTTON_SQUARE = 0 BUTTON_X = 1 BUTTON_CIRCLE = 2 BUTTON_TRIANGLE = 3 def init_joystick(): pygame.init() pygame.joystick.init() controller = pygame.joystick.Joystick(0) controller.init() return controller def main(): controller = init_joystick() bot = miio.vacuum.Vacuum(ip, token) modes = ['manual', 'home', 'spot', 'cleaning', 'unk'] mode = 'unk' axis = [0.00 for _ in range(6)] flag = True button = [False for _ in range(14)] print('Press start to start!') while flag: for event in pygame.event.get(): if event.type == pygame.JOYAXISMOTION: axis[event.axis] = round(event.value,2) elif event.type == pygame.JOYBUTTONDOWN: button[event.button] = True # Touchpad to exit if event.button == 13: flag = False elif event.type == pygame.JOYBUTTONUP: if mode == 'unk': print('Ready to go! Press X to start manual mode') if event.button == BUTTON_X: mode = 'manual' bot.manual_start() elif mode == 'manual': if event.button == BUTTON_TRIANGLE: bot.manual_stop() mode = 'unk' elif event.button == BUTTON_X: play_sound('http://192.168.1.43:8080/dejavu.mp3') # see ya later elif event.button == BUTTON_CIRCLE: # stop sound play_sound(';') if mode == 'manual': try: move_robot(bot, button, axis) # see ya in the next step except: bot.manual_start() pass time.sleep(0.01) 

Untuk saat ini, di move_robot, Anda cukup mencetak (sumbu) dan memeriksa apakah joystick berfungsi.
Selanjutnya, kita perlu membuat robot naik ketika Anda menekan tombol / tongkat, saya memilih tongkat kiri pada sumbu Y (atas -1, turun 1) untuk kecepatan dan tongkat kanan pada sumbu X untuk sudut, ternyata seperti ini

 def translate(value, leftMin, leftMax, rightMin, rightMax): leftSpan = leftMax - leftMin rightSpan = rightMax - rightMin valueScaled = float(value - leftMin) / float(leftSpan) return rightMin + (valueScaled * rightSpan) def move_robot(bot, buttons, axis): rot = 0 val = 0 to_min, to_max = -0.3, 0.3 # Right stick X if axis[2] != 0: rot = -translate(axis[2], -1, 1, -90, 90) if abs(rot) < 8: rot = 0 # Left stick Y, -1 up, 1 down if axis[1] != 0: val = -translate(axis[1], -1, 1, to_min, to_max) if abs(val) < 0.07: val = 0 if rot or val: bot.manual_control(rot, val, 150) 

Jalankan skrip, tekan X pada pengontrol dan robot harus naik dan berputar
Pada tahap ini, saya mempunyai masalah: untuk beberapa alasan, jika Anda menekan tongkat kiri ke depan dan mencoba untuk berbelok, itu tidak akan berubah, Anda pertama-tama harus memperlambat, jika Anda mencoba mengurangi nilai pemetaan, misalnya, mengatur -0.29, 0.29, itu akan mulai melingkari , sampai posisi stiker kiri berubah, saya tidak pernah tahu apa masalahnya

Langkah 4, tambahkan musik


Kami pergi dengan ssh ke robot kami dan melihat bahasa scripting apa yang ada.

Tidak ada Python, tetapi saya tidak melihat titik untuk menginstalnya, tetapi saya menemukan mutiara, cocok untuk tugas kecil kami.

Selanjutnya, instal sox:

 sudo apt-get install sox, libsox-fmt-mp3 

dan tulis server kecil di atas mutiara:

 #!/usr/bin/perl use IO::Socket::INET; $| = 1; my $socket = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '7777', Proto => 'tcp', Listen => 2, Reuse => 1 ); die "cannot create socket $!\n" unless $socket; print "server waiting for client connection on port 7777\n"; while(1) { my $client_socket = $socket->accept(); my $client_address = $client_socket->peerhost(); my $client_port = $client_socket->peerport(); print "connection from $client_address:$client_port\n"; my $data = ""; $client_socket->recv($data, 256); print "received data: $data\n"; my @urls = split /;/, $data; system("killall play > /dev/null"); $data = "ok"; $client_socket->send($data); shutdown($client_socket, 1); if ( $urls[0] ne "") { system("play -q -v 0.4 " . $urls[0] . " &"); } } $socket->close(); 

 sudo perl sound_server.pl 

di konsol kami, kami melakukan sesuatu seperti

 import socket ip = '' s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, 7777)) s.sendall(b'http://%local_ip%:%local_port%/test.mp3;') s.close() 

Dan melalui penyedot debu, test.mp3 kita harus diputar (sesuai, kita perlu menaikkan file server di mesin lokal kita).

Fungsi play_sound () kami akan melakukan hal yang hampir sama, hanya sendall (url + ';') yang akan, url adalah argumen fungsi.

Hasil


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


All Articles