FastBond智能建筑之AI控制
采用Maix Dock M1进行AI识别,通过卷积神经网络进行视觉的训练,识别特定手势控制GPIO来控制LED的点亮或者熄灭,加上时间的判定,可以确定灯的亮度,如凌晨开灯较暗,平时开灯全亮。
标签
小宝呱
更新2021-12-07
1268

FastBond活动选择的项目方向介绍

  • 智能建筑
  • 智能控制:由于疫情的原因或者比较危险的地方,采用隔空的AI姿势识别会极大的提高操作的安全性
  • 对于本次FastBond的想法
  • 平时会思考技术在行业场景上面的应用,制造业以及医疗行业
  • 制造业:
  • 对于比较危险的场景、精度比较高的场景、隔离的场景,较适合隔空无接触的方式进行指示,有机器来完成相关的操作,例如:高压、高温场景
  • 医疗行业:
  • 对于无菌高要求、无接触要求的场景,适合手势控制,例如:在进行手术的医生,还需要查阅影像系统,采用手势隔空操作是最佳方式

 

项目设计思路

  • 采用K210的AI芯片(Maix Dock M1)进行AI方面的识别工作,同时也具有多种外设可进行控制。
  • 本次Demo采用三极管控制LED灯进行。
  • 通过卷积神经网络进行视觉的训练,可以识别训练的特定手势。
  • 利用识别的手势控制GPIO来控制LED的点亮或者熄灭
  • 同时加上时间的判定,可以确定灯的亮度,如凌晨开灯较暗,平时开灯全亮。

代码

 

# object classifier boot.py
# generated by maixhub.com

import sensor, image, lcd, time
import KPU as kpu
import gc, sys
from fpioa_manager import fm
from Maix import GPIO
from machine import I2C


io_led=35
fm.register(io_led, fm.fpioa.GPIO0)
led=GPIO(GPIO.GPIO0, GPIO.OUT)

class RTC:
    w = ["FRI","SAT","SUN","MON","TUE","WED","THU"]

    def __init__(self, address=0x68, register=0x00):
        self.rtc_address = address
        self.rtc_register = register
        self.i2c=I2C(I2C.I2C4, freq=100000, scl=11, sda=9)


    def DS3231_SetTime(self, NowTime = b'\x00\x23\x12\x28\x14\x07\x21'):
        self.i2c.writeto_mem(int(self.rtc_address), int(self.rtc_register),NowTime)


    def bcd2bin(self, value):
        return (value or 0) - 6 * ((value or 0) >> 4)

    def pre_zero(self, value):
        pre_zero = True
        if pre_zero:
            if value < 10:
                value = "0"+str(value)
        return value

    def DS3231_ReadTime(self):
        try:
            buffer = self.i2c.readfrom_mem(self.rtc_address,self.rtc_register,7)
            year = self.bcd2bin(buffer[6]) + 2000
            month = self.bcd2bin(buffer[5])
            day = self.bcd2bin(buffer[4])
            weekday = self.w[self.bcd2bin(buffer[3])]
            hour = self.pre_zero(self.bcd2bin(buffer[2]))
            minute = self.pre_zero(self.bcd2bin(buffer[1]))
            second = self.pre_zero(self.bcd2bin(buffer[0]))
            time_string = str(hour) + ":" + str(minute) + ":" + str(second) + " " + weekday + " " +
            \str(year) + "-" + str(month) + "-" + str(day)
            return time_string
        except:
            return False

def lcd_show_except(e):
    import uio
    err_str = uio.StringIO()
    sys.print_exception(e, err_str)
    err_str = err_str.getvalue()
    img = image.Image(size=(224,224))
    img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
    lcd.display(img)

def main(labels = None, model_addr="/sd/m.kmodel",
    \sensor_window=(224, 224), lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_windowing(sensor_window)
    sensor.set_hmirror(sensor_hmirror)
    sensor.set_vflip(sensor_vflip)
    sensor.run(1)
    rtc = RTC()

    lcd.init(type=1)
    lcd.rotation(lcd_rotation)
    lcd.clear(lcd.WHITE)

    try:
        img = image.Image("startup.jpg")
        lcd.display(img)
    except Exception:
        img = image.Image(size=(320, 240))
        img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
        lcd.display(img)

    try:
        task = None
        task = kpu.load(model_addr)
        status = None
        while(True):
            img = sensor.snapshot()
            date = rtc.DS3231_ReadTime()
            t = time.ticks_ms()
            fmap = kpu.forward(task, img)
            t = time.ticks_ms() - t
            plist=fmap[:]
            pmax=max(plist)
            max_index=plist.index(pmax)
            if max_index == 1:
                led.value(0)
                status = "Close"
            else:
                led.value(1)
                status = "Open"
            img.draw_string(0,0, "%.2f : %s" %(pmax, labels[max_index].strip()), scale=1.5,color=(255, 0, 0))
            img.draw_string(185,0, status, scale=1.5, color=(255, 255, 0))
            img.draw_string(0, 210, "t:%dms" %(t), scale=1.3, color=(255, 0, 0))
            img.draw_string(105, 213, date, scale=1, color=(255, 0, 0))
            lcd.display(img)
    except Exception as e:
        raise e
    finally:
        if not task is None:
            kpu.deinit(task)


if __name__ == "__main__":
    try:
        labels = ["openbutton", "closebutton"]
        # main(labels=labels, model_addr=0x300000)
        main(labels=labels, model_addr="/sd/m.kmodel")
    except Exception as e:
        sys.print_exception(e)
        lcd_show_except(e)
    finally:
        gc.collect()

 

采用元件

FjpHG3W4aPoJ-5lLoV9h93fMs17C

美信DS3231时钟模块

  • 低成本、高精度I2C实时时钟(RTC)
  • 具有集成的温补晶体振荡器(TCXO)和晶体。
  • 该器件包含电池输入端,断开主电源时认可保持精确的计时。
  • 其提供年、月、日、星期、时、分、秒信息,提供有效期到2100年的闰年补偿。

 

亚德诺ADP3338-3.3电源芯片

  • 高线路和负载精度:±0.8% (25°C),±1.4%(整个温度范围)
  • 超低压差:190 mV(典型值、1 A)
  • 具有130 µA(典型值)超低静态电流

 

整体照片

Fiq1bw7IQy5JfLF7fYRA2Exl7XDbFnIjQbXG5SArPfkdhRlf06xdo-fl

附件下载
boot.py
主代码
m.kmodel
训练模型
团队介绍
电子爱好者,对于电路设计、嵌入式编程、人工智能、工业自动化控制、工业物联网有着极大的兴趣,也是平时的爱好。 非常热衷于参加电子森林的各种活动(虽然比较忙)
团队成员
小宝呱
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号