Micro:bit系列教程13:Rotation Sensor

来自丢石头百科


本章将介绍Micro:bit连接Rotation Sensor模块的使用,可用于计算顺时针和逆时针旋转的角度和旋转圈数。


1.基本介绍

   Rotation Sensor是一款增量编码器,是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位器,这种转动是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数,主要用于工业中的定位问题。


2.硬件连接

       在硬件上,采用Micro:bit的P0,P1,P2分别与Rotation Sensor的SIA,SIB,SW连接,具体连接示意图如下图所示:


<tbody> </tbody>

<a name="_Hlk527392968">Micro:bit


Rotation Sensor


VCC


VCC


GND


GND


SIA


P0


SIB


P1


SW


P2



具体硬件连接如下表所示:


182004c5ngz8742vngx898.jpg


<v:shapetype coordsize="21600,21600" filled="f" id="_x0000_t75" o:preferrelative="t" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" stroked="f"> <v:stroke joinstyle="miter"> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"> <v:f eqn="sum @0 1 0"> <v:f eqn="sum 0 0 @1"> <v:f eqn="prod @2 1 2"> <v:f eqn="prod @3 21600 pixelWidth"> <v:f eqn="prod @3 21600 pixelHeight"> <v:f eqn="sum @0 0 1"> <v:f eqn="prod @6 1 2"> <v:f eqn="prod @7 21600 pixelWidth"> <v:f eqn="sum @8 21600 0"> <v:f eqn="prod @7 21600 pixelHeight"> <v:f eqn="sum @10 21600 0"> </v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:formulas> <v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f"> <o:lock aspectratio="t" v:ext="edit"> </o:lock></v:path></v:stroke></v:shapetype><v:shape id="图片_x0020_2" o:spid="_x0000_i1028" style="width:312pt;height:222pt;visibility:visible;mso-wrap-style:square" type="#_x0000_t75"> <v:imagedata cropleft="5615f" cropright="8116f" o:title="" src="file:///C:\Users\LINXINWU\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"> </v:imagedata></v:shape>


3.计数原理

       将Rotation Sensor的SIA,SIB,SW分别连接到逻辑分析仪的CH0,CH1,CH2,分别顺时针,逆时针,按下旋转编码器,同时采集波形,得到的波形如下图所示:


182005r8ood42ceo7zdkns.png


<v:shape id="图片_x0020_1" o:spid="_x0000_i1027" style="width:414.75pt;

height:1in;visibility:visible;mso-wrap-style:square" type="#_x0000_t75">

<v:imagedata o:title="" src="file:///C:\Users\LINXINWU\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png"> </v:imagedata></v:shape>


由逻辑分析仪得出的波形可知,当顺时针旋转编码器时,SIB将先产生下降沿,约过了30ms之后(取决于旋转的速度),SIA将产生下降沿;当逆时针旋转编码器时,SIA将先产生下降沿,约过了30ms之后(取决于旋转的速度),SIB将产生下降沿,对SIA,SIAB共同产生的下降沿个数进行统计,即可得知此次旋转的角度,当按下按键时,SW将产生下降沿,此按键可用于清零旋转的角度。


4.软件设计

    打开makecode,采用图形块编写以下程序(不用添加软件包):


182006whhfskevrfr2hvzu.png


<v:shape id="图片_x0020_4" o:spid="_x0000_i1026" style="width:394.5pt;height:697.5pt;

visibility:visible;mso-wrap-style:square" type="#_x0000_t75">

<v:imagedata o:title="" src="file:///C:\Users\LINXINWU\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png"> </v:imagedata></v:shape>


该程序的JavaScript代码如下所示,可直接复制至makecode使用:


===   cpp代码: ===

let time = 0
let item = 0
let count = 0
pins.onPulsed(DigitalPin.P1, PulseValue.Low, () => {
    if (input.runningTime() - time > 50) {
        time = input.runningTime()
        count = count + 1
    }
    time = input.runningTime()
    serial.writeValue("press", 0)
})
pins.onPulsed(DigitalPin.P0, PulseValue.Low, () => {
    if (input.runningTime() - time > 50) {
        time = input.runningTime()
        count = count - 1
    }
    time = input.runningTime()
    serial.writeValue("press", 0)
})
pins.onPulsed(DigitalPin.P2, PulseValue.Low, () => {
    count = 0
    serial.writeValue("press", 1)
})
count = 0
item = 0
time = input.runningTime()
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)
pins.setPull(DigitalPin.P2, PinPullMode.PullUp)
serial.redirectToUSB()
basic.forever(() => {
    while (item != count) {
        item = count
        serial.writeValue("item", item)
    }
    basic.pause(500)
})


下载,等下载成功后,点击显示数据(设备),依次顺时针旋转Rotation Sensor,逆时针旋转Rotation Sensor,按下Rotation Sensor,可得如下波形的数据:


182007z2bhvfhbmmy2hgqb.png


<v:shape id="图片_x0020_6" o:spid="_x0000_i1025" style="width:415.5pt;height:205.5pt;

visibility:visible;mso-wrap-style:square" type="#_x0000_t75">

<v:imagedata o:title="" src="file:///C:\Users\LINXINWU\AppData\Local\Temp\msohtmlclip1\01\clip_image004.png"> </v:imagedata></v:shape>


由makecode控制台显示的数据可知,当旋钮顺时针旋转时,每转一个刻度,item变量将加1,当旋钮逆时针旋转时,每转一个刻度,item变量将减1,当按下旋钮时,item数据将归零,符合预期。