Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 17:2b3fa9b1a05b
- Parent:
- 16:1e91753f0a01
- Child:
- 18:d0a6771fa38d
diff -r 1e91753f0a01 -r 2b3fa9b1a05b main.cpp
--- a/main.cpp Thu May 02 09:24:28 2019 +0000
+++ b/main.cpp Thu May 02 09:34:57 2019 +0000
@@ -1,8 +1,8 @@
#include "mbed.h"
+#include "debug.h"
#include "pin.h"
#include "microinfinity.h"
-#include "pidcontroller.h"
-#include "debug.h"
+#include "robot.h"
/*
//#define DEBUG_ON
@@ -26,184 +26,6 @@
};
float accel_max = 0.01; //これグローバルにしたのはごめん。set関数多すぎてめんどくなった。
-
-class Motor //PIDコントローラ、エンコーダを含むモータのクラス
-{
- PwmOut *pin_forward_, *pin_back_;
- Ec *ec_; //対応するエンコーダ
- float duty_, pre_duty_, duty_limit_; //dutyと現在のモータ位置
- int resolution_;
-public:
- Motor(PwmOut *forward, PwmOut *back); //ピンをポインタ渡し
- void setDutyLimit(float limit)
- {
- duty_limit_ = limit;
- };
- float getDutyLimit()
- {
- return duty_limit_;
- };
- float getPosi(); //ポジをエンコーダから取得
- void calcDuty(PIDcontroller *pid); //Duty比を計算
- void setEncoder(Ec *ec)
- {
- ec_ = ec;
- }; //エンコーダを設定
- void setResolution(int reso)
- {
- resolution_ = reso;
- };
- void output(); //出力するだけ
- void output(float duty);
-};
-
-class OneLeg //足の挙動を制御する
-{
- Motor *motor_;
- float target_pose_;
-
-public:
- PIDcontroller *pid_;
- OneLeg() {};
- void setMotor(Motor *motor)
- {
- motor_ = motor;
- };
- void setPIDcontroller(PIDcontroller *pid)
- {
- pid_ = pid;
- };
- void setTargetPose(float target_pose);
- void actMotor();//モータ出力
-};
-
-class Robot
-{
- float ticker_time_, air_wait_time_;
- OneLeg *Leg1_, *Leg2_;
- Timer timer;
-
-public:
- Robot()
- {
- timer.reset();
- timer.start();
- };
- void setLeg(OneLeg *Leg1_, OneLeg *Leg2_);
- void setTickerTime(float ticker_time);
- void run();//ここがメインで走る記述
-};
-
-
-
-Motor::Motor(PwmOut *forward, PwmOut *back)
-{
- pin_forward_ = forward;
- pin_back_ = back;
-}
-float Motor::getPosi()
-{
- float posi = 2.0*180*((float)(ec_->getCount)()/(float)resolution_);
-
- //DEBUG("value :%d :%d\n\r", (ec_->getCount)(),resolution_);
- DEBUG("posi is %.4f\n\r",posi);
- return posi;
-}
-void Motor::calcDuty(PIDcontroller *pid)
-{
- duty_ = pid->calc(getPosi());
- DEBUG("duty is %.4f\n\r",duty_);
-}
-void Motor::output()
-{
- //DEBUG("dutyOut %.3f\n\r",duty_);
- //加速度が一定値を超えたら変更加える
- if (duty_ > 0) {
- //if (duty_ - pre_duty_ > accel_max) duty_ = pre_duty_ + accel_max;
- double output_duty=min(fabs(duty_), duty_limit_);
- pin_forward_->write(output_duty);
- pin_back_->write(0);
- DEBUG("forward %.3f\n\r",pin_forward_->read());
- } else {
- //if (pre_duty_ - duty_ > accel_max)
- // duty_ = pre_duty_ - accel_max;
- double output_duty=min(fabs(duty_), duty_limit_);
- pin_forward_->write(0);
- pin_back_->write(output_duty);
- DEBUG("back %.3f\n\r",pin_back_->read());
- }
- pre_duty_ = duty_;
-}
-void Motor::output(float duty)
-{
- duty_ = duty;
- //DEBUG("dutyOut %.3f\n\r",duty_);
- //加速度が一定値を超えたら変更加える
- if (duty_ > 0) {
- //if (duty_ - pre_duty_ > accel_max) duty_ = pre_duty_ + accel_max;
- double output_duty=min(fabs(duty_), duty_limit_);
- pin_forward_->write(output_duty);
- pin_back_->write(0);
- DEBUG("forward %.3f\n\r",pin_forward_->read());
- } else {
- //if (pre_duty_ - duty_ > accel_max)
- // duty_ = pre_duty_ - accel_max;
- double output_duty=min(fabs(duty_), duty_limit_);
- pin_forward_->write(0);
- pin_back_->write(output_duty);
- DEBUG("back %.3f\n\r",pin_back_->read());
- }
- pre_duty_ = duty_;
-}
-
-void OneLeg::setTargetPose(float target_pose)
-{
- target_pose_ = target_pose;
- //PIDにtargetを送る
- pid_->setTarget(target_pose_);
-}
-void OneLeg::actMotor()
-{
- motor_->calcDuty(pid_);
- motor_->output();
-}
-
-
-
-void Robot::setLeg(OneLeg *Leg1, OneLeg *Leg2)
-{
- Leg1_ = Leg1;
- Leg2_ = Leg2;
-}
-void Robot::setTickerTime(float ticker_time)
-{
- ticker_time_ = ticker_time;
- Leg1_->pid_->setTimeDelta(ticker_time_);
- Leg2_->pid_->setTimeDelta(ticker_time_);
-}
-void Robot::run()
-{
- while (!Leg1_->pid_->IsConvergence_ || !Leg2_->pid_->IsConvergence_) { //片方が収束していない時*/
- //ticker_time毎にモータに出力する
- float time_s = timer.read();
- Leg1_->actMotor();
- Leg2_->actMotor();
- float rest_time_s = ticker_time_ - (timer.read() - time_s);
- //ticker_timeまで待機
- if (rest_time_s > 0) {
- wait(rest_time_s);
- DEBUG("start:%.3f last: %.3f restTime: %.3f\n\r",time_s, timer.read(),rest_time_s);
- }
-
- else //時間が足りない場合警告
- printf("error: restTime not enough\n\r");
- DEBUG("loop end\n\r")
- }
-
-}
-
-
-
////////////関数
void reset();
void setup();