倒立振子のプログラムです。ジャイロセンサーの値を積分し、角度を。。モーターの出力を積分して移動距離を算出しています。
Dependencies: mbed
main.cpp
- Committer:
- WAT34
- Date:
- 2015-03-29
- Revision:
- 0:cb965cafb758
File content as of revision 0:cb965cafb758:
#include "mbed.h" #define pi 3.141592653589794 #define waddr 0xD0 #define raddr 0xD1 #define kt 0.1 //出力値の各ゲインを調節 #define ko 0.1 #define kp 0.1 #define kd 0.1 PwmOut mp[4] ={p21,p22,p23,p24}; I2C sen(p9,p10); Timer global; Timer pt; void motor_cont(char select,double percent)//selectが0の時は左がselectが1の時は右のモータをコントロール。 { select *= 2; if (percent>0){ mp[select] = fabs(percent); mp[select+1] = 0; }else if (percent <0){ mp[select] = 0; mp[select+1] = fabs(percent); }else{ mp[select] = 0; mp[select+1] = 0; } } void sensor_init(){ //センサ計測よーーーーーい sen.frequency(400000); char put[2][2]; //送る値の用意 put[0][0] = 0x6b; put[0][1] = 0x00; put[1][0] = 0x37; put[1][1] = 0x02; sen.write(waddr,put[0],2); //送信 sen.write(waddr,put[1],2); } void get_gyro(double *x,double *y,double *z,int *time) //ジャイロの値をもってくる { int i; //変数用意 char tv[6]; short t[3]; char put[] ={0x43}; sen.write(waddr,put,1); //センサに送信 sen.read(raddr,tv,6); for(i = 0;i <3;i++){ //xyzそれぞれの値を算出 t[i] = tv[2*i]<<8+tv[2*i+1]; } global.stop(); *time = global.read_us(); global.reset(); global.start(); *x = t[0]*0.00763; //dag/secに単位換算 *y = t[1]*0.00763; *z = t[2]*0.00763; } //------------------main function------------------------------------------------------------------------------------------ int main() { global.start(); //プログラムでの経過時間をけいそく(積分などで利用) sensor_init(); double x,y,z,x2,theta,omega,power,power2,distance; int time,time2; while(1) { get_gyro(&x,&y,&z,&time); theta = theta+(x+x2)*time/(2.0*1000000.0); //積分して角度算出 omega = x; power = kt*theta + ko*omega +kp*power; time2 = pt.read_us(); distance = distance + (power+power2)*time2/(2.0*1000000.0); //移動距離を出力を積分して算出 power += kd*distance; pt.reset(); pt.start(); x2 = x; power2 = power; } }