基于stm32單片機(jī)的智能盲人頭盔系統(tǒng) - 導(dǎo)盲杖 (含代碼)

基于單片機(jī)的智能盲人頭盔系統(tǒng)

  • 難度系數(shù):4分
  • 工作量:4分
  • 創(chuàng)新點(diǎn):3分

1 簡(jiǎn)介

盲人因?yàn)槿鄙倭艘曈X的感知能力而行走不便,如何安全舒適獨(dú)立出行已經(jīng)成為目前困擾他們外出的最主要原因.目前最常用的導(dǎo)盲工具有拐杖和導(dǎo)盲犬,但傳統(tǒng)的導(dǎo)盲拐杖不能發(fā)現(xiàn)較遠(yuǎn)處的障礙物且對(duì)于復(fù)雜的路況難以做出正確的判斷,不能滿足盲人獨(dú)立出行的基本需求;此外,我國(guó)導(dǎo)盲犬的數(shù)量很少,需求遠(yuǎn)遠(yuǎn)大于供應(yīng),而且有些盲人也可能由于各種原因不愿意使用導(dǎo)盲犬.因此,設(shè)計(jì)出一種智能導(dǎo)盲設(shè)備更加方便的幫助盲人出行。

2 主要器件

  • STM32單片機(jī)
  • HC-SRO4超聲波模塊
  • 導(dǎo)航模塊
  • 圖像識(shí)別模塊
  • 光敏傳感模塊
  • 智能語(yǔ)音合成模塊

3 實(shí)現(xiàn)效果


4 設(shè)計(jì)原理

4.1 硬件設(shè)計(jì)

設(shè)計(jì)的核心模塊采用STM32模塊,它負(fù)責(zé)頭盔上各種傳感器的相互協(xié)調(diào)以及信息的存儲(chǔ),保障各個(gè)模塊正常的工作,電路圖如圖:

STM32模塊

STM32單片機(jī)的主要硬件設(shè)計(jì)性能、集成度都比較高,功耗、電壓等均都比較低,具有實(shí)時(shí)性、數(shù)字信號(hào)邏輯優(yōu)化和預(yù)處理、開發(fā)簡(jiǎn)易的特點(diǎn)[2].能更好的負(fù)責(zé)頭盔上各種傳感器的相互協(xié)調(diào)以及信息的存儲(chǔ),保障各個(gè)模塊的正常工作.STM32原理見圖

HC-SR04超聲波避障模塊

簡(jiǎn)介

HC-SR04超聲波模塊常用于機(jī)器人避障、物體測(cè)距、液位檢測(cè)、公共安防、停車場(chǎng)檢測(cè)等場(chǎng)所。HC-SR04超聲波模塊主要是由兩個(gè)通用的壓電陶瓷超聲傳感器,并加外圍信號(hào)處理電路構(gòu)成的。如圖:

兩個(gè)壓電陶瓷超聲傳感器,一個(gè)用于發(fā)出超聲波信號(hào),一個(gè)用于接收反射回來的超聲波信號(hào)。由于發(fā)出信號(hào)和接收信號(hào)都比較微弱,所以需要通過外圍信號(hào)放大器提高發(fā)出信號(hào)的功率,和將反射回來信號(hào)進(jìn)行放大,以能更穩(wěn)定地將信號(hào)傳輸給單片機(jī)。模塊整體電路如圖:

模塊參數(shù)

(1)模塊主要電氣參數(shù)

  • 使用電壓:DC—5V
  • 靜態(tài)電流:小于2mA
  • 電平輸出:高5V
  • 電平輸出:底0V
  • 感應(yīng)角度:不大于15度
  • 探測(cè)距離:2cm-450cm
  • 高精度 可達(dá)0.2cm

(2)模塊引腳
超聲波模塊有4個(gè)引腳,分別為Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V電源, Trig(控制端)控制發(fā)出的超聲波信號(hào),Echo(接收端)接收反射回來的超聲波信號(hào)。模塊如圖

導(dǎo)航模塊

導(dǎo)航功能的實(shí)現(xiàn)是通過使用百度API,對(duì)收到的坐標(biāo)和目的地坐標(biāo)發(fā)起檢索請(qǐng)求,百度 API將顯示出到達(dá)目的地的最佳路線以及所用時(shí)間等信息,通過語(yǔ)音提示引導(dǎo)用戶到達(dá)目的地[3].該模塊是通過STM32的響應(yīng)串口,獲取一個(gè)GPS響應(yīng)端口協(xié)議數(shù)據(jù),再將一個(gè)GPS的串口數(shù)據(jù)發(fā)送給需要STM32的響應(yīng)串口,由串口數(shù)據(jù)采用GPS串口協(xié)議編譯解碼,解析編譯出來后數(shù)據(jù)保存在需要響應(yīng)的串口結(jié)構(gòu)體中.

圖象識(shí)別模塊

由于超聲波模塊只能對(duì)前方4 m范圍內(nèi)的障礙物進(jìn)行檢測(cè),所以為了更好地檢測(cè)和識(shí)別盲區(qū)內(nèi)的人和障礙物,以及實(shí)現(xiàn)助盲社交的功能,設(shè)計(jì)采用了圖像識(shí)別模塊.

基于雙目立體圖像視覺三維儀的測(cè)量

這種雙目立體圖像視覺三維儀的測(cè)量方法是基于立體視差計(jì)算原理[4],主要通過對(duì)兩幅立體圖像進(jìn)行視差的綜合計(jì)算,直接對(duì)前方兩個(gè)物體高度進(jìn)行一定距離上的測(cè)量.基線距為兩個(gè)連線投影點(diǎn)或攝像機(jī)的基點(diǎn)基線中心的距離,用字母b表示.攝像機(jī)坐標(biāo)所在投影鏡頭的內(nèi)部有一光學(xué)坐標(biāo)中心,光學(xué)坐標(biāo)原點(diǎn)是作為整個(gè)投影攝像機(jī)所在鏡頭光學(xué)坐標(biāo)系的一個(gè)運(yùn)動(dòng)原點(diǎn),坐標(biāo)的運(yùn)動(dòng)關(guān)系如圖5所示.設(shè)O1和O2為光軸坐標(biāo)原點(diǎn)距離左右俯視對(duì)象攝像機(jī)光軸以及光軸坐標(biāo)交點(diǎn)1 m的距離,設(shè)空間中點(diǎn)的坐標(biāo)為P,左反射圖像和右反射圖像中對(duì)應(yīng)的兩點(diǎn)坐標(biāo)分別為P1(U1,V1)和P2(U2,V2).若兩臺(tái)攝像機(jī)的圖像處于同一平面,點(diǎn)P上兩個(gè)點(diǎn)的坐標(biāo)與點(diǎn)y的坐標(biāo)相同,即V1=V2.f表示焦距,b表示基線距,Zc表示P點(diǎn)在Z軸上的坐標(biāo).

由三角幾何關(guān)系得到位置差d:

及攝像機(jī)坐標(biāo)系中的坐標(biāo)值.

人臉圖像識(shí)別處理

對(duì)于人臉識(shí)別以及對(duì)于紅綠燈、斑馬線的圖像識(shí)別主要基于美國(guó)opencv公司發(fā)行的一款跨行業(yè)平臺(tái)自動(dòng)計(jì)算機(jī)圖形視覺和自動(dòng)機(jī)器智能學(xué)習(xí)軟件庫(kù)[5].對(duì)于使用人臉識(shí)別采集功能,首先需要利用人臉數(shù)據(jù)庫(kù)采集市opencv采集中的人臉數(shù)據(jù)庫(kù)采集orl構(gòu)建人臉識(shí)別數(shù)據(jù)庫(kù),在不同人物表情、光照、人臉識(shí)別細(xì)節(jié)的不同情況下可以采集一個(gè)熟人的嘴和臉大小作為技能測(cè)試集,采集集中包含一個(gè)陌生人和一個(gè)熟人的嘴與臉大小作為技能訓(xùn)練集;對(duì)一個(gè)熟人的嘴和臉大小進(jìn)行分割預(yù)處理,檢測(cè)一個(gè)熟人的嘴和臉大小并用新的orl進(jìn)行分割產(chǎn)生出新的人臉,通過分割改變?nèi)四槾笮】梢允顾c熟人orl利用人臉識(shí)別數(shù)據(jù)庫(kù)檢測(cè)人物的臉細(xì)節(jié)大小一致.再利用人臉識(shí)別算法檢測(cè)出熟人的臉.對(duì)于斑馬線以及紅綠燈的判定,是利用攝像頭對(duì)周圍環(huán)境進(jìn)行拍攝并按幀保存圖像;通過對(duì)圖像的預(yù)處理將圖像采集的過程中采集到的干擾項(xiàng)進(jìn)行剔除.圖像預(yù)分析處理之后將直接進(jìn)入二次目標(biāo)圖像定位分析階段,確定一個(gè)目標(biāo)后對(duì)其圖像進(jìn)行二次數(shù)值邊緣化與目標(biāo)邊緣化的提取,再與目標(biāo)樣本像素做高度比較,相似度較高若達(dá)到超過一個(gè)特定的圖像值則可以認(rèn)為其指的是一個(gè)目標(biāo),記錄的是目標(biāo)在其像素中的坐標(biāo).運(yùn)用圖像預(yù)處理方法,可計(jì)算出每個(gè)紅綠燈光線位置,通過與紅綠燈樣本對(duì)比,確定每個(gè)紅綠燈準(zhǔn)確的光線位置,并對(duì)紅綠燈的顏色進(jìn)行判別并輸出,再根據(jù)各個(gè)燈所在位置像素的R、G、B分量來判斷燈的顏色,最后通過智能語(yǔ)音模塊告訴盲人.

光敏傳感模塊

光敏信號(hào)傳感器指的是一種可以利用這些光敏傳感元件將光線電信號(hào)進(jìn)行轉(zhuǎn)換成為無線電信號(hào)的電子傳感器,基本工作原理圖如下:

圖中光敏電阻的工作是基于光電磁場(chǎng)效應(yīng),其阻值隨光強(qiáng)的增大而減小.LM393則是雙有源電壓比較器,不受限于vcc的兩端有源電壓設(shè)定值的最大限制,它的負(fù)載電阻可以連接輸出電壓設(shè)定范圍內(nèi)的任何功率輸出電壓,還可用亮度電位控制器自動(dòng)調(diào)節(jié)顯示的亮度系數(shù)閾值亮度系數(shù)大于系統(tǒng)設(shè)定值時(shí)顯示DO會(huì)自動(dòng)輸出亮度低電平,反之則會(huì)自動(dòng)輸出亮度高電平.利用這個(gè)特性,可以使頭盔在夜間發(fā)光,以提醒周圍行人和車輛,保障盲人夜間出行的安全.

智能語(yǔ)音合成模塊

智能語(yǔ)音合成模塊的功能是將控制模塊發(fā)送的文本信息轉(zhuǎn)換成語(yǔ)音從而輸出,該部分采用XF-S4240中文語(yǔ)音合成模塊,其主要應(yīng)用于嵌入式領(lǐng)域。該模塊有如下特點(diǎn):

  • 可通過GB2312、GBK、Big5、Unicode的快速文本合成;同時(shí),它支持中文文本和英文的合成,能夠正確快速地識(shí)別英文、數(shù)字、時(shí)間點(diǎn)、日期和常用的國(guó)際度量單位符號(hào);還支持處理各種音節(jié)和字母.
  • 擁有UART、SPI、I2C三種數(shù)據(jù)通信接口.
  • 支持合成、停止、暫停合成、繼續(xù)合成等多種控制指令.

存儲(chǔ)模塊用于存儲(chǔ)待合成的文本數(shù)據(jù)文件.存儲(chǔ)設(shè)備為語(yǔ)音控制系統(tǒng)SD卡(安全數(shù)字存儲(chǔ)卡),具有便攜性、通用性和安全性三大特點(diǎn)。

4.2 軟件設(shè)計(jì)

具體軟件流程

5 部分核心代碼

//超聲波測(cè)距 //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共陽(yáng)數(shù)碼管引腳 //Trig  = P1^0 //Echo  = P3^2 #include <reg52.h>     //包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件 #define uchar unsigned char //定義一下方便使用 #define uint  unsigned int #define ulong unsigned long //*********************************************** sfr  CLK_DIV = 0x97; //為STC單片機(jī)定義,系統(tǒng)時(shí)鐘分頻 //為STC單片機(jī)的IO口設(shè)置地址定義 sfr   P0M1   = 0X93;
sfr   P0M0   = 0X94;
sfr   P1M1   = 0X91;
sfr   P1M0   = 0X92;
sfr	P2M1   = 0X95;
sfr	P2M0   = 0X96; //*********************************************** sbit Trig  = P1^0; //產(chǎn)生脈沖引腳 sbit Echo  = P3^2; //回波引腳 sbit test  = P1^1; //測(cè)試用引腳 uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數(shù)碼管0-9 uint distance[4]; //測(cè)距接收緩沖區(qū) uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定義寄存器 bit succeed_flag; //測(cè)量成功標(biāo)志 //********函數(shù)聲明 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; //系統(tǒng)時(shí)鐘為1/8晶振(pdf-45頁(yè))  P0M1 = 0; //將io口設(shè)置為推挽輸出 P1M1 = 0;
     P2M1 = 0;
     P0M0 = 0XFF;
     P1M0 = 0XFF;
     P2M0 = 0XFF;
   i=0;
   flag=0;
	test =0;
	Trig=0; //首先拉低脈沖輸入引腳 TMOD=0x11; //定時(shí)器0,定時(shí)器1,16位工作方式 TR0=1; //啟動(dòng)定時(shí)器0 IT0=0; //由高電平變低電平,觸發(fā)外部中斷 ET0=1; //打開定時(shí)器0中斷 //ET1=1;        //打開定時(shí)器1中斷 EX0=0; //關(guān)閉外部中斷 EA=1; //打開總中斷0  while(1) //程序循環(huán) {
  EA=0;
	     Trig=1;
        delay_20us();
        Trig=0; //產(chǎn)生一個(gè)20us的脈沖,在Trig引腳  while(Echo==0); //等待Echo回波引腳變高電平 succeed_flag=0; //清測(cè)量成功標(biāo)志 EX0=1; //打開外部中斷 TH1=0; //定時(shí)器1清零 TL1=0; //定時(shí)器1清零 TF1=0; // TR1=1; //啟動(dòng)定時(shí)器1 EA=1; while(TH1 < 30);//等待測(cè)量的結(jié)果,周期65.535毫秒(可用中斷實(shí)現(xiàn))  TR1=0; //關(guān)閉定時(shí)器1 EX0=0; //關(guān)閉外部中斷 if(succeed_flag==1)
	     { 	
		   distance_data=outcomeH; //測(cè)量結(jié)果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//與低8位合并成為16位結(jié)果數(shù)據(jù) distance_data*=12; //因?yàn)槎〞r(shí)器默認(rèn)為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; //測(cè)試燈變化 } /// distance[i]=distance_data; //將測(cè)量結(jié)果的數(shù)據(jù)放入緩沖區(qū) /// 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號(hào) {    
     outcomeH =TH1; //取出定時(shí)器的值 outcomeL =TL1; //取出定時(shí)器的值 succeed_flag=1; //至成功測(cè)量的標(biāo)志 EX0=0; //關(guān)閉外部中斷 } //**************************************************************** //定時(shí)器0中斷,用做顯示 timer0() interrupt 1 // 定時(shí)器0中斷是1號(hào) {
 	 TH0=0xfd; //寫入定時(shí)器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;
      }
   } //***************************************************************** /*
//定時(shí)器1中斷,用做超聲波測(cè)距計(jì)時(shí)
timer1() interrupt 3  // 定時(shí)器0中斷是1號(hào)
    {
TH1=0;
TL1=0;
     }
*/ //****************************************************************** //顯示數(shù)據(jù)轉(zhuǎn)換程序 void conversion(uint temp_data) {  
    uchar ge_data,shi_data,bai_data ;
    bai_data=temp_data/100 ;
    temp_data=temp_data%100; //取余運(yùn)算 shi_data=temp_data/10 ;
    temp_data=temp_data%10; //取余運(yùn)算 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;} /*交換值	 
    }
*/ 

嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長(zhǎng),不少人因?yàn)閷W(xué)習(xí)路線不對(duì)或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯(cuò)失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點(diǎn)擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點(diǎn)贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!

點(diǎn)擊這里找小助理0元領(lǐng)取:掃碼進(jìn)群領(lǐng)資料


the end

評(píng)論(0)