2018級西電通院微控制專案設計
- 1. 簡要說明
- 2.專案內容
- 2.1專案要求
- 2.2我的想法
- 2.3電子設計
- STM32
- 傳感器
- 光敏傳感器
- 距離傳感器
- 顏色傳感器
- 身份識別(非接觸識別)
- 維護模式
1. 簡要說明
專案設計是西電通院的特色課程,自從16級首次開始做這個,到我們18級現在已經是第三代了,
這個專案是以小組為單位的,一般是5-6人小組,全院打亂隨機分組(據說是會按成績區間分配),由于作業量特別大,所以是要給每個人分配作業,然后最后再完成成品(今年是交的報告和視頻成果),
2.專案內容
2.1專案要求
要求如下





剛開始看這個專案:wdnmd,這也太難了吧,爺要掛科了,
之后趕緊聯系了學長,學長大概和我解釋了下這個專案是如何云云,我稍微對專案該如何完成稍微有一點了解了,然后又仔細看了專案設計的設計指南好幾遍,總結出了一下幾個作業:
1.電子:STM32以及傳感器編程
2.數字電路設計:verilog,主要是驅動伺服電機
3.軟體設計:java語言,做程式的主界面以及里面的操作內容
4.文案:最終報告整合、專利申請書等文案作業
5.網頁設計:做一個靜態web介紹你的公司和產品
6.組裝:應該是所有人一起做,但是今年沒有
7.機械設計:畫機械圖,一共三個,作業大不大
總的來說,前三項任務是比較重的,其他的相對壓力較輕,在第一次會議時,我主動承擔了電子設計以及經理的任務,接下來組里其他同學也確認了自己的任務,
2.2我的想法
作為經理,我當時構思的產品,如下:
1.模塊化功能:即觸摸界面顯示幾個按鍵,表示不同的功能,

2.具體功能:(中英雙語)
2.1學科:語數外物化等,分為網課學習,教材查看,習題練習等
2.1.1網課學習:視頻(快取到本地,點開可以放)
2.1.2教材查看:內容意思一下
2.1.3習題練習(重點):全是選擇題,通過不同色塊代表選項,用RGB顏色檢測器探測,與真實答案比較,成功了發語音(互動),失敗了機械臂揮動
2.2外語:可添加口語功能(如果可實作):用戶可跟讀單詞
2.3學習監督:設定開啟和關閉,自主設定學習時長,若在規定時長內離開(激光測距儀檢測),則機器人揮手,發出警告
2.4智能護眼:設定開啟和關閉,超過限定學習時間,亮燈,發出休息提醒
3.維護模式:
3.1驗證管理員賬號
3.2驗證機器人的各部分是否可以正常作業
3.2.1指定部位機械臂轉動
3.2.2指定部位亮燈
3.2.3讀取激光測距儀資料
3.2.4讀取顏色傳感器資料
網頁設計相關:
1.總體框架按xxx的想法,基本是把內容都填充進去就好
2.需要美工,設計logo,海報,視頻剪輯
FPGA:
主要是舵機控制,即機械臂揮動
FPGA (XC7A35T-1CSG324C)
關于非接觸驗證:
使用多個光敏傳感器和卡插,卡插帶缺口,嵌到傳感器上,缺口可以將光遮擋住,從而輸出0,反之輸出1,由0,1的組合可以確定不同玩家或管理員,0000~1111
這個東西套件里沒有,但是必要,去年不少組都采用此種方式
(我已購買)
關于答題:
選項ABC對應RGB三種色塊,我不太清楚具體如何操作啊,選某個選項肯定是在上位機的螢屏上操作,那么直接在上位機上進行結果判定并反饋不就可了么?(最后壓根沒用這個)
關于互動:
1.stm32給fpga “go”指令,控制電機運行的模式(IO口電平控制)
相當于fpga作用是驅動電機做任意角度轉動(自定),在vivado中封裝好固定的運行狀態,通過stm32電平的組合控制選擇電機運行狀態
DigitalOut(選電機,選模式)
2.stm32給上位機反饋傳感器結果
上位機給stm32輸入指令(COM串口通訊)
3.顏色、距離傳感器都接I2C(I2C通訊)
4.光敏傳感器接AO(數字信號)
DigitalIn(判斷身份)
5.串口助手(USART)
而我技術部分負責的是電子設計,下面我來詳細說明這部分
2.3電子設計
電子設計分為兩部分,一個是STM32,另一個是傳感器設計
STM32
本次專案中使用的是STM32L476單片機,是一款低功耗型的單片機
其中介面如下

1.有兩類介面,一類是arduino配套的,一類是一般的,到時候需要哪個管腳就直接用杜邦線連接
2.所有管腳都有其相對應的功能,例如串口收發/AO/DO/電源等,按照要求連接即可
接著給出微控制器總體運行流程

主函式撰寫規范:
int main(){1
中斷
while(1){2
while(1){3
插卡檢測
if 失敗:回傳檢測
if 成功:繼續執行
while(1){4
if 學習模式 :
while(1){5
switch(各種功能)
5}
else if 維護模式:
while(1){6
switch(各種功能)
6}
else
4}
3}
2}
1}
呼叫函式:
顏色判斷函式
顏色回傳函式
距離回傳函式
選項判斷函式
插卡識別函式
電機控制函式
傳感器
傳感器分為三種,分別為:光敏、距離、顏色傳感器
光敏傳感器
光敏電阻是用硫化隔或硒化隔等半導體材料制成的電阻器,其作業原理是基于內光電效應,隨著光照強度的升高,電阻值迅速降低,由于光照產生的載流子都參與導電,在外加電場的作用下作漂移運動,電子奔向電源的正極,空穴奔向電源的負極,從而使光敏電阻器的阻值迅速下降,其在無光照時,幾乎呈高阻狀態,暗電阻很大,

用這個傳感器,主要是把它作為插卡來進行身份識別的
測驗結果如下:


注意:光敏傳感器輸出的是光強度數值,所以接支持模擬輸出的AO口
距離傳感器
VL6180是飛行時間測距傳感器,傳感器包含一個非常小的激光源和一個匹配的傳感器,VL6180X可以檢測飛行時間,或激光恢復傳感器所需的時間從而計算出距離,因此VL6180X的準確度高,由于傳感器模塊體積小,易于在任何機器人或互動式專案中使用,可以將它與任何3-5V電源或邏輯微控制器一起使用,

用它來檢測用戶距離機器人的距離,若距離適當且超過一定時間,則開啟身份識別界面
顏色傳感器
TCS34725芯片提供紅、綠、藍(RGB)以及明光感應的數字回傳值,TCS34725彩色傳感器有著廣泛的應用,包括RGB LED背光控制、固態照明、健康產品、工業程序控制和醫療診斷設備等,
傳感器回傳四個引數值,分別為顏色引數中的 R, G, B 以及 C 值,根據說明以及我們的測驗,由于距離,環境光線,測量物體的放反光程度等細微差異,輸出的資料會產生一定量的誤差或者偏差,因此在使用本傳感器的程序中,需要對使用環境和處理資料的程序進行一定的調整及優化,以保證最后識別的結果有較高的精度保證,

測驗結果如下:


身份識別(非接觸識別)

機器人擁有非接觸驗證身份功能,故身份識別全部采用硬體完成,
需要使用VL6180x距離傳感器、一個TCS34725顏色傳感器以及四個光敏傳感器組合完成,
我們使用專用的卡插和顏色擋板,光敏傳感器檢測到遮擋物時回傳為0,未檢測到時為1,從而不同卡插可以代表不同身份的用戶,為了驗證管理員身份,我們使用紅色擋板遮蓋顏色傳感器,否則其余時刻用藍色遮擋,
進行身份驗證時,用戶首先將代表身份的卡插和顏色擋板插入機器人指定位置,然后等待距離傳感器判斷用戶是否在機器人面前,等待3s后,微控制器根據傳感器讀取的資料進行身份驗證,從而進入應用界面(學習界面/維護界面),
下面給出微控制器布線結果:

距離傳感器和顏色傳感器連線圖

光敏傳感器連線圖
維護模式
當成功驗證管理員身份后,用戶可以進入維護模式,檢驗各傳感器、led燈、伺服電機的運轉情況,對于fpga,是由微控制提供指令驅動的,故我們給出fpga不同功能對應的電平組合,
對應指令如下:
a:顏色傳感器讀取
b:距離傳感器讀取
c:光敏傳感器讀取
d:led閃爍
e:fpga“00”控制電平
f:fpga“01”控制電平
g:fpga“10”控制電平
h:fpga“11”控制電平
該部分代碼如下:
#include "mbed.h"
#include "stdint.h"
#include <VL6180x.h>
#define VL6180X_ADDRESS 0x29
VL6180xIdentification identification;
// mbed uses 8bit addresses shift address by 1 bit left
VL6180x sensor(A4, A5, VL6180X_ADDRESS<<1);//距離傳感器
Serial pc(SERIAL_TX, SERIAL_RX);
AnalogIn switch1(PA_0); //光敏傳感器
I2C i2c(I2C_SDA, I2C_SCL); //顏色傳感器
int sensor_addr = 41 << 1;
DigitalOut green(LED1);
void ret_rgb(int r,int g,int b) //該函式用于回傳顏色值
{
if (r > g*1.3 && r > b*1.3)
{
pc.printf("red\n");
}
else if (g > r*1.3 && g > b*1.3)
{
pc.printf("green\n");
}
else if (b > r*1.3 && b > g*1.3)
{
pc.printf("blue\n");
}
else
pc.printf("no\n");
wait(0.1);
}
void color_read()
{
//打開顏色傳感器
int r,g,b;
green = 1; // off
pc.baud(9600);
// Connect to the Color sensor and verify whether we connected to the correct sensor.
i2c.frequency(100000);
char id_regval[1] = {146};
char data[1] = {0};
i2c.write(sensor_addr,id_regval,1, true);
i2c.read(sensor_addr,data,1,false);
if (data[0]==68) {
green = 0;
wait (2);
green = 1;
} else {
green = 1;
}
// Initialize color sensor
char timing_register[2] = {129,0};
i2c.write(sensor_addr,timing_register,2,false);
char control_register[2] = {143,0};
i2c.write(sensor_addr,control_register,2,false);
char enable_register[2] = {128,3};
i2c.write(sensor_addr,enable_register,2,false);
// Read data from color sensor (Clear/Red/Green/Blue)
while (true) {
char clear_reg[1] = {148};
char clear_data[2] = {0,0};
i2c.write(sensor_addr,clear_reg,1, true);
i2c.read(sensor_addr,clear_data,2, false);
int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
char red_reg[1] = {150};
char red_data[2] = {0,0};
i2c.write(sensor_addr,red_reg,1, true);
i2c.read(sensor_addr,red_data,2, false);
int red_value = ((int)red_data[1] << 8) | red_data[0];
char green_reg[1] = {152};
char green_data[2] = {0,0};
i2c.write(sensor_addr,green_reg,1, true);
i2c.read(sensor_addr,green_data,2, false);
int green_value = ((int)green_data[1] << 8) | green_data[0];
char blue_reg[1] = {154};
char blue_data[2] = {0,0};
i2c.write(sensor_addr,blue_reg,1, true);
i2c.read(sensor_addr,blue_data,2, false);
int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
// print sensor readings
//pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n", clear_value, red_value, green_value, blue_value);
wait(0.5);
//顏色傳感器顯示資料
r = red_value;
g = green_value;
b = blue_value;
pc.printf("R %d G %d B %d\n ",r,g,b);
//ret_rgb(r,g,b);
}
}
void light_read(){
float s1;
pc.baud(9600);
while(1)
{
s1 = switch1.read();
s1 = s1*5000;
pc.printf("measure = %.0f\n",s1);
wait(0.3);
}
}
void distance_read(){
uint8_t retaddr;
pc.baud(9600);
wait_ms(100); // delay .1s
sensor.getIdentification(&identification); // Retrieve manufacture info from device memory
if(sensor.VL6180xInit() != 0) {
printf("FAILED TO INITALIZE\n"); //Initialize device and check for errors
};
sensor.VL6180xDefautSettings(); //Load default settings to get started.
wait(1);
retaddr=sensor.changeAddress(0x29,0x27);
sensor.getIdentification(&identification); // Retrieve manufacture info from device memory
wait(1);
retaddr=sensor.changeAddress(0x27,0x29);
sensor.getIdentification(&identification); // Retrieve manufacture info from device memory
while(1) {
//Get Distance and report in mm
printf("Distance measured (mm) = ");
printf("%d\n", sensor.getDistance() );
wait_ms(500);
}
}
int main(){
char order = pc.getc();
printf("welcome to the matainance system :\n");
switch(order){
case 'a'://顏色傳感器
color_read();
break;
case 'b'://距離傳感器
distance_read();
break;
case 'c'://光敏傳感器
light_read();
break;
case 'd'://led閃爍
for(int p=0;p<10;p++){
green = ~green;
}
break;
case 'e':
pc.printf("00\n");
break;
case 'f':
pc.printf("01\n");
break;
case 'g':
pc.printf("10\n");
break;
case 'h':
pc.printf("11\n");
break;
}
}
代碼思路比較簡單,主要是定義幾個傳感器如何讀取,并將資料顯示(print)出來,然后主函式用case呼叫即可,FPGA與的stm32互動是用電平控制的,而我們是線上完成,所以無法與FPGA連接,用輸出電平代替給的指令,
當然驅動傳感器這方面有一些麻煩的驅動函式,不過網上都有庫,如看懂函式輸入輸出,直接呼叫即可,自己寫應該不太可能,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262459.html
標籤:其他
上一篇:ESP32開發 2.添加.c.h并修改CMakeLists,來定制自己的工程
下一篇:《拖延心理學》讀后感
