基於51單片機和Openmv也能做垃圾分類系統(課程抵修)

 文章會在我的個人網站優先更新:http://www.xiaokai1999.cn/archives/306

如果想要資源,可以在下面評論,我整理好了會發到我的個人網站上,供大家下載學習。

目錄

介紹

1. 摘要

1.2 應用方向

1.3 設計創新點

2 系統的結構設計

3 OpenMV3

4 程序流程圖

4.1 STC89C52RC串口接收

4.2 定時器中斷函數控制PWM信號輸出

4.3 舵機及LED開關控制

4.4 OpenMV3檢測物體

5 系統調試


 

介紹

這個項目是我們學院單片機課程抵修(這門課的學分就拿到了,一學期不用上課),主要檢測電池,金屬,其他紙類

因爲當時上海正在推行垃圾分類,那我就想簡單的做一下吧,這樣還能完成抵修。

當時的成績

基於51單片機的垃圾分類系統(課程抵修)

想法:說實話,當時條件有限,檢測的方法的確很撈:(現在主要都是靠深度學習了,這種不值一提具體可以看視頻)

  1. 使用openmv模板匹配(NCC算法)圖像,確定類型
  2. 再用金屬傳感器檢測,是否爲金屬
  3. 最後確定檢測的物體是金屬還是電池
其中的一部分模板

 

說明:OpenMV不能實現深度學習!!!,本身只是基於STM32的,沒有機會給我們跑深度學習的!!不過好像可以用模型,但是支持的較少。

在寒假裏爲了增強垃圾分類的功能,我做了深度學習實現垃圾分類(用自己的電腦跑了整整3個小時~~

1. 摘要

         隨着人們生活水平的提高,越來越多的家庭進入智能化時代,人們對智能化家電的需求越來越高,但是現在垃圾分類還是我們最大的問題,現在的國民素質還有待培養,對扔垃圾懶惰隨意的意識型態還沒改變,而且居民對垃圾分類知識很是缺乏,爲了讓更多的人享受到科技帶來的便利和培養居民垃圾分類的意識,所以開發了本系統。相對那些售價高昂的智能垃圾桶,本產品更加適合大多數的普通家庭,本產品基於 OpenMV3 對垃圾進行檢測,有效的分離電池和其他垃圾。

1.2 應用方向

本產品可以應用在幾乎所有場合,適用範圍廣泛環境搭建更加的簡單,可以輕鬆實現垃圾檢測的功能。本產品可以應用在所有想提高自己生活體驗的家庭裏,爲他們帶來更方便快捷的生活體驗。

1.3 設計創新點

現在的這款垃圾桶相比於傳統的產品更加的方便,對於家中原本的垃圾桶省去了手動去分類的煩惱,同時也比別家公司生產的產品更加的節能。比如溫度檢測可以隨時提醒用戶扔垃圾,不僅僅達到了讓居民養成一個扔垃圾的好習慣,同時也讓家裏變得非常整潔,使人們獲得更加舒適的體驗的同時也保護了家裏的環境。再比如說本產品可以對用戶扔的垃圾進行分類,達到了分類的目的,還能讓居民學習垃圾分類的小知識,在垃圾同外部還裝有一個小燈,能在他顏色變化的時候觀察垃圾桶的工作狀態。

2 系統的結構設計

        本系統主要的目的是實現 OpenMV3 攝像頭模塊通過 NCC 算法檢測垃 圾,並且和 STC89C52RC 單片機串口通信,單片機從而通過 OpenMV3 傳 輸下來的數據進行進一步的檢測當前投遞的垃圾屬於哪類垃圾,從而實現 垃圾分類的效果。

openmv系統的工作流程圖
標題

3 OpenMV3

OpenMV3攝像頭是一款小巧,低功耗,低成本的電路板,它幫助你很輕鬆的完成機器視覺(machine vision)應用。你可以通過高級語言Python腳本(準確的說是 MicroPython ),而不是C/C++。Python的高級數據結構使你很容易在機器視覺算法中處理複雜的輸出。但是,你仍然可以完全控制OpenMV3,包括IO引腳。你可以很容易的使用外部終端觸發拍攝或者或者執行算法,也可以把算法的結果用來控制IO引腳。如果使用此攝像頭模塊可以大大降低開發成本,縮短研發週期。

OpenMV3實物圖

 

4 程序流程圖

當給單片機上電以後,系統會對各個模塊進行初始化的設置,所有的模塊初始化完成以後,程序會進入主函數中的while循環裏,在循環裏會進行按鍵的採集和串口數據的接收,然後根據接收的數據來控制各個設備工作。如果串口沒有接收到數據,那麼就會執行溫度採集的函數,並把採集到的溫度顯示在LCD上。

 

系統流程圖

4.1 STC89C52RC串口接收

51單片機串行口是一個可編程全雙工的通信接口,具有Uart(異步收發器)的全部功能,能同時進行數據的發送與接收,也可作爲同步一位寄存器使用,本處主要是用來接收數據。51有兩個獨立的串行數據緩衝寄存器SBUF (一個發送,一個接收)和發送控制器、接收控制器,輸入移位寄存器及若干控制門電路。本次串口的使用方式爲方式4。

STC89C52RC流程圖

串口的發送和接收程序如下:

//初始化串口
void Usart_Init(void)
{
        TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 0;
}
//發送單個字節
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
} /**串口中斷函數**/
void UARTInterrupt(void) interrupt 4
{
    c=’0’;
    if(RI)
{
    RI = 0;
    c=SBUF;
}
else
{
    TI = 0;
}
}



 

4.2 定時器中斷函數控制PWM信號輸出

本次系統一共用到了2個定時器,其中一個用於串口輸入,最後一個定時器0用於產生不同頻率的PWM,用以控制舵機。兩個定時器的初始化以及中斷服務函數如下:

/******初始化中斷0函數******/
void Timer0_Init()
{
    TMOD=0x01;
    TH0 = 0xff;
  TL0 = 0xa4;      //0.1ms中斷一次
    EA=1;
    ET0=1;
    TR0=0;
}
/******中斷0函數******/
void Time0() interrupt 1
{
    Basis++;
    TH0=0xff; TL0=0xa4;
    if (Basis==200)
    Basis=0;
    PWM = (Basis<=PWM_NUM) ? 1: 0;
} 
//初始化串口
void Usart_Init(void)
{
        TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 0;
}
/******串口中斷函數******/
void UARTInterrupt(void) interrupt 4
{
        c='0';
    if(RI)
    {
        RI = 0;
        c=SBUF;
    }
    else
        {
            TI = 0; 
        }     
}

4.3 舵機及LED開關控制

當串口接收到OpenMV發送過來的數據之後,單片機要根據對應的數據控制相應的設備,並把設備的狀態通過LED顯示出口。舵機的作用是用來控制門窗的開關,對應的狀態也會通過LED顯示出來。舵機的控制以及LED顯示的控制函數如下:

/******1602顯示******/
void Display1602(int i)
{
    uchar num;
    switch(i)
    {
        case 0://開機初始化
        {
            LcdWriteCom(0x80);
            for(num=0;num<12;num++)
            {
                LcdWriteData(table[num]);//顯示開機畫面
            }
            LcdWriteCom(0x80+0x40);
            for(num=0;num<6;num++)
            {
                LcdWriteData('.');//顯示開機畫面
                delay(50);
            }
            bee=0;
            delay(100);
            bee=1;
            TR0=1;
            PWM_NUM =31;//初始化舵機
            delay(10);
            TR0=0;
            break;
        }

 

4.4 OpenMV3檢測物體

當我們按下執行按鈕,OpenMV通過NCC樣本匹配算法來檢測垃圾的形狀和顏色是否與樣本所匹配,檢測完畢後將會通過串口發送給STC89C52RC單片機,OpenMV主要程序如下:

if(not pin3.value()):
            r = img.find_template(template, 0.9, step=4, search=SEARCH_EX)
            if r:
                img.draw_rectangle(r,color=(0,255,0))
            if r==None:
                r1 = img.find_template(template1, 0.8, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
                for tp in template2:
                    t = image.Image(tp)
                    r2 = img.find_template(t, 0.85, step=4, search=SEARCH_EX)
                    if r2:
                        break
                for tp in template3:
                    t = image.Image(tp)
                    r3 = img.find_template(t, 0.8, step=4, search=SEARCH_EX) 
                    if r3:
                        break
                if r1:
                    img.draw_rectangle(r1)
                    uart.write('1')#檢測到電池
                    print(1)
                elif r2:
                    img.draw_rectangle(r2)
                    uart.write('1')#檢測到電池
                    print(2)
                elif r3:
                    img.draw_rectangle(r3)
                    uart.write('1')#檢測到電池
                    print(3)
                else:
                    uart.write('3')#檢測到有物體
                    print(4)
            else:
                uart.write('0')#檢測到無物體
                print(0)

5 系統調試

整體實物圖如圖5.1所示,上邊的攝像頭爲OpenMV,下面的桶爲垃圾回收處理中心

整體實物圖

 

將單片機通上電,實時獲取溫度並且溫度實時顯示在LCD1602上。

LCD1602顯示溫度

 

首先是檢測電池(5號電池如圖5.3所示,18650充電電池如圖5.4所示,7號電池如圖5.5所示)的測試。

 

檢測5號電池

 

 

圖5.4  檢測18650電池

 

 

圖5.5  檢測7號電池


放上電池,按下檢測按鈕。垃圾桶蓋子通過舵機轉動自動打開如圖5.6所示,電池隨即滾入盒內,並進行進一步檢測。

 
圖5.6  垃圾桶蓋子自動打開

 

 

圖5.7  內部滑坡圖

 

 

電池最後停留在固定位置,內部的滑坡圖如圖5.7所示,經過金屬傳感器檢測如圖5.8所示:

物體最終停留圖

 

 

檢測完畢,顯示電池爲有害垃圾並且蜂鳴器連續鳴叫六下。

接下來我們檢測金屬,實際效果如圖5.9所示:

檢測結果爲Harmful waste 有害垃圾

 

 

我們隨機放上一個粗螺絲,實際效果如圖5.10所示:

檢測目標爲一顆螺絲

 

 

結果爲Metal waste金屬垃圾,效果圖如圖5.11所示:

Metal waste爲金屬垃圾

 檢測目標爲一張捲過的紙,效果圖如圖5.12所示:

 
檢測目標爲一張捲過的紙

 

最後的檢測結果爲Other waste其他垃圾,效果圖如圖5.13所示:

 other waste其他垃圾

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章