最简单DIY基于STM32F407探索者开发板和PCA9685舵机控制模块的红外遥控机械臂控制程序
STM32庫函數開發(fā)系列文章目錄
第一篇:STM32F103ZET6單片機雙串口互發(fā)程序設計與實現
第二篇:最簡單DIY基于STM32單片機的藍牙智能小車設計方案
第三篇:最簡單DIY基于STM32F407探索者開發(fā)板的MPU6050陀螺儀姿態(tài)控制舵機程序
第四篇:最簡單DIY基于STM32F407探索者開發(fā)板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序
文章目錄
- STM32庫函數開發(fā)系列文章目錄
- 前言
- 一、最簡單DIY基于STM32F407探索者開發(fā)板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序是什么?
- 二、使用步驟
- 1.準備硬件
- 2.準備正點原子開源的MPU6050的代碼
- 3.準備正點原子紅外遙控的代碼和顯示屏的代碼
- 4.修改源碼和組合源碼(這部分原創(chuàng))
- 三、運行與調試
- 總結
前言
????daodanjishui物聯網核心原創(chuàng)技術之最簡單DIY基于STM32F407探索者開發(fā)板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序。
????市面上有各種開源STM32和PCA9685舵機控制器,但是有復雜的有簡單的,如果想快速入門stm32f407zgt6+PCA9685舵機控制,這個方案會給你一個快捷高效的方案。
一、最簡單DIY基于STM32F407探索者開發(fā)板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序是什么?
????我記得本欄的第三篇STM32控制舵機是用定時器的PWM波庫函數搞定的,雖然51單片機也寫過PCA9685控制舵機的程序,但是還沒有寫過STM32的,所以誕生了這個第四篇博文。
????這次的方案主要是:STM32F407ZGT6單片機用IO模擬IIC總線直接控制PCA9685模塊來間接控制舵機,所以這次用STM32F4和PCA9685來控制四個舵機組成的機械臂。下面請看全家福:
????這次的程序使用的stm32庫函數來編程,說實話也修改了正點原子開發(fā)板配套的例程,正點原子移植了arduino版本的IIC控制MPU6050的庫才有了我這個下文,第三篇博文是用I2C來控制MPU6050,這篇博文是用I2C來控制PCA9685模塊。為了實現這個STM32舵機的控制,我查閱了網上很多有關舵機控制的資料和視頻,我?guī)缀鯔M掃了全部正點原子關于舵機控制的論壇帖子,有含金量的帖子基本上沒有多少,給出源碼的程序我覺得多多少少有點問題,也踩了很多坑!總之寫代碼是痛苦的,在這個吃快餐的時代最好的辦法就是復制粘貼“拿來主義”,但是并不是什么都可以拿的,有時候自己去嘗試的時候才發(fā)現沒有東西可以拿,只能硬著頭皮擼起袖子加油干。
優(yōu)酷視頻演示地址:https://v.youku.com/v_show/id_XNTAxMTcxMzE0MA==.html
直接觀看
最簡單DIY基于STM32F407探索者開發(fā)板和PCA9685舵機控制模塊的紅外遙控機械臂控制程序
二、使用步驟
1.準備硬件
1.1正點原子探索者開發(fā)板一個,如果沒有的話用STM32F407ZET6核心板也可以的,現在美國ST公司禁售該芯片,估計以后這個芯片就被淘汰了。
1.2舵機sg90四個。
1.3PCA9685模塊一個。
1.4正點原子4.3寸電容顯示屏一個。(如果沒有的話可以屏蔽該部分代碼)
1.5配套紅外遙控器一個。
1.6三合板機械臂支架一套。(某寶有賣)
2.準備正點原子開源的MPU6050的代碼
我采用庫函數開發(fā),所以代碼直接使用該開發(fā)板配套的免費開源源碼進行二次開發(fā)。源碼來源:探索者光盤資料\A盤\4,程序源碼\2,標準例程-庫函數版本\實驗32 MPU6050六軸傳感器實驗
代碼如下(示例):
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" #include "lcd.h" #include "mpu6050.h" #include "inv_mpu.h" #include "inv_mpu_dmp_motion_driver.h" //ALIENTEK 探索者STM32F407開發(fā)板 實驗32 //MPU6050六軸傳感器 實驗 -庫函數版本 //技術支持:www.openedv.com //淘寶店鋪:http://eboard.taobao.com //廣州市星翼電子科技有限公司 //作者:正點原子 @ALIENTEK//串口1發(fā)送1個字符 //c:要發(fā)送的字符 void usart1_send_char(u8 c) {while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); USART_SendData(USART1,c); } //傳送數據給匿名四軸上位機軟件(V2.6版本) //fun:功能字. 0XA0~0XAF //data:數據緩存區(qū),最多28字節(jié)!! //len:data區(qū)有效數據個數 void usart1_niming_report(u8 fun,u8*data,u8 len) {u8 send_buf[32];u8 i;if(len>28)return; //最多28字節(jié)數據 send_buf[len+3]=0; //校驗數置零send_buf[0]=0X88; //幀頭send_buf[1]=fun; //功能字send_buf[2]=len; //數據長度for(i=0;i<len;i++)send_buf[3+i]=data[i]; //復制數據for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i]; //計算校驗和 for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]); //發(fā)送數據到串口1 } //發(fā)送加速度傳感器數據和陀螺儀數據 //aacx,aacy,aacz:x,y,z三個方向上面的加速度值 //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值 void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz) {u8 tbuf[12]; tbuf[0]=(aacx>>8)&0XFF;tbuf[1]=aacx&0XFF;tbuf[2]=(aacy>>8)&0XFF;tbuf[3]=aacy&0XFF;tbuf[4]=(aacz>>8)&0XFF;tbuf[5]=aacz&0XFF; tbuf[6]=(gyrox>>8)&0XFF;tbuf[7]=gyrox&0XFF;tbuf[8]=(gyroy>>8)&0XFF;tbuf[9]=gyroy&0XFF;tbuf[10]=(gyroz>>8)&0XFF;tbuf[11]=gyroz&0XFF;usart1_niming_report(0XA1,tbuf,12);//自定義幀,0XA1 } //通過串口1上報結算后的姿態(tài)數據給電腦 //aacx,aacy,aacz:x,y,z三個方向上面的加速度值 //gyrox,gyroy,gyroz:x,y,z三個方向上面的陀螺儀值 //roll:橫滾角.單位0.01度。 -18000 -> 18000 對應 -180.00 -> 180.00度 //pitch:俯仰角.單位 0.01度。-9000 - 9000 對應 -90.00 -> 90.00 度 //yaw:航向角.單位為0.1度 0 -> 3600 對應 0 -> 360.0度 void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw) {u8 tbuf[28]; u8 i;for(i=0;i<28;i++)tbuf[i]=0;//清0tbuf[0]=(aacx>>8)&0XFF;tbuf[1]=aacx&0XFF;tbuf[2]=(aacy>>8)&0XFF;tbuf[3]=aacy&0XFF;tbuf[4]=(aacz>>8)&0XFF;tbuf[5]=aacz&0XFF; tbuf[6]=(gyrox>>8)&0XFF;tbuf[7]=gyrox&0XFF;tbuf[8]=(gyroy>>8)&0XFF;tbuf[9]=gyroy&0XFF;tbuf[10]=(gyroz>>8)&0XFF;tbuf[11]=gyroz&0XFF; tbuf[18]=(roll>>8)&0XFF;tbuf[19]=roll&0XFF;tbuf[20]=(pitch>>8)&0XFF;tbuf[21]=pitch&0XFF;tbuf[22]=(yaw>>8)&0XFF;tbuf[23]=yaw&0XFF;usart1_niming_report(0XAF,tbuf,28);//飛控顯示幀,0XAF } int main(void) { u8 t=0,report=1; //默認開啟上報u8 key;float pitch,roll,yaw; //歐拉角short aacx,aacy,aacz; //加速度傳感器原始數據short gyrox,gyroy,gyroz; //陀螺儀原始數據short temp; //溫度NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統(tǒng)中斷優(yōu)先級分組2delay_init(168); //初始化延時函數uart_init(500000); //初始化串口波特率為500000LED_Init(); //初始化LED KEY_Init(); //初始化按鍵LCD_Init(); //LCD初始化MPU_Init(); //初始化MPU6050POINT_COLOR=RED;//設置字體為紅色 LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"MPU6050 TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2014/5/9");while(mpu_dmp_init()){LCD_ShowString(30,130,200,16,16,"MPU6050 Error");delay_ms(200);LCD_Fill(30,130,239,130+16,WHITE);delay_ms(200);}LCD_ShowString(30,130,200,16,16,"MPU6050 OK");LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");POINT_COLOR=BLUE;//設置字體為藍色 LCD_ShowString(30,170,200,16,16,"UPLOAD ON "); LCD_ShowString(30,200,200,16,16," Temp: . C"); LCD_ShowString(30,220,200,16,16,"Pitch: . C"); LCD_ShowString(30,240,200,16,16," Roll: . C"); LCD_ShowString(30,260,200,16,16," Yaw : . C"); while(1){key=KEY_Scan(0);if(key==KEY0_PRES){report=!report;if(report)LCD_ShowString(30,170,200,16,16,"UPLOAD ON ");else LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");}if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){ temp=MPU_Get_Temperature(); //得到溫度值MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度傳感器數據MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺儀數據if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定義幀發(fā)送加速度和陀螺儀原始數據if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));if((t%10)==0){ if(temp<0){LCD_ShowChar(30+48,200,'-',16,0); //顯示負號temp=-temp; //轉為正數}else LCD_ShowChar(30+48,200,' ',16,0); //去掉負號 LCD_ShowNum(30+48+8,200,temp/100,3,16); //顯示整數部分 LCD_ShowNum(30+48+40,200,temp%10,1,16); //顯示小數部分 temp=pitch*10;if(temp<0){LCD_ShowChar(30+48,220,'-',16,0); //顯示負號temp=-temp; //轉為正數}else LCD_ShowChar(30+48,220,' ',16,0); //去掉負號 LCD_ShowNum(30+48+8,220,temp/10,3,16); //顯示整數部分 LCD_ShowNum(30+48+40,220,temp%10,1,16); //顯示小數部分 temp=roll*10;if(temp<0){LCD_ShowChar(30+48,240,'-',16,0); //顯示負號temp=-temp; //轉為正數}else LCD_ShowChar(30+48,240,' ',16,0); //去掉負號 LCD_ShowNum(30+48+8,240,temp/10,3,16); //顯示整數部分 LCD_ShowNum(30+48+40,240,temp%10,1,16); //顯示小數部分 temp=yaw*10;if(temp<0){LCD_ShowChar(30+48,260,'-',16,0); //顯示負號temp=-temp; //轉為正數}else LCD_ShowChar(30+48,260,' ',16,0); //去掉負號 LCD_ShowNum(30+48+8,260,temp/10,3,16); //顯示整數部分 LCD_ShowNum(30+48+40,260,temp%10,1,16); //顯示小數部分 t=0;LED0=!LED0;//LED閃爍}}t++; } }3.準備正點原子紅外遙控的代碼和顯示屏的代碼
因為控制舵機需要用紅外遙控,那么就需要用到紅外遙控有關的開源代碼,代碼路徑是:探索者光盤資料\A盤\4,程序源碼\2,標準例程-庫函數版本\實驗29 紅外遙控實驗
因為有顯示屏,所以需要顯示屏的代碼。代碼路徑是:
紅外代碼如下:
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "remote.h" //ALIENTEK 探索者STM32F407開發(fā)板 實驗29 //紅外遙控器實驗 -庫函數版本 //技術支持:www.openedv.com //淘寶店鋪:http://eboard.taobao.com //廣州市星翼電子科技有限公司 //作者:正點原子 @ALIENTEKint main(void) { u8 key;u8 t=0; u8 *str=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統(tǒng)中斷優(yōu)先級分組2delay_init(168); //初始化延時函數uart_init(115200); //初始化串口波特率為115200LED_Init(); //初始化LEDLCD_Init();Remote_Init(); //紅外接收初始化 POINT_COLOR=RED;//設置字體為紅色 LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"REMOTE TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2014/5/7");LCD_ShowString(30,130,200,16,16,"KEYVAL:"); LCD_ShowString(30,150,200,16,16,"KEYCNT:"); LCD_ShowString(30,170,200,16,16,"SYMBOL:"); while(1){key=Remote_Scan(); if(key){ LCD_ShowNum(86,130,key,3,16); //顯示鍵值LCD_ShowNum(86,150,RmtCnt,3,16); //顯示按鍵次數 switch(key){case 0:str="ERROR";break; case 162:str="POWER";break; case 98:str="UP";break; case 2:str="PLAY";break; case 226:str="ALIENTEK";break; case 194:str="RIGHT";break; case 34:str="LEFT";break; case 224:str="VOL-";break; case 168:str="DOWN";break; case 144:str="VOL+";break; case 104:str="1";break; case 152:str="2";break; case 176:str="3";break; case 48:str="4";break; case 24:str="5";break; case 122:str="6";break; case 16:str="7";break; case 56:str="8";break; case 90:str="9";break;case 66:str="0";break;case 82:str="DELETE";break; }LCD_Fill(86,170,116+8*8,170+16,WHITE); //清楚之前的顯示LCD_ShowString(86,170,200,16,16,str); //顯示SYMBOL}else delay_ms(10); t++;if(t==20){t=0;LED0=!LED0;}} }顯示屏代碼如下:
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h"//ALIENTEK 探索者STM32F407開發(fā)板 實驗13 //LCD顯示實驗-庫函數版本 //技術支持:www.openedv.com //淘寶店鋪:http://eboard.taobao.com //廣州市星翼電子科技有限公司 //作者:正點原子 @ALIENTEKint main(void) { u8 x=0;u8 lcd_id[12]; //存放LCD ID字符串NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統(tǒng)中斷優(yōu)先級分組2delay_init(168); //初始化延時函數uart_init(115200); //初始化串口波特率為115200LED_Init(); //初始化LEDLCD_Init(); //初始化LCD FSMC接口POINT_COLOR=RED; //畫筆顏色:紅色sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//將LCD ID打印到lcd_id數組。 while(1) { switch(x){case 0:LCD_Clear(WHITE);break;case 1:LCD_Clear(BLACK);break;case 2:LCD_Clear(BLUE);break;case 3:LCD_Clear(RED);break;case 4:LCD_Clear(MAGENTA);break;case 5:LCD_Clear(GREEN);break;case 6:LCD_Clear(CYAN);break; case 7:LCD_Clear(YELLOW);break;case 8:LCD_Clear(BRRED);break;case 9:LCD_Clear(GRAY);break;case 10:LCD_Clear(LGRAY);break;case 11:LCD_Clear(BROWN);break;}POINT_COLOR=RED; LCD_ShowString(30,40,210,24,24,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,lcd_id); //顯示LCD ID LCD_ShowString(30,130,200,12,12,"2014/5/4"); x++;if(x==12)x=0;LED0=!LED0; delay_ms(1000); } }4.修改源碼和組合源碼(這部分原創(chuàng))
這里有部分原創(chuàng)的代碼:
//author:daodanjishui 2020.12.16 主頁:https://www.cirmall.com/user/3517397 //管腳定義,左邊是單片機,右邊是PCA //PB8-----SCL //PB9-----SDA /** 舵機編號按照PCA9685模塊上面寫的0~15一共16個舵機進行編號,最左邊的是0號舵機。 但是程序中TURN_1代表的是0號舵機的翻轉的角度,買家要注意了。不要混淆! 機械臂最下面的是2號舵機,夾子是3號舵機,左邊的舵機是1號,右邊的舵機是2號。 所以PCA模塊接上的0、1、2、3號舵機,剩下的全部懸空,舵機接錯也沒有關系,動作亂而已 遙控按鍵9控制舵機2右轉,按鍵7控制舵機2左轉按鍵5控制舵機0上升,按鍵8控制舵機0下降下方向鍵控制控制舵機3關閉夾子,按鍵2控制舵機3打開夾子按鍵4控制舵機1后仰,按鍵6控制舵機1前伸 */#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "pcf8574.h" #include "remote.h"u8 TEXT_Buffer[]={"Explorer STM32F4 IIC PCA9685 demo"}; #define SIZE sizeof(TEXT_Buffer) //通過改變TURN_1 int main(void) { u8 key;u8 *str=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);Stm32_Clock_Init(336,8,2,7);//設置時鐘,168Mhz delay_init(168);uart_init(115200);LED_Init();LCD_Init(); Remote_Init(); //紅外接收初始化IIC_Init();POINT_COLOR =RED ;LCD_ShowString(30,90,400,16,16,"author:daodanjishui"); //標題1LCD_ShowString(30,110,400,16,16,TEXT_Buffer); //標題2LCD_ShowString(30,130,200,16,16,"KEYVAL:"); //鍵值LCD_ShowString(30,150,200,16,16,"KEYCNT:"); //按鍵計數 LCD_ShowString(30,170,200,16,16,"SYMBOL:");// LCD_ShowString(30,190,200,16,16,"TURN_1:"); //舵機1LCD_ShowString(30,210,200,16,16,"TURN_2:");//舵機2LCD_ShowString(30,230,200,16,16,"TURN_3:");//舵機3LCD_ShowString(30,250,200,16,16,"TURN_4:");//舵機4PCA9685_write(PCA9685_MODE1,0x0);//移植代碼要注意setPWMFreq(50);//設置PWM的頻率為50Hz,這樣可以保證產生20ms的脈沖時間GPIO_ResetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);//led管腳初始化up();TURN_1=90;//90度TURN_2=90;TURN_3=90;TURN_4=40;//夾子40度 BEFORE[0]=TURN_1;//BEFORE[]這是數組存放舵機校準的時候初始值BEFORE[1]=TURN_2;BEFORE[2]=TURN_3;BEFORE[3]=TURN_4;while(1){key=Remote_Scan();//讀取紅外遙控的鍵值 if(key){ LCD_ShowNum(86,130,key,3,16); //顯示鍵值LCD_ShowNum(86,150,RmtCnt,3,16); //顯示按鍵次數 LCD_ShowNum(86,190,TURN_1,3,16); //顯示TURN_1~4LCD_ShowNum(86,210,TURN_2,3,16);LCD_ShowNum(86,230,TURN_3,3,16);LCD_ShowNum(86,250,TURN_4,3,16);LCD_ShowNum(140,190,BEFORE[0],3,16); //顯示BEFORE[0~3]LCD_ShowNum(140,210,BEFORE[1],3,16);LCD_ShowNum(140,230,BEFORE[2],3,16);LCD_ShowNum(140,250,BEFORE[3],3,16);delay_ms(10);switch(key){ case 162:TURN_1+=5;if(TURN_1>180)TURN_1=90;str="1";break; case 48://按鍵4TURN_2-=5;if(TURN_2<40)TURN_2=90;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);str="4";break; case 122://按鍵6TURN_2+=5;if(TURN_2>135)TURN_2=90;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);str="6";break; case 2:TURN_2-=5;if(TURN_2<5)TURN_2=90; str="5";break; case 226:EXPECT(90,90,90,70);//如果接收到226鍵值的話,舵機前三個轉90度最后一個轉70度str="3";break; case 194:str="6";break; case 34:TURN_2+=5;if(TURN_2>180)TURN_2=90;str="4";break; case 224:TURN_3+=5;if(TURN_3>180)TURN_3=90;str="7";break; case 168://下方向鍵TURN_4-=5;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);if(TURN_4<40)TURN_4=40;str="close";//關夾子break; case 144:str="9";break; case 104:RETURN(BEFORE,95,40,10,70);str="*";break; case 152://按鍵2TURN_4=60;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);//舵機從BEFORE[]數組的狀態(tài)運動到新的TURN_X狀態(tài)str="open";break; case 176:str="#";break; case 24://按鍵5的鍵值是24TURN_1=140;//TURN_2=90;//TURN_3=90;//TURN_4=60;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);//舵機從BEFORE[]數組的狀態(tài)運動到新的TURN_X狀態(tài)str="up";//屏幕狀態(tài)反饋顯示break; case 16://按鍵7TURN_3-=5;RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);//舵機右轉if(TURN_3<5)TURN_3=90;//角度減到極限時候,回到原來調0處str="right";break; case 56://按鍵8//EXPECT(65,45,40,75);//直接轉到固定的狀態(tài)TURN_1=40; RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);//舵機從BEFORE[]數組的狀態(tài)運動到新的TURN_X狀態(tài) str="down";break; case 90://按鍵9TURN_3+=5;//每次按一次,舵機3的角度就增加5度RETURN(BEFORE,TURN_1,TURN_2,TURN_3,TURN_4);//舵機左轉if(TURN_3>180)TURN_3=90;//角度減到極限時候,回到原來調0處str="left";break; }LCD_Fill(86,170,116+8*8,170+16,WHITE); //清楚之前的顯示LCD_ShowString(86,170,200,16,16,str); //顯示SYMBOL} } }說明:以上就是我main函數的代碼,里面也包含了我構思紅外遙控器的邏輯設計,還有一些其他次要的頭文件和工具文件沒有放進來,因為代碼量大,另外也請讀者尊重原創(chuàng),尊重勞動成果,請下載我最后附錄上的工程代碼,工程代碼注釋詳細,代碼精簡。
三、運行與調試
(1)功能說明:用紅外遙控器的按鍵遙控與PCA9685連接的機械臂運動,PCA用IIC總線與STM32連接,stm32上有紅外接收器接收遙控器的信號,同時顯示屏會顯示機械臂的狀態(tài)和按鍵的鍵值。
(2)代碼說明:用MDK5寫的庫函數代碼
(3)硬件說明:還是正點原子探索者開發(fā)板的全家桶硬件,4.3寸電容屏加紅外遙控器,舵機和機械臂是買其他家的。舵機和機械臂和PCA9685看視頻介紹,木頭合成板做的機械臂,10塊左右買到的架子,把sg90舵機裝進去。
(4) 下載源碼,下面是源碼截圖:
(5)按照視頻演示進行控制機械臂。
????通過上面運行與調試證明了程序狀態(tài)良好,達到博文提出的要求。
總結
????總結:涉及到IIC通信和紅外收發(fā),不過這些庫函數都有別人幫我們做好了,我做的工作是將他們組合在一起完成舵機的控制,最終完成機械臂的控制,代碼難度不大,但是要做好舵機控制,還是要好好學習代碼中舵機控制的部分代碼。
????預告:下期將會引入機器人四肢的控制,把單片機玩起來。同時加入上位機和圖傳,讓機器人控制多姿多彩。
最后附上本博文代碼下載地址:https://www.cirmall.com/circuit/22287/
直接跳轉
正點原子相關代碼免費下載
總結
以上是生活随笔為你收集整理的最简单DIY基于STM32F407探索者开发板和PCA9685舵机控制模块的红外遥控机械臂控制程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国电子政务行业投资
- 下一篇: 综合评价法——秩和比(RSR)