نحن ركوب Xiaomi مكنسة كهربائية

لذلك جاءت عطلة رأس السنة ، ومعهم الكثير من وقت الفراغ ، وحتى مكنسة كهربائية ذكية سقطت في يدي. بمجرد أن رأيت التحكم اليدوي في تطبيق MiHome ، أدركت على الفور ما أردت القيام به: سنتحكم في المكنسة الكهربائية باستخدام لوحة اللعبة Dualshock v4!

الخطوة 1 ، سحب الرمز المميز ، وامض (اختياري)


وضعنا تطبيق MiHome المصحح ، والذي سيظهر لنا الرمز المميز ، ثم حدد البرامج الثابتة للجذر ، وقم بتنزيل وتثبيت python-miio (نقطة تثبيت python-miio) ، حاول تثبيت البرنامج الثابت باستخدام mirobo --ip %ip% --token %token% update-firmware %filename% وعند هذه النقطة كسر كل شيء. المكنسة الكهربائية رفضت بشدة أن يتم تحديثها ، بعد عدة ساعات من googling ، حاولت أن أرى إخراج debug من mirobo و lo وها! نظرًا لحقيقة أن لدي عدة محولات مثبتة على جهاز الكمبيوتر المحمول ، فقد حاول توزيع البرامج الثابتة على شبكة محول VirtualBox Host-Only. بعد ذلك ، قمت فقط برفع خادم الملفات وتشغيل هذا الأمر: 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"}' . نهض البرنامج الثابت في مكان ما في 10 دقائق ، عملت الوصول ssh

الخطوة 2 ، في محاولة لركوب الروبوت


 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() 

في هذه المرحلة ، يجب أن يقول المكنسة الكهربائية باستخدام أدوات التحكم عن بُعد (أو شيء مشابه وفقًا للبرنامج الثابت) ، ارتعاش وتوقف

الخطوة 3 ، الاتصال Dualshock


بعد قليل من البحث ، تقرر استخدام لعبة الأقزام
نحن ننظر إلى ما أزرار / ملصقات هي المسؤولة عن

 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) 

في الوقت الحالي ، في move_robot ، يمكنك فقط الطباعة (المحور) والتحقق من أن عصا التحكم تعمل.
بعد ذلك ، نحن بحاجة إلى ركوب الروبوت عندما تضغط على الأزرار / العصي ، اخترت العصا اليسرى على المحور ص (أعلى -1 ، أسفل 1) للسرعة والعصا اليمنى على المحور X للزاوية ، واتضح أن هذا

 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) 

قم بتشغيل البرنامج النصي ، واضغط X على وحدة التحكم ويجب أن يركب الروبوت ويدور
في هذه المرحلة ، واجهت مشكلة: لسبب ما ، إذا قمت بالضغط على العصا اليسرى للأمام حتى النهاية ومحاولة الدوران ، فلن تنعطف ، يجب عليك أولاً التباطؤ ، إذا حاولت تقليل قيم التعيين ، على سبيل المثال ، تعيين -0.29 ، 0.29 ، فسوف تبدأ في وضع دائرة ، حتى يتغير موضع الملصق الأيسر ، لم أحسب أبدًا ما هي المشكلة

الخطوة 4 ، إضافة بعض الموسيقى


نذهب إلى ssh لدينا الروبوت ونرى ما هي لغات البرمجة النصية هناك.

لم يكن هناك بيثون ، لكنني لم أر نقطة تثبيته ، لكنني وجدت لؤلؤة مناسبة لمهمتنا الصغيرة.

بعد ذلك ، قم بتثبيت sox:

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

واكتب خادم صغير على اللؤلؤة:

 #!/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 

في وحدة التحكم لدينا نحن نفعل شيئا مثل

 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() 

ومن خلال المكنسة الكهربائية ، يجب تشغيل test.mp3 (وفقًا لذلك ، نحتاج إلى رفع خادم الملفات على الجهاز المحلي لدينا).

ستؤدي وظيفة play_sound () نفس الشيء تقريبًا ، فقط sendall (url + '؛') ستكون ، url هي وسيطة الوظيفة.

النتيجة


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


All Articles