最近也是需要遠端居家上班,但是公司的設備需要有人協助幫忙按按鈕,但由於我又是不太習慣請人幫忙的小RD,於是自己來動手做個遙控手臂,話不多說
上成品
開發環境arduino IDE
1. 3D 列印機
2. 機械手臂圖檔(請參考文末連結)
3. 一些螺絲螺母M3 跟 M4
4. 伺服馬達4顆
5. 銼刀(用來修邊)
6. Arduino NANO Shield
7. Arduino NANO + Mini USB
過程記錄
1.
等待漫長的列印
2.
組裝
當印到這兩個的時候記得多印一下,因為一片會太薄,建議使用兩片
這邊可以看到即便我使用到兩片也有些微變形,之前只鎖一片壞掉了沒拍照記錄,可惜
3.
組裝伺服馬達時,切記切記,一定要先確認初始位置,我是都先把馬達設定在90度之後才固定手臂的位置將伺服馬達安裝進去,這也是我初始化的位置。
這邊先講一下使用arduino範例程式,作為伺服馬達的初始化角度
開起來的範例
需修改成如下
4. 組裝好之後就來開始寫程式吧
先想一下我們需要怎麼控制它,由於我們需要遠端控制他到一些指定位置
,那當然要下命令啊,怎麼下呢?當然是透過我們的COMPORT去下命令,有些時候想要它移動快一點,那設定的角度就要大。
分析一下需求,
(1) 指定特定馬達轉動特定角度
(2) 指定定馬達轉動固定角度
5.
開始撰寫程式碼吧
我們先定義代號
M1 代表 一號伺服馬達
M2 代表 二號伺服馬達
M3 代表 三號伺服馬達
接著轉動角度為1~180
命令格式我們暫且訂為
馬達,愈轉動角度
Ex. M1,90\n 代表一號伺服馬達轉到90度位置
-------------程式碼--------------
#include <Servo.h>
Servo RightLiftServer; //控制左右
Servo UpDownServer; //控制上下
Servo Forbackward; //控制前後
Servo myservo4; // create servo object to control a servo
String ReciveCmd = "";
int Pos_RightLift = 90;
int Pos_UpDown = 90;
int Pos_Forback = 90;
int Step = 5;
void setup() {
Serial.begin(9600);
RightLiftServer.attach(9);
UpDownServer.attach(6);
Forbackward.attach(5);
myservo4.attach(3);
RightLiftServer.write(90);
UpDownServer.write(90);
Forbackward.write(150);
myservo4.write(90);
}
void control(String Motor, int postion)
{
if (Motor == "M1")
{
RightLiftServer.write(postion);
}
else if (Motor == "M2")
{
UpDownServer.write(postion);
}
else if (Motor == "M3")
{
Forbackward.write(postion);
}
else if(Motor == "Set")
{
Step = postion;
}
}
void ScanCmd(String StringCmd)
{
String Motor = "";
String Str_postion = "";
int comflag = false;
int degree = 0;
if (StringCmd.equals("UP\n"))
{
Serial.println("UP\n");
Pos_UpDown+=Step;
if (Pos_UpDown >= 180)Pos_UpDown = 180;
UpDownServer.write(Pos_UpDown);
}
else if (StringCmd.equals("Down\n"))
{
Serial.println("Down\n");
Pos_UpDown-=Step;
if (Pos_UpDown <= 0)Pos_UpDown = 0;
UpDownServer.write(Pos_UpDown);
}
else if (StringCmd.equals("Right\n"))
{
Serial.println("Right\n");
Pos_RightLift+=Step;
if (Pos_RightLift >= 180)Pos_RightLift = 180;
RightLiftServer.write(Pos_RightLift);
}
else if (StringCmd.equals("Lift\n"))
{
Serial.println("Lift\n");
Pos_RightLift-=Step;
if (Pos_RightLift <= 0)Pos_RightLift = 0;
RightLiftServer.write(Pos_RightLift);
}
else if (StringCmd.equals("Forword\n"))
{
Serial.print("Forword:");
Pos_Forback+=Step;
if (Pos_Forback > 179)Pos_Forback = 179;
Serial.println(Pos_Forback);
Forbackward.write(Pos_Forback);
}
else if (StringCmd.equals("Backword\n"))
{
Serial.println("Backword:");
Pos_Forback-=Step;
if (Pos_Forback <= 0)Pos_Forback = 0;
Serial.println(Pos_Forback);
Forbackward.write(Pos_Forback);
}
else if(StringCmd.equals("Postion\n"))
{
Serial.print("Pos_RightLift:");
Serial.println(Pos_RightLift);
Serial.print("Pos_UpDown:");
Serial.println(Pos_UpDown);
Serial.print("Pos_Forback:");
Serial.println(Pos_Forback);
}
else
{
for (int i = 0; i < sizeof(StringCmd); i++)
{
if (StringCmd[i] == ',')comflag = true;
if (comflag != true && StringCmd[i] != ',')
Motor += StringCmd[i];
else if (comflag == true && StringCmd[i] != ',' && StringCmd[i] != '\n') {
Str_postion += StringCmd[i];
}
}
Serial.print(Motor + ":");
Serial.println(Str_postion);
degree = Str_postion.toInt();
if (degree > 180)degree = 180;
else if (degree < 0)degree = 0;
control(Motor, degree);
}
}
void loop() {
if (Serial.available() > 0)
{
char recive_char = Serial.read();
// Serial.println(recive_char);
if (recive_char == '\n')
{
ReciveCmd += '\n';
ScanCmd(ReciveCmd);
ReciveCmd = "";
}
else
{
ReciveCmd += recive_char;
}
}
}
-------------程式碼--------------
問題紀錄
1. 如果你的NANO燒錄不進去,請選擇old Version
2. 小心買到會一直轉的伺服馬達,花錢買經驗,購買時一定要選可以控制角度的,從外觀上還真的看不出來(影片中,寫固定角度一個會固定不動,一個會一直轉)
https://www.instructables.com/EEZYbotARM/
沒有留言:
發佈留言