2021-2-19 09:46:02 [显示全部楼层]
查看: 2699|回复: 11

[项目] 用Arduino制作智能军棋

[复制链接]
本帖最后由 hnyzcj 于 2021-2-19 10:06 编辑

【项目源起】
        军棋的玩法通常有三种:明棋、暗棋和翻棋,其中暗棋是一种知己不知彼的玩法,每人使用一种颜色的棋子,立起来,正面朝向自己摆放,布置自己喜欢的阵法。然后按照规定的行棋方式走棋。想要吃棋的时候,并不知道对面是什么棋,也不能看。这时候,需要第三个人来担任裁判。裁判查看双方的棋子,比大小,小的一方被吃,拿出棋盘(拿出棋盘后也不能暴露是什么棋),大的一方留在棋盘上,直到分出胜负。于是我们决定设计制作一套智能军棋,只需两个玩家对战,不仅解脱裁判的尴尬与无聊,更能让玩家专注局势的博弈,不受裁判影响,极大提升玩家体验,如图1-3所示。
图1.jpg
图2.jpg
图3.jpg
【项目展示】
图4.jpg
图5.jpg

图6.jpg
图7.jpg

【功能简介】
      (1)智能识别:智能军棋通过Huskylens视觉识别传感器扫描放置于擂台上军棋标签,对双方的棋子进行准确识别。
      (2)智能评判:智能军棋通过内置算法判断双方出棋等级高低,从而给出胜负的判定。
      (3)声光效果:智能军棋搭配音效搭配LED光效,紧张刺激又烧脑,增加玩家的代入感。
      (4)磁力吸附:棋子的底部设计有三枚强磁铁,与擂台上的磁铁相互吸附,避免错误摆放。

【硬件材料】
【制作过程】
       1.系统设计
        在进行系统设计前,我们先来了解下传统军棋的玩法。
     (1)吃子规则
       一副军旗双方共含有50个棋子,两方各有25个棋子,分别是司令、军长、师长、旅长、团长、营长、连长、排长、工兵、地雷、炸弹、军旗。司令→军长→师长→旅长→团长→营长→连长→排长→工兵,小棋遇大棋被吃,相同棋子相遇,则同归于尽;工兵能排除地雷,其它棋子不能排雷;炸弹与任何棋子相遇时同归于尽,也就是说,在军棋中,司令是最大的,就是司令可以吃一切的棋子。
    (2)棋子识别
      本作品最初设计时,是想在每枚棋子中放置不同阻值的电阻来予以区分,但通过串口读取数据发现数据误差较大。因此放弃这种方案,采用AprilTag标签进行标识,Huskylens视觉识别传感器进行识别的方案。同时为了防止对方记棋,我们对每一颗棋子都标记了AprilTag,这样一套棋子就需要50个AprilTag标签。这样问题就转换成Huskylens识别标签了问题了。
    (3)棋子PK算法
      依据军棋的吃子规则,我们对于两个上擂台棋子的PK,只要以下几类问题:
     ▲军衔PK:这类棋子属于进攻型棋子,只需按照上述军衔等级高低判断胜负,等级相同同归于尽。
     ▲工兵拆雷:工兵遇到地雷,则工兵拆除地雷。
     ▲工兵扛旗:军棋必须在棋盘中两个大本营中的其中之一,且不可移动。工兵可扛旗,结束棋局。
     ▲炸弹处理:防御型棋子,此棋子在棋盘上不可动,只能被动接受PK,任何可动棋子与之相遇两者同归于尽。
     ▲地雷处理:防御型棋子,此棋子在棋盘上不可动,只能被动接受PK,除工兵以外的棋子与之相遇两者同归于尽。
     针对上述问题进行算法设计,作为双方PK的核心算法。通过Huskylens识别出棋子的ID来判断棋子PK的胜负。
   (4)声光效果
     为了增加棋局的娱乐性,我们在系统中增加的了声光效果,用绿色光代表胜利,红色光代表失败,并配以适当的音效。

     2.结构设计
     本次作品结构设计涉及两部分:一部分是棋盘结构,使用LaserMaker绘制结构图。另一部分是3D打印棋子结构件。
   (1)棋盘结构件设计(松木板)
     首先以3mm厚的松木板为原料,使用“快速造盒工具”,生成一个盒体。然后删除盒体左右两侧,并在盒体顶部,添加“棋盘”图片,并绘制蜂鸣器、Huskylens安装孔位和擂台孔位。具体设计如下图8-9所示。
图片8.png
图片9.png
      其次依据上步生成盒体宽(内部)的尺寸绘制棋子收纳盒,具体设计图如下图10所示。
图片10.png
      最后绘制出25个棋子的面板,如下图11所示
图片11.png
     棋子结构件设计(3D打印)
     我们在Fusion 360中,设计绘制棋子外壳结构和擂台结构如下图12-13所示。
图12棋子盖子.png 图13棋子吸附底部.png
      电路连线
      智能军棋系统电路连接如图14所示。两条灯带分别接D7,D8口,蜂鸣器模块接D4口,Huskylens视觉识别传感器通过I2C口与主控Arduino连接。
图14电路连线(军棋) 拷贝.jpg
       代码编写
       主程序如下图15所示,包含了两个函数“定位识别”、“判断结果”,其中“定位识别”是通过识别到的两个方框中X的坐标值进行比较从而判断,从而判断所对应ID的两颗棋子左右位置;“判断结果”则依据前面定义的算法对两颗棋子进行胜负判定。
  1. <font face="微软雅黑" size="4">/*!
  2. * MindPlus
  3. * uno
  4. *
  5. */
  6. #include <DFRobot_NeoPixel.h>
  7. #include <DFRobot_HuskyLens.h>
  8. #include <DFRobot_Libraries.h>
  9. // 动态变量
  10. String         mind_s_M1, mind_s_M2;
  11. volatile float mind_n_N1, mind_n_N2;
  12. // 函数声明
  13. void DF_DingWeiShiBie();
  14. void DF_CeLiangZuoBiao();
  15. void DF_N1DaYuN2();
  16. void DF_N1XiaoYuN2();
  17. void DF_PanDuanJieGuo();
  18. void DF_MingChen();
  19. void DF_DiLeiChuLi();
  20. void DF_TongGuiYuJin();
  21. void DF_ZuoBianSheng();
  22. void DF_ZhaDanChuLi();
  23. void DF_YouBianSheng();
  24. void DF_GongBingChaiLei();
  25. void DF_KangQi();
  26. void DF_XiangDeng();
  27. void DF_LXiaoYuR();
  28. void DF_LDaYuR();
  29. // 创建对象
  30. DFRobot_HuskyLens huskylens;
  31. DFRobot_NeoPixel  neoPixel_7;
  32. DFRobot_NeoPixel  neoPixel_8;
  33. DFRobot_Tone      DFTone;
  34. // 主程序开始
  35. void setup() {
  36.         huskylens.beginI2CUntilSuccess();
  37.         huskylens.writeAlgorithm(ALGORITHM_TAG_RECOGNITION);
  38.         neoPixel_7.begin(7, 6);
  39.         neoPixel_8.begin(8, 6);
  40.         neoPixel_7.setBrightness(255);
  41.         neoPixel_8.setBrightness(255);
  42.         mind_n_N1 = 0;
  43.         mind_n_N2 = 0;
  44.         huskylens.clearOSD();
  45.         delay(1000);
  46.         huskylens.writeOSD(String("system is ok"), 84, 35);
  47.         delay(1000);
  48. }
  49. void loop() {
  50.         huskylens.request();
  51.         DF_DingWeiShiBie();
  52.         DF_PanDuanJieGuo();
  53. }
  54. // 自定义函数
  55. void DF_DingWeiShiBie() {
  56.         mind_n_N1 = (String(huskylens.readBlockParameterDirect(1).xCenter).toInt());
  57.         mind_n_N2 = (String(huskylens.readBlockParameterDirect(2).xCenter).toInt());
  58.         DF_N1XiaoYuN2();
  59.         DF_N1DaYuN2();
  60. }
  61. void DF_CeLiangZuoBiao() {
  62.         huskylens.writeOSD(String((String((String(mind_n_N1) + String("===="))) + String(mind_n_N2))), 103, 21);
  63.         delay(1000);
  64. }
  65. void DF_N1DaYuN2() {
  66.         if (((mind_n_N2 - mind_n_N1)<0)) {
  67.                 huskylens.clearOSD();
  68.                 mind_n_N1 = (String(huskylens.readBlockParameterDirect(2).ID).toInt());
  69.                 mind_n_N2 = (String(huskylens.readBlockParameterDirect(1).ID).toInt());
  70.                 huskylens.writeOSD(String((String((String(mind_n_N1) + String("-------"))) + String(mind_n_N2))), 20, 130);
  71.                 delay(500);
  72.         }
  73. }
  74. void DF_N1XiaoYuN2() {
  75.         if (((mind_n_N1 - mind_n_N2)<0)) {
  76.                 huskylens.clearOSD();
  77.                 mind_n_N1 = (String(huskylens.readBlockParameterDirect(1).ID).toInt());
  78.                 mind_n_N2 = (String(huskylens.readBlockParameterDirect(2).ID).toInt());
  79.                 huskylens.writeOSD(String((String((String(mind_n_N1) + String("-------"))) + String(mind_n_N2))), 20, 130);
  80.                 delay(500);
  81.         }
  82. }
  83. void DF_PanDuanJieGuo() {
  84.         // 军棋中军衔高低判定
  85.         if ((((2<mind_n_N1) && (mind_n_N1<41)) && ((5<mind_n_N2) && (mind_n_N2<41)))) {
  86.                 DF_XiangDeng();
  87.                 DF_LXiaoYuR();
  88.                 DF_LDaYuR();
  89.         }
  90.         DF_GongBingChaiLei();
  91.         DF_DiLeiChuLi();
  92.         DF_ZhaDanChuLi();
  93.         DF_KangQi();
  94. }
  95. void DF_MingChen() {
  96.         if ((mind_n_N1==1)) {
  97.                 mind_s_M1 = "chess:";
  98.         }
  99.         if ((mind_n_N2==2)) {
  100.                 mind_s_M1 = "chess:";
  101.         }
  102.         if (((3<=mind_n_N1) && (mind_n_N1<=5))) {
  103.                 mind_s_M1 = "engineer:";
  104.         }
  105.         if (((6<=mind_n_N2) && (mind_n_N2<=8))) {
  106.                 mind_s_M2 = "engineer:";
  107.         }
  108.         if (((9<=mind_n_N1) && (mind_n_N1<=11))) {
  109.                 mind_s_M1 = "platoon:";
  110.         }
  111.         if (((12<=mind_n_N2) && (mind_n_N2<=14))) {
  112.                 mind_s_M2 = "platoon:";
  113.         }
  114.         if (((15<=mind_n_N1) && (mind_n_N1<=17))) {
  115.                 mind_s_M1 = "Company:";
  116.         }
  117.         if (((18<=mind_n_N2) && (mind_n_N2<=20))) {
  118.                 mind_s_M2 = "Company:";
  119.         }
  120.         if (((21<=mind_n_N1) && (mind_n_N1<=22))) {
  121.                 mind_s_M1 = "battalion :";
  122.         }
  123.         if (((23<=mind_n_N2) && (mind_n_N2<=24))) {
  124.                 mind_s_M2 = "battalion:";
  125.         }
  126.         if (((25<=mind_n_N1) && (mind_n_N1<=26))) {
  127.                 mind_s_M1 = "regimental ";
  128.         }
  129.         if (((27<=mind_n_N2) && (mind_n_N2<=28))) {
  130.                 mind_s_M2 = "regimental: ";
  131.         }
  132.         if (((29<=mind_n_N1) && (mind_n_N1<=30))) {
  133.                 mind_s_M1 = "brigade: ";
  134.         }
  135.         if (((31<=mind_n_N2) && (mind_n_N2<=32))) {
  136.                 mind_s_M2 = "brigade: ";
  137.         }
  138.         if (((33<=mind_n_N1) && (mind_n_N1<=34))) {
  139.                 mind_s_M1 = "teacher:";
  140.         }
  141.         if (((35<=mind_n_N2) && (mind_n_N2<=36))) {
  142.                 mind_s_M2 = "teacher:";
  143.         }
  144.         if ((mind_n_N1==37)) {
  145.                 mind_s_M1 = "army:";
  146.         }
  147.         if ((mind_n_N2==38)) {
  148.                 mind_s_M2 = "army:";
  149.         }
  150.         if ((mind_n_N1==39)) {
  151.                 mind_s_M1 = "commander:";
  152.         }
  153.         if ((mind_n_N2==40)) {
  154.                 mind_s_M2 = "commander:";
  155.         }
  156.         if (((41<=mind_n_N1) && (mind_n_N1<=43))) {
  157.                 mind_s_M1 = "mine:";
  158.         }
  159.         if (((44<=mind_n_N2) && (mind_n_N2<=46))) {
  160.                 mind_s_M2 = "mine:";
  161.         }
  162.         if (((47<=mind_n_N1) && (mind_n_N1<=48))) {
  163.                 mind_s_M1 = "bomb:";
  164.         }
  165.         if (((49<=mind_n_N2) && (mind_n_N2<=50))) {
  166.                 mind_s_M2 = "bomb:";
  167.         }
  168. }
  169. void DF_DiLeiChuLi() {
  170.         if ((((9<=mind_n_N1) && (mind_n_N1<=39)) && ((44<=mind_n_N2) && (mind_n_N2<=46)))) {
  171.                 huskylens.writeOSD(String("boom_RD"), 5, 10);
  172.                 delay(1000);
  173.                 DF_TongGuiYuJin();
  174.         }
  175.         if ((((41<=mind_n_N1) && (mind_n_N1<=43)) && ((12<=mind_n_N2) && (mind_n_N2<=40)))) {
  176.                 huskylens.writeOSD(String("boom_LD"), 5, 10);
  177.                 delay(1000);
  178.                 DF_TongGuiYuJin();
  179.         }
  180.         if ((((41<=mind_n_N1) && (mind_n_N1<=43)) && ((44<=mind_n_N2) && (mind_n_N2<=46)))) {
  181.                 huskylens.writeOSD(String("boom_LRD"), 5, 10);
  182.                 delay(1000);
  183.                 DF_TongGuiYuJin();
  184.         }
  185. }
  186. void DF_TongGuiYuJin() {
  187.         neoPixel_7.setRangeColor(0, 6, 0xFF0000);
  188.         neoPixel_7.setRangeColor(0, 6, 0xFF0000);
  189.         DFTone.play(4, 131, 500);
  190.         delay(1000);
  191.         neoPixel_7.clear();
  192.         neoPixel_8.clear();
  193. }
  194. void DF_ZuoBianSheng() {
  195.         neoPixel_7.setRangeColor(0, 6, 0x00FF00);
  196.         neoPixel_7.setRangeColor(0, 6, 0xFF0000);
  197.         DFTone.play(4, 196, 500);
  198.         delay(1000);
  199.         neoPixel_7.clear();
  200.         neoPixel_8.clear();
  201. }
  202. void DF_ZhaDanChuLi() {
  203.         if ((((47<=mind_n_N1) && (mind_n_N1<=48)) && ((6<=mind_n_N2) && (mind_n_N2<=46)))) {
  204.                 huskylens.writeOSD(String("boom-LZ"), 5, 10);
  205.                 delay(1000);
  206.                 DF_TongGuiYuJin();
  207.         }
  208.         if ((((3<=mind_n_N1) && (mind_n_N1<=46)) && ((49<=mind_n_N2) && (mind_n_N2<=50)))) {
  209.                 huskylens.writeOSD(String("boom_RZ"), 5, 10);
  210.                 delay(1000);
  211.                 DF_TongGuiYuJin();
  212.         }
  213.         if ((((47<=mind_n_N1) && (mind_n_N1<=48)) && ((49<=mind_n_N2) && (mind_n_N2<=50)))) {
  214.                 huskylens.writeOSD(String("boom_LRZ"), 5, 10);
  215.                 delay(1000);
  216.                 DF_TongGuiYuJin();
  217.         }
  218. }
  219. void DF_YouBianSheng() {
  220.         neoPixel_7.setRangeColor(0, 6, 0xFF0000);
  221.         neoPixel_7.setRangeColor(0, 6, 0x00FF00);
  222.         DFTone.play(4, 262, 500);
  223.         delay(1000);
  224.         neoPixel_7.clear();
  225.         neoPixel_8.clear();
  226. }
  227. void DF_GongBingChaiLei() {
  228.         if ((((3<=mind_n_N1) && (mind_n_N1<=5)) && ((44<=mind_n_N2) && (mind_n_N2<=46)))) {
  229.                 huskylens.writeOSD(String("L-CHAI"), 5, 10);
  230.                 delay(1000);
  231.                 DF_ZuoBianSheng();
  232.         }
  233.         if ((((41<=mind_n_N1) && (mind_n_N1<=43)) && ((6<=mind_n_N2) && (mind_n_N2<=8)))) {
  234.                 huskylens.writeOSD(String("R_CHAI"), 5, 10);
  235.                 delay(1000);
  236.                 DF_YouBianSheng();
  237.         }
  238. }
  239. void DF_KangQi() {
  240.         if (((1==mind_n_N1) && ((6<=mind_n_N2) && (mind_n_N2<=40)))) {
  241.                 huskylens.writeOSD(String("R-winner"), 5, 10);
  242.                 delay(1000);
  243.                 DF_YouBianSheng();
  244.         }
  245.         if (((2==mind_n_N2) && ((3<=mind_n_N1) && (mind_n_N2<=40)))) {
  246.                 huskylens.writeOSD(String("L-winner"), 5, 10);
  247.                 delay(1000);
  248.                 DF_ZuoBianSheng();
  249.         }
  250. }
  251. void DF_XiangDeng() {
  252.         if ((((3<=mind_n_N1) && (mind_n_N1<=5)) && ((6<=mind_n_N2) && (mind_n_N2<=8)))) {
  253.                 huskylens.writeOSD(String("====="), 5, 10);
  254.                 delay(1000);
  255.                 DF_TongGuiYuJin();
  256.         }
  257.         if ((((9<=mind_n_N1) && (mind_n_N1<=11)) && ((12<=mind_n_N2) && (mind_n_N2<=14)))) {
  258.                 huskylens.writeOSD(String("====="), 5, 10);
  259.                 delay(1000);
  260.                 DF_TongGuiYuJin();
  261.         }
  262.         if ((((15<=mind_n_N1) && (mind_n_N1<=17)) && ((18<=mind_n_N2) && (mind_n_N2<=20)))) {
  263.                 huskylens.writeOSD(String("====="), 5, 10);
  264.                 delay(1000);
  265.                 DF_TongGuiYuJin();
  266.         }
  267.         if ((((mind_n_N1==21) || (mind_n_N1==22)) && ((mind_n_N2==23) || (mind_n_N2==24)))) {
  268.                 huskylens.writeOSD(String("====="), 5, 10);
  269.                 delay(1000);
  270.                 DF_TongGuiYuJin();
  271.         }
  272.         if ((((mind_n_N1==25) || (mind_n_N1==26)) && ((mind_n_N2==27) || (mind_n_N2==28)))) {
  273.                 huskylens.writeOSD(String("====="), 5, 10);
  274.                 delay(1000);
  275.                 DF_TongGuiYuJin();
  276.         }
  277.         if ((((mind_n_N1==29) || (mind_n_N1==30)) && ((mind_n_N2==31) || (mind_n_N2==32)))) {
  278.                 huskylens.writeOSD(String("====="), 5, 10);
  279.                 delay(1000);
  280.                 DF_TongGuiYuJin();
  281.         }
  282.         if ((((mind_n_N1==33) || (mind_n_N1==34)) && ((mind_n_N2==35) || (mind_n_N2==36)))) {
  283.                 huskylens.writeOSD(String("====="), 5, 10);
  284.                 delay(1000);
  285.                 DF_TongGuiYuJin();
  286.         }
  287.         if (((mind_n_N1==37) && (mind_n_N2==38))) {
  288.                 huskylens.writeOSD(String("====="), 5, 10);
  289.                 delay(1000);
  290.                 DF_TongGuiYuJin();
  291.         }
  292.         if (((mind_n_N1==39) && (mind_n_N2==40))) {
  293.                 huskylens.writeOSD(String("====="), 5, 10);
  294.                 delay(1000);
  295.                 DF_TongGuiYuJin();
  296.         }
  297. }
  298. void DF_LXiaoYuR() {
  299.         if ((((3<=mind_n_N1) && (mind_n_N1<=5)) && ((12<=mind_n_N2) && (mind_n_N2<=40)))) {
  300.                 huskylens.writeOSD(String("R"), 5, 10);
  301.                 delay(1000);
  302.                 DF_YouBianSheng();
  303.         }
  304.         if ((((9<=mind_n_N1) && (mind_n_N1<=11)) && ((18<=mind_n_N2) && (mind_n_N2<=40)))) {
  305.                 huskylens.writeOSD(String("R"), 5, 10);
  306.                 delay(1000);
  307.                 DF_ZuoBianSheng();
  308.         }
  309.         if ((((15<=mind_n_N1) && (mind_n_N1<=17)) && ((23<=mind_n_N2) && (mind_n_N2<=40)))) {
  310.                 huskylens.writeOSD(String("R"), 5, 10);
  311.                 delay(1000);
  312.                 DF_YouBianSheng();
  313.         }
  314.         if ((((21<=mind_n_N1) && (mind_n_N1<=22)) && ((27<=mind_n_N2) && (mind_n_N2<=40)))) {
  315.                 huskylens.writeOSD(String("R"), 5, 10);
  316.                 delay(1000);
  317.                 DF_YouBianSheng();
  318.         }
  319.         if ((((25<=mind_n_N1) && (mind_n_N1<=26)) && ((31<=mind_n_N2) && (mind_n_N2<=40)))) {
  320.                 huskylens.writeOSD(String("R"), 5, 10);
  321.                 delay(1000);
  322.                 DF_YouBianSheng();
  323.         }
  324.         if ((((29<=mind_n_N1) && (mind_n_N1<=30)) && ((35<=mind_n_N2) && (mind_n_N2<=40)))) {
  325.                 huskylens.writeOSD(String("R"), 5, 10);
  326.                 delay(1000);
  327.                 DF_YouBianSheng();
  328.         }
  329.         if ((((33<=mind_n_N1) && (mind_n_N1<=34)) && ((38<=mind_n_N2) && (mind_n_N2<=40)))) {
  330.                 huskylens.writeOSD(String("R"), 5, 10);
  331.                 delay(1000);
  332.                 DF_YouBianSheng();
  333.         }
  334.         if (((mind_n_N1==37) && (mind_n_N2==40))) {
  335.                 huskylens.writeOSD(String("R"), 5, 10);
  336.                 delay(1000);
  337.                 DF_YouBianSheng();
  338.         }
  339. }
  340. void DF_LDaYuR() {
  341.         if ((((9<=mind_n_N1) && (mind_n_N1<=11)) && ((6<=mind_n_N2) && (mind_n_N2<=8)))) {
  342.                 huskylens.writeOSD(String("L"), 5, 10);
  343.                 delay(1000);
  344.                 DF_ZuoBianSheng();
  345.         }
  346.         if ((((15<=mind_n_N1) && (mind_n_N1<=17)) && ((6<=mind_n_N2) && (mind_n_N2<=14)))) {
  347.                 huskylens.writeOSD(String("L"), 5, 10);
  348.                 delay(1000);
  349.                 DF_ZuoBianSheng();
  350.         }
  351.         if ((((21<=mind_n_N1) && (mind_n_N1<=22)) && ((6<=mind_n_N2) && (mind_n_N2<=20)))) {
  352.                 huskylens.writeOSD(String("L"), 5, 10);
  353.                 delay(1000);
  354.                 DF_ZuoBianSheng();
  355.         }
  356.         if ((((25<=mind_n_N1) && (mind_n_N1<=26)) && ((6<=mind_n_N2) && (mind_n_N2<=24)))) {
  357.                 huskylens.writeOSD(String("L"), 5, 10);
  358.                 delay(1000);
  359.                 DF_ZuoBianSheng();
  360.         }
  361.         if ((((29<=mind_n_N1) && (mind_n_N1<=30)) && ((6<=mind_n_N2) && (mind_n_N2<=28)))) {
  362.                 huskylens.writeOSD(String("L"), 5, 10);
  363.                 delay(1000);
  364.                 DF_ZuoBianSheng();
  365.         }
  366.         if ((((33<=mind_n_N1) && (mind_n_N1<=34)) && ((6<=mind_n_N2) && (mind_n_N2<=32)))) {
  367.                 huskylens.writeOSD(String("L"), 5, 10);
  368.                 delay(1000);
  369.                 DF_ZuoBianSheng();
  370.         }
  371.         if (((mind_n_N1==37) && ((6<=mind_n_N2) && (mind_n_N2<=36)))) {
  372.                 huskylens.writeOSD(String("L"), 5, 10);
  373.                 delay(1000);
  374.                 DF_ZuoBianSheng();
  375.         }
  376.         if (((mind_n_N1==39) && ((6<=mind_n_N2) && (mind_n_N2<=38)))) {
  377.                 huskylens.writeOSD(String("L"), 5, 10);
  378.                 delay(1000);
  379.                 DF_ZuoBianSheng();
  380.         }
  381. }
  382. </font>
复制代码
设备组装
       第一步:3D打印棋子外壳结构件如下图25-27所示,取出 3颗强磁铁,将其安装在3个孔位。
图25.jpg 图26.jpg 图27.jpg
       第二步:取出切割好的棋子表面,将其安装在棋子外壳上,如下图28所示。
图28.jpg 图29.jpg
       第三步:3D打印出擂台结构件,并拿出6颗强磁铁安装在对应的孔位上,如图30所示。具体安装磁铁的级性要与蓝橙色棋子匹配。例如,一侧擂台外露为N极,则对应棋子外露为S极;另一侧擂台外露为S极,则对应棋子外露为N极。安装后以后,使用棋子测试。
图30.jpg 图31.jpg
       第四步:为Huskylens加装支架和铜柱,如下图32所示。
图32.jpg
       第五步:将Huskylens、蜂鸣器、擂台固定在棋盘上,如下图33所示。
图33.jpg
       第六步:用热熔胶将LED灯带安装固定到指示灯区域,如下图34所示。
       图34.jpg
       第七步:将上步中的棋盘于底板侧板组合安装,主控固定在底板对应孔位,从而完成安装如图35所示。另外使用热熔胶将棋子收纳盒,粘贴完成如下图36所示。
图35.jpg 图36.jpg
        第八步:启动MaixPy.ide编程软件,选择“工具”——“机器视觉”——“AprilTag生成器——TAG36H11”生成相应的标签如图37所示。        
图37.png
         第九步:从生成标签中选取其中的50个标签,用热敏打印机打印出来,如下图38所示。
图38.jpg
        第十步:分配标签,以下表为依据将生成的标签依次分配给蓝方和橙方对应棋子。并将打印出的标签粘贴在棋子的顶部,如下图39所示。
图39.jpg
       6.系统测试
       在测试前,先要完成对50个棋子标签的学习,嗯,这是个力气活,而且需要有耐心!具体操作这里不再赘述。系统加电对其进行测试,分别军衔PK(大于、等于、小于)、工兵拆雷、炸弹处理、地雷处理、工兵扛旗的所有情况进行测试,验证其结果的有效性。
图片41.png 图42工兵地雷.jpg 图40司令对师长.jpg 图43.jpg 图44.jpg


云天  7 中级技匠

发表于 2021-2-19 12:02:32

很好的作品,工程量也很大!
回复

使用道具 举报

szjuliet  版主

发表于 2021-2-20 07:55:23

这个作品太太天才了!
唤起了遥远的童年回忆。话说现在的小朋友还玩这种游戏吗?
回复

使用道具 举报

hnyzcj  版主
 楼主|

发表于 2021-2-20 08:20:54

szjuliet 发表于 2021-2-20 07:55
这个作品太太天才了!
唤起了遥远的童年回忆。话说现在的小朋友还玩这种游戏吗? ...

棋子.jpg
回复

使用道具 举报

hnyzcj  版主
 楼主|

发表于 2021-2-20 08:39:26



还是很好玩的
回复

使用道具 举报

 4 中级技师

发表于 2021-2-20 18:04:42

很好的项目
回复

使用道具 举报

szjuliet  版主

发表于 2021-2-20 20:57:08


哈哈,厉害厉害!
回复

使用道具 举报

微笑的rockets  NPC

发表于 2021-2-26 10:46:09

用语音合成模块,或者mp3模块增加一个语音提示,另外可以把二哈的显示关掉。
回复

使用道具 举报

hnyzcj  版主
 楼主|

发表于 2021-2-26 16:05:14

微笑的rockets 发表于 2021-2-26 10:46
用语音合成模块,或者mp3模块增加一个语音提示,另外可以把二哈的显示关掉。 ...

YES
回复

使用道具 举报

佛系唐法官  4 中级技师

发表于 2021-2-26 17:03:48

这个项目非常的妙啊!以后可以两个人玩棋了!
回复

使用道具 举报

MRX  4 中级技师

发表于 2021-2-28 15:50:05

这个项目真不错。
回复

使用道具 举报

沧海笑  5 高级技师

发表于 2021-3-10 10:36:26

非常好的创意与实践,完成度很高。赞
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail