因此,新年假期到了,他们有了许多空闲时间,甚至一个智能吸尘器也落入了我的手中。 在MiHome应用程序中看到手动控制后,我立即意识到我想做的事情:我们将使用Dualshock v4游戏手柄控制吸尘器!
步骤1,拖动令牌,闪烁(可选)
我们放入了打补丁的MiHome应用程序,该应用程序将向我们显示令牌,然后选择根固件,下载并安装python-miio(pip install python-miio),尝试使用
mirobo --ip %ip% --token %token% update-firmware %filename%
安装固件
mirobo --ip %ip% --token %token% update-firmware %filename%
,此时一切都中断了。 真空吸尘器拼命拒绝更新,经过几个小时的搜索之后,我试图看到mirobo和lo的调试输出,瞧瞧! 由于我的笔记本电脑上安装了多个适配器,因此他尝试在VirtualBox仅主机适配器的网络上分发固件。 接下来,我刚举起文件服务器并
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"}'
以下命令:
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
经过一番研究,决定使用pygame
我们看看是什么按钮/贴纸负责 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中,您仅可以打印(轴)并检查操纵杆是否正常工作。
接下来,当您按下按钮/操纵杆时,我们需要使机器人骑行,我选择了Y轴上的左操纵杆(上-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转到我们的机器人,看看那里有什么脚本语言。
没有Python,但是我看不到安装它的意义,但是我发现了适合我们的小任务的珍珠。
接下来,安装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是函数参数。
结果