自動化物流系統(tǒng)可以對庫存的入庫、出庫、移庫、盤點等操作進行全面的控制和管理,對物品進行實時分析與控制,為企業(yè)管理者作出正確決策提供依據(jù),將庫存量減至最優(yōu)存儲量,大幅提高資金流轉(zhuǎn)速度與利用率,降低庫存成本;從物流效率和管理水平、空間利用率、人工成本、等方面可以看出,自動化物流系統(tǒng)與傳統(tǒng)物流系統(tǒng)相比,具有更加明顯的優(yōu)勢。
今天簡單分享一下物流自動化倉儲分揀系統(tǒng)的自動識別原理,下面是基本的原理圖:
具體工作原理如下:
主控MCU采用stm32F103C8T6,是目前非常常用的一個單片機型號,采用M3內(nèi)核,72M主頻,采用射頻模塊主要是用來獲取RFID標(biāo)簽中的數(shù)據(jù)信息,當(dāng)系統(tǒng)處于主菜單時,按下鍵盤中的OK鍵,啟動射頻模塊(拉低SHD引腳)。單片機通過捕獲EM4095的DEMOD_OUT引腳輸出的曼切斯特碼波形,利用解碼算法獲取當(dāng)前讀入標(biāo)簽的信息。如果讀取到標(biāo)簽的信息,則在屏幕上顯示標(biāo)簽ID號;并通過單片機TTL串口將數(shù)據(jù)通過wifi模塊發(fā)送給服務(wù)器
一、一鍵啟動電路
圖中KEY_COND和EN_A分別與單片機的IO口相連。其工作原理為:
- 當(dāng)系統(tǒng)處于關(guān)閉時,EN_A通過R26處于低電平,SP6205穩(wěn)壓器不工作,此時系統(tǒng)沒有上電。當(dāng)按下電源鍵(KEY_POWER),EN_A為高電平,系統(tǒng)啟動。又由于EN_A與IO腳相連,啟動后立即將EN_A拉高,這時抬起電源按鍵,實現(xiàn)自鎖,系統(tǒng)正常工作。
- 當(dāng)系統(tǒng)處于運行狀態(tài)時(電源鍵沒有按下),此時EN_A為高電平,但由于分壓電阻R24,R25的存在,KEY_COND上的電壓只有50mV可以認(rèn)為是低電平,當(dāng)按下電源按鍵,此時KEY_COND拉高并能被單片機讀取,當(dāng)抬起電源按鍵后KL25將與EN_A相連的IO腳電平拉低,這時SP6205停止工作,系統(tǒng)關(guān)閉。
二、射頻模塊識別原理
射頻模塊這塊是采用識別近距離RFID標(biāo)簽并為節(jié)省能源降低功耗,因此選用低頻段RFID技術(shù),選用EM5095芯片作為射頻模塊的主芯片。EM4095是EM MICROELECTRONIC公司開發(fā)的一款CMOS集成的應(yīng)用于100kHz~150kHz頻率的RFID系統(tǒng)的收發(fā)前端芯片,其工作電壓為5V,主要完成的工作是:
EM4095與單片機連接的信號有三個引腳,用于數(shù)據(jù)和時鐘的傳輸以及系統(tǒng)對EM4095的驅(qū)動和控制:
- DEMOD_OUT:輸出信號,為EM4095感應(yīng)到線圈上的AM信號后經(jīng)過解調(diào)后得到的曼徹斯特編碼信號,將之接收并解碼校驗后可得到所讀出的標(biāo)簽的值。
- RDY/CLK:時鐘信號,為EM4095從天線線圈上提取出的經(jīng)過諧振后的時鐘頻率,范圍應(yīng)在100kHz-150kHz,而本文所設(shè)計的系統(tǒng)此頻率在125kHz。
- SHD:休眠控制信號,此引腳為高電平時,EM4095將被強制進入休眠狀態(tài),天線線圈上沒有電流,目的是保護芯片和節(jié)省能源。
- EM4095與單片機的連接方式并不是標(biāo)準(zhǔn)的控制和通信接口,無法利用單片機任何現(xiàn)成的控制和接口單元對其進行驅(qū)動和控制,根據(jù)EM4095的DEMOD_OUT,RDY/CLK和SHD這三個引腳,并按其數(shù)據(jù)手冊上工作原理進行控制。
- DEMOD_OUT為EM4095感應(yīng)到線圈上的AM信號后經(jīng)過解調(diào)后得到的曼徹斯特編碼信號,因此將與DEMOD_OUT引腳連接的單片機的IO設(shè)置為輸入,將曼徹斯特編碼信號讀入到單片機中。
- RDY/CLK為EM4095的時鐘信號,主要是在系統(tǒng)啟動時,檢測EM4095芯片能否正常工作。
- SHD引腳控制的內(nèi)容為EM4095的線圈加電,在不需讀取RFID標(biāo)簽信息時將SHD引腳拉高,線圈未上電,EM4095不工作;在需要讀取RFID標(biāo)簽信息時將SHD引腳拉低,EM4095正常工作
三、源碼分析
檢測方法1).確定起始位,首先要正確找到數(shù)據(jù)1 按規(guī)則下跳為1 上跳為0. 可檢測高電平并等其變低 但這會把0錯檢為1因為0也存在高電平。但是如果檢測到一個周期的高電平(數(shù)據(jù)01)則可 確定找到了數(shù)據(jù)1,找到1后就可以同步了,因為EM4100卡最后一位數(shù)據(jù)就是0正好可以利用 作為判斷的特征。
2).對于數(shù)據(jù)的確定,由于有了同步則可在同步后延時384us即3/4個碼原周期在判斷接受段電平如何 如為高則置數(shù)據(jù)為1,并一直等到低電平的出現(xiàn),相反則等高電平的出現(xiàn),并在此之間插入超時 判斷。這樣,一個完整的數(shù)據(jù)判斷就完成了,并確保數(shù)據(jù)的準(zhǔn)確性,另外這種方法的抗干擾性 會非常好,而如果采用定時同步的話則會因信號的畸變而引起數(shù)據(jù)出錯,整體會導(dǎo)致讀卡幾率降低 但是此程序也有其缺點,因為采用純延時判斷的手段,因此其占用單片機的運行時間比較大。
3).同步后開始接受同步數(shù)據(jù)即9個1,這一部分用一個循環(huán)做,如果出錯則放棄接收
4).同步數(shù)據(jù)接收完后,則開始接受數(shù)據(jù),數(shù)據(jù)分11行5列接收以利于校驗位的判斷 如有出錯則放棄數(shù)據(jù)
5).如一切正常則返回卡號,如因嘗試讀卡次數(shù)到了則返回0以表示沒有識別到標(biāo)簽
//讀取卡號,
ulong Read_Card()
{
uchar i=0; //起始為的計數(shù)值
uchar error; //時間溢出的計數(shù)值
uchar error_flag; //時間溢出標(biāo)志
uchar row,col; //行列寄存器
uchar row_parity; //行校驗寄存器
uchar col_parity[5]; //列校驗寄存器
uchar _data; //數(shù)據(jù)寄存器
ulong temp; //卡號寄存器
ulong timeout=0; //搜索次數(shù)寄存器
while(1)
{
if(timeout==10)return 0;//嘗試10次搜索,如沒有責(zé)返回0
else timeout++;
error=0;
while(Manchester_IN==0)//等高電平
{
if(error==TIME_OF)break;//超時退出
else error++;
}
if(error==100)continue;//結(jié)束本次主循環(huán)
else error=0;
Delay384us();
if(Manchester_IN)//尋找真正的1起始位,利用01的波形確定1起始位,即最后一位加第一位
{
for(i=0;i<8;i++)//判斷是否是真的起始位
{
error=0; //限定等待時間
while(Manchester_IN)
{
if(error==TIME_OF)
{
error_flag=1;//時間溢出
break; //退出
}
else error++;
}
Delay384us(); //延時至下一碼原
if(Manchester_IN&&error_flag==0); //判斷下一位是否為1 和是否沒有時間溢出
else break; //不是1退出,溢出退出
}
if(error_flag)//因時間溢出造成的本次主循環(huán)退出
{
error_flag=0;
continue; //退出本次循環(huán)
}
else;
if(i==8) //起始位接受完并且正確后開始接受數(shù)據(jù)
{
error_flag=0;
error=0; //限定等待時間
while(Manchester_IN)
{
if(error==TIME_OF)
{
error_flag=0;
break; //時間溢出造成的出錯
}
else error++;
}
if(error_flag)
{
error_flag=0;
continue; //因等待待第一個正式數(shù)據(jù)錯誤引起的本次主循環(huán)退出
}
else;
//所有列校驗清零
col_parity[0]=col_parity[1]=col_parity[2]=col_parity[3]=col_parity[4]=0;
for(row=0;row<11;row++) //共11行數(shù)據(jù)
{
for(col=0,row_parity=0/*行校驗清零*/;col<5;col++)//共5列數(shù)據(jù)
{
Delay384us(); //延時至下一碼原
if(Manchester_IN)_data=1; //數(shù)據(jù)為1
else _data=0; //數(shù)據(jù)為0
if(col<4&&row<10) //數(shù)據(jù)區(qū)的接受,后四個字節(jié)
{
temp<<=1; //左移一位
temp+=(ulong)_data; //數(shù)據(jù)相加
}
else;
row_parity+=_data; //行校驗加入數(shù)據(jù)
col_parity[col]+=_data; //相應(yīng)列校驗加入數(shù)據(jù) 雖最后一列沒有校驗但為了方便也加上
error=0; //限定等待時間清零
while(Manchester_IN==(bit)_data)
{
if(error==TIME_OF) //由于時間溢出造成的數(shù)據(jù)出錯
{
error_flag=1;
break; //退出本while循環(huán)
}
else error++;
}
if(error_flag)break; //出錯退出內(nèi)層for循環(huán)
else;
}
if(row<10)//最后一行沒有校驗所以要加限制
{
if((row_parity&0x01)||error_flag) //出錯退出外for循環(huán)
{
temp=0;
error_flag=1;
break; //退出
}
else;
}
else;
}
//對最后接收的列校驗進行判斷,及對來自上面數(shù)據(jù)錯誤error_flag處理以結(jié)束本次主循環(huán)
if(error_flag||((col_parity[0]&0x01)&&(col_parity[1]&0x01)&&(col_parity[2]&0x01)&&(col_parity[3]&0x01)))
{ //最后一列沒有校驗
error_flag=0;
temp=0;
continue; //退出本次循環(huán)
}
else return temp;//將正確的數(shù)據(jù)返回
}
continue;
}
continue;
}
}
四、OLED顯示
OLED顯示貨物識別狀態(tài)信息,采用SPI串口的通訊模式控制數(shù)據(jù)的傳輸和顯示,OLED模塊與單片機連接的引腳共有4個,分別為OLED_RST,OLED_DC,OLED_SCK,OLED_SDA。
- OLED_RST為OLED模塊的復(fù)位引腳,低電平時OLED模塊復(fù)位;
- OLED_DC控制寫入的是數(shù)據(jù)是控制命令還是普通的點陣數(shù)據(jù)。當(dāng)OLED_DC拉高時,寫入的數(shù)據(jù)為顯示的點陣數(shù)據(jù);當(dāng)OLED_DC拉低時,寫入的數(shù)據(jù)為OLED的控制命令;
- OLED_SCK為單片機與OLED通信的時鐘信號線;
- OLED_SDA為單片機與OLED通信的數(shù)據(jù)信號線。
配套資料中有射頻模塊的驅(qū)動程序,歡迎下載。