文章會在我的個人網站優先更新:http://www.xiaokai1999.cn/archives/306
如果想要資源,可以在下面評論,我整理好了會發到我的個人網站上,供大家下載學習。
目錄
介紹
這個項目是我們學院單片機課程抵修(這門課的學分就拿到了,一學期不用上課),主要檢測電池,金屬,其他紙類。
因爲當時上海正在推行垃圾分類,那我就想簡單的做一下吧,這樣還能完成抵修。
基於51單片機的垃圾分類系統(課程抵修)
想法:說實話,當時條件有限,檢測的方法的確很撈:(現在主要都是靠深度學習了,這種不值一提具體可以看視頻)
- 使用openmv模板匹配(NCC算法)圖像,確定類型
- 再用金屬傳感器檢測,是否爲金屬
- 最後確定檢測的物體是金屬還是電池
說明:OpenMV不能實現深度學習!!!,本身只是基於STM32的,沒有機會給我們跑深度學習的!!不過好像可以用模型,但是支持的較少。
在寒假裏爲了增強垃圾分類的功能,我做了深度學習實現垃圾分類(用自己的電腦跑了整整3個小時~~)
1. 摘要
隨着人們生活水平的提高,越來越多的家庭進入智能化時代,人們對智能化家電的需求越來越高,但是現在垃圾分類還是我們最大的問題,現在的國民素質還有待培養,對扔垃圾懶惰隨意的意識型態還沒改變,而且居民對垃圾分類知識很是缺乏,爲了讓更多的人享受到科技帶來的便利和培養居民垃圾分類的意識,所以開發了本系統。相對那些售價高昂的智能垃圾桶,本產品更加適合大多數的普通家庭,本產品基於 OpenMV3 對垃圾進行檢測,有效的分離電池和其他垃圾。
1.2 應用方向
本產品可以應用在幾乎所有場合,適用範圍廣泛環境搭建更加的簡單,可以輕鬆實現垃圾檢測的功能。本產品可以應用在所有想提高自己生活體驗的家庭裏,爲他們帶來更方便快捷的生活體驗。
1.3 設計創新點
現在的這款垃圾桶相比於傳統的產品更加的方便,對於家中原本的垃圾桶省去了手動去分類的煩惱,同時也比別家公司生產的產品更加的節能。比如溫度檢測可以隨時提醒用戶扔垃圾,不僅僅達到了讓居民養成一個扔垃圾的好習慣,同時也讓家裏變得非常整潔,使人們獲得更加舒適的體驗的同時也保護了家裏的環境。再比如說本產品可以對用戶扔的垃圾進行分類,達到了分類的目的,還能讓居民學習垃圾分類的小知識,在垃圾同外部還裝有一個小燈,能在他顏色變化的時候觀察垃圾桶的工作狀態。
2 系統的結構設計
本系統主要的目的是實現 OpenMV3 攝像頭模塊通過 NCC 算法檢測垃 圾,並且和 STC89C52RC 單片機串口通信,單片機從而通過 OpenMV3 傳 輸下來的數據進行進一步的檢測當前投遞的垃圾屬於哪類垃圾,從而實現 垃圾分類的效果。
3 OpenMV3
OpenMV3攝像頭是一款小巧,低功耗,低成本的電路板,它幫助你很輕鬆的完成機器視覺(machine vision)應用。你可以通過高級語言Python腳本(準確的說是 MicroPython ),而不是C/C++。Python的高級數據結構使你很容易在機器視覺算法中處理複雜的輸出。但是,你仍然可以完全控制OpenMV3,包括IO引腳。你可以很容易的使用外部終端觸發拍攝或者或者執行算法,也可以把算法的結果用來控制IO引腳。如果使用此攝像頭模塊可以大大降低開發成本,縮短研發週期。
4 程序流程圖
當給單片機上電以後,系統會對各個模塊進行初始化的設置,所有的模塊初始化完成以後,程序會進入主函數中的while循環裏,在循環裏會進行按鍵的採集和串口數據的接收,然後根據接收的數據來控制各個設備工作。如果串口沒有接收到數據,那麼就會執行溫度採集的函數,並把採集到的溫度顯示在LCD上。
4.1 STC89C52RC串口接收
51單片機串行口是一個可編程全雙工的通信接口,具有Uart(異步收發器)的全部功能,能同時進行數據的發送與接收,也可作爲同步一位寄存器使用,本處主要是用來接收數據。51有兩個獨立的串行數據緩衝寄存器SBUF (一個發送,一個接收)和發送控制器、接收控制器,輸入移位寄存器及若干控制門電路。本次串口的使用方式爲方式4。
串口的發送和接收程序如下:
//初始化串口
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上。
首先是檢測電池(5號電池如圖5.3所示,18650充電電池如圖5.4所示,7號電池如圖5.5所示)的測試。
放上電池,按下檢測按鈕。垃圾桶蓋子通過舵機轉動自動打開如圖5.6所示,電池隨即滾入盒內,並進行進一步檢測。
電池最後停留在固定位置,內部的滑坡圖如圖5.7所示,經過金屬傳感器檢測如圖5.8所示:
檢測完畢,顯示電池爲有害垃圾並且蜂鳴器連續鳴叫六下。
接下來我們檢測金屬,實際效果如圖5.9所示:
我們隨機放上一個粗螺絲,實際效果如圖5.10所示:
結果爲Metal waste金屬垃圾,效果圖如圖5.11所示:
檢測目標爲一張捲過的紙,效果圖如圖5.12所示:
最後的檢測結果爲Other waste其他垃圾,效果圖如圖5.13所示: