本人機械電子專業的大一學生一枚,這是我在部落格園的第一篇隨筆
2024年4月份我在二手平臺花費300大洋入手了香橙派zero3和3B,買回來後一開始是裝上ubuntu跑QQ機器人和minecraft伺服器的,所以雖然看到了板子上的40pin引腳,但當時並未立即探索其硬體擴充套件功能。幾天後,好奇心驅使我深入瞭解這些引腳的用途,我開始研究香橙派的GPIO程式設計。故發表隨筆來記錄我的折騰之旅。
180度舵機作為一種常見的執行機構,廣泛應用於機器人關節控制、攝像頭雲臺調整等場景。要驅動舵機,關鍵在於理解PWM(脈衝寬度調製)訊號的生成與控制。不過在香橙派上使用wiringPi來輸出PWM不需要像stm32一樣去配置各種暫存器,還算是方便一些。
我們需要以下函式來輸出硬體PWM波(以香橙派3B為例)
1 pinMode(int pin, int Mode); // 設定引腳為pwm輸出,引數Mode為PWM_OUTPUT 2 pwmSetClock(int pin,int divisor); // 引數divisor為div 3 pwmSetRange(int pin,unsigned int range); // 引數range為arr 4 pwmWrite(int pin, int value); // 引數value為ccr
硬體PWM的頻率是可調的,有適用於香橙派的計算公式
頻率 = 24000000 / (arr * div);
佔空比 = ccr / arr;
下面寫一個控制sg90舵機旋轉到45度處的程式碼
1 #include "wiringPi.h" 2 #include <stdio.h> 3 #define PWM_pin 21 4 //香橙派3B的硬體PWM輸出引腳為wpi編號下的2和21號引腳,這裡使用21號引腳 5 int main() 6 { 7 int div = 8; 8 int arr = 60000; 9 int ccr = 3000; 10 //頻率= 24000000 / (60000 * 8) = 50Hz sg90舵機要50Hz才能正常驅動 11 if (wiringPiSetup() == -1) {printf("初始化失敗惹>︿<");} 12 pinMode(PWM_pin, PWM_OUTPUT); 13 while (1) 14 { 15 pwmSetClock(PWM_pin, div); 16 pwmSetRange(PWM_pin, arr); 17 pwmWrite(PWM_pin, ccr); 18 //佔空比duty = ccr / arr = 5.0% 對應45度位置 19 } 20 }
儲存,命名為main.c
我是用vscode遠端連線到香橙派3B的,在控制檯輸入gpio readall就可以看到香橙派3B的引腳定義圖。使用cd命令進入程式碼所在資料夾,輸入
orangepi@orangepi3b:my-project/ $ gcc main.c -o test1 -lwiringPi
然後再輸入
orangepi@orangepi3b:my-project/ $ sudo ./test1
按照提示輸入密碼後就可以看到舵機轉到了45度處
python的程式碼和c語言版本大同小異,如下
1 import wiringpi as pi 2 from wiringpi import GPIO 3 4 PWM_PIN = 21 5 div = 8 6 arr = 60000 7 ccr = 4500 8 if pi.wiringPiSetup() == -1: 9 print("初始化失敗惹>︿<") 10 pi.pinMode(PWM_PIN,GPIO.PWM_OUTPUT) 11 while True: 12 pi.pwmSetClock(PWM_PIN, div) 13 pi.pwmSetRange(PWM_PIN, arr) 14 pi.pwmWrite(PWM_PIN, ccr) # duty = 7.5% 對應 90度
儲存為main.py 然後以管理員身份執行
python3 main.py
是可以看到舵機轉到了90度位置處