- 難度系數:4分
- 工作量:4分
- 創新點:3分
1 簡介
盲人因為缺少了視覺的感知能力而行走不便,如何安全舒適獨立出行已經成為目前困擾他們外出的最主要原因.目前最常用的導盲工具有拐杖和導盲犬,但傳統的導盲拐杖不能發現較遠處的障礙物且對于復雜的路況難以做出正確的判斷,不能滿足盲人獨立出行的基本需求;此外,我國導盲犬的數量很少,需求遠遠大于供應,而且有些盲人也可能由于各種原因不愿意使用導盲犬.因此,設計出一種智能導盲設備更加方便的幫助盲人出行。
2 主要器件
- STM32單片機
- HC-SRO4超聲波模塊
- 導航模塊
- 圖像識別模塊
- 光敏傳感模塊
- 智能語音合成模塊
3 實現效果
4 設計原理
4.1 硬件設計
設計的核心模塊采用STM32模塊,它負責頭盔上各種傳感器的相互協調以及信息的存儲,保障各個模塊正常的工作,電路圖如圖:
STM32模塊
STM32單片機的主要硬件設計性能、集成度都比較高,功耗、電壓等均都比較低,具有實時性、數字信號邏輯優化和預處理、開發簡易的特點[2].能更好的負責頭盔上各種傳感器的相互協調以及信息的存儲,保障各個模塊的正常工作.STM32原理見圖
HC-SR04超聲波避障模塊
簡介
HC-SR04超聲波模塊常用于機器人避障、物體測距、液位檢測、公共安防、停車場檢測等場所。HC-SR04超聲波模塊主要是由兩個通用的壓電陶瓷超聲傳感器,并加外圍信號處理電路構成的。如圖:
兩個壓電陶瓷超聲傳感器,一個用于發出超聲波信號,一個用于接收反射回來的超聲波信號。由于發出信號和接收信號都比較微弱,所以需要通過外圍信號放大器提高發出信號的功率,和將反射回來信號進行放大,以能更穩定地將信號傳輸給單片機。模塊整體電路如圖:
模塊參數
(1)模塊主要電氣參數
- 使用電壓:DC—5V
- 靜態電流:小于2mA
- 電平輸出:高5V
- 電平輸出:底0V
- 感應角度:不大于15度
- 探測距離:2cm-450cm
- 高精度 可達0.2cm
(2)模塊引腳
超聲波模塊有4個引腳,分別為Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V電源, Trig(控制端)控制發出的超聲波信號,Echo(接收端)接收反射回來的超聲波信號。模塊如圖
導航模塊
導航功能的實現是通過使用百度API,對收到的坐標和目的地坐標發起檢索請求,百度 API將顯示出到達目的地的最佳路線以及所用時間等信息,通過語音提示引導用戶到達目的地[3].該模塊是通過STM32的響應串口,獲取一個GPS響應端口協議數據,再將一個GPS的串口數據發送給需要STM32的響應串口,由串口數據采用GPS串口協議編譯解碼,解析編譯出來后數據保存在需要響應的串口結構體中.
圖象識別模塊
由于超聲波模塊只能對前方4 m范圍內的障礙物進行檢測,所以為了更好地檢測和識別盲區內的人和障礙物,以及實現助盲社交的功能,設計采用了圖像識別模塊.
基于雙目立體圖像視覺三維儀的測量
這種雙目立體圖像視覺三維儀的測量方法是基于立體視差計算原理[4],主要通過對兩幅立體圖像進行視差的綜合計算,直接對前方兩個物體高度進行一定距離上的測量.基線距為兩個連線投影點或攝像機的基點基線中心的距離,用字母b表示.攝像機坐標所在投影鏡頭的內部有一光學坐標中心,光學坐標原點是作為整個投影攝像機所在鏡頭光學坐標系的一個運動原點,坐標的運動關系如圖5所示.設O1和O2為光軸坐標原點距離左右俯視對象攝像機光軸以及光軸坐標交點1 m的距離,設空間中點的坐標為P,左反射圖像和右反射圖像中對應的兩點坐標分別為P1(U1,V1)和P2(U2,V2).若兩臺攝像機的圖像處于同一平面,點P上兩個點的坐標與點y的坐標相同,即V1=V2.f表示焦距,b表示基線距,Zc表示P點在Z軸上的坐標.
由三角幾何關系得到位置差d:
及攝像機坐標系中的坐標值.
人臉圖像識別處理
對于人臉識別以及對于紅綠燈、斑馬線的圖像識別主要基于美國opencv公司發行的一款跨行業平臺自動計算機圖形視覺和自動機器智能學習軟件庫[5].對于使用人臉識別采集功能,首先需要利用人臉數據庫采集市opencv采集中的人臉數據庫采集orl構建人臉識別數據庫,在不同人物表情、光照、人臉識別細節的不同情況下可以采集一個熟人的嘴和臉大小作為技能測試集,采集集中包含一個陌生人和一個熟人的嘴與臉大小作為技能訓練集;對一個熟人的嘴和臉大小進行分割預處理,檢測一個熟人的嘴和臉大小并用新的orl進行分割產生出新的人臉,通過分割改變人臉大小可以使它與熟人orl利用人臉識別數據庫檢測人物的臉細節大小一致.再利用人臉識別算法檢測出熟人的臉.對于斑馬線以及紅綠燈的判定,是利用攝像頭對周圍環境進行拍攝并按幀保存圖像;通過對圖像的預處理將圖像采集的過程中采集到的干擾項進行剔除.圖像預分析處理之后將直接進入二次目標圖像定位分析階段,確定一個目標后對其圖像進行二次數值邊緣化與目標邊緣化的提取,再與目標樣本像素做高度比較,相似度較高若達到超過一個特定的圖像值則可以認為其指的是一個目標,記錄的是目標在其像素中的坐標.運用圖像預處理方法,可計算出每個紅綠燈光線位置,通過與紅綠燈樣本對比,確定每個紅綠燈準確的光線位置,并對紅綠燈的顏色進行判別并輸出,再根據各個燈所在位置像素的R、G、B分量來判斷燈的顏色,最后通過智能語音模塊告訴盲人.
光敏傳感模塊
光敏信號傳感器指的是一種可以利用這些光敏傳感元件將光線電信號進行轉換成為無線電信號的電子傳感器,基本工作原理圖如下:
圖中光敏電阻的工作是基于光電磁場效應,其阻值隨光強的增大而減小.LM393則是雙有源電壓比較器,不受限于vcc的兩端有源電壓設定值的最大限制,它的負載電阻可以連接輸出電壓設定范圍內的任何功率輸出電壓,還可用亮度電位控制器自動調節顯示的亮度系數閾值亮度系數大于系統設定值時顯示DO會自動輸出亮度低電平,反之則會自動輸出亮度高電平.利用這個特性,可以使頭盔在夜間發光,以提醒周圍行人和車輛,保障盲人夜間出行的安全.
智能語音合成模塊
智能語音合成模塊的功能是將控制模塊發送的文本信息轉換成語音從而輸出,該部分采用XF-S4240中文語音合成模塊,其主要應用于嵌入式領域。該模塊有如下特點:
- 可通過GB2312、GBK、Big5、Unicode的快速文本合成;同時,它支持中文文本和英文的合成,能夠正確快速地識別英文、數字、時間點、日期和常用的國際度量單位符號;還支持處理各種音節和字母.
- 擁有UART、SPI、I2C三種數據通信接口.
- 支持合成、停止、暫停合成、繼續合成等多種控制指令.
存儲模塊用于存儲待合成的文本數據文件.存儲設備為語音控制系統SD卡(安全數字存儲卡),具有便攜性、通用性和安全性三大特點。
4.2 軟件設計
具體軟件流程
5 部分核心代碼
//超聲波測距 //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共陽數碼管引腳 //Trig = P1^0 //Echo = P3^2 #include <reg52.h> //包括一個52標準內核的頭文件 #define uchar unsigned char //定義一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x97; //為STC單片機定義,系統時鐘分頻 //為STC單片機的IO口設置地址定義 sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96; //*********************************************** sbit Trig = P1^0; //產生脈沖引腳 sbit Echo = P3^2; //回波引腳 sbit test = P1^1; //測試用引腳 uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9 uint distance[4]; //測距接收緩沖區 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定義寄存器 bit succeed_flag; //測量成功標志 //********函數聲明 void conversion(uint temp_data); void delay_20us(); //void pai_xu(); void main(void) // 主程序 { uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系統時鐘為1/8晶振(pdf-45頁) P0M1 = 0; //將io口設置為推挽輸出 P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test =0;
Trig=0; //首先拉低脈沖輸入引腳 TMOD=0x11; //定時器0,定時器1,16位工作方式 TR0=1; //啟動定時器0 IT0=0; //由高電平變低電平,觸發外部中斷 ET0=1; //打開定時器0中斷 //ET1=1; //打開定時器1中斷 EX0=0; //關閉外部中斷 EA=1; //打開總中斷0 while(1) //程序循環 {
EA=0;
Trig=1;
delay_20us();
Trig=0; //產生一個20us的脈沖,在Trig引腳 while(Echo==0); //等待Echo回波引腳變高電平 succeed_flag=0; //清測量成功標志 EX0=1; //打開外部中斷 TH1=0; //定時器1清零 TL1=0; //定時器1清零 TF1=0; // TR1=1; //啟動定時器1 EA=1; while(TH1 < 30);//等待測量的結果,周期65.535毫秒(可用中斷實現) TR1=0; //關閉定時器1 EX0=0; //關閉外部中斷 if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//與低8位合并成為16位結果數據 distance_data*=12; //因為定時器默認為12分頻 distance_data/=58; //微秒的單位除以58等于厘米 } //為什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 if(succeed_flag==0)
{
distance_data=0; //沒有回波則清零 test = !test; //測試燈變化 } /// distance[i]=distance_data; //將測量結果的數據放入緩沖區 /// i++; /// if(i==3) /// { /// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4; /// pai_xu(); /// distance_data=distance[1]; a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
} /// i=0; /// } }
} //*************************************************************** //外部中斷0,用做判斷回波電平 INTO_() interrupt 0 // 外部中斷是0號 {
outcomeH =TH1; //取出定時器的值 outcomeL =TL1; //取出定時器的值 succeed_flag=1; //至成功測量的標志 EX0=0; //關閉外部中斷 } //**************************************************************** //定時器0中斷,用做顯示 timer0() interrupt 1 // 定時器0中斷是1號 {
TH0=0xfd; //寫入定時器0初始值 TL0=0x77; switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break; case 0x01:P0=shi;P2=0xfe;flag++;break; case 0x02:P0=bai;P2=0xfb;flag=0;break;
}
} //***************************************************************** /*
//定時器1中斷,用做超聲波測距計時
timer1() interrupt 3 // 定時器0中斷是1號
{
TH1=0;
TL1=0;
}
*/ //****************************************************************** //顯示數據轉換程序 void conversion(uint temp_data) {
uchar ge_data,shi_data,bai_data ;
bai_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算 shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算 ge_data=temp_data;
bai_data=SEG7[bai_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];
EA=0;
bai = bai_data;
shi = shi_data;
ge = ge_data ;
EA=1;
} //****************************************************************** void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++);
} /*
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交換值
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交換值
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交換值
}
*/
嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊下方鏈接,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦!
點擊這里找小助理0元領取:掃碼進群領資料