لذلك جاءت عطلة رأس السنة ، ومعهم الكثير من وقت الفراغ ، وحتى مكنسة كهربائية ذكية سقطت في يدي. بمجرد أن رأيت التحكم اليدوي في تطبيق 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)
في هذه المرحلة ، يجب أن يقول المكنسة الكهربائية باستخدام أدوات التحكم عن بُعد (أو شيء مشابه وفقًا للبرنامج الثابت) ، ارتعاش وتوقف
الخطوة 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
في الوقت الحالي ، في 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
قم بتشغيل البرنامج النصي ، واضغط X على وحدة التحكم ويجب أن يركب الروبوت ويدور
في هذه المرحلة ، واجهت مشكلة: لسبب ما ، إذا قمت بالضغط على العصا اليسرى للأمام حتى النهاية ومحاولة الدوران ، فلن تنعطف ، يجب عليك أولاً التباطؤ ، إذا حاولت تقليل قيم التعيين ، على سبيل المثال ، تعيين -0.29 ، 0.29 ، فسوف تبدأ في وضع دائرة ، حتى يتغير موضع الملصق الأيسر ، لم أحسب أبدًا ما هي المشكلة
الخطوة 4 ، إضافة بعض الموسيقى
نذهب إلى ssh لدينا الروبوت ونرى ما هي لغات البرمجة النصية هناك.
لم يكن هناك بيثون ، لكنني لم أر نقطة تثبيته ، لكنني وجدت لؤلؤة مناسبة لمهمتنا الصغيرة.
بعد ذلك ، قم بتثبيت sox:
sudo apt-get install sox, libsox-fmt-mp3
واكتب خادم صغير على اللؤلؤة:
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 هي وسيطة الوظيفة.
النتيجة