2018年8月6日 星期一

青少年班

彰化縣政府107年度青少年職業探索營
機械手臂自動控制設計班

機器手臂簡介ppt
材料:meArm組件,馬達建議使用MG90S,不要選用SG90

下載一
下載二

0.依照教材進行組裝
1.使用可變電阻操控伺服馬達轉動角度
   馬達接在數位腳位第9腳、可變電阻中間腳接類比腳位A0。
   小心轉動可變電阻,透過監控視窗,逐一測試所有伺服馬達的可轉動範圍,並紀錄上下限。
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
  Serial.begin(9600);// 開啟 Serial Port,通訊速率為 9600
  myservo.attach(9);  // Servo 接在 pin 9
}
void loop()
{
  val = analogRead(potpin);  
  val = map(val, 0, 1023, 0, 179);
  Serial.println(val);  
  myservo.write(val);                  // 設定 Servo 旋轉角度
  delay(100);                           // 等待
}

2.使用單顆可變電阻測試操控四顆伺服馬達轉動角度
   夾爪馬達接在數位腳位第2腳,底部馬達、左馬達、右馬達分別接在3、4、5腳,可變電阻中間腳接類比腳位A0。
   將步驟1所量測到的馬達轉動範圍填入程式中,利用可變電阻測試四顆馬達的轉動順暢性。
#include <Servo.h>
Servo myservo_B;
Servo myservo_L;
Servo myservo_R;
Servo myservo_H;
int potpin = 0;
int val,val_B,val_L,val_R,val_H;
int B_min=10;//底部馬達最小角度
int B_max=175;//底部馬達最大角度
int L_min=110;//左馬達最大角度 (此處反著寫)
int L_max=40;//左馬達最小角度 (此處反著寫)
int R_min=60;//右馬達最小角度
int R_max=160;//右馬達最大角度
int H_min=80;//夾爪馬達最小角度
int H_max=145;//夾爪馬達最大角度
int dt=50;
void setup()
{
  //Serial.begin(9600);// 開啟 Serial Port,通訊速率為 9600
  //myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_L.attach(4);  // Servo 接在 pin 4
  myservo_R.attach(5);  // Servo 接在 pin 5
  myservo_H.attach(2);  // Servo 接在 pin 2 
}
void loop()
{
  val = analogRead(potpin);  
  val_B = map(val, 0, 1023, B_min, B_max);
  val_L = map(val, 0, 1023, L_min, L_max);
  val_R = map(val, 0, 1023, R_min, R_max);
  val_H = map(val, 0, 1023, H_min, H_max); 
  //Serial.println(val);  
  myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_B.write(val_B);                  // 設定 Servo 旋轉角度
  myservo_L.write(val_L);                  // 設定 Servo 旋轉角度
  myservo_R.write(val_R);                  // 設定 Servo 旋轉角度
  myservo_H.write(val_H);                  // 設定 Servo 旋轉角度
  delay(dt);                           // 等待
  myservo_B.detach(); 
  delay(100-dt);
}

3.使用雙搖桿測試操控四顆伺服馬達轉動角度
   左搖桿的S-X接A0,控制底部馬達,S-Y接A1,控制左馬達。

   右搖桿的S-X接A2,控制夾爪馬達,S-Y接A3,控制右馬達。
   預設馬達角度為為最大與最小的平均值。當搖桿移動時,馬達就跟著轉動到對應角度,放開時回復到預設角度。
#include <Servo.h>
Servo myservo_B;
Servo myservo_L;
Servo myservo_R;
Servo myservo_H;
int B = 0;//左S-X接A0,控制底部馬達
int L = 1;//左S-Y接A1,控制左馬達
int H = 2;//右S-X接A2,控制夾爪馬達
int R = 3;//右S-Y接A3,控制右馬達
int val,val_B,val_L,val_R,val_H;
int B_min=10;//底部馬達最小角度
int B_max=175;//底部馬達最大角度
int L_min=110;//左馬達最大角度 (此處反著寫)
int L_max=40;//左馬達最小角度 (此處反著寫)
int R_min=60;//右馬達最小角度
int R_max=160;//右馬達最大角度
int H_min=80;//夾爪馬達最小角度
int H_max=145;//夾爪馬達最大角度
int dt=50;
void setup()
{
  //Serial.begin(9600);// 開啟 Serial Port,通訊速率為 9600
  //myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_L.attach(4);  // Servo 接在 pin 4
  myservo_R.attach(5);  // Servo 接在 pin 5
  myservo_H.attach(2);  // Servo 接在 pin 2 
}
void loop()
{
  val = analogRead(B);  
  val_B = map(val, 0, 1023, B_min, B_max);
  val = analogRead(L);
  val_L = map(val, 0, 1023, L_min, L_max);
  val = analogRead(R);
  val_R = map(val, 0, 1023, R_min, R_max);
  val = analogRead(H);
  val_H = map(val, 0, 1023, H_min, H_max); 
  //Serial.println(val);  
  myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_B.write(val_B);                  // 設定 Servo 旋轉角度
  myservo_L.write(val_L);                  // 設定 Servo 旋轉角度
  myservo_R.write(val_R);                  // 設定 Servo 旋轉角度
  myservo_H.write(val_H);                  // 設定 Servo 旋轉角度
  delay(dt);                           // 等待
  myservo_B.detach(); 
  delay(100-dt);
}

4.使用雙搖桿操控meArm
   與步驟3接法一致,但搖桿偏移時,馬達逐步轉動,搖桿回復時,馬達停止轉動。
#include <Servo.h>
Servo myservo_B;
Servo myservo_L;
Servo myservo_R;
Servo myservo_H;
int B = 0;//左S-X接A0,控制底部馬達
int L = 1;//左S-Y接A1,控制左馬達
int H = 2;//右S-X接A2,控制夾爪馬達
int R = 3;//右S-Y接A3,控制右馬達
int val_b,val_l,val_r,val_h,val_B,val_L,val_R,val_H;
int db,dl,dr,dh;
int B_min=30;//底部馬達最小角度
int B_max=160;//底部馬達最大角度
int L_min=40;//左馬達最小角度
int L_max=110;//左馬達最大角度
int R_min=50;//右馬達最小角度
int R_max=150;//右馬達最大角度
int H_min=60;//夾爪馬達最小角度
int H_max=150;//夾爪馬達最大角度
int dt=15;
void setup()
{
  //Serial.begin(9600);// 開啟 Serial Port,通訊速率為 9600
  myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_L.attach(4);  // Servo 接在 pin 4
  myservo_R.attach(5);  // Servo 接在 pin 5
  myservo_H.attach(2);  // Servo 接在 pin 2
  val_B=(B_min+B_max)/2;
  val_L=(L_min+L_max)/2;
  val_R=(R_min+R_max)/2;
  val_H=(H_min+H_max)/2;
  myservo_B.write(val_B);                  // 設定 Servo 旋轉角度
  myservo_L.write(val_L);                  // 設定 Servo 旋轉角度
  myservo_R.write(val_R);                  // 設定 Servo 旋轉角度
  myservo_H.write(val_H);                  // 設定 Servo 旋轉角度
  delay(dt);                           // 等待
  myservo_B.detach(); 
  delay(dt);   
}
void loop()
{
  val_b = analogRead(B);  
  if (val_b >= 912)
     db=1;
  else if (val_b <= 312)
     db=-1;
  else
     db=0;
  val_l = analogRead(L);
   if (val_l >= 912)
     dl=-1;
  else if (val_l <= 312)
     dl=1;
  else
     dl=0;
  val_r = analogRead(R);
  if (val_r >= 912)
     dr=1;
  else if (val_r <= 312)
     dr=-1;
  else
     dr=0;  
  val_h = analogRead(H);
  if (val_h >= 912)
     dh=5;
  else if (val_h <= 312)
     dh=-5;
  else
     dh=0;
  if ((val_B+db)>= B_min && (val_B+db)<= B_max)
     val_B=val_B+db;
  if ((val_L+dl)>= L_min && (val_L+dl)<= L_max)
     val_L=val_L+dl;
  if ((val_R+dr)>= R_min && (val_R+dr)<= R_max)
     val_R=val_R+dr;
  if ((val_H+dh)>= H_min && (val_H+dh)<= H_max)
     val_H=val_H+dh;
  //Serial.println(val);  
  myservo_B.attach(3);  // Servo 接在 pin 3
  myservo_B.write(val_B);                  // 設定 Servo 旋轉角度
  myservo_L.write(val_L);                  // 設定 Servo 旋轉角度
  myservo_R.write(val_R);                  // 設定 Servo 旋轉角度
  myservo_H.write(val_H);                  // 設定 Servo 旋轉角度
  delay(dt);                           // 等待
  myservo_B.detach(); 
  delay(dt);
}
5.音效下載
6. 0810-1
7. 0810-2

1 則留言: