用Arduino制作智能军棋项目分享

2021-02-195.5万
精华项目
AI 快速预览详细 收起
该项目使用Arduino uno、HuskyLens视觉识别传感器等硬件,通过AprilTag标签实现军棋的智能识别与评判。系统能够自动判断双方出棋等级高低,并通过声光效果增加玩家的代入感。适用于青少年科创比赛和STEM教育场景。


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

用Arduino制作智能军棋项目分享图7
用Arduino制作智能军棋项目分享图5

【功能简介】
      (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所示。
用Arduino制作智能军棋项目分享图28
用Arduino制作智能军棋项目分享图29
      其次依据上步生成盒体宽(内部)的尺寸绘制棋子收纳盒,具体设计图如下图10所示。
用Arduino制作智能军棋项目分享图31
      最后绘制出25个棋子的面板,如下图11所示
用Arduino制作智能军棋项目分享图34
     棋子结构件设计(3D打印)
     我们在Fusion 360中,设计绘制棋子外壳结构和擂台结构如下图12-13所示。
用Arduino制作智能军棋项目分享图6用Arduino制作智能军棋项目分享图8
      电路连线
      智能军棋系统电路连接如图14所示。两条灯带分别接D7,D8口,蜂鸣器模块接D4口,Huskylens视觉识别传感器通过I2C口与主控Arduino连接。
用Arduino制作智能军棋项目分享图10
       代码编写
       主程序如下图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个孔位。
用Arduino制作智能军棋项目分享图9用Arduino制作智能军棋项目分享图11用Arduino制作智能军棋项目分享图13
       第二步:取出切割好的棋子表面,将其安装在棋子外壳上,如下图28所示。
用Arduino制作智能军棋项目分享图14用Arduino制作智能军棋项目分享图18
       第三步:3D打印出擂台结构件,并拿出6颗强磁铁安装在对应的孔位上,如图30所示。具体安装磁铁的级性要与蓝橙色棋子匹配。例如,一侧擂台外露为N极,则对应棋子外露为S极;另一侧擂台外露为S极,则对应棋子外露为N极。安装后以后,使用棋子测试。
用Arduino制作智能军棋项目分享图15用Arduino制作智能军棋项目分享图16
       第四步:为Huskylens加装支架和铜柱,如下图32所示。
用Arduino制作智能军棋项目分享图17
       第五步:将Huskylens、蜂鸣器、擂台固定在棋盘上,如下图33所示。
用Arduino制作智能军棋项目分享图19
       第六步:用热熔胶将LED灯带安装固定到指示灯区域,如下图34所示。
      用Arduino制作智能军棋项目分享图20
       第七步:将上步中的棋盘于底板侧板组合安装,主控固定在底板对应孔位,从而完成安装如图35所示。另外使用热熔胶将棋子收纳盒,粘贴完成如下图36所示。
用Arduino制作智能军棋项目分享图21用Arduino制作智能军棋项目分享图24
        第八步:启动MaixPy.ide编程软件,选择“工具”——“机器视觉”——“AprilTag生成器——TAG36H11”生成相应的标签如图37所示。        
用Arduino制作智能军棋项目分享图22
         第九步:从生成标签中选取其中的50个标签,用热敏打印机打印出来,如下图38所示。
用Arduino制作智能军棋项目分享图23
        第十步:分配标签,以下表为依据将生成的标签依次分配给蓝方和橙方对应棋子。并将打印出的标签粘贴在棋子的顶部,如下图39所示。
用Arduino制作智能军棋项目分享图25
       6.系统测试
       在测试前,先要完成对50个棋子标签的学习,嗯,这是个力气活,而且需要有耐心!具体操作这里不再赘述。系统加电对其进行测试,分别军衔PK(大于、等于、小于)、工兵拆雷、炸弹处理、地雷处理、工兵扛旗的所有情况进行测试,验证其结果的有效性。
用Arduino制作智能军棋项目分享图33用Arduino制作智能军棋项目分享图32用Arduino制作智能军棋项目分享图27用Arduino制作智能军棋项目分享图26用Arduino制作智能军棋项目分享图30


2018.zip

190.82 KB, 下载次数: 4472

程序

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(23)
jackczm
jackczm
有mind+代码吗?发个给[email]duankh2012@163.com[/email],谢谢!
jackczm
jackczm回复hnyzcj
感谢感谢,没有看到,以为是c++代码
hnyzcj
hnyzcj
作者
回复jackczm
已经挂在帖子尾部,请自行下载。
IOHDHQ
IOHDHQ
看起来用了二哈,要事被篡改了咋办
耘想
耘想
牛啊!!!!!!!!!!!
摸鱼的网民
摸鱼的网民
不戳6666
派大星ym
派大星ym
脑洞大开。。。
大熊小明
大熊小明
我康康这个程序可以学习下么??
Mr-k
Mr-k
厉害厉害
淘气的一丁
淘气的一丁
您好 老师··请问这个程序可以学习下么??
hnyzcj
hnyzcj
作者
回复淘气的一丁
已经挂在帖子尾部
淘气的一丁
淘气的一丁回复淘气的一丁
看到了··谢谢
三春牛-创客
三春牛-创客
厉害!!!
Mr-k
Mr-k
厉害!!!!!!!!!!!!!!!!!!!!!!!!!
丨偏执狂丨
丨偏执狂丨
让人看着眼前一亮
豆爸
豆爸
6666666666
刘昌胜
刘昌胜
有种回到童年的感觉,与科技结合
老玩家
老玩家
感谢分享,这里特意注册账号提个缺点,看看有没有什么好的优化方式
这个码毕竟是大家都能看到的信息,并且不是特别复杂(8x8?),
经常玩的话,很难不会去记住关键棋子的码征,比如对面司令
之前也看到过市面上卖的智能军旗,应该用的是ic线圈判定的
(没有研究过,主要玩法是比大小的时候,双方将自己棋子放到棋盘中央的专用平台上就会出现结果)
不过这个读码识别还是挺新颖的,值得借鉴。
hnyzcj
hnyzcj
作者
回复老玩家
感谢感谢,目前以我能有器材和能力去解决这个问题。
hnyzcj
hnyzcj
作者
回复老玩家
是的,是的您说的很对,如果后面有时间继续修改
霹雳豆沙包
霹雳豆沙包
怎么能想到这么好的创意!!!
沧海笑
沧海笑
非常好的创意与实践,完成度很高。赞
MRX
MRX
这个项目真不错。
佛系唐法官
佛系唐法官
这个项目非常的妙啊!以后可以两个人玩棋了!
微笑的rockets
微笑的rockets
用语音合成模块,或者mp3模块增加一个语音提示,另外可以把二哈的显示关掉。
hnyzcj
hnyzcj
作者
回复微笑的rockets
YES
诩
很好的项目