本帖最后由 efans_87896504 于 2022-11-16 13:07 编辑
小车可以可以转向了,但还缺点什么,毕竟总不能随时跟着后面操作按键吧,要是能够远程控制就好了。于是,我和小朋友决定尝试远程控制。怎么控制呢,TCP?MQTT?最后还是选择简单点的,使用MQTT来控制。这个对于小朋友来说,就复杂点了,只能跟他讲点原理,我来操作了。 1、首先,需要一个MQTT服务器,这个原先做练习时搭建过一个,直接拿来用就可以了。当然也可以用小河狸创客自己的MQTT服务器。
2、接着就需要完成小车的控制程序,连接上MQTT服务器,然后订阅下发命令主题,根据不同命令进行具体操作。
- # generated by GewuBit
- import gewu
- from wifi import *
- import ujson
- from umqtt import MQTTClient
- iot_wifi = gewu_wifi()
- ssid = str('HUAWEI-GEWU')
- pwd = str('123456')
- client_id = 'mygewuiotclient'
- mserver = '192.168.2.37'
- port=1883
- topic_ctl = b'public/gewuiot/cmd'
- topic_sta = b'public/gewuiot/sta'
- def sub_callback(topic, msg):
- cmd = ujson.loads(msg)
- if cmd['target'] == 'transmission':
- if cmd['option'] == 'forward':
- gewu.servo_p4.set_dir_speed(-1, 30)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'forward', 0, 0, 16)
- gewu.display.show()
- elif cmd['option'] == 'backward':
- gewu.servo_p4.set_dir_speed(1, 30)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'backward', 0, 0, 16)
- gewu.display.show()
- elif cmd['option'] == 'stop':
- gewu.servo_p4.release()
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'stop', 0, 0, 16)
- gewu.display.show()
- elif cmd['option'] == 'start':
- gewu.servo_p4.set_speed(30)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'start', 0, 0, 16)
- gewu.display.show()
- else:
- print('bad command')
- elif cmd['target'] == 'steering':
- if cmd['option'] == 'left':
- gewu.servo_p3.set_angle(65)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'turn left', 0, 50, 16)
- gewu.display.show()
- elif cmd['option'] == 'right':
- gewu.servo_p3.set_angle(115)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'turn right', 0, 50, 16)
- gewu.display.show()
- elif cmd['option'] == 'straighten':
- gewu.servo_p3.set_angle(90)
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'straighten', 0, 50, 16)
- gewu.display.show()
- else:
- gewu.display.fill(OLED.BLACK)
- gewu.display.text_ch(b'bad command', 0, 0, 16)
- gewu.display.show()
- def on_start():
- gewu.display.fill(OLED.BLACK)
- gewu.display.text(str('Gewu:bit'), 0, 0, 6)
- gewu.display.show()
- iot_wifi.connectWiFi(ssid, pwd)
- while not iot_wifi.isconnected():
- pass
- gewu.display.fill(OLED.BLACK)
- gewu.display.text(str('Wifi connected!'), 0, 0, 6)
- gewu.display.show()
- print(client_id)
- client = MQTTClient(client_id,mserver,port)
- client.set_callback(sub_callback)
- client.connect()
- client.subscribe(topic_ctl)
- client.publish(topic_sta, ujson.dumps({"sta": "Device online"}), retain=False)
- print("Connected to %s, subscribed to %s topic" % (mserver, topic_ctl))
-
- while True:
- client.check_msg()
- time.sleep(1)
- yield
- func_start = on_start()
- def repeat():
- next(func_start)
- while True:
- repeat()
- gewu.sleep_ms(1)
3、小车程序写完了,就可以使用MQTT客户端工具来向控制命令主题发布控制命令了。不过小朋友不同意了,你这个太不友好了,还要每次敲命令,不能搞个应用,直接点点按钮么?好吧,那就用微信小程序实现个操作界面吧。
界面效果如下:
好了,到此,就完成MQTT控制格物小车了,看看效果: