摇杆扩展板 摇杆是游戏机最主要的操纵外设。从街机到家里的红白机,用的都是摇杆。只是形状千变万化而已。有的有个手柄,真的像个摇杆,有的就是几个按钮。其实,这几个按钮,也是摇杆,内部结构与电路基本一致。英语叫JoyStick。摇杆也是一个传感器。 淘宝上买了一块Funduino JoyStick shield V1.0A。Shield,有的翻译为盾板,现在一般叫扩展板。这块盾板引出了全部数字口D0~D13、全部模拟口A0~A5,以及I2C芯片间通信总线、蓝牙插座、2.4G(远程无线收发)。板上安装了一个带按钮的摇杆,6个独立按钮。没有资料,我们对它很感兴趣,就做了一些测试。测试工具就是万用表和ArduinoScratch软件。 一、测试外特性 先用万用表的通断档测量摇杆与I/O口的连接,发现标X的端口连在模拟口A0上,标Y的端口连在A1上,摇杆内置按钮连在数字口D8上。6个按钮A、B、C、D、E、F分别连在D2~D7上。本文主要说摇杆,因此,对6个独立按钮就忽略了。 知道了摇杆与按钮分别连接的是哪些口,就可以编写Scratch程序来进行测试了。程序如下。用的软件是ArduinoScratch(早期叫AS-Block)。你的Arduino板第一次连ArduinoScratch时,要先下载固件到你的Arduino板(选菜单项"连接|上传固件")。我们创建的9个变量全打上勾,让它们的值在舞台上动态显示出来。 测试程序 当摇杆向左扳时,变量X(接受模拟口A0的输入值)的值为0;向右扳时,X的值为1023。将摇杆向前扳,变量Y(接受模拟口A1的输入值)为0;向后扳,Y的值为1023。你也可以斜向推。向右前45度方向扳,变量X与Y同时为1023,向左后方向扳,X与Y都为0;向右后扳,X为1023,Y为0;向左前扳,X为0,Y为1023。 摇杆不被扳动时,也就是X、Y都处于原始位置,X和Y的值都是500左右的浮动值。 当摇杆内置的按钮K按下时,D8为false,释放,D8为true。 因此,摇杆其实是一个三态传感器。X方向有三个值:X-=0,X0=~500,X+=1023。Y也一样。在Scratch游戏脚本里要使用摇杆,只要为X和Y各设定两个阈值就行了。譬如,设下阈值为200,上阈值为800。当A0输入小于200时,我们认为摇杆被向左扳了;大于800时,则认为向右扳了。而在200~800之间时,认为摇杆没有左右扳动。Y方向也是一样。 二、测试分析内部电路 知道了外特性,一般使用问题不大了。我还不满足,想知道它的内部到底是怎么一个电路?手头只有万用表,再加上数学,应该能分析出来吧。 先用万用表测量摇杆几个点之间的电阻值。这时,当然不能接上电源!我测得,Vcc与Gnd之间的阻值是4.8K左右。摇杆原始位置时,X端对Vcc、对Gnd的阻值都是3.8K左右,Y端也是这样。摇杆向右扳时,X对Vcc的阻值为0,对Gnd为4.8K左右。向左扳时,X对Vcc的阻值为4.8K左右,对Gnd为0。 分析如上所述的外特性,这个电路不会很复杂。如果让我来设计,摇杆的内部电路应该是一个由4个电阻器、2个一刀双抛开关组成的。如下图所示。 摇杆内部电路 其中的4个电阻R1~R4的阻值是相等的。 先看左边部分。因为R1与R2阻值相等,各自分得Vcc的一半电压,5V。不扳动摇杆时,接A0的输出端的电平是2.5V左右。说穿了吧,就是由于上面用ArduinoScratch测得"摇杆不被扳动时,也就是X、Y都处于原始位置,X和Y的值都是500左右的浮动值。",因而我推断出,只能是这个电路结构,而且R1=R2。当摇杆向右扳时,内部的开关Kx与X+接触,电阻R1被短接,Vcc直连至A0口,这时,输出到A0口的电平就是Vcc——5V。所以ArduinoScratch读出的数值是1023。而向左扳时,Kx与X-端接触,接A0的输出端被拉到Gnd,A0口输入的电平为0V,读数也是0。右边电路是Y方向的,工作原理一模一样。 现在来看,我的猜想与实测(包括万用表测量电阻以及ArduinoScratch试验)是相符的。原始状态时,Vcc与Gnd之间的电阻值是4.8K,说明四个电阻都是4.8K。左边两个4.8K串联,是9.6K,右边也是9.6K,两个9.6K并联,又变成4.8K。与实测相符。 摇杆内置按钮就是一个按钮,内部没有电阻。 这个是Arduino Uno的盾板,不能插在Arduino Nano板上。