亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

电子棋盘(4x4 演示原型)

组件和用品

霍尔效应传感器
× 16
无焊面包板全尺寸
× 1
LED(通用)
× 16
RFID 阅读器(通用)
125 kHz RFID 阅读器和天线
× 1
Arduino Mega 2560
× 1
RFID 标签 3M
× 2

必要的工具和机器

有机玻璃
光面纸
木板
丙烯酸漆(深绿色和奶油色)x2
10 毫米圆形磁铁
棋子和皇后棋子
烙铁和焊接材料

应用和在线服务

Arduino IDE

关于这个项目

嗨,制造商,

我是 Tahir Miriyev,2018 年毕业于土耳其安卡拉中东技术大学。我主修应用数学,但我一直喜欢制作东西,尤其是当涉及到一些电子、设计和编程方面的手工时。多亏了我们工业设计系提供的独特的原型设计课程,我有机会制作一些非常有趣的东西。该项目可以被视为一个学期项目,持续整个学期(4个月)。学生们被分配了一项任务,寻找一种创造性的方法来设计现有的产品/演示,并使用 Arduino 微控制器和传感器实现他们的想法。我在想国际象棋,在对成功的项目做了一些研究后,我注意到在以前的项目中,制造商基本上使用现成的国际象棋引擎(每个图形的所有动作都在核心中编程),以及Raspberry Pi,一些MUX 、LED 和簧片开关。不过,在我的项目中,我决定摆脱国际象棋引擎方面的任何外部软件,并使用 RFID 阅读器、霍尔效应传感器和 Arduino Mega 为图形识别问题寻找创造性的解决方案。

简单地说,假设您有一个带有“大脑”=微控制器的棋盘,并且您必须让棋盘了解您手中握着的数字以及放置的位置。这就是图形识别的问题。当您拥有一个所有棋子都站在棋盘上的初始位置的国际象棋引擎时,此问题的解决方案是微不足道的。在解释为什么会这样之前,让我先说几句。

对于那些对这里的工作原理充满热情的人,我必须澄清一下为什么我们需要簧片开关(或者在我的情况下,我使用了霍尔效应传感器):如果你在每个部件下面放一块磁铁,然后从一个棋盘上的方块(假设每个方块下面都有一个簧片开关)由于传感器上方磁场的存在/不存在,您可以让您的控制器了解是否有/没有站在方块上的棋子。然而,它仍然没有告诉微控制器任何关于哪一块站在广场上的确切信息。它只告诉正方形上有/没有一块。在这一点上,我们面临一个图形识别问题,可以使用国际象棋引擎来解决,在国际象棋比赛开始时,所有棋子都放在初始位置。这样微控制器从一开始就“知道”每一块的位置,所有地址都固定在内存中。然而,这给我们带来了一个巨大的限制:你不能选择任意数量的棋子并将它们随机放置在棋盘上的任何位置并开始分析游戏。你总是必须从头开始,所有的棋子最初都应该在板上,因为一旦你拿起一个棋子并放在其他正方形上,这是微控制器跟踪它们位置的唯一方法。本质上,这是我注意到并决定努力解决的问题。

我的解决方案很简单,虽然很有创意。我在电路板的正面放置了一个 RFID 阅读器。同时,我不仅在零件下面贴了一块磁铁,还贴了一个 RFID 标签,每个零件都有一个唯一的 ID。因此,在您将图形放置在任何所需的正方形之前,您可以先将棋子靠近 RFID 阅读器,让它读取 ID、识别棋子、将其保存在内存中,然后您就可以将其放置在任何您想要的地方。此外,为了简化电路设计,我使用了霍尔效应传感器,而不是使用簧片开关,它们的工作原理类似,唯一的区别是将 0 或 1 作为数字数据发送到微控制器,这表示“存在”或广场上分别“没有”任何一块。我还添加了 LED(不幸的是,颜色不同,没有 LED),因此当您提起该部件时,所有可以放置已提起部件的方形位置都会亮起。可以将其视为国际象棋学习者的教育实践:)

最后,我想指出,尽管我使用了多种技术,但该项目仍然简单易懂,没有深入研究或过于复杂。我没有足够的时间来处理 8x8 棋盘(也因为 64 个霍尔效应传感器在土耳其很昂贵,我承担了与项目相关的所有费用),这就是为什么我做了 4x4 演示版,只测试了两个部分:Pawn 和 Queen .我没有使用国际象棋引擎,而是为 Arduino 编写了一个源代码,它可以生成一切。

在我们进入一步一步之前 关于项目是如何完成的解释,我建议观看说明性视频,并对我在谈论的内容有一些直观的了解。

注意 #1:一个红色 LED(第一排/从左到右)烧坏了,没关系。

注意#2:虽然被广泛使用,但根据我的经验,我可以说 RFID 技术不是用于 DIY 应用程序的最佳主意(当然,如果您有其他选择)。在一切正常之前,我做了很多尝试,将棋子放在靠近阅读器的地方,等待它正确读取 ID。应该为此设置串行端口,因为 RFID 阅读器读取 ID 的方式令人头疼。一个人应该自己尝试以了解问题。

这是所有工具的列表 我用于项目:

电子元件:

  • 面包板 (x1)
  • 全向 A1126LUA-T (IC-1126 SW OMNI 3-SIP ALLEGRO) 霍尔效应传感器 (x16)
  • 基本的 5 毫米 LED (x16)
  • 跳线
  • 125 kHz RFID 阅读器和天线 (x1)
  • Arduino Mega (x1)
  • RFID 3M 标签 (x2)

其他材料:

  • 有机玻璃
  • 光面纸
  • 短木板(木制)
  • 丙烯酸漆(深绿色和奶油色)x2
  • 薄纸板
  • 10 毫米圆形磁铁 (x2)
  • 棋子和皇后棋子
  • 烙铁和焊接材料

是时候解释事物是如何制作的了。 请按照分步说明进行操作:

1. 取一块21x21厘米的硬纸板,另外再多取一些硬纸板,将纸板上半部分的墙壁剪下来粘好,拼出16个正方形,A B C D 1 2 3 4。由于纸板很薄,您可以在每个正方形中粘贴 16 个霍尔效应传感器,每个有 3 个腿和 16 个 LED,每个有 2 个腿。

2. 设置组件后,您需要进行一些焊接,将霍尔效应传感器和 LED 的腿焊接到跳线。在这一点上,我建议以聪明的方式选择彩色电线,这样您就不会与 LED 的 + 和 - 脚以及霍尔效应传感器的 VCC、GND 和 PIN 脚混淆。当然,人们可能会打印带有传感器的 PCB,甚至 WS2812 类型的 LED 已经焊接,但我决定让项目保持简单并做更多的“手工”。在这一点上,您所要做的就是准备电线和传感器,在遵循 Fritzing 方案的后期阶段,您可以看到应该将每根电线的末端连接到哪里。很快,其中一些将直接连接到 Arduino Mega 上的 PIN(Arduino 上有足够的引脚),其他连接到面包板,所有 GND 都可以焊接到一根电线上(形成公共接地),稍后应连接到 Arduino 板上的 GND。这里有一个重要的注意事项:霍尔效应传感器是全方位的,这意味着磁铁的哪一极靠近传感器并不重要,当附近有磁场时它会发送 0 数据,当附近没有磁场时会发送 1 数据,即,磁铁远离传感器(比我们说的 5 sm 更远)。

3. 准备类似的 21x21 cm 纸板并将 Arduino Mega 和一个长面包板固定在上面。您还可以再次从纸板上切割出任何所需高度的 4 面墙,然后用这两层 21x21 厘米的方板垂直粘合它们。然后按照 Fritzing Schematics 进行设置。完成 LED 和霍尔效应传感器后,您还可以设置 RFID 阅读器。

4. 通过使用基本代码发送信号来测试所有 LED 和传感器是否工作。不要回避这一步,因为它会让你测试一切是否正常并传递给电路板的进一步构建。

5. 准备 Pawn 和 Queen,下面附有两个半径 10 厘米的磁铁,以及圆形 RFID 标签。稍后,您需要从 Arduino IDE 上的串行屏幕读取这些标签的 ID。

6. 如果一切正常,您可以启动主代码并尝试一下!

7(可选)。你可以用木头做一些艺术作品,这会让你的演示更自然。这取决于您的意愿和想象力。

以下是不同阶段的一些视频和照片:

感谢您的关注!测试所有内容,并在评论中随意写下我遗漏的任何错误、改进、建议等。期待听到有关该项目的一些意见。如果您需要该项目的任何帮助,请给我发邮件 (miriyevt@gmail .com) 或添加 Skype (tahir.miriyev9r1),以便我们可以安排对话并详细讨论事情。祝你好运!

代码

  • think_code.ino
think_code.inoArduino
我试图留下尽可能多的评论,以使代码分析的过程易于理解。说实话,这个逻辑乍一看可能有点复杂,但是如果你深入挖掘代码的逻辑,它会看起来更全面。

注意:与真正的棋盘类似,我将方块抽象为 A1、A2、A3、A4、B1、...、C1、...、D1、...、D4。但是,在代码中,使用这种表示法是不切实际的。因此,我使用数组并将正方形表示为 00, 01, 02, 03,10,11,12,13,..., 32,33。
#include SoftwareSerial RFID(11, 12);//----------------------------------------------- - - - - - - 开始 - - - - - - - - - - - - - - - - - - - -------------------------------------------------- ------int empty_pos[2];int figure_pos[2][2]; //将图形位置视为具有三个条目(x pos, y pos, and value 1(queen), 2(pawn)int new_id[14] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int id_type_matrix[4][4] ={{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};int temp =0;int Queen_id[14] ={2, 53, 65, 48, 48, 56, 51, 49, 55, 70, 65, 51, 52, 3};int pawn_id[14] ={2, 53, 65, 48, 48, 56, 51, 56, 67, 49, 56, 52, 68, 3};int temp_vect[2];int count =0;int ID =0;int jeni_id[14]; //霍尔效应传感器的初始阵列矩阵int hes_bool_matrix[4][4];//霍尔效应列表Arduinoconst 上的传感器引脚 int hes_00 =44;const int hes_01 =45;const int hes_02 =46;const int hes_03 =47;const int hes_10 =48;const int hes_11 =49;const int hes_12 =50st;const int hes_20 =3;const int hes_21 =4;const int hes_22 =5;const int hes_23 =6;const int hes_30 =7;const int hes_31 =8;const int hes_32 =9;const int hes_33 =1 hes_pin_matrix[4][4] ={ {hes_00, he s_01, hes_02, hes_03}, {hes_10, hes_11, hes_12, hes_13}, {hes_20, hes_21, hes_22, hes_23}, {hes_30, hes_31, hes_32, hes_33} int_32, hes_33 LED int_0st LED; =23;const int led_02 =24;const int led_03 =25;const int led_10 =26;const int led_11 =27;const int led_12 =28;const int led_13 =29;const int led_20 =30;const int led_21 =;const int led_22 =32;const int led_23 =33;const int led_30 =34;const int led_31 =35;const int led_32 =36;const int led_33 =37;int led_matrix[4][4] ={{led_00, led_01, led_02, led_03}, {led_10, led_11, led_12, led_13}, {led_20, led_21, led_22, led_23}, {led_30, led_31, led_32, led_33}};//--------- ------------------------------------- 设置区域 ----- -------------------------------------------------- --------------------------void setup() { RFID.begin(9600); Serial.begin(9600); //霍尔效应传感器的读取(输入)模式 pinMode(hes_01, INPUT); pinMode(hes_02,输入); pinMode(hes_03,输入); pinMode(hes_00,输入); pinMode(hes_10,输入); pinMode(hes_11,输入); pinMode(hes_12,输入); pinMode(hes_13,输入); pinMode(hes_20,输入); pinMode(hes_21,输入); pinMode(hes_22,输入); pinMode(hes_23,输入); pinMode(hes_30,输入); pinMode(hes_31,输入); pinMode(hes_32,输入); pinMode(hes_33,输入); //LED 引脚的写入(输出)模式 pinMode(led_00, OUTPUT); pinMode(led_01,输出); pinMode(led_02,输出); pinMode(led_03,输出); pinMode(led_10,输出); pinMode(led_11,输出); pinMode(led_12,输出); pinMode(led_13,输出); pinMode(led_20,输出); pinMode(led_21,输出); pinMode(led_22,输出); pinMode(led_23,输出); pinMode(led_30,输出); pinMode(led_31,输出); pinMode(led_32,输出); pinMode(led_33,输出);读取标签();延迟(1000); first_figure();延迟(1000);串口.end(); RFID.end();延迟(5000); Serial.begin(9600);延迟(1000); RFID.开始(9600);延迟(1000);读取标签();延迟(5000); //RFID.flush(); // 停止多次读取 second_figure(); delay(1000);// id_type_matrix[0][2] =2;// id_type_matrix[2][1] =1;}//----------------- ---------------------------------功能区--------------- ---------------------------------------------//--- -------------------------------------RFID ID跟踪与图形识别-- ----------------------------------------布尔型 compare_ID(int aa[14], int bb[14]){ 布尔值 ff =假; int fg =0; for (int cc =0; cc <14; cc++) { if (aa[cc] ==bb[cc]) { fg++; } } if (fg ==14) { ff =true; } return ff;}int read_tags(){ Serial.println("将图形靠近RFID阅读器");延迟(5000); RFID.flush(); // 停止多次读取 if (RFID.available()> 0) { delay(300); for (int z =0; z <14; z++) { ID =RFID.read(); new_id[z] =ID; Serial.println(new_id[z], DEC);延迟(500); } } Serial.println("ID读取完成"); ++计数;延迟(5000); //将图形放在板上的时间和将第二个图形放在 RFID 阅读器前面的时间return new_id;}void first_figure() { if (compare_ID(new_id, Queen_id) ==true) { Serial.println("QUEEN IS DETECTED" ); for (int s =0; s <=3; s++) { for (int t =0; t <=3; t++) { if (digitalRead(hes_pin_matrix[s][t]) ==0) { id_type_matrix[s ][t] =1; temp_vect[0] =s; temp_vect[1] =t; Serial.print("女王被放置在:"); Serial.print(s); Serial.println(t); digitalWrite(led_matrix[s][t],HIGH);延迟(1000);数字写入(led_matrix[s][t],低); } } } } else if (compare_ID(new_id, pawn_id) ==true) { Serial.println("PAWN IS DETECTED"); for (int s =0; s <=3; s++) { for (int t =0; t <=3; t++) { if (digitalRead(hes_pin_matrix[s][t]) ==0) { id_type_matrix[s ][t] =2; temp_vect[0] =s; temp_vect[1] =t; Serial.print("Pawn 被放置到:"); Serial.print(s); Serial.println(t); digitalWrite(led_matrix[s][t],HIGH);延迟(1000);数字写入(led_matrix[s][t],低); } } } } else { Serial.println("未定义图形"); }}void second_figure() { if (compare_ID(new_id, Queen_id) ==true) { Serial.println("QUEEN IS DETECTED"); for (int s =0; s <=3; s++) { for (int t =0; t <=3; t++) { if (digitalRead(hes_pin_matrix[s][t]) ==0 &&(s !=temp_vect[0] || t !=temp_vect[1])) { id_type_matrix[s][t] =1; Serial.print("女王被放置在:"); Serial.print(s); Serial.println(t); digitalWrite(led_matrix[s][t],HIGH);延迟(1000);数字写入(led_matrix[s][t],低); } } } } else if (compare_ID(new_id, pawn_id) ==true) { Serial.println("PAWN IS DETECTED"); for (int s =0; s <=3; s++) { for (int t =0; t <=3; t++) { if (digitalRead(hes_pin_matrix[s][t]) ==0 &&(s !=temp_vect[0] || t !=temp_vect[1])) { id_type_matrix[s][t] =2; Serial.print("Pawn 被放置到:"); Serial.print(s); Serial.println(t); digitalWrite(led_matrix[s][t],HIGH);延迟(1000);数字写入(led_matrix[s][t],低); } } } }}//------------------------------------------- ---- 找图-------------------------------------------- -----------------------------//仅当您将图形放回板上时才关闭 LED 的额外功能void leds_off() { int i, j; for (i =0; i <=3; i++) { for (j =0; j <=3; j++) { digitalWrite(led_matrix[i][j], LOW); } }}//-------------------------------------------- ----移动女王-------------------------------------------- -------------------------------------------------- --void move_queen() { int i, j; for (i =empty_pos[0]; i <3;) { digitalWrite(led_matrix[++i][empty_pos[1]], HIGH); //沿着垂直线点亮 } for (i =empty_pos[0]; i> 0;) { digitalWrite(led_matrix[--i][empty_pos[1]], HIGH); } for (i =empty_pos[1]; i <3;) { digitalWrite(led_matrix[empty_pos[0]][++i], HIGH); //沿着水平线发光 } for (i =empty_pos[1]; i> 0;) { digitalWrite(led_matrix[empty_pos[0]][--i], HIGH); } i =empty_pos[0]; j =empty_pos[1]; for (i =i - 3, j =j - 3; i <=3, j <=3; i++, j++) { if (i>=0 &&j>=0 &&i !=empty_pos[0]) { Serial.print(i); Serial.println(j);数字写入(led_matrix[i][j],高); } } i =empty_pos[0]; j =empty_pos[1]; for (i =i + 3, j =j - 3; i>=0, j <=3; i--, j++) { if (i>=0 &&i <=3 &&j>=0 &&j <=3 &&i !=empty_pos[0]) { Serial.print(i); Serial.println(j);数字写入(led_matrix[i][j],高); } } }//-------------------------------------------------开始读取数字和保存位置对于他们每个人---------------------------void figure_reading() { //读取循环中的所有位置以检测pawn的位置int i, j, found_figure =0;开始:found_figure =0; //读取棋盘上所有被占用的(0)和空的(1)位置 //将0(=空方格), 1(=被占用方格)分配给变量hes_bool_matrix[0][0] =digitalRead(hes_00); hes_bool_matrix[0][1] =digitalRead(hes_01); hes_bool_matrix[0][2] =digitalRead(hes_02); hes_bool_matrix[0][3] =digitalRead(hes_03); hes_bool_matrix[1][0] =digitalRead(hes_10); hes_bool_matrix[1][1] =digitalRead(hes_11); hes_bool_matrix[1][2] =digitalRead(hes_12); hes_bool_matrix[1][3] =digitalRead(hes_13); hes_bool_matrix[2][0] =digitalRead(hes_20); hes_bool_matrix[2][1] =digitalRead(hes_21); hes_bool_matrix[2][2] =digitalRead(hes_22); hes_bool_matrix[2][3] =digitalRead(hes_23); hes_bool_matrix[3][0] =digitalRead(hes_30); hes_bool_matrix[3][1] =digitalRead(hes_31); hes_bool_matrix[3][2] =digitalRead(hes_32); hes_bool_matrix[3][3] =digitalRead(hes_33); for (i =0; i <=3; i++) { for (j =0; j <=3; j++) { if (hes_bool_matrix[i][j] ==0) { found_figure++; if (found_figure ==1) { if (id_type_matrix[i][j] ==0) { id_type_matrix[i][j] =temp;温度 =0; } if(id_type_matrix[i][j]==1){ Serial.print("Queen is stand on:"); Serial.print(i); Serial.println(j);图_pos[0][0] =i;图_pos[0][1] =j; } else if(id_type_matrix[i][j]==2){ Serial.print("Pawn站在:"); Serial.print(i); Serial.println(j);图_pos[0][0] =i;图_pos[0][1] =j; //if (id_type_matrix[i][j] ==0) { //id_type_matrix[i][j] =temp; //温度=0; }} } } else if (found_figure ==2) { if (id_type_matrix[i][j] ==0) { id_type_matrix[i][j] =temp;温度 =0; } if(id_type_matrix[i][j]==1){ Serial.print("Queen is stand on:"); Serial.print(i); Serial.println(j);图_pos[1][0] =i; figure_pos[1][1] =j; //if (id_type_matrix[i][j] ==0) { //id_type_matrix[i][j] =temp; //温度=0; } } else if(id_type_matrix[i][j]==2){Serial.print("Pawn站在:"); Serial.print(i); Serial.println(j);图_pos[1][0] =i; figure_pos[1][1] =j;// if (id_type_matrix[i][j] ==0) {// id_type_matrix[i][j] =temp;// temp =0; } //出去; } } } }} out:if (found_figure ==0 || found_figure ==1) { goto start; } else if (found_figure ==2) { leds_off(); } // - - - - - - - - - - - - - - - - - - - - - - - 我们选择要选择的图 --------------------------------------------- -------------------- empty_pos[0] =-1;延迟(2000); if (digitalRead(hes_pin_matrix[figure_pos[0][0]][figure_pos[0][1]]) ==1) { empty_pos[0] =figure_pos[0][0]; empty_pos[1] =figure_pos[0][1]; temp =id_type_matrix[empty_pos[0]][empty_pos[1]]; id_type_matrix[empty_pos[0]][empty_pos[1]] =0; } else if (digitalRead(hes_pin_matrix[figure_pos[1][0]][figure_pos[1][1]]) ==1) { empty_pos[0] =figure_pos[1][0]; empty_pos[1] =figure_pos[1][1]; temp =id_type_matrix[empty_pos[0]][empty_pos[1]]; id_type_matrix[empty_pos[0]][empty_pos[1]] =0; } //------------------------------------------- 移动 PAWN 或 QUEEN -------------------------------------------------- -------------------------------------------------- if(temp==1){ if ( empty_pos[0] !=-1) { move_queen();开始; } } else if(temp==2){if ( empty_pos[0] !=-1) { if (empty_pos[0] <2) { digitalWrite(led_matrix[empty_pos[0] + 1][empty_pos[1]] , 高的);数字写入(led_matrix[empty_pos[0] + 2][empty_pos[1]],高); } else if (empty_pos[0] ==2) { digitalWrite(led_matrix[empty_pos[0] + 1][empty_pos[1]], HIGH); } 别的; } delay(100);} figure_reading();}//------------------------------------ --------------------------------- 循环开始 --------------- -------------------------------------------------- -------------------void loop() { figure_reading();}

示意图

原理图有点复杂,我知道,但思路应该很清楚。这是我第一次使用 Fritzing(顺便强烈推荐),可能可以更准确地绘制连接。无论如何,我记下了原理图中的所有内容。

注意:我在Fritzing的数据库中的组件中找不到RDIF Reader的确切型号。我使用的模型是 125Khz RFID 模块 - UART。您可以在 Youtube 上找到有关如何使用 Arduino 设置此模块的教程。 4x4demo_q0nvG3T3nS.fzz

制造工艺

  1. 原型颂
  2. 电子墨水
  3. Raspoulette 原型
  4. 什么是 RFID?
  5. Arduino RFID 锁教程
  6. 原型注塑模具与生产注塑模具
  7. 电子皮肤对疼痛的反应
  8. 如何选择PCB原型制造公司
  9. 重要的原型 PCB 定义:第 2 部分
  10. 什么是原型设计?
  11. 电子泵简介
  12. 了解电子点火系统的工作原理