|

当时玩Arduino 六轴机械手臂写的,现在毫无保留开源,有兴趣的可以拿去完善;
数值型(a,b,e)
子程序·手臂运行(X [数值型], Y [数值型], Z [数值型])
执行点数据("P0")
延时(1000)
执行点数据("P1")
延时(1000)
执行点数据("P2")
延时(1000)
执行点数据("P3")
Robot.zip
(1.1 MB, 下载次数: 59)
更新下位机交互Arduino代码:
[JavaScript] 纯文本查看 复制代码 //定义数字接口7 连接伺服舵机信号线
const int servopin=7,servopin1=8,servopin2=9,servopin3=10,servopin4=11,servopin5=12;
//定义角度变量
int myangle,myangle1,myangle2,myangle3,myangle4,myangle5;
//定义脉宽变量
int pulsewidth,pulsewidth1,pulsewidth2,pulsewidth3,pulsewidth4,pulsewidth5;
//定义收到的舵机角度
int val,val1,val2,val3,val4,val5,val6;
int Speed=10;
//定义一个comdata字符串变量,赋初值为空值
String comdata ="";
int mark = 0;
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 servopulse1(int servopin1,int myangle1)//定义一个脉冲函数
{
pulsewidth1=(myangle1*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin1,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth1);//延时脉宽值的微秒数
digitalWrite(servopin1,LOW);//将舵机接口电平至低
delay(20-pulsewidth1/1000);
}
void servopulse2(int servopin2,int myangle2)//定义一个脉冲函数
{
pulsewidth2=(myangle2*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin2,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth2);//延时脉宽值的微秒数
digitalWrite(servopin2,LOW);//将舵机接口电平至低
delay(20-pulsewidth2/1000);
}
void servopulse3(int servopin3,int myangle3)//定义一个脉冲函数
{
pulsewidth3=(myangle3*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin3,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth3);//延时脉宽值的微秒数
digitalWrite(servopin3,LOW);//将舵机接口电平至低
delay(20-pulsewidth3/1000);
}
void servopulse4(int servopin4,int myangle4)//定义一个脉冲函数
{
pulsewidth4=(myangle4*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin4,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth4);//延时脉宽值的微秒数
digitalWrite(servopin4,LOW);//将舵机接口电平至低
delay(20-pulsewidth4/1000);
}
void servopulse5(int servopin5,int myangle5)//定义一个脉冲函数
{
pulsewidth5=(myangle5*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin5,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth5);//延时脉宽值的微秒数
digitalWrite(servopin5,LOW);//将舵机接口电平至低
delay(20-pulsewidth5/1000);
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口7
pinMode(servopin1,OUTPUT);//设定舵机接口为输出接口8
pinMode(servopin2,OUTPUT);//设定舵机接口为输出接口9
pinMode(servopin3,OUTPUT);//设定舵机接口为输出接口10
pinMode(servopin4,OUTPUT);//设定舵机接口为输出接口11
pinMode(servopin5,OUTPUT);//设定舵机接口为输出接口12
Serial.begin(9600);//连接到串行端口,波特率为obot
Serial.println("Robot Ready" ) ;
}
void loop()//将7 到12 的数转化为0 到180 角度,并让LED 闪烁相应数的次数
{
int j = 0;
int numdata[8] = {0};
while (Serial.available() > 0)
{
//读入之后将字符串,串接到comdata上面。
comdata += char(Serial.read());
//延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
delay(2);
//标记串口读过数据,如果没有数据的话,直接不执行这个while了。
mark = 1;
}
if(mark == 1) //如果接收到数据则执行comdata分析操作,否则什么都不做。
{
for(int i = 0; i < comdata.length() ; i++)
{
if( comdata[ i] == ',')
{
j++;
}
else
{
numdata[j] = numdata[j] * 10 + (comdata[ i] - '0');
}
}
if(comdata=="Motor On"||comdata=="Motor Off"||comdata=="Power Off"||comdata=="Power On")
{
Serial.print(comdata);
Serial.println();
}
//comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
comdata = String("");
//输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
mark = 0;
mark ==0;
val1=numdata[2];
val2=numdata[3];
val3=numdata[4];
val4=numdata[5];
val5=numdata[6];
val6=numdata[7];
if(numdata[1]>10&&numdata[1]<=16)
{
// val1=val1*(180/9);//将数字转化为角度
Serial.print(val1);
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
if(numdata[1]==11)
{
servopulse(servopin,val1);//引用脉冲函数
}
if(numdata[1]==12)
{
servopulse1(servopin1,val1);//引用脉冲函数
}
if(numdata[1]==13)
{
servopulse2(servopin2,val1);//引用脉冲函数
}
if(numdata[1]==14)
{
servopulse3(servopin3,val1);//引用脉冲函数
}
if(numdata[1]==15)
{
servopulse4(servopin4,val1);//引用脉冲函数
}
if(numdata[1]==16)
{
servopulse5(servopin5,val1);//引用脉冲函数
}
// Serial.print(val1);
// Serial.println();
}
}
if(numdata[1]==0)
{
Speed=numdata[2];
}
if(numdata[1]==1)
{
//// val1=val1-'0';//将特征量转化为数值变量
// val1=val1*(180/9);//将数字转化为角度
//// val2=val2-'0';//将特征量转化为数值变量
// val2=val2*(180/9);//将数字转化为角度
//// val3=val3-'0';//将特征量转化为数值变量
// val3=val3*(180/9);//将数字转化为角度
//// val4=val4-'0';//将特征量转化为数值变量
// val4=val4*(180/9);//将数字转化为角度
//// val5=val5-'0';//将特征量转化为数值变量
// val5=val5*(180/9);//将数字转化为角度
//// val6=val6-'0';//将特征量转化为数值变量
// val6=val6*(180/9);//将数字转化为角度
if(Speed<0 && Speed>60)
{
Speed=50;
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,val1);//引用脉冲函数
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse1(servopin1,val2);//引用脉冲函数
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse2(servopin2,val3);//引用脉冲函数
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse3(servopin3,val4);//引用脉冲函数
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse4(servopin4,val5);//引用脉冲函数
}
for(int i=0;i<=Speed;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse5(servopin5,val6);//引用脉冲函数
}
Serial.print("Moving Servo to:");
Serial.print(val1,DEC);
Serial.print(",");
Serial.print(val2,DEC);
Serial.print(",");
Serial.print(val3,DEC);
Serial.print(",");
Serial.print(val4,DEC);
Serial.print(",");
Serial.print(val5,DEC);
Serial.print(",");
Serial.print(val6,DEC);
Serial.print(",");
Serial.print(Speed,DEC);
Serial.println();
}
}
}
需要玩下位机的可以联系本人,有问必答,知无不言。 |
评分
-
查看全部评分
|