2 回答

TA貢獻1982條經驗 獲得超2個贊
char data;
if(Serial.available>0){
data = Serial.read();
}
最好寫成這樣
兩邊寫的端口號和比特率多少 都一樣嗎
SendData((char*)&val,sizeof(val));

TA貢獻1854條經驗 獲得超8個贊
舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成。其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基準電路,產生周期為20ms,寬度為1.5ms 的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。經由電路板上的IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回信號,判斷是否已經到達定位。適用于那些需要角度不斷變化并可以保持的控制系統。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。一般舵機旋轉的角度范圍是0 度到180 度。
舵機有很多規格,但所有的舵機都有外接三根線,分別用棕、紅、橙三種顏色進行區分,由于舵機品牌不同,顏色也會有所差異,棕色為接地線,紅色為電源正極線,橙色為信號線。
舵機的轉動的角度是通過調節PWM(脈沖寬度調制)信號的占空比來實現的,標準PWM(脈沖寬度調制)信號的周期固定為20ms(50Hz),理論上脈寬分布應在1ms到2ms 之間,但是,事實上脈寬可由0.5ms 到2.5ms 之間,脈寬和舵機的轉角0°~180°相對應。有一點值得注意的地方,由于舵機牌子不同,對于同一信號,不同牌子的舵機旋轉的角度也會有所不同。
用Arduino 控制舵機的方法有兩種,一種是通過Arduino 的普通數字傳感器接口產生占空比不同的方波,模擬產生PWM 信號進行舵機定位,第二種是直接利用Arduino 自帶的Servo 函數進行舵機的控制,這種控制方法的優點在于程序編寫,缺點是只能控制2 路舵機,因為Arduino 自帶函數只能利用數字9、10 接口。Arduino 的驅動能力有限,所以當需要控制1 個以上的舵機時需要外接電源。
方法一:
將舵機接數字 9 接口上。
編寫一個程序讓舵機轉動到用戶輸入數字所對應的角度數的位置,并將角度打印顯示到屏幕上。
int servopin=9;//定義數字接口9 連接伺服舵機信號線
int myangle;//定義角度變量
int pulsewidth;//定義脈寬變量
int val;
void servopulse(int servopin,int myangle)//定義一個脈沖函數
{
pulsewidth=(myangle*11)+500;//將角度轉化為500-2480 的脈寬值
digitalWrite(servopin,HIGH);//將舵機接口電平至高
delayMicroseconds(pulsewidth);//延時脈寬值的微秒數
digitalWrite(servopin,LOW);//將舵機接口電平至低
delay(20-pulsewidth/1000);
}
void setup()
{
pinMode(servopin,OUTPUT);//設定舵機接口為輸出接口
Serial.begin(9600);//連接到串行端口,波特率為9600
Serial.println("servo=o_seral_simple ready" ) ;
}
void loop()//將0 到9 的數轉化為0 到180 角度,并讓LED 閃爍相應數的次數
{
val=Serial.read();//讀取串行端口的值
if(val>'0'&&val<='9')
{
val=val-'0';//將特征量轉化為數值變量
val=val*(180/9);//將數字轉化為角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
for(int i=0;i<=50;i++) //給予舵機足夠的時間讓它轉到指定角度
{
servopulse(servopin,val);//引用脈沖函數
}
}
}
方法二
先具體分析一下 Arduino 自帶的Servo 函數及其語句,來介紹一下舵機函數的幾個常用語句吧。
1、attach(接口)——設定舵機的接口,只有數字9 或10 接口可利用。
2、write(角度)——用于設定舵機旋轉角度的語句,可設定的角度范圍是0°到180°。
3、read()——用于讀取舵機角度的語句,可理解為讀取最后一條write()命令中
的值。
4、attached()——判斷舵機參數是否已發送到舵機所在接口。
5、detach()——使舵機與其接口分離,該接口(數字9 或10 接口)可繼續被用作PWM 接口。
注:以上語句的書寫格式均為“舵機變量名.具體語句()”例如:myservo.attach(9)。
仍然將舵機接在數字9 接口上即可。
參考源程序B:
#include <Servo.h>//定義頭文件,這里有一點要注意,可以直接在Arduino 軟件菜單欄單擊Sketch>Importlibrary>Servo,調用Servo 函數,也可以直接輸入#include <Servo.h>,但是在輸入時要注意在#include 與<Servo.h>之間要有空格,否則編譯時會報錯。
Servo myservo;//定義舵機變量名
void setup()
{
myservo.attach(9);//定義舵機接口(9、10 都可以,缺點只能控制2 個)
}
void loop()
{
myservo.write(90);//設置舵機旋轉的角度
}
添加回答
舉報