wininw
发表于 2015-3-26 09:08:58
有没有简单的串口6050测试程序?通过arduino的,目前没有usb转ttl接口。
It's_me
发表于 2015-3-29 22:25:53
我的程序都已经传到论坛上了啊
121806050
发表于 2015-4-6 11:12:52
谢谢分享,目前正在学习中
ofourme
发表于 2015-4-9 21:41:51
kehengsite 发表于 2014-11-12 20:31 补充楼主展示的仿真建模代码下载地址:http://www.mathworks.com/matlabcentral/fileexchange/19147-nxtway ...
有matlab仿真?学习!!
zerolinn
发表于 2015-4-22 20:13:37
谢谢楼主分享
不学不会
发表于 2015-4-22 23:15:32
希望楼主继续更新:loveliness:
406472135
发表于 2015-4-23 10:26:54
不明觉厉,刚接触Arduino,向大神们学习
zerolinn
发表于 2015-4-23 21:51:09
你好,我编码器没数据你能帮我看看吗?谢谢
//把小车右侧电机的编码器OUTA信号连接到Arduino控制器的数字端口2
#define PinA_right 2 ////数字端口2是Arduino的外部中断0的端口
#define PinB_right 8 //右侧电机的编码器OUTB 信号对于数字端口8
//把小车左侧电机的编码器OUTA信号连接到Arduino控制器的数字端口3
#define PinA_left 3 //数字端口3是Arduino的外部中断1的端口
#define PinB_left 10 //左侧电机的编码器OUTB 信号对于数字端口10
long count_right = 0; //定义编码器码盘计数值(此编码器转一圈发出334个脉冲)
long count_left = 0;
long rpm_right = 0; //每分钟(min)转速(r/min)
long rpm_left = 0;
unsigned long time = 0,
old_time = 0;// 时间标记 //初始化
unsigned char Re_buf,counter=0;
unsigned char sign=0;
int M_left=4;
int M_left2=7;
int M_right=9;
int M_right2=11;
int E_left=5;
int E_right=6;
float a,w,Angle,T;
short sAccelerat,sAngleVelocity,sAngle,sT;
void setup() {
// initialize serial:
Serial.begin(115200);
pinMode(M_left,OUTPUT);
pinMode(M_left2,OUTPUT);
pinMode(M_right,OUTPUT);
pinMode(M_right2,OUTPUT);
pinMode(E_left,OUTPUT);
pinMode(E_right,OUTPUT);
pinMode(PinA_right,INPUT); //伺服电机编码器的OUTA和OUTB信号端设置为输入模式
pinMode(PinB_right,INPUT);
pinMode(PinA_left,INPUT);
pinMode(PinB_left,INPUT); //定义外部中断的中断子程序Code(),中断触发为下跳沿触发 //当编码器码盘的正交编码板OUTA脉冲信号发生下跳沿中断时, //将自动调用执行中断子程序Code()。
attachInterrupt(0, Code_right, FALLING);
attachInterrupt(1, Code_left, FALLING);//对直流电机驱动板的使能端口和转向端口进行设置,以使小车 //执行前进、后退、左转、右转、停止和速度切换动作。
}
void SetMotor(int nLeftVol, int nRightVol) {
if(nLeftVol >=0)
{digitalWrite(M_left,LOW);
digitalWrite(M_left2,HIGH);
} else {
digitalWrite(M_left,HIGH);
digitalWrite(M_left2,LOW);
nLeftVol=-nLeftVol;
}
if(nRightVol >= 0) {
digitalWrite(M_right,LOW);
digitalWrite(M_right2,HIGH);
} else {
digitalWrite(M_right,HIGH);
digitalWrite(M_right2,LOW);
nRightVol=-nRightVol;
}
if(nLeftVol>255) { nLeftVol = 255 ; } //防止PWM值超过255
if(nRightVol>255) { nRightVol = 255 ; }//防止PWM值超过255
analogWrite(E_left,nLeftVol);//将模拟值(PWM波)输出到管脚
analogWrite(E_right,nRightVol);
}
float PID1(float e,float kp,float ki,float kd)
{
static float es=0,sum=0;
float r;
sum+=e;
r = kp*e+ki*sum+kd*(e-es);
es=e;
return r;
}
float PID2(float e,float kp,float ki,float kd)
{
static float es=0,sum=0;
float r;
sum+=e;
r = kp*e+ki*sum+kd*(e-es);
es=e;
return r;
}
void loop() {
float kp=30,ki=0.0,kd=10,r1,r2;
if (sign==0) return;//sign为数据更新标志,每隔10ms更新一次,也就是说以下代码每隔10ms控制一次。
sign=0;
kd = (float)analogRead(1)/1024*200;
r1=PID1(Angle,kp,ki,kd);//PID1、PID2函数就是第四节的PID函数,为了区分左右轮,所以分成两个。
r2=PID2(Angle,kp,ki,kd);
SetMotor(r1,r2);//设置电机转速。
old_time= millis();
/*Serial.print("angle:");
Serial.print(Angle);Serial.print(" ");
Serial.print(r1);Serial.print(" ");
Serial.println(kd);Serial.print(" ");*/
time = millis();//以毫秒为单位,计算当前时间 //计算出每0.5秒钟内,编码器码盘计得的脉冲数,
if(abs(time - old_time) >= 500) // 如果计时时间10ms
{ detachInterrupt(0); // 关闭外部中断0
detachInterrupt(1); // 关闭外部中断1
//此直流减速电机的编码器码盘为334个齿,减速比为21.3。 //把编码器每0.5秒钟计得的脉冲数,换算为当前转速值的计算式
rpm_right =(float)count_right*60*2/(334*30);
rpm_left =(float)count_left*60*2/(334*30);
Serial.println( rpm_right);
Serial.println(rpm_left);
Serial.println("---------------");
Serial.println(rpm_right-rpm_left);
Serial.println("---------------");
}
}
void serialEvent() {
while (Serial.available()) {
Re_buf=(unsigned char)Serial.read();
if(counter==0&&Re_buf!=0x55) return; //第0号数据不是帧头
counter++;
if(counter==11) //接收到11个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
switch(Re_buf )
{
case 0x51:
a = float(short(Re_buf <<8| Re_buf ))/32768*16;
a =float(short(Re_buf <<8| Re_buf ))/32768*16;
a =float(short(Re_buf <<8| Re_buf ))/32768*16;
break;
case 0x52:
w =float(short(Re_buf <<8| Re_buf ))/32768*250;
w =float(short(Re_buf <<8| Re_buf ))/32768*250;
w =float(short(Re_buf <<8| Re_buf ))/32768*250;
break;
case 0x53:
Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
T =float(short(Re_buf <<8| Re_buf ));///340.0+36.25
sign=1;
break;
}
}
}
}
void Code_right()
{
count_right += 1; // 编码器码盘计数加一
}
//左侧电机编码器码盘计数中断子程序
void Code_left() { count_left += 1; // 编码器码盘计数加一
}
jackhuang
发表于 2015-4-28 21:37:32
下载附件竟然还要阅读权限啊~~~~~:L:L:L:L:L:L:L:L
jackhuang
发表于 2015-4-28 22:52:09
为啥附件下载不了~~~~~~~~~~~~~~:Q:Q:Q:Q:Q
immortal
发表于 2015-5-1 15:42:38
楼主,我也在做自平衡小车,我用的是arduino 的PID库,但是输出一直是0;帮我看看是什么原因,好吗?
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=14704&page=1#pid91785
immortal
发表于 2015-5-1 21:32:06
It's_me 发表于 2015-3-29 22:25 static/image/common/back.gif
我的程序都已经传到论坛上了啊
这个论坛吗?
cxlhaoahoxuexi
发表于 2015-5-16 17:43:21
我用的51单片机做的,也是MPU6050,不知道如何调节静差。请教一下楼主。
QH_飞蓬
发表于 2015-5-16 21:19:03
谢谢分享!!!!!!!!!!!
azh7138m
发表于 2015-5-17 20:23:43
权限不足很难受啊:(
页:
1
2
3
4
5
6
7
8
9
[10]
11
12
13
14
15
16