【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键2

知识点:什么是掌控板?
掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口,支持图形化及MicroPython代码编程,可实现智能机器人、创客智造作品等智能控制类应用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

掌控板硬件特性:
ESP-32主控
处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
主频:高达240MHz的时钟频率
SRAM:520KB
Flash:8MB
Wi-Fi标准:FCC/CE/TELEC/KCC
Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔
频率范围:2.4~2.5 GHz
蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
蓝牙音频:CVSD和SBC音频低功耗:10uA
供电方式:Micro USB供电
工作电压:3.3V
最大工作电流:200mA
最大负载电流:1000mA
掌控板载
三轴加速度计MSA300,测量范围:±2/4/8/16G
地磁传感器MMC5983MA,测量范围:±8 Gauss;精度0.4mGz,电子罗盘误差±0.5°
光线传感器
麦克风
3 颗全彩ws2812灯珠
1.3英寸OLED显示屏,支持16*16字符显示,分辨率128x64
无源蜂鸣器
支持2个物理按键(A/B)、6个触摸按键
支持1路鳄鱼夹接口,可方便接入各种阻性传感器
拓展接口
20通道数字I/O, (其中支持12路PWM,6路触摸输入)
5通道12bit模拟输入ADC,P0~P4
1路的外部输入鳄鱼夹接口:EXT/GND
支持I2C、UART、SPI通讯协议

在这里插入图片描述
在这里插入图片描述
1、按键开关
主要是指轻触式按键开关,也称之为轻触开关。按键开关是一种电子开关,属于电子元器件类,最早出现在日本[称之为:敏感型开关],使用时以满足操作力的条件向开关操作方向施压开关功能闭合接通,当撤销压力时开关即断开,其内部结构是靠金属弹片受力变化来实现通断的。按键开关由嵌件、基座、弹片、按钮、盖板组成,其中防水类轻触开关在弹片上加一层聚酰亚胺薄膜。

按键开关有接触电阻荷小、精确的操作力误差、规格多样化等方面的优势,在电子设备及白色家电等方面得到广泛的应用如:影音产品、数码产品、遥控器、通讯产品、家用电器、安防产品、玩具、电脑产品、健身器材、医疗器材、验钞笔、雷射笔按键等等。因为按键开关对环境的条件(施压力小于2倍的弹力/环境温湿度条件以及电气性能)大型设备及高负荷的按钮都使用导电橡胶或锅仔开关五金弹片直接来代替,比如医疗器材、电视机遥控器等。

关于五脚按键开关的脚位问题:两个引脚为一组,向开关体正确施压时四个引脚相导通,第五个引脚为接地作用。

按键开关是随着电子技术发展的要求而开发的第四代开关产品,最早的体积为12mm12mm,8mm8mm两种,现在为6mm6mm。产品结构有立式、卧式和卧式带地端三种,现在又有组合式(3M、4M、SM、6M、SM)和电位器按键开关组合两类,满足国内各种电子产品要求。安装尺寸有6.5mm4.5mm,5.5mm4mm和6mm4mm三种。国外已有4.5mm*4.5mm小型按键开关和片式按键开关,片式按键开关适合于表面组装。

现在已有第五代开关—薄膜开关,功能与按键开关相同,主要用于电子仪器和数控机床,但电阻大、手感差。为了克服手感差的现象,也有在薄膜开关内不是用银层做接触点,而是装上接触簧片。

按键开关分成两大类:利用金属簧片作为开关接触片的称按键开关,接触电阻小,手感好,有“滴答”清脆声。利用导电橡胶作为接触通路的开关习惯称为导电橡胶开关。开关手感好,但接触电阻大,一般在100一300n。按键开关的结构是靠按键向下移动,使接触簧片或导电橡胶块接触焊片,形成通路。

按键开关的操作力与簧片所处的状态有关。开始力与簧片的压缩的距离成正比当簧片压缩到5%一70%时操作力突然减少,并伴有“滴答”声。导龟橡胶开关一般有两种结构。操作力曲线随橡胶块的几何形状不同而有很大的差异。

相对湿度:<95%
额定电压:12V
额定电流:50mA
温度:-25~70℃

按键开关的主要用途有彩色电视机、黑白电视机、音响设备、录像机、摄像机、计算机、游戏机、传真机、对讲机、警棍、机床控制装置、复印、打印机、电子仪器、仪表和其它家用电器。

在这里插入图片描述

2、在掌控板上部边沿有按压式A、B两个按键

当按下按键时为低电平,否则高电平。在掌控板A,B按键按下的过程如下述,当按下时,电平从高变低,在高电平(1)变为低电平(0)的那一瞬间叫作下降沿。当按键松开时,电平从低变高,在低电平(0)变为高电平(1)的那一瞬间叫作上升沿。 我们可以通过获取电平变化来获取,当前按键状态。
P5、P11是掌控板的按键A、B的IO引脚,为避免冲突,限定拓展板的P5、P11引脚只能用于数字电平输入,且拓展板会对输入电平进行翻转。

在这里插入图片描述
8、双向开关灯

#MicroPython动手做(15)——掌控板之AB按键
#双向开关灯

#MicroPython动手做(15)——掌控板之AB按键
#双向开关灯

from mpython import *
import time

def on_button_a_down(_):
    global abc, variable
    time.sleep_ms(10)
    if button_a.value() == 1: return
    variable = variable ^ 1

def on_button_b_down(_):
    global abc, variable
    time.sleep_ms(10)
    if button_b.value() == 1: return
    variable = variable ^ 1

button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)


variable = 0
while True:
    if variable == 1:
        rgb.fill( (0, 0, 0) )
        rgb.write()
        time.sleep_ms(1)
        oled.fill(0)
        oled.DispChar("关灯", 50, 25, 1)
    else:
        rgb.fill((int(255), int(102), int(0)))
        rgb.write()
        time.sleep_ms(1)
        oled.fill(0)
        oled.DispChar("开灯", 50, 25, 1)
    oled.show()

mPython X 图形编程

在这里插入图片描述

注解:
在mPython X“数学”模组里找到异或运算符

在这里插入图片描述

在程序中我们A键和B键都可以控制灯的亮灭,即按下A键或B键灯亮,再按A键或B键灯灭,我们可以使用按位异或运算符“^”实现效果,按位异或运算是将两个运算分量的对应位按位遵照以下规则进行计算:

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

即相应位的值相同的,结果为 0,不相同的结果为 1。

例如:

a = 60 (60 = 0011 1100)

b = 13 ( 13 = 0000 1101)

c = a ^ b( 49 = 0011 0001)

每当按键A或者按键B被按下,将变量“variable”的值^1然后在赋值给变量“variable”

十进制的1和0在二进制也是1和0

初始化deng变量为0,按键按下执行异或运算deng^1=1;

此时deng变量为1,按键按下执行异或运算deng^1=0;

依此类推即可实现按键控制deng变量的数值。

a=60,b=13

在这里插入图片描述
贴士

按位运算符是以二进制数进行计算的,可以通过十进制转换位二进制运算,十进制与二进制的区别在于:

基数不同,前者满10进1,后者满2进1

有效字符不同,前者有效字符有10个:0,1,2,3,4,5,5,6,7,8,9;后者有效字符有2个:0,1

在这里插入图片描述
9、模拟“图灵测试”
图灵1950年的时候发表一篇论文,《计算机器与智能》,提出了一个设想。测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次测试后,如果有超过30%的测试者不能确定出被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。

#MicroPython动手做(15)——掌控板之AB按键
#模拟“图灵测试”

from mpython import * #从mpython中调用所有的库文件
oled.DispChar('图灵测试', 40, 25) #在x=40,y=25的位置显示“图灵测试”
oled.show() #打开显示
while True: #循环执行
    if button_a.value() == 0 or button_b.value() == 0: #如果按钮a或者按钮b被按下
        oled.fill(0) #屏幕熄灭
        oled.DispChar('你会下国际象棋吗?', 0, 0)
        oled.DispChar('A.是的', 0, 16)
        oled.DispChar('B.是的', 0, 32)
        oled.show()
        break#跳出次循环

while True:
    if button_a.value() == 0 or button_b.value() == 0:
        oled.fill(0)
        oled.DispChar('你会下象棋吗?', 0, 0)
        oled.DispChar('A.是的', 0, 16)
        oled.DispChar('B.我不是说过了吗?', 0, 32)
        oled.show()
        break

while True:
    if button_a.value() == 0 or button_b.value() == 0:
        oled.fill(0)
        oled.DispChar('你会下象棋吗?', 0, 0)
        oled.DispChar('A.是的', 0, 16)
        oled.DispChar('B.你烦不烦,干嘛老提', 0, 32)
        oled.DispChar('同样的问题。', 0, 48)
        oled.show()
        break

while True:
    if button_a.value() == 0 or button_b.value() == 0:
        oled.fill(0)
        oled.DispChar('A-A-A,A-B-A', 0, 0)
        oled.DispChar('A-A-B,A-B-B', 0, 16)
        oled.DispChar('你认为哪个是人的回答?', 0, 32)
        oled.DispChar('哪一个是机器人的回答?', 0, 48)
        oled.show()
        break

艾伦·麦席森·图灵(Alan Mathison Turing):英国数学家、逻辑学家,被称为计算机科学之父,人工智能之父。图灵对于人工智能的发展有诸多贡献,提出了一种用于判定机器是否具有智能的试验方法,即图灵试验,至今,每年都有试验的比赛。此外,图灵提出的著名的图灵机模型为现代计算机的逻辑工作方式奠定了基础。

图灵1950年的时候发表一篇论文,《计算机器与智能》,提出了一个设想。测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次测试后,如果有超过30%的测试者不能确定出被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。

在这里插入图片描述

在这里插入图片描述

10、AB键与玫瑰曲线
玫瑰曲线,按A加1,按B开始

玫瑰曲线,基本的意思是:平面内,围绕某一中心点平均分布整数个正弦花瓣的曲线。数学公式是:ρ=a*sin(nθ),a为定长,n为整数(不一定是花瓣数)。

由于这个图形不是由直线组成,所以,掌控板上的所有绘图函数均无法使用,只能使用其中的像素点显示功能。命令如下:

display.pixel(50,0,1)

这个命令中:display.pixel(x, y [,c ]) x , y 为点坐标(x,y)。当如果未给出c,则获取指定像素的颜色值。 如果给出c,则将指定的像素设置为给定的颜色,由于掌控板用的是黑白屏幕,所以用1代表点亮就可以了。

#MicroPython动手做(15)——掌控板之AB按键
#玫瑰曲线,按A加1,按B开始,


from mpython import *
import math,time#引入库文件

def DrawRoseCurve(a,n):#定义函数,函数名称可以自己命名
    for t in range(0,360):#循环次数,由于是画一圈,所以是360;可以自行设定
        x = math.floor(math.cos(t)*a*math.sin(n*t))#计算x坐标的值,注意:这里需要取整
        y = math.floor(math.sin(t)*a*math.sin(n*t))#计算y坐标的值,并且取整
        display.pixel(x+64,y+32,1) #显示坐标像素点,为什么要+64、+32,哪是因为要把中心坐标(64,32)作为起点
        display.show() #执行

# 按键引脚初始化
  
display.fill(0)#清屏
display.show()#清屏执行
  
BTNA = Pin(0, mode=Pin.OPEN_DRAIN,pull=Pin.PULL_UP,value=1)
BTNB = Pin(2, mode=Pin.OPEN_DRAIN,pull=Pin.PULL_UP,value=1)
  
display.DispChar('玫瑰曲线', 38, 0)
display.DispChar('输入花瓣数量,按A加', 0, 17)
display.DispChar('按B开始', 0, 34)
display.show() #执行
  
n1 = 0
jishu = True
Start = False
while True:
    if jishu:
        if BTNA.value() == 0 and  BTNB.value() == 1 :
            display.fill(0)#清屏
            display.show()#清屏执行
            n1 = n1+1
            display.DispChar('数量:%d' % n1, 0, 0)
            display.show()#执行
            time.sleep_ms(400)
        if BTNA.value() == 1 and  BTNB.value() == 0 :
            jishu = False
            Start = True
        if Start:
            if n1%2 == 0:
                n1=n1/2
                display.fill(0)#清屏
                display.show()#清屏执行
                DrawRoseCurve(30,n1)#调用函数
Break

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/131999257