2014-7-10 12:14:02 [显示全部楼层]
28634浏览
查看: 28634|回复: 25

语音控制小车

[复制链接]
    新拿到了一个机器人小车套件: 切诺基4WD移动机器人平台
语音控制小车图1

    想用它来做一个语音控制的小车。总共分为三个部分进行。    

硬件列表:



      

   第一部分:小车运动。
    步骤一: 硬件搭建。  
    既然是小车,首先要做的就是让小车走起来,这个难度不大,高手可以直接略过。但是作为机器人小白的我,还是很乐意跟大家分享一下这辆小车的安装调试的。
    我拿到的切诺基4WD移动机器人平台上面有一块板子Romeo V2
语音控制小车图2
    在用它和语音模块结合的时候,发现只要将语音控制程序载进去,一上传成功,端口立马消失。这个问题倒腾了很久,后来DFRobot的工程师告诉我,Romeo V2是基于ATmega32u4芯片的Leonardo板卡,在硬件上不支持语音识别模块。:'(:'(:'(让眼泪先飞一会。    当然,这点小问题还是难不倒咱们滴。此路不通,再换一条好啦。这次我使用的是DFRduino UNO R3
语音控制小车图3
    好了,折腾了一番,现在开始接线并调试吧。【切诺基4WD移动机器人平台的安装请查看链接:4WD移动机器人平台安装
   我们的切诺基4WD移动机器人平台是自带电机驱动的,所以不需要再叠加电机驱动扩展板了。先将4个电机引出来的线分别连接到M1、M2、M3、M4四个接线柱上。小车运行方向除了可以在程序中通过设置高低电平或者设置正负运行速度来完成,还可以改变接线次序。一般而言,红线接正极,黑线接负极,具体情况可以自行测试。将移动机器人平台上的D4、D5、D6、D7引脚用面包线连接到主控板的数字针脚4、5、6、7。接线图如下:

语音控制小车图9
   步骤二:程序编写。
    搭建完毕,给板卡下载程序。程序可参考商城给出的样例代码
  1. int E1 = 5;     //M1 Speed Control
  2. int E2 = 6;     //M2 Speed Control
  3. int M1 = 4;     //M1 Direction Control
  4. int M2 = 7;     //M1 Direction Control
  5. void stop(void)                    //Stop
  6. {
  7.   digitalWrite(E1,0);
  8.   digitalWrite(M1,LOW);   
  9.   digitalWrite(E2,0);   
  10.   digitalWrite(M2,LOW);   
  11. }   
  12. void advance(char a,char b)          //Move forward
  13. {
  14.   analogWrite (E1,a);      //PWM Speed Control
  15.   digitalWrite(M1,HIGH);   
  16.   analogWrite (E2,b);   
  17.   digitalWrite(M2,HIGH);
  18. }  
  19. void back_off (char a,char b)          //Move backward
  20. {
  21.   analogWrite (E1,a);
  22.   digitalWrite(M1,LOW);   
  23.   analogWrite (E2,b);   
  24.   digitalWrite(M2,LOW);
  25. }
  26. void turn_L (char a,char b)             //Turn Left
  27. {
  28.   analogWrite (E1,a);
  29.   digitalWrite(M1,LOW);   
  30.   analogWrite (E2,b);   
  31.   digitalWrite(M2,HIGH);
  32. }
  33. void turn_R (char a,char b)             //Turn Right
  34. {
  35.   analogWrite (E1,a);
  36.   digitalWrite(M1,HIGH);   
  37.   analogWrite (E2,b);   
  38.   digitalWrite(M2,LOW);
  39. }
  40. void setup(void)
  41. {
  42.   int i;
  43.   for(i=4;i<=7;i++)
  44.     pinMode(i, OUTPUT);  
  45.   Serial.begin(19200);      //Set Baud Rate
  46.   Serial.println("Run keyboard control");
  47.   digitalWrite(E1,LOW);   
  48.   digitalWrite(E2,LOW);
  49. }
  50.   
  51. void loop(void)
  52. {
  53.   if(Serial.available()){
  54.     char val = Serial.read();
  55.     if(val != -1)
  56.     {
  57.       switch(val)
  58.       {
  59.       case 'w'://Move Forward
  60.         advance (255,255);   //move forward in max speed
  61.         break;
  62.       case 's'://Move Backward
  63.         back_off (255,255);   //move back in max speed
  64.         break;
  65.       case 'a'://Turn Left
  66.         turn_L (100,100);        
  67.         break;      
  68.       case 'd'://Turn Right
  69.         turn_R (100,100);
  70.         break;
  71.       case 'z':
  72.         Serial.println("Hello");
  73.         break;
  74.       case 'x':
  75.         stop();
  76.         break;
  77.       }
  78.     }
  79.     else stop();  
  80.   }
  81.   
  82. }
复制代码
    步骤三: 功能实现。
    样例程序中通过改变M1、M2的高低电平定义了前进、后退、左转、右转四个函数,通过给E1、E2设定数值0实现小车停止运动。在通过串口控制实现小车运动指令。在串口监视器中输入“w”,小车前进;输入“s”,小车后退;输入“a”,小车左转;输入“d”小车右转;输入“x”,小车停止运动;输入“z”,串口监视器显示“Hello”。

    第二部分:语音控制小车运动。
    小车测试成功以后,我们来玩语音控制吧。
    步骤一:
    首先,拿出我们的
Voice Recognition 语音识别扩展板。

语音控制小车图7
    将其叠加到Uno R3主控板上面。看一下实物图:
    语音控制小车图4
    步骤二:程序编写。
    在使用语音模块控制小车之前,我们可以先做一个简单的测试,也就是商城中提供的开关灯实验。点击链接查看语音控制中的【使用教程】。

  1. #include <Voice.h>
  2. #define SUM 2 //SUM识别关键词的个数,最大不超过50个
  3. uint8  nAsrStatus=0;
  4. char sRecog[SUM][80] = {"kai deng", "guan deng"};//每个关键词拼音字母个数不超过79个,用户可以自行修改       ?
  5. int state=7;  //状态指示灯
  6. int led=8;    //受控制数字口
  7. void finally (unsigned char n)
  8. {
  9. switch(n)  //n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
  10.         {
  11.         case 0:
  12.                 Serial.println( "kai deng");
  13.               Serial.println( " ");
  14.               digitalWrite(led,LOW);
  15.                 break;
  16.         case 1:
  17.                 Serial.println( "guan deng");
  18.               digitalWrite(led,HIGH);
  19.                 break;
  20.         default:
  21.                 Serial.println( "error");
  22.                 Serial.println( " ");
  23.                 break;        
  24.         }
  25. }
  26. void ExtInt0Handler ()
  27. {
  28.   Voice.ProcessInt0();        //芯片送出中断信号                                
  29. }
  30. void setup()
  31. {
  32.   Serial.begin(9600);
  33.   Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
  34.                                            //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
  35.                                            //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
  36.   attachInterrupt(0,ExtInt0Handler,LOW);
  37.   pinMode(led,OUTPUT);
  38.   pinMode(state,OUTPUT);
  39.   digitalWrite(state,HIGH);
  40.   digitalWrite(led,HIGH);
  41. }
  42. void loop()
  43. {  
  44.         uint8 nAsrRes;
  45.         nAsrStatus = LD_ASR_NONE;
  46.         while(1)
  47.         {
  48.                 switch(nAsrStatus)
  49.                 {
  50.                         case LD_ASR_RUNING:
  51.                         case LD_ASR_ERROR:               
  52.                                 break;
  53.                         case LD_ASR_NONE:
  54.                         {
  55.                                 nAsrStatus=LD_ASR_RUNING;
  56.                             if (Voice.RunASR(SUM,80,sRecog)==0)  //识别不正确
  57.                                 {      
  58.                                         nAsrStatus= LD_ASR_ERROR;
  59.                                         Serial.println( "ASR_ERROR");
  60.                                 }
  61.                               digitalWrite(state,LOW);
  62.                               Serial.println( "ASR_RUNING.....");
  63.                                 break;
  64.                         }
  65.                         case LD_ASR_FOUNDOK:
  66.                         {
  67.                                 digitalWrite(state,HIGH);
  68.                                 nAsrRes =Voice. LD_GetResult();//一次ASR识别流程结束,去取ASR识别结果
  69.                                 finally(nAsrRes);
  70.                                 nAsrStatus = LD_ASR_NONE;
  71.                                 break;
  72.                         }
  73.                         case LD_ASR_FOUNDZERO:
  74.                         default:
  75.                         {
  76.                                 
  77.                                 nAsrStatus = LD_ASR_NONE;
  78.                                 break;
  79.                         }
  80.                  }// switch
  81.               delay(500);
  82.         }// while
  83. }
复制代码
    通过实验上面的代码,我们可以发现,要将小车与语音控制相结合只需要将char sRecog[SUM][80] = {"kai deng", "guan deng"};代码中的这一段改成我们要的命令,比如”qian jin“,"hou tui","zuo zhuan","you zhuan","ting zhi"等等。当然,我们也需要在void finally ( )函数中进行相应的修改。比如case 0的情况中,如果第一个指令是前进命令,我们可以在Serial.println()中输出”qin jin“,同时调用小车中的前进函数,这样当我们的语音识别模块检测到外界”前进“命令以后,会在串口中输出”qian jin“,同时,小车向前运动。其他的指令也是如此。

    将语音控制LED的关键代码与小车运动代码进行整合。当然,语音识别的灵敏度会是一个很大的问题,这个我们将在以后的例子中继续完善。

    代码如下:   
  1. #include <Voice.h>
  2. //#include <SoftwareSerial.h>  //ruan chuankou
  3. #define SUM 5 //SUM识别关键词的个数,最大不超过50个
  4. uint8  nAsrStatus=0;
  5. //SoftwareSerial mySerial(10, 11); // RX, TX
  6. char sRecog[SUM][80] = {"qian jin", "hou tui","zuo zhuan", "you zhuan","ting zhi"};//每个关键词拼音字母个数不超过79个,用户可以自行修改      
  7. int E1 = 5;     //M1 Speed Control
  8. int E2 = 6;     //M2 Speed Control
  9. int M1 = 4;     //M1 Direction Control
  10. int M2 = 7;     //M1 Direction Control
  11. void stop(void)                    //Stop
  12. {
  13.   digitalWrite(E1,0);  
  14.   digitalWrite(E2,0);   
  15. }   
  16. void advance(char a,char b)          //Move forward
  17. {
  18.   analogWrite (E1,a);      //PWM Speed Control
  19.   digitalWrite(M1,HIGH);   
  20.   analogWrite (E2,b);   
  21.   digitalWrite(M2,HIGH);
  22. }  
  23. void back_off (char a,char b)          //Move backward
  24. {
  25.   analogWrite (E1,a);
  26.   digitalWrite(M1,LOW);   
  27.   analogWrite (E2,b);   
  28.   digitalWrite(M2,LOW);
  29. }
  30. void turn_L (char a,char b)             //Turn Left
  31. {
  32.   analogWrite (E1,a);
  33.   digitalWrite(M1,LOW);   
  34.   analogWrite (E2,b);   
  35.   digitalWrite(M2,HIGH);
  36. }
  37. void turn_R (char a,char b)             //Turn Right
  38. {
  39.   analogWrite (E1,a);
  40.   digitalWrite(M1,HIGH);   
  41.   analogWrite (E2,b);   
  42.   digitalWrite(M2,LOW);
  43. }
  44. void finally (unsigned char n)
  45. {
  46. switch(n)  //n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
  47.         {
  48.         case 0:
  49.                 Serial.println( "qian jin");
  50.               Serial.println( " ");
  51.                advance (255,255);  
  52.                 break;
  53.         case 1:
  54.                 Serial.println( "hou tui");
  55.                 back_off (255,255);
  56.                 break;
  57.         case 2:
  58.                 Serial.println( "zuo zhuan");
  59.                 turn_L (100,100);   
  60.                 break;
  61.         case 3:
  62.                 Serial.println( "you zhuan");
  63.                 turn_R (100,100);   
  64.                 break;
  65.        case 4:
  66.                 Serial.println( "ting zhi");
  67.                 stop();   
  68.                 break;
  69.         default:
  70.                 Serial.println( "error");
  71.                 Serial.println( " ");
  72.                 break;        
  73.         }
  74. }
  75. void ExtInt0Handler ()
  76. {
  77.   Voice.ProcessInt0();        //芯片送出中断信号                                
  78. }
  79. void setup(void)
  80. {
  81.   int i;
  82.   for(i=4;i<=7;i++)
  83.     pinMode(i, OUTPUT);  
  84.   Serial.begin(19200);      //Set Baud Rate
  85.    Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
  86.                                            //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
  87.                                            //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
  88.   attachInterrupt(0,ExtInt0Handler,LOW);
  89. }
  90.   
  91. void loop()
  92. {  
  93.         uint8 nAsrRes;
  94.         nAsrStatus = LD_ASR_NONE;
  95.         while(1)
  96.         {
  97.                 switch(nAsrStatus)
  98.                 {
  99.                         case LD_ASR_RUNING:
  100.                         case LD_ASR_ERROR:               
  101.                                 break;
  102.                         case LD_ASR_NONE:
  103.                         {
  104.                                 nAsrStatus=LD_ASR_RUNING;
  105.                             if (Voice.RunASR(SUM,80,sRecog)==0)  //识别不正确
  106.                                 {      
  107.                                         nAsrStatus= LD_ASR_ERROR;
  108.                                         Serial.println( "ASR_ERROR");
  109.                                 }
  110.                               Serial.println( "ASR_RUNING.....");
  111.                                 break;
  112.                         }
  113.                         case LD_ASR_FOUNDOK:
  114.                         {
  115.                                 nAsrRes =Voice. LD_GetResult();//一次ASR识别流程结束,去取ASR识别结果
  116.                                 finally(nAsrRes);
  117.                                 nAsrStatus = LD_ASR_NONE;
  118.                                 break;
  119.                         }
  120.                         case LD_ASR_FOUNDZERO:
  121.                         default:
  122.                         {
  123.                                 
  124.                                 nAsrStatus = LD_ASR_NONE;
  125.                                 break;
  126.                         }
  127.                  }// switch
  128.               delay(500);
  129.         }// while
  130. }
复制代码
  步骤三:功能实现。
    下载程序到板卡之上,进行测试,当我们发出“前进”语音,小车将会调用 advance()函数,此时小车前进,其他运动时同样的道理。拔下USB线,插上锂电池,语言识别小车照样可以按照我们设定的指令工作。

    第三部分:语音识别与MP3模块相结合。
    语音控制完成了,总感觉少点什么是吧。要是小车能回应我们的话就好了。ok,那就动手吧。
    步骤一:硬件搭建。    
    拿出我们的mp3播放模块。DFRduino Player module 。见见它的真面目吧。
语音控制小车图6
    很好,就是它了。介绍商城中都有,自己看罗。值得注意的是,在使用该模块的时候,最好在后背贴上胶带,以防止短路。说一下接线。mp3模块有一个串口排针接口,提供了5V,GND,RX,TX,OUT五个针脚,如下图:

语音控制小车图5
    将除了OUT以外的四个接在语音识别模块的mp3接线口。如下图:


语音控制小车图10
    其中,5V对应5V,GND对应GND,RX接在TX,TX对应RX。
    实物图如下:

语音控制小车图8

    这里,我们还接上了一个小喇叭。在商城中也可以找到。
    步骤二:程序编写。
    线路搭建好以后,我们要进行程序编写了。同样是在之前的程序基础上,加上MP3播放的代码。当然,我们需要一个sd卡,在里面放入你想要播放的语音(故事,音乐,指令......都可以,你也可以实现设定对话,这样就可以跟我们的机器人聊天罗。)注意一下,我们使用的是串口通信,所以要将语音识别模块上UART和I2C选择按钮拨到UART那边哦。
    贴一下关键代码。
  1. void finally (unsigned char n)
  2. {
  3. switch(n)  //n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
  4.         {
  5.         case 0:
  6.                 Serial.println( "qian jin");
  7.                Serial.println("\\qian");
  8.                 advance (255,255);  
  9.                 break;
  10.         case 1:
  11.                 Serial.println( "hou tui");
  12.                 Serial.println("\\hou");
  13.                 back_off (255,255);
  14.                 break;
  15.         case 2:
  16.                 Serial.println( "zuo zhuan");
  17.                 Serial.println("\\zuo");
  18.                 turn_L (100,100);   
  19.                 break;
  20.         case 3:
  21.                 Serial.println( "you zhuan");
  22.                 Serial.println("\\you");
  23.                 turn_R (100,100);   
  24.                 break;
  25.        case 4:
  26.                 Serial.println( "ting zhi");
  27.                 Serial.println("\\zhi");
  28.                 stop();   
  29.                 break;
  30.        case 5:
  31.                 Serial.println( "chang ge");
  32.                 Serial.println("\\bo");  
  33.                 Serial.println("\\2");  
  34.                 break;
  35.        case 6:
  36.                 Serial.println( "zan ting bo");
  37.                 Serial.println("\\:p");  
  38.                 break;
  39.        case 7:
  40.                 Serial.println( "ji xu bo");
  41.                 Serial.println("\\:s");   
  42.                 break;
  43.        case 8:
  44.                 Serial.println( "xia yi shou");
  45.                 Serial.println("\\:n");   
  46.                 break;
  47.        case 9:
  48.                 Serial.println( "shang yi shou");
  49.                 Serial.println("\\:u");   
  50.                 break;
  51.         default:
  52.                 Serial.println( "error");
  53.                 Serial.println( " ");
  54.                 break;        
  55.         }
  56. }
复制代码
    步骤三:功能实现。
   解释一下上面的关键代码。在case 0里面加入了  Serial.println("\\qian"), 这行代码是要求mp3播放SD卡中名字是【qian】的一段语音。同样的,case 1中多了一行Serial.println("\\hou")的代码,是要求mp3播放名字是【hou】的语音, Serial.println("\\:p")是暂停播放,Serial.println("\\:s")是继续播放,Serial.println("\\:n")是播放下一首......这些指令在商城中都有详细的介绍。
  下载程序,就可以实现比较完整的语音控制小车啦。当我们发出“前进”指令,mp3会播放“执行命令前进”,其他的也是同样的道理。值得一提的是,我们给小车添加了播放音乐的功能。小车可以识别“播放音乐”,“暂停播放”,“继续播放”,“上一首”,“下一首”等多个指令。
    这样的语音控制的小车有没有什么可以改进的地方呢,我们下次再说罗~~留点悬念呀,(*^__^*) 嘻嘻……








   













语音小车参考程序.zip

642.33 KB, 下载次数: 2102

洛水一梦24  学徒

发表于 2016-5-17 19:28:38

本帖最后由 洛水一梦24 于 2016-5-17 20:22 编辑

楼主,请问一下你的语音控制小车的程序,我用arduino+Voice Recognition 语音识别扩展板+MC33886电机驱动,使用时应该修改程序的那块,可以直接拿来用吗?
我是这样连线的:
GND - GND
IN1 - 4
IN2 - 5
IN3 - 7
IN4 - 6
5V -5V
还需要修改程序那里吗?

楼主,能发送一份voice.h的库吗?1099608789@qq.com
回复

使用道具 举报

Jane  高级技匠

发表于 2014-11-20 17:52:20

faweiz 发表于 2014-9-23 22:25
我也制作了相同的语音控制小车, 更多Arduino,Processing 代码请游览我的博客!
本人无私奉献!
博客文章地 ...

好巧呀,前几天还在youtube上看到这个视频的!不知道愿不愿意在我们社区也分享一下呢?灰常欢迎啊~
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-16 14:37:13

mickey 发表于 2014-7-16 14:21
我的玩法是使用ASR board做语音识别手持机,通过无线模块遥控小车。只要无线模块能覆盖,它跑到哪里都能遥 ...

我也正准备把ASR Board做语音识别手持机,通信考虑的是蓝牙,不过wifi更加给力些啊。
回复

使用道具 举报

Phoebe  高级技匠

发表于 2014-7-14 11:44:31

你的语音模块装在小车上,我想到的是你对着小车说“前进”,小车就跑了。。。。然后你就没法控制它了:lol
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-14 13:36:06

Phoebe 发表于 2014-7-14 11:44
你的语音模块装在小车上,我想到的是你对着小车说“前进”,小车就跑了。。。。然后你就没法控制它了 ...

对滴~~所以后面还要再做~~~:handshake
回复

使用道具 举报

Grey  中级技匠

发表于 2014-7-15 18:24:21

可以再叠加一块GSM shield 这样可以通过电话来控制了
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-16 09:48:06

Grey 发表于 2014-7-15 18:24
可以再叠加一块GSM shield 这样可以通过电话来控制了

:handshake这个可以有~~
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-16 09:48:52

Grey 发表于 2014-7-15 18:24
可以再叠加一块GSM shield 这样可以通过电话来控制了

:handshake这个可以有~~
回复

使用道具 举报

mickey  NPC

发表于 2014-7-16 14:21:54

我的玩法是使用ASR board做语音识别手持机,通过无线模块遥控小车。只要无线模块能覆盖,它跑到哪里都能遥控,妈妈再也不用担心跟着小车跑了。
回复

使用道具 举报

七七  学徒

发表于 2014-7-31 17:45:06

挺有意思,一喊前进,没有下一条指令,会不会乱撞呢?;P
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-31 18:24:08

七七 发表于 2014-7-31 17:45
挺有意思,一喊前进,没有下一条指令,会不会乱撞呢?

哈哈,对呀,所以后面更新了两种无线控制的语音小车:lol
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2014-7-31 18:24:55

mickey 发表于 2014-7-16 14:21
我的玩法是使用ASR board做语音识别手持机,通过无线模块遥控小车。只要无线模块能覆盖,它跑到哪里都能遥 ...

妈妈再也不用担心我们的小车离家出走~~
回复

使用道具 举报

紫妖  学徒

发表于 2014-8-6 22:46:10

大神,我现在连循迹小车的程序都搞不定,求教
回复

使用道具 举报

lance6245  学徒

发表于 2014-8-21 10:45:45

上学时候玩过羚羊的声控小车  也是只能追着跑
回复

使用道具 举报

faweiz  学徒

发表于 2014-9-23 22:25:47

我也制作了相同的语音控制小车, 更多Arduino,Processing 代码请游览我的博客!
本人无私奉献!
博客文章地址: http://www.faweiz.com/iTesla/
回复

使用道具 举报

Jane  高级技匠

发表于 2014-11-20 18:03:56

faweiz 发表于 2014-9-23 22:25
我也制作了相同的语音控制小车, 更多Arduino,Processing 代码请游览我的博客!
本人无私奉献!
博客文章地 ...

看了你的博客,内容好丰富呀!
回复

使用道具 举报

Ricky  NPC

发表于 2014-11-22 18:11:13

faweiz 发表于 2014-9-23 22:25
我也制作了相同的语音控制小车, 更多Arduino,Processing 代码请游览我的博客!
本人无私奉献!
博客文章地 ...

可以转载吗?
回复

使用道具 举报

Geemi  初级技匠

发表于 2015-12-30 16:06:44

好长呀,,,这帖子。。LZ辛苦了
回复

使用道具 举报

tzlzy  高级技师
 楼主|

发表于 2016-1-11 21:06:02

Geemi 发表于 2015-12-30 16:06
好长呀,,,这帖子。。LZ辛苦了

:lol还好还好啦
回复

使用道具 举报

s414545584  见习技师

发表于 2016-2-24 13:59:20

楼主请问还有没有voice.h的库呀,如果有,拜托发我一份414545584@qq.com
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail