1.创作灵感:我们都喜欢下军棋,可是下军棋要有个裁判,也就是说必须有三个人才能好好下军棋,其中一个人专门做裁判。可是如果裁判的这个人不公正,或不熟悉军棋规则,可能就会误判,造成不公平的结果。有没有办法用我们所学的知识来解决这些问题的呢?
2.设计思路:我们知道,军棋的电子裁判主要功能是用来比较大小。在学校我参了人工智能课程,学习了创客的知识后,我突然来了灵感。是否可以应用Arduino、Micro:bit等智能单片机的强大的控制、判断功能,来实现军棋的电子裁判功能呢?
其实网上有很多现成的电子裁判,但是成本比较高,究其原因,主要就是要生产专用的棋子和增加裁判电路,以实现识别判断不同的棋子,同时改造成本又要很低;二是要用什么方式实现军棋间关系的识别。
首先,是要对军棋进行改造,如果是进行内部改装,要很麻烦,那是否可以直接在军棋上加装什么来实现军棋的识别呢?军棋有司令、军长、师长、旅长、团长、营长、连长、排长、工兵、地雷、炸弹、军棋,共12种棋子,电子裁判就是要对他们关系进行识别。
在老师的提醒下,在计算机系统里的二进制,一个01就两种状态,如果有多个01就可以有多种状态,可以用于军棋大小关系的识别。经过我们的计算,我发现,只要用四个端口的01组合,就可以识别所有的军棋。
军棋 | 识别码 |
司令 | 0111 |
军长 | 1011 |
师长 | 1101 |
旅长 | 1110 |
团长 | 0011 |
营长 | 0101 |
连长 | 0110 |
排长 | 1001 |
工兵 | 1100 |
炸弹 | 1111 |
地雷 | 0001 |
军旗 | 1010 |
我们用连接的线代表1(高电平),断开的线代表0(低电平),四个端口的01组合共有14种,我用了其中的12种,全1的和全0的没用。
2.确定使用的硬件
(1)确定军棋的改造方案(创新亮点)
经过思考,我选择了在军棋底部加装一块表示高低电平的小电路板,对棋子的大小影响很小,只要用双面胶粘上即可。下面是改造的过程:
取一块完整的缚铜板,拿棋子对照确定需要裁切的线路板大小,根据代码切割缚铜板,并粘在棋子下面:
(2)确定硬件的使用
我们用易用易得的单片机Arduino Nano及micro:bit来实现我的控制,非常适合我的科技发明制作.同时我还需要一片声音播放模块
同时,还需要一个发光的LED灯,来指示胜负方。
找齐了这些硬件,我就要想办法把这些连接在一起了。在老师的指导下,我们开始尝试连接端口以及连线。
3.编写控制程序
(1)程序的初步设计。
接着,我要学习编写程序来控制智能单片机。我应用的是Mind+进行编程
这个程序主要是比较各个组合所代表的棋子大小,经过多次试验,我把四位高低电平的组合分别用不同的数字变量来代表他们:。
下面是我们编写的判断程序:
程序编写好后,通过USB线把程序下载到智能单片机中进行测试。经过多次不断改进,终于成功!
4.进行外观设计
接下来,要对外观进行设计。我用学校的激光切割机进行切割制作。
在老师的指导下,我们终于一步步攻克难关,把图纸设计出来了!
5.硬件制作及连接测试
用万用板制作军棋高低电平检测电路
6.测试结果
经过测试,该产品可以正常工作,指导清晰,效果良好,成功的解决了裁判的难题,可以做为军棋的电子裁判。
6.存在问题
在使用的过程中,我发现如果检测线路板和棋子的线路板如果连接不好,可能会出现误判。
序号 | 硬件 | 数量(个) | |
1 | arduino nano | 1 | |
2 | LED灯 | 2 | |
3 | 自制检测板 | 2 | |
4 | 码片 | 50 | |
5 | 外壳 | 1 | |
6 | 按钮开关 | 1 | |
7 | 电源开关 | 1 | |
8 | 电池盒 | 1 | |
9 | 导线 | 若干 | |
10 | 固定柱 | 若干 |
led.enable(false)
let a = 0
let b = 0
let c = 0
let d = 0
let e = 0
let f = 0
let g = 0
let h = 0
let i = 0
let j = 0
pins.digitalWritePin(DigitalPin.P11, 1)
basic.forever(function () {
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
if (pins.digitalReadPin(DigitalPin.P11) == 0) {
a = pins.digitalReadPin(DigitalPin.P1)
basic.pause(50)
b = pins.digitalReadPin(DigitalPin.P2)
basic.pause(50)
c = pins.digitalReadPin(DigitalPin.P3)
basic.pause(50)
d = pins.digitalReadPin(DigitalPin.P4)
basic.pause(50)
e = pins.digitalReadPin(DigitalPin.P6)
basic.pause(50)
f = pins.digitalReadPin(DigitalPin.P7)
basic.pause(50)
g = pins.digitalReadPin(DigitalPin.P8)
basic.pause(50)
h = pins.digitalReadPin(DigitalPin.P9)
basic.pause(50)
if (a == 0 && b == 0 && (c == 0 && d == 0)) {
i = 0
}
if (e == 0 && f == 0 && (g == 0 && h == 0)) {
j = 0
}
if (a == 1 && b == 1 && (c == 1 && d == 1)) {
i = 11
}
if (e == 1 && f == 1 && (g == 1 && h == 1)) {
j = 11
}
if (a == 0 && b == 0 && (c == 0 && d == 1)) {
i = 10
}
if (e == 0 && f == 0 && (g == 0 && h == 1)) {
j = 10
}
if (a == 1 && b == 1 && (c == 0 && d == 0)) {
i = 1
}
if (e == 1 && f == 1 && (g == 0 && h == 0)) {
j = 1
}
if (a == 1 && b == 0 && (c == 0 && d == 1)) {
i = 2
}
if (e == 1 && f == 0 && (g == 0 && h == 1)) {
j = 2
}
if (a == 0 && b == 1 && (c == 1 && d == 0)) {
i = 3
}
if (e == 0 && f == 1 && (g == 1 && h == 0)) {
j = 3
}
if (a == 0 && b == 1 && (c == 0 && d == 1)) {
i = 4
}
if (e == 0 && f == 1 && (g == 0 && h == 1)) {
j = 4
}
if (a == 0 && b == 0 && (c == 1 && d == 1)) {
i = 5
}
if (e == 0 && f == 0 && (g == 1 && h == 1)) {
j = 5
}
if (a == 1 && b == 1 && (c == 1 && d == 0)) {
i = 6
}
if (e == 1 && f == 1 && (g == 1 && h == 0)) {
j = 6
}
if (a == 1 && b == 1 && (c == 0 && d == 1)) {
i = 7
}
if (e == 1 && f == 1 && (g == 0 && h == 1)) {
j = 7
}
if (a == 1 && b == 0 && (c == 1 && d == 1)) {
i = 8
}
if (e == 1 && f == 0 && (g == 1 && h == 1)) {
j = 8
}
if (a == 0 && b == 1 && (c == 1 && d == 1)) {
i = 9
}
if (e == 0 && f == 1 && (g == 1 && h == 1)) {
j = 9
}
if (i < 10 && j < 10) {
if (i > j) {
pins.digitalWritePin(DigitalPin.P5, 0)
pins.digitalWritePin(DigitalPin.P10, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
} else if (i == j) {
pins.digitalWritePin(DigitalPin.P5, 0)
pins.digitalWritePin(DigitalPin.P10, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
} else {
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
}
} else if (i == 11 || j == 11) {
pins.digitalWritePin(DigitalPin.P5, 0)
pins.digitalWritePin(DigitalPin.P10, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
} else if (i == 10) {
if (j == 1) {
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
} else {
pins.digitalWritePin(DigitalPin.P5, 0)
pins.digitalWritePin(DigitalPin.P10, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
}
} else if (j == 10) {
if (i == 1) {
pins.digitalWritePin(DigitalPin.P5, 0)
pins.digitalWritePin(DigitalPin.P10, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
} else {
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
}
}
a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
g = 0
h = 0
i = 0
j = 0
pins.digitalWritePin(DigitalPin.P11, 1)
pins.digitalWritePin(DigitalPin.P5, 1)
pins.digitalWritePin(DigitalPin.P10, 1)
}
})