| 本帖最后由 云天 于 2021-11-8 22:02 编辑 
 
 
 
 
 
 什么是麦克纳姆轮
 在竞赛机器人 和特殊工种机器人中,全向移动经常是一个必需的功能。「全向移动」意味着可以在平面内做出任意方向平移同时自转的动作。为了实现全向移动,一般机器人会使用「全向轮」(Omni Wheel)或「麦克纳姆轮」(Mecanum Wheel)这两种特殊轮子。全向轮: 麦克纳姆轮: 麦克纳姆轮与普通轮子的区别在于麦克纳姆轮旋转时,由于存在斜向的从动轮,会同时产生一个斜向的力,当我们控制轮子旋转的速度与方向时,将斜向的力增强或抵消,从而实现小车的全向移动。可以完成横移、斜方向移动等普通小车无法完成的高难度动作,轮子的转动方向与小车的运动方向关系如下图: 【麦克纳姆轮安装】车拆时再上图 
 【电机驱动L298N安装】车拆时再上图 
 【电机电源及灯带安装】车拆时再上图 
 【Maixduino 主控安装】车拆时再上图 
 【Mind+编程】 【Micrpython代码】 
 其中修改“mqtt = MQTTClient("", hostgetIP("iot.dfrobot.com.cn"), 1883, "X8jykxFnR", "u8jskbFngz", keepalive=300)”中的“keepalive”值改为“300”。(MQTT在建立连接的时候,我们可以传递一个 Keep Alive 参数,它的单位为秒,MQTT 协议中约定:在 1.5*Keep Alive 的时间间隔内,如果 Broker 没有收到来自 Client 的任何数据包,那么 Broker 认为它和 Client 之间的连接已经断开;同样地, 如果 Client 没有收到来自 Broker 的任何数据包,那么 Client 认为它和 Broker 之间的连接已经断开。)复制代码
# MindPlus
# maixduino
from network_esp32 import wifi
from board import board_info
from umqtt import MQTTClient
from machine import Timer
from pin import Pin
import ubinascii
import neopixel
import machine
import usocket
import time
import gc
def neopixel_range(rgb, start, end, color):
  trend = -1 if end < start else 1
  for i in range(start, end-1 if trend < 0 else end+1, trend):
    rgb[i] = (color)
  rgb.write()
def hostgetIP(host):
        return usocket.getaddrinfo(host,8080,0,0)[0][4][0]
_mqtt_topic_list = []
def timer11_tick(_):
  global mqtt
  mqtt.check_msg()
def mqtt_callback(topic, msg):
  try:
    topic = topic.decode('utf-8', 'ignore')
    _msg = msg.decode('utf-8', 'ignore')
    eval('mqtt_topic_' + bytes.decode(ubinascii.hexlify(topic)) + '("' + _msg + '")')
  except:
    print((topic, msg))
def neopixel_rotate(rgb, offset):
  steps = rgb.n
  if offset == 0 or steps == 0:
    return
  offset = (abs(offset) % steps)*(-1 if offset < 0 else 1)
  c = []
  if offset > 0:
    for i in range(0, offset):
      c.append(rgb[steps-offset+i])
    for i in range(steps-1, offset-1, -1):
      rgb[i] = rgb[i-offset]
    for i in range(0, offset):
      rgb[i] = c[i]
  else:
    for i in range(0, abs(offset)):
      c.append(rgb[i])
    for i in range(0, steps-abs(offset)):
      rgb[i] = rgb[i+abs(offset)]
    for i in range(steps-abs(offset), steps):
      rgb[i] = c[i-steps+abs(offset)]
  rgb.write()
def neopixel_hsl(h, s, l):
  h = (abs(h) % 360)*(-1 if h < 0 else 1)
  s = max(s, 0); s = min(s, 99); l = max(l, 0); l = min(l, 99)
  c = (((100 - abs(2 * l - 100)) * s) << 8) // 10000
  h1 = h // 60; h2 = (h - h1 * 60) * 256 // 60;
  temp = abs((((h1 % 2) << 8) + h2) - 256);
  x = (c * (256 - (temp))) >> 8; _r = _g = _b = 0
  if h1 == 0:
    _r = c; _g = x; _b = 0
  elif h1 == 1:
    _r = x; _g = c; _b = 0
  elif h1 == 2:
    _r = 0; _g = c; _b = x
  elif h1 == 3:
    _r = 0; _g = x; _b = c
  elif h1 == 4:
    _r = x; _g = 0; _b = c
  elif h1 == 5:
    _r = c; _g = 0; _b = x
  m = ((l * 2 << 8) // 100 - c) // 2
  r = _r + m; g = _g + m; b = _b + m
  return (r, g, b)
def neopixel_rainbow(rgb, start, end, start_hue, end_hue):
  steps = rgb.n
  if steps == 0:
    return
  if end < start:
    num = end; end = start; start = num
  start = max(start, 0); start = min(start, steps)
  end = max(end, 0); end = min(end, steps)
  steps = end - start + 1
  saturation = 100; luminance = 50; h1 = start_hue; h2 = end_hue
  hDistCW = (abs((h2 + 360) - h1) % 360)*(-1 if ((h2 + 360) - h1) < 0 else 1)
  hStepCW = (hDistCW * 100) // steps; hStep = hStepCW
  h1_100 = h1 * 100; s1 = saturation; s2 = saturation; sDist = s2 - s1
  sStep = sDist // steps; s1_100 = s1 * 100; l1 = luminance; l2 = luminance
  lDist = l2 - l1; lStep = lDist // steps; l1_100 = l1 * 100
  if steps == 1:
    rgb[start] =  neopixel_hsl(h1 + hStep, s1 + sStep, l1 + lStep)
  else:
    rgb[start] = neopixel_hsl(start_hue, saturation, luminance)
    for i in range(start + 1, start + steps - 1):
      h = (h1_100 + i * hStep) // 100 + 360
      s = (s1_100 + i * sStep) // 100
      l = (l1_100 + i * lStep) // 100
      rgb[i] = neopixel_hsl(h, s, l)
    rgb[start + steps - 1] = neopixel_hsl(end_hue, saturation, luminance)
  rgb.write()
# 自定义函数
def back():
  Pin.digital_write(board_info.PIN2, 1)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN4, 1)
  Pin.digital_write(board_info.PIN5, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 1)
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 1)
def forward():
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 1)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 1)
  Pin.digital_write(board_info.PIN8, 1)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN10, 1)
  Pin.digital_write(board_info.PIN11, 0)
def stop():
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 0)
def right():
  Pin.digital_write(board_info.PIN10, 1)
  Pin.digital_write(board_info.PIN11, 0)
  Pin.digital_write(board_info.PIN2, 1)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 1)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 1)
def left():
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 1)
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 1)
  Pin.digital_write(board_info.PIN8, 1)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN4, 1)
  Pin.digital_write(board_info.PIN5, 0)
# 事件回调函数
def mqtt_topic_356e39327571424d67(_msg):
  global JieGuo
  if (_msg == 'G'):
    forward()
    time.sleep(0.2)
    stop()
  if (_msg == 'B'):
    back()
    time.sleep(0.2)
    stop()
  if (_msg == 'L'):
    left()
    time.sleep(0.2)
    stop()
  if (_msg == 'R'):
    right()
    time.sleep(0.2)
    stop()
  if (_msg == 'S'):
    stop()
  if (_msg == 'Y'):
    JieGuo = 1
    neopixel_rainbow(ws2812_13, 0, 15, 1, 360)
  if (_msg == 'N'):
    JieGuo = 0
    ws2812_13.fill((0, 0, 0))
    ws2812_13.write()
ws2812_13 = neopixel.NeoPixel(board_info.PIN13, n=16, bpp=3, timing=1)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
neopixel_range(ws2812_13, 0, 15, (0, 0, 255))
time.sleep(3)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
wifi.connect("sxs", "smj080823")
while not (wifi.isconnected()):
  pass
mqtt = MQTTClient("", hostgetIP("iot.dfrobot.com.cn"), 1883, "X8jykxFnR", "u8jskbFngz", keepalive=300)
try:
  mqtt.connect()
  print('MQTT Connected Successful')
except:
  print('MQTT Connection Failed')
mqtt.set_callback(mqtt_callback)
mqtt.subscribe("5n92uqBMg")
tim11 =Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period=50,callback=timer11_tick)
ShiJian = time.ticks_ms()
JieGuo = 0
neopixel_range(ws2812_13, 0, 15, (204, 0, 0))
time.sleep(3)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
while True:
  if (JieGuo == 1):
    if ((time.ticks_ms() - ShiJian) > 200):
      neopixel_rotate(ws2812_13, 1)
      ShiJian = time.ticks_ms()
  if Pin.digital_read(board_info.PIN6):
    gc.collect()
    neopixel_range(ws2812_13, 0, 15, (0, 0, 255))
    time.sleep(0.2)
    ws2812_13.fill((0, 0, 0))
    ws2812_13.write()
    neopixel_range(ws2812_13, 0, 15, (204, 0, 0))
    time.sleep(0.2)
    ws2812_13.fill((0, 0, 0))
    ws2812_13.write()
    machine.reset()
 【App Inventor编程】
 
  
  
  
  【程序进一步优化】为实现小车连续运动,将APP中的按钮命令“点击”发送修改为“按下”发送,再增加“松开”命令发送“停止指令”。Maixduino程序中将接收命令后的"stop"指令去掉。
 
  
  
 
 复制代码
# MindPlus
# maixduino
from network_esp32 import wifi
from board import board_info
from umqtt import MQTTClient
from machine import Timer
from pin import Pin
import ubinascii
import neopixel
import usocket
import time
def neopixel_range(rgb, start, end, color):
  trend = -1 if end < start else 1
  for i in range(start, end-1 if trend < 0 else end+1, trend):
    rgb[i] = (color)
  rgb.write()
def hostgetIP(host):
        return usocket.getaddrinfo(host,8080,0,0)[0][4][0]
_mqtt_topic_list = []
def timer11_tick(_):
  global mqtt
  mqtt.check_msg()
def mqtt_callback(topic, msg):
  try:
    topic = topic.decode('utf-8', 'ignore')
    _msg = msg.decode('utf-8', 'ignore')
    eval('mqtt_topic_' + bytes.decode(ubinascii.hexlify(topic)) + '("' + _msg + '")')
  except:
    print((topic, msg))
def neopixel_rotate(rgb, offset):
  steps = rgb.n
  if offset == 0 or steps == 0:
    return
  offset = (abs(offset) % steps)*(-1 if offset < 0 else 1)
  c = []
  if offset > 0:
    for i in range(0, offset):
      c.append(rgb[steps-offset+i])
    for i in range(steps-1, offset-1, -1):
      rgb[i] = rgb[i-offset]
    for i in range(0, offset):
      rgb[i] = c[i]
  else:
    for i in range(0, abs(offset)):
      c.append(rgb[i])
    for i in range(0, steps-abs(offset)):
      rgb[i] = rgb[i+abs(offset)]
    for i in range(steps-abs(offset), steps):
      rgb[i] = c[i-steps+abs(offset)]
  rgb.write()
def neopixel_hsl(h, s, l):
  h = (abs(h) % 360)*(-1 if h < 0 else 1)
  s = max(s, 0); s = min(s, 99); l = max(l, 0); l = min(l, 99)
  c = (((100 - abs(2 * l - 100)) * s) << 8) // 10000
  h1 = h // 60; h2 = (h - h1 * 60) * 256 // 60;
  temp = abs((((h1 % 2) << 8) + h2) - 256);
  x = (c * (256 - (temp))) >> 8; _r = _g = _b = 0
  if h1 == 0:
    _r = c; _g = x; _b = 0
  elif h1 == 1:
    _r = x; _g = c; _b = 0
  elif h1 == 2:
    _r = 0; _g = c; _b = x
  elif h1 == 3:
    _r = 0; _g = x; _b = c
  elif h1 == 4:
    _r = x; _g = 0; _b = c
  elif h1 == 5:
    _r = c; _g = 0; _b = x
  m = ((l * 2 << 8) // 100 - c) // 2
  r = _r + m; g = _g + m; b = _b + m
  return (r, g, b)
def neopixel_rainbow(rgb, start, end, start_hue, end_hue):
  steps = rgb.n
  if steps == 0:
    return
  if end < start:
    num = end; end = start; start = num
  start = max(start, 0); start = min(start, steps)
  end = max(end, 0); end = min(end, steps)
  steps = end - start + 1
  saturation = 100; luminance = 50; h1 = start_hue; h2 = end_hue
  hDistCW = (abs((h2 + 360) - h1) % 360)*(-1 if ((h2 + 360) - h1) < 0 else 1)
  hStepCW = (hDistCW * 100) // steps; hStep = hStepCW
  h1_100 = h1 * 100; s1 = saturation; s2 = saturation; sDist = s2 - s1
  sStep = sDist // steps; s1_100 = s1 * 100; l1 = luminance; l2 = luminance
  lDist = l2 - l1; lStep = lDist // steps; l1_100 = l1 * 100
  if steps == 1:
    rgb[start] =  neopixel_hsl(h1 + hStep, s1 + sStep, l1 + lStep)
  else:
    rgb[start] = neopixel_hsl(start_hue, saturation, luminance)
    for i in range(start + 1, start + steps - 1):
      h = (h1_100 + i * hStep) // 100 + 360
      s = (s1_100 + i * sStep) // 100
      l = (l1_100 + i * lStep) // 100
      rgb[i] = neopixel_hsl(h, s, l)
    rgb[start + steps - 1] = neopixel_hsl(end_hue, saturation, luminance)
  rgb.write()
# 自定义函数
def back():
  Pin.digital_write(board_info.PIN2, 1)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN4, 1)
  Pin.digital_write(board_info.PIN5, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 1)
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 1)
def forward():
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 1)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 1)
  Pin.digital_write(board_info.PIN8, 1)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN10, 1)
  Pin.digital_write(board_info.PIN11, 0)
def stop():
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 0)
def right():
  Pin.digital_write(board_info.PIN10, 1)
  Pin.digital_write(board_info.PIN11, 0)
  Pin.digital_write(board_info.PIN2, 1)
  Pin.digital_write(board_info.PIN3, 0)
  Pin.digital_write(board_info.PIN8, 0)
  Pin.digital_write(board_info.PIN9, 1)
  Pin.digital_write(board_info.PIN4, 0)
  Pin.digital_write(board_info.PIN5, 1)
def left():
  Pin.digital_write(board_info.PIN10, 0)
  Pin.digital_write(board_info.PIN11, 1)
  Pin.digital_write(board_info.PIN2, 0)
  Pin.digital_write(board_info.PIN3, 1)
  Pin.digital_write(board_info.PIN8, 1)
  Pin.digital_write(board_info.PIN9, 0)
  Pin.digital_write(board_info.PIN4, 1)
  Pin.digital_write(board_info.PIN5, 0)
# 事件回调函数
def mqtt_topic_356e39327571424d67(_msg):
  global JieGuo
  if (_msg == 'G'):
    forward()
  if (_msg == 'B'):
    back()
  if (_msg == 'L'):
    left()
  if (_msg == 'R'):
    right()
  if (_msg == 'S'):
    stop()
  if (_msg == 'Y'):
    JieGuo = 1
    neopixel_rainbow(ws2812_13, 0, 15, 1, 360)
  if (_msg == 'N'):
    JieGuo = 0
    ws2812_13.fill((0, 0, 0))
    ws2812_13.write()
ws2812_13 = neopixel.NeoPixel(board_info.PIN13, n=16, bpp=3, timing=1)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
neopixel_range(ws2812_13, 0, 15, (0, 0, 255))
time.sleep(3)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
wifi.connect("sxs", "smj080823")
while not (wifi.isconnected()):
  pass
mqtt = MQTTClient("", hostgetIP("iot.dfrobot.com.cn"), 1883, "X8jykxFnR", "u8jskbFngz", keepalive=30)
try:
  mqtt.connect()
  print('MQTT Connected Successful')
except:
  print('MQTT Connection Failed')
mqtt.set_callback(mqtt_callback)
mqtt.subscribe("5n92uqBMg")
tim11 =Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period=50,callback=timer11_tick)
ShiJian = time.ticks_ms()
JieGuo = 0
neopixel_range(ws2812_13, 0, 15, (204, 0, 0))
time.sleep(3)
ws2812_13.fill((0, 0, 0))
ws2812_13.write()
while True:
  if (JieGuo == 1):
    if ((time.ticks_ms() - ShiJian) > 200):
      neopixel_rotate(ws2812_13, 1)
      ShiJian = time.ticks_ms()
 演示:麦克纳姆大战小黑
 【语音控制】
 1、使用软件“MaixPy IDE”,首先将asr.py上传到Maixduino板子上。选择“工具”菜单,“发送文件到开发板”。
 文中用到的ASR.py是由df团队编写(感谢李工提供),具体代码如下:
 
 2、固件要使用“maixpy_v0.6.2_72_g22a8555b5_minimum_speech_with_ide_support ”复制代码
import time
import json
from Maix import GPIO, I2S
from fpioa_manager import fm
from speech_recognizer import isolated_word
class ASR:
    def __init__(self):
        self.asr = None
        self.i2s = None
        self.model = None
    def __start(self, size):
        if self.asr:
            del self.asr
        if self.i2s:
            del self.i2s
        try:
            fm.register(20,fm.fpioa.I2S0_IN_D0, force=True)
            fm.register(18,fm.fpioa.I2S0_SCLK, force=True)
            fm.register(19,fm.fpioa.I2S0_WS, force=True)
            self.i2s = I2S(I2S.DEVICE_0)
            self.i2s.channel_config(self.i2s.CHANNEL_0, self.i2s.RECEIVER, align_mode=I2S.STANDARD_MODE)
            self.i2s.set_sample_rate(16000)
            self.asr = isolated_word(dmac=2, i2s=I2S.DEVICE_0, size=size)
            self.asr.set_threshold(0, 0, 15000)
            return True
        except:
            return False
    def newModel(self):
        return []
    def training(self, corpus, model):
        if not corpus or not self.__start(1) or not self.asr:
            return
        rc=1
        co=0
        while True:
            time.sleep_ms(100)
            if self.asr.Done == self.asr.record(0):
                model.append({'name': corpus, 'data': self.asr.get(0)})
                print("complete")
                break
            if self.asr.Speak == self.asr.state():
                if rc != -1:
                    print()
                print("speak: " + str(corpus))
                rc = -1
            else:
                if co%2==0:
                    print("\rready" + "."*rc + " "*(3-rc), end='')
                    rc += 1
                    if rc > 3:
                        rc = 1
            co += 1
    def run(self, model):
        if not model or len(model)<1 or not self.__start(len(model)) or not self.asr:
            return None
        for i in range(len(model)):
            self.asr.set(i, model[i]['data'])
        self.model = model
    def recognize(self):
        if not self.model or len(self.model)<1 or not self.asr:
            return None
        for i in range(20):
            if self.asr.Done == self.asr.recognize():
                result = self.asr.result()
                if result:
                    return self.model[result[0]]['name']
        return None
    def save(self, model, path):
        if not model or not path:
            return False
        try:
            for i in range(len(model)):
                model[i]['data'] = list(model[i]['data'])
                model[i]['data'][1] = list(model[i]['data'][1])
            with open(path, "wb") as f:
                json.dump(model,f)
                f.close()
            return True
        except:
            return False
    def load(self, path):
        if not path:
            return []
        try:
            with open(path, "rb") as f:
                model = json.load(f)
                for i in range(len(model)):
                    model[i]['data'][1] = bytes(model[i]['data'][1])
                    model[i]['data'] = tuple(model[i]['data'])
                f.close()
            return model
        except:
            return []
asr = ASR()
 
  
  https://cn.dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_72_g22a8555b5
 3、训练代码
 
 复制代码
# MindPlus
# maixduino
from board import board_info
from ASR import asr
import time
from Maix import GPIO
from fpioa_manager import fm
fm.register(board_info.PIN12,fm.fpioa.GPIO0)
led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
led_r.value(0)
time.sleep(1)
led_r.value(1)
model = asr.newModel()
corpus = ['打开','关闭','退出']
print('开始训练')
for order in corpus:
  asr.training(order, model)
print('训练完成')
asr.save(model, "/flash/asr.json")
asr.run(asr.load("/flash/asr.json"))
while True:
  result = asr.recognize()
  if bool(result):
    print(result)
    if (result == '打开'):
      led_r.value(1)
    if (result == '关闭'):
      led_r.value(0)
    if (result == '退出'):
      break
fm.unregister(board_info.PIN12)
 
 LED灯接在扩展板的12引脚上。
 
 4、测试代码
 
  
 
 测试复制代码
# MindPlus
# maixduino
from board import board_info
from ASR import asr
import time
from Maix import GPIO
from fpioa_manager import fm
fm.register(board_info.PIN12,fm.fpioa.GPIO0)
led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
led_r.value(1)
time.sleep(1)
led_r.value(0)
asr.run(asr.load("/flash/asr.json"))
while True:
  result = asr.recognize()
  if bool(result):
    print(result)
    if (result == '打开'):
      led_r.value(1)
    if (result == '关闭'):
      led_r.value(0)
    if (result == '退出'):
      break
fm.unregister(board_info.PIN12)
 
 【语音控车】1.训练程序
 
 复制代码
from board import board_info
from ASR import asr
import time
from Maix import GPIO
from fpioa_manager import fm
fm.register(board_info.PIN12,fm.fpioa.GPIO0)
led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
led_r.value(0)
time.sleep(1)
led_r.value(1)
model = asr.newModel()
#corpus = ['打开','关闭','退出','前进','后退','向左','向右','停止']
print('开始训练')
for order in corpus:
  asr.training(order, model)
print('训练完成')
asr.save(model, "/flash/asr.json")
 2、语音控车代码
 
 
 测试复制代码
# MindPlus
# maixduino
from board import board_info
from ASR import asr
import time
from Maix import GPIO
from fpioa_manager import fm
fm.register(board_info.PIN2,fm.fpioa.GPIO0)
PIN2=GPIO(GPIO.GPIO0,GPIO.OUT)
fm.register(board_info.PIN3,fm.fpioa.GPIO1)
PIN3=GPIO(GPIO.GPIO1,GPIO.OUT)
fm.register(board_info.PIN4,fm.fpioa.GPIO2)
PIN4=GPIO(GPIO.GPIO2,GPIO.OUT)
fm.register(board_info.PIN5,fm.fpioa.GPIO3)
PIN5=GPIO(GPIO.GPIO3,GPIO.OUT)
fm.register(board_info.PIN8,fm.fpioa.GPIO4)
PIN8=GPIO(GPIO.GPIO4,GPIO.OUT)
fm.register(board_info.PIN9,fm.fpioa.GPIO5)
PIN9=GPIO(GPIO.GPIO5,GPIO.OUT)
fm.register(board_info.PIN10,fm.fpioa.GPIO6)
PIN10=GPIO(GPIO.GPIO6,GPIO.OUT)
fm.register(board_info.PIN11,fm.fpioa.GPIO7)
PIN11=GPIO(GPIO.GPIO7,GPIO.OUT)
fm.register(board_info.PIN12,fm.fpioa.GPIOHS0)
led_r=GPIO(GPIO.GPIOHS0,GPIO.OUT)
# 自定义函数
def back():
  Pin.digital_write(PIN2, 1)
  Pin.digital_write(PIN3, 0)
  Pin.digital_write(PIN4, 1)
  Pin.digital_write(PIN5, 0)
  Pin.digital_write(PIN8, 0)
  Pin.digital_write(PIN9, 1)
  Pin.digital_write(PIN10, 0)
  Pin.digital_write(PIN11, 1)
def forward():
  Pin.digital_write(PIN2, 0)
  Pin.digital_write(PIN3, 1)
  Pin.digital_write(PIN4, 0)
  Pin.digital_write(PIN5, 1)
  Pin.digital_write(PIN8, 1)
  Pin.digital_write(PIN9, 0)
  Pin.digital_write(PIN10, 1)
  Pin.digital_write(PIN11, 0)
def stop():
  Pin.digital_write(PIN2, 0)
  Pin.digital_write(PIN3, 0)
  Pin.digital_write(PIN4, 0)
  Pin.digital_write(PIN5, 0)
  Pin.digital_write(PIN8, 0)
  Pin.digital_write(PIN9, 0)
  Pin.digital_write(PIN10, 0)
  Pin.digital_write(PIN11, 0)
def right():
  Pin.digital_write(PIN10, 1)
  Pin.digital_write(PIN11, 0)
  Pin.digital_write(PIN2, 1)
  Pin.digital_write(PIN3, 0)
  Pin.digital_write(PIN8, 0)
  Pin.digital_write(PIN9, 1)
  Pin.digital_write(PIN4, 0)
  Pin.digital_write(PIN5, 1)
def left():
  Pin.digital_write(PIN10, 0)
  Pin.digital_write(PIN11, 1)
  Pin.digital_write(PIN2, 0)
  Pin.digital_write(PIN3, 1)
  Pin.digital_write(PIN8, 1)
  Pin.digital_write(PIN9, 0)
  Pin.digital_write(PIN4, 1)
  Pin.digital_write(PIN5, 0)
led_r.value(1)
time.sleep(1)
led_r.value(0)
asr.run(asr.load("/flash/asr.json"))
while True:
  result = asr.recognize()
  if bool(result):
    print(result)
    if (result == '前进'):
      forword()
      time.sleep(0.2)
      stop()
    if (result == '后退'):
      back()
      time.sleep(0.2)
      stop()
    if (result == '向左'):
      left()
      time.sleep(0.2)
      stop()
    if (result == '向右'):
      right()
      time.sleep(0.2)
      stop()
    if (result == '打开'):
      led_r.value(1)
    if (result == '关闭'):
      led_r.value(0)
    if (result == '退出'):
      break
fm.unregister(board_info.PIN12)
fm.unregister(board_info.PIN2)
fm.unregister(board_info.PIN3)
fm.unregister(board_info.PIN4)
fm.unregister(board_info.PIN5)
fm.unregister(board_info.PIN8)
fm.unregister(board_info.PIN9)
fm.unregister(board_info.PIN10)
fm.unregister(board_info.PIN11)
 
 演示
 
 
 
 
 
 |