版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章解魔方機(jī)器人設(shè)計(jì)目錄8.1設(shè)計(jì)思想8.2材料清單8.3電路設(shè)計(jì)
8.1設(shè)計(jì)思想
智能機(jī)器人技術(shù)隨著機(jī)器人學(xué)、計(jì)算機(jī)科學(xué)、計(jì)算機(jī)視覺等學(xué)科的發(fā)展,應(yīng)用范圍和使用價(jià)值得到了非常廣泛的關(guān)注和提高,成為當(dāng)今世界高科技領(lǐng)域備受關(guān)注的熱點(diǎn)課題。近年來智能機(jī)器人逐漸走進(jìn)人類的日常生產(chǎn)和生活,而解魔方機(jī)器人因其無與倫比的趣味性和炫酷的交互性,正成為人工智能的研究熱點(diǎn)。由于解魔方機(jī)器人融合了計(jì)算機(jī)視覺、圖像處理、機(jī)器人控制技術(shù)、虛擬現(xiàn)實(shí)交互、魔方算法等多學(xué)科知識(shí),因此實(shí)現(xiàn)一個(gè)快速、穩(wěn)定的解魔方機(jī)器人具有很大的挑戰(zhàn)性。
本項(xiàng)目的魔方機(jī)器人通過設(shè)計(jì)穩(wěn)定的機(jī)械結(jié)構(gòu),采用當(dāng)今世界上復(fù)原步數(shù)最少的Kociemba算法,優(yōu)化傳統(tǒng)的通過設(shè)定閾值的顏色識(shí)別策略,極大提高了整個(gè)系統(tǒng)工作的穩(wěn)定性。通過優(yōu)化魔方復(fù)原指令解析算法,進(jìn)一步減少了魔方復(fù)原指令解析得到的舵機(jī)執(zhí)行步數(shù)。魔方機(jī)器人在復(fù)原魔方的快速性和穩(wěn)定性兩方面都達(dá)到了很好的效果,復(fù)原魔方平均不會(huì)超過70秒,達(dá)到了魔方機(jī)器人設(shè)計(jì)的預(yù)期。通過本項(xiàng)目的訓(xùn)練可以鍛煉學(xué)生的電路連接、元器件搭載、程序調(diào)試、傳感器運(yùn)用、算法調(diào)用及優(yōu)化等多方面能力,能夠?qū)⒐た茖W(xué)生之前學(xué)到的相關(guān)課程進(jìn)行一次梳理和整合,教會(huì)學(xué)生如何學(xué)以致用,并能夠激發(fā)學(xué)生的學(xué)習(xí)興趣和創(chuàng)新熱情。8.2材料清單材料清單如表8-1所示
表8-1材料清單上述清單中的材料中有幾處需要特別注意:1.第2,3,4項(xiàng)本項(xiàng)目使用的是自行建模3D打印的零件,主要目的是降低開發(fā)成本。如果有同學(xué)想追求更好的性能,可以聯(lián)系淘寶進(jìn)行定制,定制件具有精準(zhǔn)性更高等優(yōu)點(diǎn)。2.第7項(xiàng)中的數(shù)字舵機(jī),各位同學(xué)也可以根據(jù)實(shí)際需求選擇市面上的數(shù)字舵機(jī),推薦使用NG995,55g舵機(jī),本舵機(jī)可以在同等電壓下旋轉(zhuǎn)180度的時(shí)間更短,極大地提升了魔方的還原速度。但是不建議同學(xué)們選用模擬舵機(jī),因?yàn)槟M舵機(jī)需要不斷的接受舵機(jī)控制器發(fā)送的PWM信號(hào)才能保持鎖定角度,完成相應(yīng)的操作,并且精度較差,線性度很難達(dá)標(biāo)。而數(shù)字舵機(jī)僅需接受一次舵機(jī)控制器傳遞的PWM信號(hào)就可以鎖定角度不變,控制精度較高、線性度良好、相應(yīng)速度快,能夠完成本項(xiàng)目的各項(xiàng)功能需要。特別值得注意的是,并不是舵機(jī)的轉(zhuǎn)動(dòng)角度越大越好,同學(xué)們不要選用360度舵機(jī),因?yàn)槟壳笆忻娴臒o死角舵機(jī)絕大部分無法接受PWM信號(hào)控制,不能鎖定角度不變,一經(jīng)上電會(huì)不停旋轉(zhuǎn)。3.本項(xiàng)目1和22項(xiàng)為特殊定制件。需要同學(xué)們注意相關(guān)的細(xì)節(jié)問題,以免由于個(gè)人疏忽造成不必要的經(jīng)濟(jì)損失。4.第36項(xiàng)是STM32系統(tǒng)的專用仿真器,仿真器購買時(shí)需注意對(duì)應(yīng)的型號(hào)和相應(yīng)配置,如果型號(hào)和stm32開發(fā)板不匹配則無法進(jìn)行數(shù)據(jù)的下載和導(dǎo)入。8.3機(jī)械零件設(shè)計(jì)以下為亞克力定制工程圖,因?yàn)榭紤]項(xiàng)目整體的可塑性和便攜性,不建議用鋼板、塑料等其他材料。選用亞克力板作為本設(shè)計(jì)的底盤是因其材料具有較好的透明性、易加工、不容易變形,表面光澤度較高,成本相對(duì)較低等優(yōu)點(diǎn)。滑塊增高塊圖如圖8-1所示、機(jī)械手工程圖如圖8-2所示、基板工程圖如圖8-3所示、基板工程圖細(xì)節(jié)如圖8-4所示。
圖8-1滑塊增高塊圖
圖8-2機(jī)械手工程圖
圖8-3基板工程圖
圖8-4基板工程圖細(xì)節(jié)
圖紙中所有單位均為
mm,比例為
1:1,透明亞克力材質(zhì)。
具體參數(shù)要求:
1.滑塊增高塊厚度為
30mm,數(shù)量4個(gè)。
2.機(jī)械手厚度為10mm,數(shù)量4個(gè)。
3.基板厚度為8mm,數(shù)量1個(gè)。
本項(xiàng)目的連接條和轉(zhuǎn)魔方的機(jī)械手根據(jù)硬度和韌性的要求選擇使用PLA材料。即通過自主建模,通過3D打印制作完成。以下為3D打印件工程圖。連接條如圖8-5所示,機(jī)械手如圖8-6所示。圖8-5連接條圖8-6機(jī)械手進(jìn)行3D打印材料時(shí),應(yīng)該盡量選用質(zhì)量好的PLA耗材,這樣才能保證成品的質(zhì)量。一般耗材選擇1.75MM,公差不超過±0.02mm的材料。另外,3D打印機(jī)原則上是選用精度越高的越好,但是同學(xué)們往往接觸到的都是入門級(jí)別的設(shè)上述零件圖各插口沒有做的特別細(xì)小,一般的打印機(jī)都可以完成。上述零件打印的最低要求標(biāo)準(zhǔn)是機(jī)器打印精度0.2mm,打印層高0.4mm8.4電路設(shè)計(jì)8.4.1硬件框圖1.魔方機(jī)器人設(shè)計(jì)方案主要的系統(tǒng)組成
手機(jī)app主要功能是顏色識(shí)別過程中獲取魔方六個(gè)面的六張圖片,STM32通過控制舵機(jī)讓魔方旋轉(zhuǎn)到特定的角度,ArduinoMega2560實(shí)現(xiàn)了STM32和各個(gè)傳感模塊之間的數(shù)據(jù)交換,其通過控制藍(lán)牙模塊實(shí)現(xiàn)了人對(duì)魔方機(jī)器人的各種控制,并利用藍(lán)牙手機(jī)端APP來完成魔方復(fù)原的核心工作。魔方復(fù)原全過程如圖8-8所示。圖8-8魔方復(fù)原全過程
圖8-9魔方機(jī)器人硬件電路框圖設(shè)計(jì)
硬件電路設(shè)計(jì)部分主要是STM32和Arduino進(jìn)行數(shù)據(jù)交換,通過視覺模塊將信息逐步傳遞,根據(jù)移植的相應(yīng)算法進(jìn)行計(jì)算,將具體的步驟以指令的形式轉(zhuǎn)給主控器,主控器將具體命令通過藍(lán)牙模塊發(fā)出,驅(qū)動(dòng)舵機(jī)運(yùn)作,最終實(shí)現(xiàn)對(duì)魔方的轉(zhuǎn)動(dòng)。如圖8-9所示。7.4V的鋰電池為整個(gè)STM32和2560硬件系統(tǒng)供電,經(jīng)XL4015E1穩(wěn)壓電路降為6.0V為舵機(jī)供電,AMS1117穩(wěn)壓電路將鋰電池電壓降為3.3V為STM32和2560供電。藍(lán)牙串口模塊可以實(shí)現(xiàn)藍(lán)牙協(xié)議和串口協(xié)議的轉(zhuǎn)換,很方便地實(shí)現(xiàn)了STM32和2560進(jìn)行數(shù)據(jù)傳輸。本項(xiàng)目用舵機(jī)兩兩一組構(gòu)成曲柄滑塊的機(jī)械結(jié)構(gòu)作為復(fù)原魔方的機(jī)械手,8個(gè)舵機(jī)構(gòu)成四組機(jī)械手。硬件系統(tǒng)實(shí)物圖如圖8-10所示。圖8-10魔方機(jī)器人硬件系統(tǒng)實(shí)物圖STM32和2560電路模塊設(shè)計(jì)
魔方機(jī)器人的電路設(shè)計(jì)較為簡(jiǎn)單,本文只簡(jiǎn)要介紹
XL4015E1
穩(wěn)壓電路圖8-11XL4015E1
穩(wěn)壓電路本項(xiàng)目使用的舵機(jī)的驅(qū)動(dòng)電流較大,每個(gè)舵機(jī)的驅(qū)動(dòng)電流大約為500mA,8個(gè)舵機(jī)同時(shí)驅(qū)動(dòng)需要至少4A的驅(qū)動(dòng)電流,,舵機(jī)的驅(qū)動(dòng)電壓為4.8V-6.5V。XL4015E1是一款輸出電壓可調(diào)的開關(guān)電源穩(wěn)壓器,最大輸出電流為5A,輸出電壓為1.25V-32V,可以滿足舵機(jī)的驅(qū)動(dòng)電流和電壓需求。XL4015E1開關(guān)頻率為180KHZ,能量轉(zhuǎn)換效率高達(dá)96%,負(fù)載調(diào)整率<0.8%,電壓調(diào)整率<0.8%。圖8-11是XL4015E1穩(wěn)壓電路的原理圖。輸出電壓的計(jì)算公式為:VOUT=1.25*(1+R1/R2)公式中1.25為參考電壓,單位為V,R1的阻值為固定值10K,R2為可調(diào)電阻,最大阻值為10K,當(dāng)輸出電壓為6.0V時(shí),R2的阻值約為2.6K。8.4.2
魔方算法Kociemba算法及其優(yōu)化本圖是本文移植的Kociemba算法Java測(cè)試軟件。按鈕Scramble可以隨機(jī)打亂一個(gè)魔方,并在界面中顯示出來,MoveLimit設(shè)定復(fù)原魔方公式的最大步數(shù),TimeLimit設(shè)定復(fù)原的最大時(shí)間。按鈕SolveCube運(yùn)行Kociemba算法并生成復(fù)原公式,當(dāng)超過設(shè)定的時(shí)間還沒有解算出來或者設(shè)定的步數(shù)過短時(shí),軟件會(huì)有提示。圖8-12
測(cè)試軟件主界面測(cè)試軟件的主界面是魔方六個(gè)面的展開圖,如圖8-12所示。魔方中心塊上的字母代表這個(gè)面所處的方位:F(front)代表前面,B(back)代表后面,L(left)代表左面,R(right)代表右面,U(up)代表上面,D(down)代表下面。一個(gè)魔方共有6種顏色,某種顏色的顏色標(biāo)號(hào)用中心塊為該顏色的面所處的方位(F、B、L、R、U、D)來表示。Kociemba算法的輸入?yún)?shù)即為魔方54個(gè)顏色塊的標(biāo)號(hào)排列,顏色標(biāo)號(hào)的排列按照一定的順序,六個(gè)面的順序依次為上、右、前、下、左、后,每個(gè)面的標(biāo)號(hào)排列按照從上到下,從左到右的順序。8.4.3Kociemba算法的優(yōu)化Kociemba魔方復(fù)原算法運(yùn)行時(shí),總會(huì)挑選近似最優(yōu)的解輸出。據(jù)多次(大于15次)測(cè)試統(tǒng)計(jì),單次運(yùn)行算法時(shí),輸出的復(fù)原公式平均有21步,舵機(jī)執(zhí)行此復(fù)原公式的平均步數(shù)為144步。算法運(yùn)行一次輸出是近似最優(yōu)解,解算時(shí)間平均為10ms。為了取得最優(yōu)的復(fù)原公式,系統(tǒng)在保證時(shí)間高效的同時(shí),必須尋找出最優(yōu)解。正常情況下,運(yùn)行時(shí)間越長,Kociemba魔方復(fù)原算法更有可能取得最優(yōu)解。當(dāng)運(yùn)行Kociemba算法時(shí)間足夠長時(shí),一定會(huì)找出最優(yōu)解,最優(yōu)解能通過減少舵機(jī)執(zhí)行步數(shù)來縮短魔方復(fù)原時(shí)間。但是減少的時(shí)間能不能抵消掉Kociemba算法多次運(yùn)行帶來的時(shí)間消
耗,這個(gè)還需要數(shù)據(jù)的測(cè)試。為了測(cè)試以取得最優(yōu)模型,我們?cè)黾恿恕跋迺r(shí)取解”的邏輯:讓Kociemba算法連續(xù)運(yùn)行t秒的時(shí)間,獲取得到最優(yōu)解,然后通過對(duì)比尋找最優(yōu)解的時(shí)間消耗與最優(yōu)解帶來的的時(shí)間收益,來判斷“限時(shí)取解”是否是一種可行的方法。測(cè)試過程中,我們?nèi)∠拗茣r(shí)間t為0.4S和遠(yuǎn)大于0.4S的時(shí)間,如5S,同時(shí)我們統(tǒng)計(jì)出每次運(yùn)行算法得到的復(fù)原公式對(duì)應(yīng)的舵機(jī)步數(shù)。
通過多次測(cè)試統(tǒng)計(jì)得出:1.Kociemba算法連續(xù)運(yùn)行0.4秒或超過0.4秒的時(shí),能獲取到最優(yōu)解,并且運(yùn)行0.4秒與運(yùn)行超過0.4秒兩種情形下取得的最優(yōu)解執(zhí)行效率相差不大。2.連續(xù)運(yùn)行0.4秒時(shí),Kociemba算法取得的最優(yōu)解大大減少了舵機(jī)運(yùn)行步數(shù),舵機(jī)執(zhí)行最優(yōu)解時(shí)平均步數(shù)為116步,最優(yōu)解帶來的時(shí)間收益大于尋找最優(yōu)解花費(fèi)的時(shí)間消耗?;谝陨蟽蓚€(gè)特點(diǎn)可以推斷出:連續(xù)運(yùn)行0.4秒的時(shí)間,足以使Kociemba算法找出魔方復(fù)原的最優(yōu)解,所以“限時(shí)取解”模型是一種可行的方法。當(dāng)限制時(shí)間t等于0.4S時(shí),對(duì)“限時(shí)取解”模型的優(yōu)化效果做了測(cè)試,從圖中可以看出,平均舵機(jī)步數(shù)優(yōu)化比例為20%,優(yōu)化效果較為可觀。Kociemba算法限時(shí)取解測(cè)試數(shù)據(jù)如圖8-13所示。圖8-13Kociemba
算法限時(shí)取解測(cè)試數(shù)據(jù)8.4.4魔方復(fù)原指令的優(yōu)化
魔方機(jī)器人有兩套指令系統(tǒng),第一套指令系統(tǒng)是現(xiàn)在世界各地的解魔方教程中所使用的一套復(fù)原指令系統(tǒng),也就是Kociemba算法得到的復(fù)原指令中使用的指令系統(tǒng),第二套指令系統(tǒng)是我們的魔方機(jī)器人在執(zhí)行魔方復(fù)原時(shí)用到的指令系統(tǒng)。其實(shí)對(duì)于復(fù)原指令優(yōu)化程序來說,一方面是通過優(yōu)化指令縮短魔方復(fù)原的時(shí)間,另一方面也是把第一套指令系統(tǒng)轉(zhuǎn)變?yōu)榈诙字噶钕到y(tǒng),這樣STM32才能在接收到指令后進(jìn)行解析,復(fù)原魔方。所以第一套指令系統(tǒng)我們稱為未優(yōu)化指令系統(tǒng),第二套指令系統(tǒng)我們稱為優(yōu)化后指令系統(tǒng)。
未優(yōu)化指令系統(tǒng)圖表給出了魔方機(jī)器人的未優(yōu)化指令系統(tǒng),共有18種單指令。表中字母L(left)代表左面,R(right)代表右面,F(xiàn)(front)代表前面,B(back)代表后面,U(up)代表上面,D(dowm)代表下面。字母后面加’代表逆時(shí)針旋轉(zhuǎn)90度,例如F’表示將魔方的前面逆時(shí)針旋轉(zhuǎn)90度,單獨(dú)一個(gè)字母表示順時(shí)針旋轉(zhuǎn)90度,字母后面有數(shù)字2表示將相應(yīng)的面旋轉(zhuǎn)180度,由于逆時(shí)針旋轉(zhuǎn)180度和順時(shí)針旋轉(zhuǎn)180度的效果是一樣的,所以不做區(qū)分。
優(yōu)化后指令系統(tǒng)
此圖表給出了魔方機(jī)器人優(yōu)化后指令系統(tǒng),共有16種單指令。指令系統(tǒng)中所有和未優(yōu)化指令系統(tǒng)相同的指令表示的含義也相同,優(yōu)化后指令系統(tǒng)中字母后面加^和未優(yōu)化指令系統(tǒng)中單字母表示的含義相同。兩個(gè)字母相同的代表翻轉(zhuǎn)指令,例如:LL代表把魔方向左翻轉(zhuǎn)90度。8.4.5硬件系統(tǒng)連接1.下位機(jī)連接如下圖8-14所示、圖8-14下位機(jī)連接圖此處同學(xué)們需要注意的是電源端的地線必須和stm32的GND相連舵機(jī)信號(hào)線分別連接PA1到PA8Stm32單片機(jī)驅(qū)動(dòng)舵機(jī)代碼:編程環(huán)境為keil使用語言為c語言。作者使用的軟件版本為Vision4,具體內(nèi)容如下。#include"stm32f10x.h"#include"movement.h"#include"motor.h"#include"usart.h"#include"instruction.h“staticconstu16original_position[4]={1430,1440,1390,1500};staticconstu16clockwise90_position[4]={580,540,545,660};staticconstu16anticlockwise90_position[4]={2310,2440,2345,2470};staticconstu16clockwise180_position[4]={2270,2310,2340,2340};staticconstu16wrasp_position[4]={1940,1638,1780,1678};staticconstu16loosen_position[4]={1410,1155,1230,1125};
u16lines_num=0;u16initial_position[8];u16firpic_position[5][8];u16secpic_position[2][8];u16thirpic_position[5][8];u16fourpic_position[2][8];u16fifpic_position[5][8];u16sixpic_position[2][8];u16retuinit_position[5][8];u16r_clockwise90[4][8];u16l_clockwise90[4][8];u16f_clockwise90[4][8];u16b_clockwise90[4][8];u16r_anticlockwise90[4][8];u16l_anticlockwise90[4][8];u16f_anticlockwise90[4][8];u16b_anticlockwise90[4][8];u16r_clockwise180[4][8];u16l_clockwise180[4][8];u16f_clockwise180[4][8];u16b_clockwise180[4][8];
u16overturnto_f[6][8];u16overturnto_b[6][8];u16overturnto_l[6][8];u16overturnto_r[6][8]voidInit_TotalArray(void){ Calcul_InitPosition(); Calcul_FirPicPosition();Calcul_SecPicPosition();Calcul_ThirPicPosition();Calcul_FourPicPosition();
Calcul_SixPicPosition();
RetuIni_AftPic(); Calcul_Lclockwise90(); Calcul_Rclockwise90(); Calcul_Fclockwise90(); Calcul_Bclockwise90();Calcul_Lanticlockwise90(); Calcul_Ranticlockwise90(); Calcul_Fanticlockwise90(); Calcul_Banticlockwise90();Calcul_Lclockwise180();Calcul_Rclockwise180(); Calcul_Fclockwise180(); Calcul_Bclockwise180();
Calcul_OverturntoB(); Calcul_OverturntoF(); Calcul_OverturntoL(); Calcul_OverturntoR();
voidCalcul_InitPosition(void){ u8i,j; for(i=0;i<4;i++) {nitial_position[i]=original_position[i]; } for(i=4,j=0;i<8;i++,j++) { initial_position[i]=wrasp_position[j];
}
}voidInit_MotorMovement(void){
u8i;for(i=0;i<8;i++) { pos[0][i]=initial_position[i]; }for(i=0;i<4;i++)
{ pos[1][i]=initial_position[i]; }
for(i=0;i<4;i++) {
pos[1][i+4]=loosen_position[i]; } lines_num=1; }
voidCalcul_FirPicPosition(void){ u8i;for(i=0;i<8;i++)
{firpic_position[0][i]=initial_position[i];
}for(i=0;i<8;i++)
{ firpic_position[1][i]=initial_position[i]; } firpic_position[1][5]=loosen_position[1]; firpic_position[1][7]=loosen_position[3];
for(i=0;i<8;i++) {firpic_position[2][i]=initial_position[i]; } for(i=0;i<8;i++) {
firpic_position[3][i]=firpic_position[2][i]; } firpic_position[3][5]=loosen_position[1]; firpic_position[3][7]=loosen_position[3];for(i=0;i<8;i++) {firpic_position[4][i]=firpic_position[3][i];
}
firpic_position[4][0]=clockwise90_position[0]; firpic_position[4][2]=anticlockwise90_position[2];}voidCalcul_SecPicPosition(void){ u8i; for(i=0;i<8;i++){secpic_position[0][i]=firpic_position[4][i];
}for(i=0;i<8;i++) {secpic_position[1][i]=secpic_position[0][i];
}secpic_position[1][0]=anticlockwise90_position[0];secpic_position[1][2]=clockwise90_position[2]; }voidCalcul_ThirPicPosition(void){ u8i; for(i=0;i<8;i++) { thirpic_position[0][i]=secpic_position[1][i];}
for(i=0;i<8;i++)
{
thirpic_position[1][i]=thirpic_position[0][i]; }thirpic_position[1][5]=wrasp_position[1];thirpic_position[1][7]=wrasp_position[3];for(i=0;i<8;i++) {thirpic_position[2][i]=thirpic_position[1][i]; } thirpic_position[2][4]=loosen_position[0]; thirpic_position[2][6]=loosen_position[2];for(i=0;i<8;i++){thirpic_position[3][i]=thirpic_position[2][i];}
thirpic_position[3][0]=original_position[0]; thirpic_position[3][2]=original_position[2]; for(i=0;i<8;i++) {thirpic_position[4][i]=thirpic_position[3][i];}
thirpic_position[4][1]=clockwise90_position[1]; thirpic_position[4][3]=anticlockwise90_position[3];
}voidCalcul_FourPicPosition(void){
u8i; for(i=0;i<8;i++){ fourpic_position[0][i]=thirpic_position[4][i];
}
for(i=0;i<8;i++){
fourpic_position[1][i]=fourpic_position[0][i];
}
fourpic_position[1][1]=anticlockwise90_position[1]; fourpic_position[1][3]=clockwise90_position[3];
}voidCalcul_FifPicPosition(void){
u8i; for(i=0;i<8;i++)
{fifpic_position[0][i]=fourpic_position[1][i];}for(i=0;i<8;i++){ fifpic_position[1][i]=fifpic_position[0][i]; }fifpic_position[1][4]=wrasp_position[0];
fifpic_position[1][6]=wrasp_position[2]; for(i=0;i<8;i++){
fifpic_position[2][i]=fifpic_position[1][i];}
fifpic_position[2][5]=loosen_position[1]; fifpic_position[2][7]=loosen_position[3]; for(i=0;i<8;i++) { fifpic_position[3][i]=fifpic_position[2][i];
}fifpic_position[3][1]=original_position[1]; fifpic_position[3][3]=original_position[3]; for(i=0;i<8;i++) {fifpic_position[4][i]=fifpic_position[3][i];
} fifpic_position[4][0]=clockwise90_position[0]; fifpic_position[4][2]=anticlockwise90_position[2];}voidCalcul_SixPicPosition(void){u8i;
for(i=0;i<8;i++){
sixpic_position[0][i]=fifpic_position[4][i]; }for(i=0;i<8;i++) { sixpic_position[1][i]=sixpic_position[0][i];
} sixpic_position[1][0]=anticlockwise90_position[0] sixpic_position[1][2]=clockwise90_position[2]; }voidRetuIni_AftPic(void){
u8i;for(i=0;i<8;i++){ retuinit_position[0][i]=sixpic_position[1][i]; } for(i=0;i<8;i++){
retuinit_position[1][i]=retuinit_position[0][i];} retuinit_position[1][5]=wrasp_position[1];retuinit_position[1][7]=wrasp_position[3];for(i=0;i<8;i++)
{ retuinit_position[2][i]=retuinit_position[1][i];
}retuinit_position[2][4]=loosen_position[0];retuinit_position[2][6]=loosen_position[2];for(i=0;i<8;i++){retuinit_position[3][i]=retuinit_position[2][i];}retuinit_position[3][0]=original_position[0];retuinit_position[3][2]=original_position[2];for(i=0;i<8;i++){ retuinit_position[4][i]=retuinit_position[3][i];}retuinit_position[4][4]=wrasp_position[0];retuinit_position[4][6]=wrasp_position[2];}
voidPicArray_ToBufferArray(u16(*array)[8],u16arrayline_num){
u8i,j;lines_num=arrayline_num; for(j=0;j<=lines_num;j++){for(i=0;i<8;i++){ pos[j][i]=*(*(array+j)+i); }}
}voidCalcul_Lclockwise90(void){ u8i; for(i=0;i<8;i++) {l_clockwise90[0][i]=initial_position[i];
} l_clockwise90[0][1]=anticlockwise90_position[1];for(i=0;i<8;i++){
l_clockwise90[1][i]=l_clockwise90[0][i];
} l_clockwise90[1][5]=loosen_position[1];for(i=0;i<8;i++){l_clockwise90[2][i]=l_clockwise90[1][i];}
l_clockwise90[2][1]=original_position[1];for(i=0;i<8;i++){
l_clockwise90[3][i]=l_clockwise90[2][i];
}l_clockwise90[3][5]=wrasp_position[1]; }voidCalcul_Lanticlockwise90(void){
u8i;
for(i=0;i<8;i++) {l_anticlockwise90[0][i]=initial_position[i];
} l_anticlockwise90[0][1]=clockwise90_position[1]; for(i=0;i<8;i++) { l_anticlockwise90[1][i]=l_anticlockwise90[0][i];
} l_anticlockwise90[1][5]=loosen_position[1];
for(i=0;i<8;i++){
l_anticlockwise90[2][i]=l_anticlockwise90[1][i];
}
l_anticlockwise90[2][1]=original_position[1];for(i=0;i<8;i++) { l_anticlockwise90[3][i]=l_anticlockwise90[2][i];
} l_anticlockwise90[3][5]=wrasp_position[1];}voidCalcul_Lclockwise180(void){u8i; for(i=0;i<8;i++){
l_clockwise180[0][i]=initial_position[i]; }
l_clockwise180[0][1]=clockwise180_position[1];for(i=0;i<8;i++){
l_clockwise180[1][i]=l_clockwise180[0][i];}
l_clockwise90[1][5]=loosen_position[1];for(i=0;i<8;i++) { l_clockwise180[2][i]=l_clockwise180[1][i];}
l_clockwise180[2][1]=original_position[1]; for(i=0;i<8;i++){
l_clockwise180[3][i]=l_clockwise180[2][i];
} l_clockwise180[3][5]=wrasp_position[1];}
voidCalcul_OverturntoL(void){
u8i;for(i=0;i<8;i++) { overturnto_l[0][i]=initial_position[i];}
overturnto_l[0][5]=loosen_position[1];
overturnto_l[0][7]=loosen_position[3];for(i=0;i<8;i++){overturnto_l[1][i]=overturnto_l[0][i];}
overturnto_l[1][0]=anticlockwise90_position[0];
overturnto_l[1][2]=clockwise90_position[2];
for(i=0;i<8;i++){
overturnto_l[2][i]=overturnto_l[1][i];
}overturnto_l[2][5]=wrasp_position[1]; overturnto_l[2][7]=wrasp_position[3];for(i=0;i<8;i++){
overturnto_l[3][i]=overturnto_l[2][i];}
overturnto_l[3][4]=loosen_position[0];
overturnto_l[3][6]=loosen_position[2];
for(i=0;i<8;i++){
overturnto_l[4][i]=overturnto_l[3][i];} overturnto_l[4][0]=original_position[0]; overturnto_l[4][2]=original_position[2]; for(i=0;i<8;i++){overturnto_l[5][i]=overturnto_l[4][i];}overturnto_l[5][4]=wrasp_position[0]; overturnto_l[5][6]=wrasp_position[2];}voidCalcul_Rclockwise90(void){
u8i; for(i=0;i<8;i++){
r_clockwise90[0][i]=initial_position[i];}
r_clockwise90[0][3]=anticlockwise90_position[3]; for(i=0;i<8;i++){
r_clockwise90[1][i]=r_clockwise90[0][i];}
r_clockwise90[1][7]=loosen_position[3]; for(i=0;i<8;i++){r_clockwise90[2][i]=r_clockwise90[1][i];}r_clockwise90[2][3]=original_position[3];for(i=0;i<8;i++){r_clockwise90[3][i]=r_clockwise90[2][i];}
r_clockwise90[3][7]=wrasp_position[3];}voidCalcul_Ranticlockwise90(void){
u8i; for(i=0;i<8;i++){r_anticlockwise90[0][i]=initial_position[i]; }r_anticlockwise90[0][3]=clockwise90_position[3]; for(i=0;i<8;i++){ r_anticlockwise90[1][i]=r_anticlockwise90[0][i];} r_anticlockwise90[1][7]=loosen_position[3]; for(i=0;i<8;i++){ r_anticlockwise90[2][i]=r_anticlockwise90[1][i];
} r_anticlockwise90[2][3]=original_position[3];for(i=0;i<8;i++) {
r_anticlockwise90[3][i]=r_anticlockwise90[2][i];
} r_anticlockwise90[3][7]=wrasp_position[3];}voidCalcul_Rclockwise180(void){ u8i; for(i=0;i<8;i++){r_clockwise180[0][i]=initial_position[i];}
r_clockwise180[0][3]=clockwise180_position[3];
for(i=0;i<8;i++){
r_clockwise180[1][i]=r_clockwise180[0][i];}
r_clockwise180[1][7]=loosen_position[3];}
void
TIM4_Int_Init(u16
arr,u16
psc)
{
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
NVIC_InitTypeDef
NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,
ENABLE);TIM_TimeBaseStructure.TIM_Period
=
arr;
TIM_TimeBaseStructure.TIM_Prescaler
=psc;
TIM_TimeBaseStructure.TIM_ClockDivision
=
TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode
=
TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,
&TIM_TimeBaseStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE
);
NVIC_InitStructure.NVIC_IRQChannel
=
TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
=
0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
=
2;
NVIC_InitStructure.NVIC_IRQChannelCmd
=
ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM4,
DISABLE);
}void
TIM3_Set_Time(u16
arr)
{
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
arr--;
TIM_TimeBaseStructure.TIM_Period
=
arr;
TIM_TimeBaseStructure.TIM_Prescaler
=71;
TIM_TimeBaseInit(TIM3,
&TIM_TimeBaseStructure);
}
void
TIM4_Set_Time(u16
arr)
{
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
arr--;
TIM_TimeBaseStructure.TIM_Period
=
arr;
void
TIM3_IRQHandler(void)
{
static
u8
i=1;
if
(TIM_GetITStatus(TIM3,
TIM_IT_Update)
!=
RESET)
{flag_vpwm=1;
switch(i)
{case
1:
{PWM1=1;
TIM3_Set_Time(pwm[0]);
}
break;
case
2:
{
PWM1=0;
TIM3_Set_Time(2500-pwm[0]);
flag_vpwm=1;
}
break;
case
3:
{
PWM2=1;
TIM3_Set_Time(pwm[1]);
}
break;
case
4:
{PWM2=0;
TIM3_Set_Time(2500-pwm[1]);
flag_vpwm=1;
}
break;
case
5:
{
PWM3=1;
TIM3_Set_Time(pwm[2]);
}
break;
case
6:
{
PWM3=0;
TIM3_Set_Time(2500-pwm[2]);
flag_vpwm=1;
}break;
case
7:
{
PWM4=1;
TIM3_Set_Time(pwm[3]);
}break;
case
8:
{
PWM4=0;
TIM3_Set_Time(2500-pwm[3]);
flag_vpwm=1;
}break;
case
9:
{
PWM5=1;
TIM3_Set_Time(pwm[4]);
}break;
case
10:
{PWM5=0;
TIM3_Set_Time(2500-pwm[4]);
flag_vpwm=1;
}break;
case
11:
{
PWM6=1;
TIM3_Set_Time(pwm[5]);
}break;
case
12:
{
PWM6=0;
TIM3_Set_Time(2500-pwm[5]);
flag_vpwm=1;
}break;
case
13:
{
PWM7=1;
TIM3_Set_Time(pwm[6]);
}break;
case
14:
{
PWM7=0;
TIM3_Set_Time(2500-pwm[6]);
flag_vpwm=1;
}break;
case
15:
{
PWM8=1;
TIM3_Set_Time(pwm[7]);
}break;
case
16:
{PWM8=0;
TIM3_Set_Time(2500-pwm[7]);
flag_vpwm=1;
i=0;
}break;
default:break;
}
i++;
}
2.ArduinoMega2560和STM32硬件連接圖
連接圖如圖8-15所示。圖8-15ArduinoMega2560和stm32通信圖ArduinoMega2560的調(diào)試代碼如下:intIntly=Serial1.read();Intabcd=Serial.read();voidsetup(){Serial.begin(9600);Serial1.begin(9600);}voidloop(){//putyourmaincodehere,torunrepeatedly:Serial.print(ly);//Serial1.print(abcd);}Stm32代碼:#if1#pragmaimport(__use_no_semihosting)struct__FILE{ inthandle;};
FILE__stdout;_sys_exit(intx){ x=x;}
intfputc(intch,FILE*f){ while((USART1->SR&0X40)==0);USART1->DR=(u8)ch; returnch;}#endifvoidUSART1_Config(void){ GPIO_InitTypeDefGPIO_InitStructure; USART_InitTypeDefUSART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_Init(USART1,&USART_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); /*EnablesUSART1interrupts,USART_IT_RXNE:ReceiveDataregisternotemptyinterrupt*/ USART_Cmd(USART1,ENABLE);
NVIC_USART1_Configuration();
}
u8num_to_asc(u8num) { u8asc; switch(num) {case0:asc=0x30;break; case1:asc=0x31;break; case2:asc=0x32;break; case3:asc=0x33;break; case4:asc=0x34;break; case5:asc=0x35;break; case6:asc=0x36;break; case7:asc=0x37;break; case8:asc=0x38;break; case9:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024某影視公司與某音頻公司關(guān)于影視作品音頻制作之合同
- 2025年度數(shù)據(jù)中心房屋租賃及電力設(shè)備供應(yīng)合同4篇
- 2025年度智慧城市大數(shù)據(jù)分析服務(wù)合同4篇
- 2025年度幼兒園幼兒保健服務(wù)承包合同:健康護(hù)航協(xié)議4篇
- 2024版項(xiàng)目委托融資服務(wù)協(xié)議書
- 2025年度文化產(chǎn)業(yè)項(xiàng)目投資合同3篇
- 2025年度智能電網(wǎng)建設(shè)出資協(xié)議參考文本4篇
- 2025年度商場(chǎng)櫥窗窗簾設(shè)計(jì)安裝與廣告合作合同3篇
- 2025年度新能源汽車充電設(shè)施代付款協(xié)議4篇
- 《建筑業(yè)稅收政策培訓(xùn)教學(xué)課件》
- JTG-T-F20-2015公路路面基層施工技術(shù)細(xì)則
- 光伏發(fā)電站集中監(jiān)控系統(tǒng)通信及數(shù)據(jù)標(biāo)準(zhǔn)
- 建筑垃圾減排及資源化處置措施
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫附答案
- 中西方校服文化差異研究
- 2024年一級(jí)建造師考試思維導(dǎo)圖-市政
- 高壓架空輸電線路反事故措施培訓(xùn)課件
- 隱私計(jì)算技術(shù)與數(shù)據(jù)安全保護(hù)
- 人教版小學(xué)數(shù)學(xué)五年級(jí)上冊(cè)口算題卡
- 《子宮肉瘤》課件
- 小學(xué)防范詐騙知識(shí)講座
評(píng)論
0/150
提交評(píng)論