物联网AI MicroPython 之 ETT-B1开发板详细开发指南

万物简单物联网教育团队推出了一款名为ETT-B1的开发板,该板以ESP32为核心,采用MicroPython作为开发语言,简化了物联网学习的复杂性。开发板集成多种传感器如六轴陀螺仪、温湿度传感器,并提供一键下载系统程序功能,便于开发者和学习者进行硬件编程和实验。
摘要由CSDN通过智能技术生成

学物联网,来万物简单IoT物联网!!在这里插入图片描述

1 内容概述

当遇到物联网、嵌入式、硬件等技术的时候,大家在脑海中就会构画出一些列复杂的技术框架内容,各种复杂的编译环境、下载环境搭建,市场上五花八门硬件设备、硬件开发板,而且学习的知识全网遍地都是,质量参差不齐,知识点非常散,让开发者无从下手,望而却步,然后就放弃了。
万物简单物联网教育团队长期致力于智能硬件的设计和研发,也一直关注物联网教育的这些问题,为了更好的解决它,团队搭建了一套一站式专业的物联网教学平台,便利于开发者和创客们学习和创作,团队成员均有15年以上的智能硬件设计和开发的经验,对物联网有独特的见解。
万物简单物联网教育开发板ETT-B1,选择当前市面热度高出货量大的ESP32作为核心板,即为大众所认知,也可消除客户后续大批量生产需要保证货源的后顾之忧;开发语言选择了MicroPython,是Python3语言的精简实现,可以非常灵活的运行在资源受限的MCU之上。选择MicroPython作为开发语言有一下几个原因:

  • 当前Python有“全民学习的编程语言”之说
  • 当前绝大部分的AI人工智能产品几乎Python开发
  • 最最最关键!!! 代码脚本写完,直接推送脚本在开发板上运行,而无须搭建学习复杂的嵌入式编译下载环境

2 开发板介绍

image.png
万物简单物联网教育开发板ETT-B1选用了ESP32为核心板,同时支持3.7V的锂电池供电,Micro USB支持代码的下载和锂电池的充电能力,内置丰富的硬件资源:按键、led指示灯、无源蜂鸣器、OLED显示、MPU6050六轴陀螺仪、AHT10温湿度以及13个可扩展编程的IO接口等。
电气特性:

2.1 按键

按键名称编程引脚号描述其他
IO00可编程按键,开发者可以直接使用ESP32启动的时候由IO0和IO2选择系统启动的模式
EN-复位按键,不可编程,按下系统会复位重启-

image.png
下载启动模式要确保IO0和IO2都为电平,IO0高电平为SPI启动模式。

EN是ESP32内部3.3V稳压器的启用引脚,它被拉高。当接地时就会禁用3.3V的稳压器,所以当EN引脚出现低高上升沿电平就会重新启动系统。

ETT-B1开发板支持自动下载系统程序的能力。

2.2 LED指示灯

指示灯名称编程引脚号描述其他
绿灯14高电平点亮,低电平熄灭
蓝灯13高电平点亮,低电平熄灭

开发板支持2个可编程led指示灯绿灯和蓝灯。

2.3 无源蜂鸣器

编程引脚号描述其他
27低电平蜂鸣器导通,PWM控制无源蜂鸣器需要PWM驱动

无源的蜂鸣器需要PWM控制,所以通过控制PWM的占空比,就可以发出不同的声音,这是无源蜂鸣器和有源的区别所在,有源只需要高低电平即可触发蜂鸣器的响声,但是发声频率只有一种。

2.4 OLED显示

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x3c
SCL26I2C的时钟信号线

使用I2C与OLED通信,显示驱动芯片为SSD1306,通信地址是0x68

2.5 六轴陀螺仪

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x68
SCL26I2C的时钟信号线

使用I2C与MPU6050六轴陀螺仪通信,通信地址是0x68

2.6 AHT10温湿度

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x38
SCL26I2C的时钟信号线

使用I2C与AHT20温湿度传感器通信,通信地址是0x38

2.7 13个可扩展编程IO

image.png

序号引脚名称编程引脚号描述其他
15V-提供5V电源
2IO3333ADC1-CH5\PWM输入输出
3IO3232ADC1-CH4\PWM输入输出
4IO3434ADC1-CH6仅作输入引脚
5IO22ADC2-CH2\PWM输入输出
6IO44ADC2-CH0\PWM输入输出
7GND-供地连接
8IO1616UART2_RXD\PWM输入输出
9IO1717UART2_TXD\PWM输入输出
10IO1818SPI3_CLK\PWM输入输出
11IO1919SPI3_MISO\PWM输入输出
12IO2121I2C_SDA\PWM输入输出
13IO2222I2C_SCL\PWM输入输出
14IO2323SPI3_MOSI\PWM输入输出
15GND-供地连接
163V3-提供3V3电源

可扩展编程IO除34引脚外,其他都可以用作GPIO输入输出以及PWM控制输出;
ESP32默认的I2C引脚为21/22,其他输入输出引脚也可以用作SCL或SDA,但是不推荐随意使用。

3 示例代码

3.1 按键

IO0按键编程示例代码

from machine import Pin 
import utime

#按键初始化函数
def keyInit():
    keyObj=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
    keyObj.irq(keyCB,Pin.IRQ_FALLING) #定义中断,下降沿触发

#按键中断回调函数
def keyCB(obj):
    utime.sleep_ms(10) #消除抖动
    if obj.value()==0: #确认按键被按下
        print("key press down")

if __name__ == '__main__':
    keyInit()
    while True:
        utime.sleep(1)

运行结果:

#当IO0按键时,出现一次key press down
key press down
key press down
key press down

3.2 LED指示灯

led引脚说明

指示灯名称编程引脚号描述其他
绿灯14高电平点亮,低电平熄灭
蓝灯13高电平点亮,低电平熄灭

led指示灯编程示例代码

from machine import Pin
import utime

ledblueObj = None
ledgreenObj = None
#led指示灯初始化函数
def ledInit():
    global ledblueObj,ledgreenObj
    ledblueObj=Pin(13,Pin.OUT) #构建led对象,GPIO13,输出
    ledgreenObj=Pin(14,Pin.OUT) #构建led对象,GPIO14,输出
    ledblueObj.value(1) #蓝灯点亮
    ledgreenObj.value(1) #绿灯点亮
    utime.sleep_ms(300)
    ledblueObj.value(0) #蓝灯熄灭
    ledgreenObj.value(0) #绿灯熄灭

if __name__ == '__main__':
    ledInit()
    while True:
        ledblueObj.value(1)
        utime.sleep(0.5)
        ledblueObj.value(0)
        ledgreenObj.value(1)
        utime.sleep(0.5)
        ledgreenObj.value(0)

运行结果:

led指示灯蓝绿交替闪烁

3.3 无源蜂鸣器

编程引脚号描述其他
27蜂鸣器低电平导通,PWM控制无源蜂鸣器需要PWM驱动

无源蜂鸣器是靠PWM脉冲波形驱动发声。
无源蜂鸣器编程示例代码

from machine import Pin,PWM
import utime

pwmObj = None
#pwm初始化函数
def pwmInit():
    global pwmObj
    pwmObj=PWM(Pin(27),Pin(27).OUT) #构建led对象,GPIO27,输出
    print(pwmObj)
    #设置PWM频率
    pwmObj.freq(100)  #range 1Hz-40MHz
    print(pwmObj)
    utime.sleep(0.2)
    #设置PWM占空比
    pwmObj.duty(100) #range 0-1023 (default 512, 50%)
    utime.sleep(0.2)
    print(pwmObj)

if __name__ == '__main__':
    pwmInit()
    pwmObj.deinit() #关闭pwm,再使用pwm,必须重新初始化
    while True:
        utime.sleep(0.5)

运行结果:

PWM(27, freq=3, duty=512)
PWM(27, freq=100, duty=512)
PWM(27, freq=100, duty=100)

3.4 OLED显示

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x3c
SCL26I2C的时钟信号线

OLED编程示例代码

from machine import Pin,SoftI2C
import utime
from ssd1306 import SSD1306_I2C

i2cObj = None
oledObj = None
#OLED初始化函数
def OLEDInit():
    global i2cObj,oledObj
    i2cObj = SoftI2C(sda=Pin(25), scl=Pin(26)) # 创建i2c对象
    oledObj = SSD1306_I2C(128, 64, i2cObj, i2cAddr=0x3c) # 创建ssd1306对象
    oledObj.fill(0)   #清屏背景黑色
    oledObj.text(str('----------------------'),3,5)
    oledObj.text('welcome ETT-B1', 3, 22)
    oledObj.text('ettPython', 30, 38)
    oledObj.text(str('----------------------'),3,55)
    oledObj.show() # 屏幕显示

if __name__ == '__main__':
    OLEDInit()
    while True:
        utime.sleep(0.5)

运行结果:

#oled 屏上显示
----------------------
 welcome ETT-B1
   ettPython
----------------------

3.5 六轴陀螺仪

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x68
SCL26I2C的时钟信号线

六轴陀螺仪编程示例代码

from machine import Pin,SoftI2C
import utime
from mpu6050 import MPU6050

i2cObj = None
mpu6050Obj = None
#mpu6050初始化函数
def mpu6050Init():
    global i2cObj,mpu6050Obj
    i2cObj = SoftI2C(sda=Pin(25), scl=Pin(26)) # 创建i2c对象
    mpu6050Obj = MPU6050(i2cObj, i2cAddr=0x68) # 创建mpu6050对象

def getData():
    temp = mpu6050Obj.getTemperature() #获取mpu6050芯片温度
    acc = mpu6050Obj.getAcceleration() #获取mpu6050加速度值
    gy = mpu6050Obj.getGyroscope() #获取mpu6050陀螺仪值
    return temp,acc,gy

if __name__ == '__main__':
    mpu6050Init()
    while True:
        utime.sleep(1)
        print(getData())

运行结果:

22.88 (1138, 132, 15470) (-36, -43, -35)
22.88 (1164, 140, 15466) (-37, -44, -35)
22.88 (1152, 132, 15496) (-37, -42, -38)
22.9 (1190, 146, 15514) (-38, -43, -37)
22.89 (1176, 96, 15408) (-37, -44, -37)
22.9 (1230, 86, 15484) (-38, -44, -35)
22.89 (1164, 126, 15520) (-37, -44, -35)
22.91 (1222, 212, 15496) (-37, -42, -37)
22.91 (1188, 194, 15448) (-37, -43, -38)

3.6 AHT10温湿度

引脚名称编程引脚号描述其他
SDA25I2C的数据信号线通信地址 0x38
SCL26I2C的时钟信号线

AHT10温湿度传感器编程示例代码

from machine import Pin,SoftI2C
import utime
from aht10 import AHT10

i2cObj = None
aht10Obj = None
#AHT10初始化函数
def aht10Init():
    global i2cObj,aht10Obj
    i2cObj = SoftI2C(sda=Pin(25), scl=Pin(26)) # 创建i2c对象
    aht10Obj = AHT10(i2cObj, i2cAddr=0x38) # 创建AHT10对象

def getData():
    temp = aht10Obj.temperature()
    humidity = aht10Obj.humidity()
    return temp,humidity

if __name__ == '__main__':
    aht10Init()
    while True:
        utime.sleep(1)
        print(getData())

运行结果:

(21.66348, 62.28437)
(21.66615, 62.2571)
(21.63677, 62.27026)
(21.63696, 62.19616)
(21.60816, 62.10594)
(21.62685, 62.11996)
(21.60797, 62.15734)

3.7 Wi-Fi连接

import time,network
def WIFI_Connect(ssid,pwd):
    wlan = network.WLAN(network.STA_IF) #STA模式
    wlan.active(True)                   #激活接口
    start_time=time.time()              #记录时间做超时判断
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(ssid, pwd) #输入WIFI账号密码

        while not wlan.isconnected():
            #超时判断,15秒没连接成功判定为超时
            if time.time()-start_time > 15 :
                print('WIFI Connected Timeout!')
                break
    if wlan.isconnected():
        global oled
        #串口打印信息
        print('network information:', wlan.ifconfig())
        return True

    else:
        return False

def connent_server(ssid,pwd):
    global client
    if WIFI_Connect(ssid,pwd):
        print('Wifi connect success!')
connent_server('路由器SSID','路由器密码')

3.8 BLE GATT连接

from ible import GATT_BLE
import time

bt = None
bleStatus = 0
def connected_event():
    global bleStatus
    print('ble conn')
    bleStatus = 1

def disconnected_event():
    bleStatus = 0
    print('ble dis event ')
    bt.ettAdvertiser()

def ble_event_cb(event, data):
    send_data = []
    if event == 1:
        '''Central disconnected'''
        connected_event()
    elif event == 2:
        '''Central disconnected'''
        disconnected_event()
    elif event == 3:
        '''New message received'''
        print('data recv ')
        buffer = bt.ettBleRecv()
        if buffer[0] == 0xaa and buffer[1] == 0x55 :
            print("data is ok")
            if buffer[2] == 0x00:
                print('start auth')
                send_data = [0xaa,0x55,0x00,0x00,0x00]
                bt.ettBleSend(bytes(send_data))
            elif buffer[2] == 0x01:
                print('auth resp')
                send_data = [0xaa,0x55,0x01,0x00,0x00]
                bt.ettBleSend(bytes(send_data))
            elif buffer[2] == 0x10:
                print('data proc')
                if buffer[3] == 0x00:
                    print('LED off')
                    ledblueObj.value(0)
                    send_data = [0xaa,0x55,0x10,0x00,0x00]
                    bt.ettBleSend(bytes(send_data))
                elif buffer[3] == 0x01:
                    print('LED on')
                    ledblueObj.value(1)
                    send_data = [0xaa,0x55,0x10,0x01,0x00]
                    bt.ettBleSend(bytes(send_data))
        else:
            print("data is error")
def ble_init():
    global bt
    print('init ble')
    bt = GATT_BLE("ETT-Python",ble_event_cb)
    print('init ble finish')
if __name__ == '__main__':
    ble_init()
    while True:
        time.sleep(1)

3.9 mqtt连接

import time,network,ujson
from ssd1306 import SSD1306_I2C
from machine import Pin,SoftI2C,Timer
from umqtt import simple

i2cObj = None
oledObj = None
clientObj = None
#OLED初始化函数
def OLEDInit():
    global i2cObj,oledObj
    i2cObj = SoftI2C(sda=Pin(25), scl=Pin(26)) # 创建i2c对象
    oledObj = SSD1306_I2C(128, 64, i2cObj, i2cAddr=0x3c) # 创建ssd1306对象
    oledObj.fill(0)   #清屏背景黑色
    oledObj.text(str('----------------------'),3,5)
    oledObj.text('welcome ETT-B1', 3, 22)
    oledObj.text('ettPython', 30, 38)
    oledObj.text(str('----------------------'),3,55)
    oledObj.show() # 屏幕显示

def WifiConnect(ssid,pwd):
    wlan = network.WLAN(network.STA_IF) #STA模式
    wlan.active(True)                   #激活接口
    start_time=time.time()              #记录时间做超时判断
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(ssid, pwd) #输入WIFI账号密码
        while not wlan.isconnected():
            #超时判断,15秒没连接成功判定为超时
            if time.time()-start_time > 15 :
                print('WIFI Connected Timeout!')
                break
    if wlan.isconnected():
        #串口打印信息
        print('network information:', wlan.ifconfig())
        #OLED数据显示(如果没接OLED,请将下面代码屏蔽)
        oledObj.fill(0)   #清屏背景黑色
        oledObj.text('IP/Subnet/GW:',0,0)
        oledObj.text(wlan.ifconfig()[0], 0, 20)
        oledObj.text(wlan.ifconfig()[1],0,38)
        oledObj.text(wlan.ifconfig()[2],0,56)
        oledObj.show()
        return True
    else:
        return False

def MQTTCallback(topic,msg):
    parse = ujson.loads(msg)
    print(parse["onoff"])
    if parse["onoff"] == 1:
        print('LED ON')
    elif parse["onoff"] == 0:
        print('LED OFF')

def MQTTRev(tim):
    clientObj.check_msg()

def connentServer(ssid,pwd):
    global clientObj
    if WifiConnect(ssid,pwd):
        SERVER = 'MQTT服务器地址'
        PORT = MQTT端口
        CLIENT_ID = '' # 客户端ID
        TOPIC = '' # TOPIC名称
        USER = '' # 用户名
        PASSWORD = '=' # 密码
        clientObj = simple.MQTTClient(CLIENT_ID, SERVER, PORT,USER,PASSWORD) #建立客户端对象
        clientObj.set_callback(MQTTCallback)  #配置回调函数
        clientObj.connect()
        clientObj.subscribe(TOPIC) #订阅主题
        
        tim = Timer(-1)
        tim.init(period=300, mode=Timer.PERIODIC,callback=MQTTRev)
if __name__ == '__main__':
    OLEDInit()
    connentServer('路由器SSID','路由器密码')
    while True:
        time.sleep(1)

开发板验证代码

ETT-B1开发板整体验证代码

import utime
import urandom
from machine import Pin,SoftI2C,PWM
from ssd1306 import SSD1306_I2C
from mpu6050 import MPU6050
from aht10 import AHT10


ledblueObj = None
ledgreenObj = None
pwmObj = None
i2cObj = None
oledObj = None
mpu6050Obj = None
aht10Obj = None

#按键初始化函数
def keyInit():
    keyObj=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
    keyObj.irq(keyCB,Pin.IRQ_FALLING) #定义中断,下降沿触发

#按键中断回调函数
def keyCB(obj):
    utime.sleep_ms(10) #消除抖动
    if obj.value()==0: #确认按键被按下
        print("key press down")

#led指示灯初始化函数
def ledInit():
    global ledblueObj,ledgreenObj
    ledblueObj=Pin(13,Pin.OUT) #构建led对象,GPIO13,输出
    ledgreenObj=Pin(14,Pin.OUT) #构建led对象,GPIO14,输出
    ledblueObj.value(0) #蓝灯熄灭
    ledgreenObj.value(0) #绿灯熄灭

#pwm初始化函数
def pwmInit():
    global pwmObj
    pwmObj=PWM(Pin(27),Pin(27).OUT) #构建led对象,GPIO27,输出
    #设置PWM占空比
    pwmObj.duty(0) #range 0-1023 (default 512, 50%)
    utime.sleep(0.2)

#OLED初始化函数
def OLEDInit():
    global i2cObj,oledObj
    i2cObj = SoftI2C(sda=Pin(25), scl=Pin(26)) # 创建i2c对象
    oledObj = SSD1306_I2C(128, 64, i2cObj, i2cAddr=0x3c) # 创建ssd1306对象
    oledObj.fill(0)   #清屏背景黑色
    oledObj.text(str('----------------------'),3,5)
    oledObj.text('welcome ETT-B1', 3, 22)
    oledObj.text('ettPython', 30, 38)
    oledObj.text(str('----------------------'),3,55)
    oledObj.show() # 屏幕显示

#mpu6050初始化函数
def mpu6050Init():
    global i2cObj,mpu6050Obj
    mpu6050Obj = MPU6050(i2cObj, i2cAddr=0x68) # 创建mpu6050对象

def testMpu6050():
    global oledObj
    temp = mpu6050Obj.getTemperature() #获取mpu6050芯片温度
    acc = mpu6050Obj.getAcceleration() #获取mpu6050加速度值
    gy = mpu6050Obj.getGyroscope() #获取mpu6050陀螺仪值
    oledObj.fill(0)   #清屏背景黑色
    oledObj.text('mpu6050 test', 8, 5)
    oledObj.text('ax:'+'{:.1f}'.format(acc[0]),8,20)
    oledObj.text('ay:'+'{:.1f}'.format(acc[1]),8,38)
    oledObj.text('az:'+'{:.1f}'.format(acc[2]),8,56)
    oledObj.show()

#AHT10初始化函数
def aht10Init():
    global i2cObj,aht10Obj
    aht10Obj = AHT10(i2cObj, i2cAddr=0x38) # 创建AHT10对象

def testAht10():
    temp = aht10Obj.temperature()
    humidity = aht10Obj.humidity()
    oledObj.fill(0)   #清屏背景黑色
    oledObj.text('ath10 test', 5, 5)
    oledObj.text('T&H:'+'{:.1f}'.format(temp)+' '+'{:.1f}'.format(humidity), 5, 20)
    oledObj.show()
    return temp,humidity
    
if __name__ == '__main__':
    keyInit()
    ledInit()
    pwmInit()
    OLEDInit()
    mpu6050Init()
    aht10Init()
    while True:
        val = (int)(urandom.random())
        print(val)
        ledblueObj.value(1)
        utime.sleep(0.5)
        ledblueObj.value(0)
        ledgreenObj.value(1)
        utime.sleep(0.5)
        ledgreenObj.value(0)
        pwmObj.freq(1000+val)
        pwmObj.duty(200+val)
        utime.sleep(0.5)
        pwmObj.freq(2000+val)
        pwmObj.duty(800+val)
        utime.sleep(0.5)
        pwmObj.duty(0)
        utime.sleep(0.5)
        testMpu6050()
        utime.sleep(1)
        testAht10()
        utime.sleep(1)

购买链接

链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 硬件准备 - ESP32开发板 - MPU6050六轴陀螺仪模块 - 杜邦线若干 2. 软件准备 - uPyCraft IDE - mpu6050库 3. 连接硬件 将MPU6050模块的VCC和GND分别接到ESP32的3.3V和GND上,将SDA和SCL分别连接到ESP32的GPIO21和GPIO22上。 4. 编写代码 ```python from machine import I2C, Pin from mpu6050 import MPU6050 import time i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) mpu = MPU6050(i2c) while True: # 读取三轴加速度数据 accel = mpu.get_acceleration() print('Acceleration', accel) # 读取三轴陀螺仪数据 gyro = mpu.get_rotation() print('Gyroscope', gyro) # 休眠50毫秒 time.sleep_ms(50) ``` 5. 运行程序 将代码上传到ESP32开发板上,打开串口监视器查看输出信息。当将MPU6050模块转动时,加速度和陀螺仪数据会发生变化。 6. 扩展功能 在读取数据的基础上,可以将MPU6050模块作为体感遥控器,控制机器人或小车的运动。例如,将机器人向前移动的代码如下: ```python from machine import Pin import time # 定义左右轮电机引脚 left_motor = Pin(4, Pin.OUT) right_motor = Pin(5, Pin.OUT) # 向前移动 def forward(): left_motor.on() right_motor.on() # 停止移动 def stop(): left_motor.off() right_motor.off() while True: # 读取三轴加速度数据 accel = mpu.get_acceleration() # 判断是否向前倾斜 if accel[1] > 5: forward() else: stop() # 休眠50毫秒 time.sleep_ms(50) ``` 当将MPU6050模块向前倾斜时,机器人就会向前移动。其他方向的移动可以按照类似的方法实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值