应答机面板—模拟飞行游戏外设制作①

其实电路板设计工作在考试周之前就已经完成了,当时一个Demo出来后,不少朋友就和我预定,但我个人一方面也是刚刚开始接触关于硬件“硬核的”开发工作,因而这个Demo也就当作自己做着玩玩看的东西了。

总体而言,PCB设计并不是很难,为了快速实现,使用了ATmega328P作为主控,说的直白一点就是:Arduino Nano。既然使用Arduino,那么硬件部分很多就可以采取模块化,右侧部分就是可以直接插入一个Arduino Nano开发板的。
Ver021S

刚拿到制版成品,我对制板结果总体还是很满意的,这里就不放细节的高清照片了,1.8的玻纤板,丝印都很清晰,但据朋友说这个绿油还是太薄了。其实我是后悔用1.8的,散热太快了,焊台温度也不敢调太高,SOP封装的芯片用风枪吹下来调试的时候也比较费事儿。买的最便宜的EC11规格的编码器,手感非常差劲,而双调编码器又太贵了。
Ver021R

使用了14个GPIO口,4个编码器各3个,两个用于数码管的数据口。

上下位机的通信架构还是很简单的,用串口通信即可,上位机下传应答机编码值,下位机接受显示;下位机上传应答机编码变化,上位机接受并调用SimConnect进行控制,总体而言代码实现起来没有什么难度。象征性的放一段编码器的代码,留作归档,这段相对其他来说理解起来还是有点区别的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int getEncoderTurnScanMode(int CLK, int DIO, int &oldA, int &oldB)
{
int result = 0;
int newA = digitalRead(CLK);
int newB = digitalRead(DIO);
if (newA != oldA || newB != oldB)
{
delay(50);
if (oldA == HIGH && newA == LOW)
{
result = (oldB * 2 - 1);
}
}
oldA = newA;
oldB = newB;
return result;
}

如果要做最终产品,可以自己定义一套字节码通信协议,或者,强烈建议不要使用ATmega328P作为主控。原因倒不在于他是不是Arduino,而是他真的满足不了仿真。在我写的第一版代码中,配合着这块0.21版的电路板,由于382P的硬件中断口实在是太少了,所以,只能在代码中做一个类似于扫描按键的逻辑,而如果使用足够的硬件中断,例如Mega2560(有6路中断),相对而言表现会好很多,可以解决一部分虚位的问题,其次EC11编码器据几个朋友说不如带有阻尼的EC16,我买的几块钱一个的EC11拿WD40洗了之后,依旧不好使,还是建议用高品质的。