right and left move at the same time

Dependencies:   mbed robot

Committer:
yuto17320508
Date:
Wed May 15 10:19:13 2019 +0000
Revision:
13:678870d8f851
Parent:
0:411ab20ce87d
l

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eri 0:411ab20ce87d 1 #ifndef __INCLUDED_EC_H_
eri 0:411ab20ce87d 2 #define __INCLUDED_EC_H_
eri 0:411ab20ce87d 3
eri 0:411ab20ce87d 4 #ifndef M_pi
eri 0:411ab20ce87d 5 #define M_pi 3.141592
eri 0:411ab20ce87d 6 #endif
eri 0:411ab20ce87d 7 /**@class Ec
eri 0:411ab20ce87d 8 @brief increment型encoder用class.
eri 0:411ab20ce87d 9 Z相(1周につき1回立ち上がる)の機能あり.
eri 0:411ab20ce87d 10 普通に使う分には不必要な機能ですが、回転回数が欲しい場合や、回転が非常に早い物の回転速度が欲しい場合などで
eri 0:411ab20ce87d 11 A,B相での処理だとマイコンが追いつかない場合などに使ってください
eri 0:411ab20ce87d 12 */
eri 0:411ab20ce87d 13 class Ec
eri 0:411ab20ce87d 14 {
eri 0:411ab20ce87d 15 protected:
eri 0:411ab20ce87d 16 int S; //A相B相のパターン(1~4)
eri 0:411ab20ce87d 17 bool stateA,stateB; //A・B相の状態
eri 0:411ab20ce87d 18 int count; //カウント数 分解能分で一周
eri 0:411ab20ce87d 19 int pre_count; //一つ前のカウント
eri 0:411ab20ce87d 20 double precount; //4倍精度カウント
eri 0:411ab20ce87d 21 int solution; //分解能
eri 0:411ab20ce87d 22 double dt; //角速度の計算間隔
eri 0:411ab20ce87d 23 double distance_mm_;//距離[mm]
eri 0:411ab20ce87d 24 double diameter_mm_;//測定輪半径
eri 0:411ab20ce87d 25 double count_to_distance_mm_;//カウントを距離に変換する係数
eri 0:411ab20ce87d 26 double gear_rate_;//ギア比(エンコーダタイムプーリー/測定輪タイムプーリー)
eri 0:411ab20ce87d 27 int is_diameter_set;//diameterがセットされていたら1
eri 0:411ab20ce87d 28 //z相用
eri 0:411ab20ce87d 29 bool first;
eri 0:411ab20ce87d 30 int rev;
eri 0:411ab20ce87d 31 double now_time,old_time;
eri 0:411ab20ce87d 32 double RPM,RPM_old;
eri 0:411ab20ce87d 33 int RPM_th;
eri 0:411ab20ce87d 34
eri 0:411ab20ce87d 35 InterruptIn signalA_;
eri 0:411ab20ce87d 36 //InterruptIn signalB_;
eri 0:411ab20ce87d 37 DigitalIn signalB_;
eri 0:411ab20ce87d 38 // InterruptIn signalZ_;
eri 0:411ab20ce87d 39
eri 0:411ab20ce87d 40 void upA();
eri 0:411ab20ce87d 41 void downA();
eri 0:411ab20ce87d 42 void upB();
eri 0:411ab20ce87d 43 void downB();
eri 0:411ab20ce87d 44 // void upZ();
eri 0:411ab20ce87d 45 // void downZ();
eri 0:411ab20ce87d 46 void setCountToDistance_mm();//countからdistanceに変換する係数を計算する。
eri 0:411ab20ce87d 47 public:
eri 0:411ab20ce87d 48 double omega; //角速度
eri 0:411ab20ce87d 49 /** コンストラクタの定義
eri 0:411ab20ce87d 50 *
eri 0:411ab20ce87d 51 * ***Z相の機能を追加したことで引数が増えました!!!!***
eri 0:411ab20ce87d 52 *
eri 0:411ab20ce87d 53 * main関数の前に必ず一度宣言する
eri 0:411ab20ce87d 54 *
eri 0:411ab20ce87d 55 * 使うエンコーダの数だけ設定する必要がある
eri 0:411ab20ce87d 56 *
eri 0:411ab20ce87d 57 * @param signalA エンコーダA相のピン名
eri 0:411ab20ce87d 58 * @param signalB エンコーダB相のピン名
eri 0:411ab20ce87d 59 * @param signalZ エンコーダZ相のピン名
eri 0:411ab20ce87d 60 * @param s エンコーダの分解能(省略可)
eri 0:411ab20ce87d 61 * @param t 角速度計算の間隔(省略可)
eri 0:411ab20ce87d 62 */
eri 0:411ab20ce87d 63 /** @section CAUTION
eri 0:411ab20ce87d 64 * 今まで以下のように定義していたものは
eri 0:411ab20ce87d 65 * @code
eri 0:411ab20ce87d 66 * #include "mbed.h"
eri 0:411ab20ce87d 67 * #include "EC.h"
eri 0:411ab20ce87d 68 *
eri 0:411ab20ce87d 69 * Ec Ec1(PA_0,PA_1,1024,0.05);
eri 0:411ab20ce87d 70 * @endcode
eri 0:411ab20ce87d 71 * 次のようにZ相の引数の部分に、NCと入れれば今までの様に使える
eri 0:411ab20ce87d 72 * @code
eri 0:411ab20ce87d 73 * #include "mbed.h"
eri 0:411ab20ce87d 74 * #include "EC.h"
eri 0:411ab20ce87d 75 *
eri 0:411ab20ce87d 76 * Ec Ec1(PA_0,PA_1,NC,1024,0.05);
eri 0:411ab20ce87d 77 * @endcode
eri 0:411ab20ce87d 78 */
eri 0:411ab20ce87d 79 Ec(PinName signalA,PinName signalB,PinName signalZ,int s,double t);
eri 0:411ab20ce87d 80
eri 0:411ab20ce87d 81 ///countの値を返す関数(int型)
eri 0:411ab20ce87d 82 int getCount();
eri 0:411ab20ce87d 83
eri 0:411ab20ce87d 84 /** omega(角速度 rad/s)の値を計算する関数
eri 0:411ab20ce87d 85 * @section CAUTION
eri 0:411ab20ce87d 86 * CalOmega関数は、一定時間ごと(dtごと)に計算される必要があるので、main関数内でタイマー割り込みを設定する必要がある。
eri 0:411ab20ce87d 87 * @code
eri 0:411ab20ce87d 88 * #include "mbed.h"
eri 0:411ab20ce87d 89 * #include "EC.h" //ライブラリをインクルード
eri 0:411ab20ce87d 90 *
eri 0:411ab20ce87d 91 * Ec Ec1(PA_0,PA_1,NC,1024,0.05); //分解能1024、計算間隔0.05秒に設定、Z相は使わない
eri 0:411ab20ce87d 92 * Ticker ticker;
eri 0:411ab20ce87d 93 * DigitalIn button(USER_BUTTON);
eri 0:411ab20ce87d 94 * Serial pc(USBTX,USBRX);
eri 0:411ab20ce87d 95 *
eri 0:411ab20ce87d 96 * void calOmega(){
eri 0:411ab20ce87d 97 * Ec1.CalOmega();
eri 0:411ab20ce87d 98 * }
eri 0:411ab20ce87d 99 *
eri 0:411ab20ce87d 100 * int main(){
eri 0:411ab20ce87d 101 * ticker.attach(&calOmega,0.05); //0.05秒間隔で角速度を計算
eri 0:411ab20ce87d 102 * while(1){
eri 0:411ab20ce87d 103 * pc.printf(" count1=%d ",Ec1.getCount());
eri 0:411ab20ce87d 104 * pc.printf(" omega1=%f\r\n ",Ec1.getOmega());
eri 0:411ab20ce87d 105 * if(pc.readable()) {
eri 0:411ab20ce87d 106 * char sel=pc.getc();
eri 0:411ab20ce87d 107 * if(sel=='r') Ec1.reset(); //rを押したらリセット
eri 0:411ab20ce87d 108 * }
eri 0:411ab20ce87d 109 * }
eri 0:411ab20ce87d 110 * }
eri 0:411ab20ce87d 111 * @endcode
eri 0:411ab20ce87d 112 */
eri 0:411ab20ce87d 113 void CalOmega();
eri 0:411ab20ce87d 114
eri 0:411ab20ce87d 115 ///omega(角速度 rad/s)の値を返す関数(double型)
eri 0:411ab20ce87d 116 double getOmega();
eri 0:411ab20ce87d 117 ///四倍精度のcountの値を返す関数(double型)
eri 0:411ab20ce87d 118 double getPreCount();
eri 0:411ab20ce87d 119 ///エンコーダを初期状態に戻す関数 countやomegaの値を0にする
eri 0:411ab20ce87d 120 virtual void reset();
eri 0:411ab20ce87d 121 ///角速度計算の間隔dtを決めることができる(デフォルトは0.05秒)
eri 0:411ab20ce87d 122 void setTime(double t);
eri 0:411ab20ce87d 123 ///(Z相を使用する場合)回転回数を返す関数(int型)
eri 0:411ab20ce87d 124 int getRev();
eri 0:411ab20ce87d 125
eri 0:411ab20ce87d 126 ///(Z相を使用する場合)回転速度(rpm)の値を返す関数(double型)
eri 0:411ab20ce87d 127 /** @section SAMPLE
eri 0:411ab20ce87d 128 * z相を使う場合のプログラムの例
eri 0:411ab20ce87d 129 * @code
eri 0:411ab20ce87d 130 * #include "mbed.h"
eri 0:411ab20ce87d 131 * #include "EC.h" //ライブラリをインクルード
eri 0:411ab20ce87d 132 *
eri 0:411ab20ce87d 133 * Ec Ec1(NC,NC,PA_0,1024,0.05); //A相B相が不必要な場合も、このようにNCと入れればよい
eri 0:411ab20ce87d 134 * DigitalIn button(USER_BUTTON);
eri 0:411ab20ce87d 135 * Serial pc(USBTX,USBRX);
eri 0:411ab20ce87d 136 *
eri 0:411ab20ce87d 137 * int main(){
eri 0:411ab20ce87d 138 * while(1){
eri 0:411ab20ce87d 139 * pc.printf(" rev1=%d ",Ec1.getRev());
eri 0:411ab20ce87d 140 * pc.printf(" rpm1=%f\r\n ",Ec1.getRPM());
eri 0:411ab20ce87d 141 * if(!button) Ec1.reset(); //USERボタンを押したらリセット
eri 0:411ab20ce87d 142 * }
eri 0:411ab20ce87d 143 * }
eri 0:411ab20ce87d 144 * @endcode
eri 0:411ab20ce87d 145 */
eri 0:411ab20ce87d 146 double getRPM();
eri 0:411ab20ce87d 147 void changeRPM_th(int th);
eri 0:411ab20ce87d 148
eri 0:411ab20ce87d 149 /** @caution 先にsetDiameter_mmをしないと正しい値とならない
eri 0:411ab20ce87d 150 @return 現在距離.
eri 0:411ab20ce87d 151 @code
eri 0:411ab20ce87d 152 #include <mbed.h>
eri 0:411ab20ce87d 153 #include "EC.h"
eri 0:411ab20ce87d 154 Ec ec(PB_5, PB_4, NC, 500, 0.5);
eri 0:411ab20ce87d 155 int main()
eri 0:411ab20ce87d 156 {
eri 0:411ab20ce87d 157 ec.setDiameter_mm(48);
eri 0:411ab20ce87d 158 while(1) {
eri 0:411ab20ce87d 159 printf("%f\r\n", ec.getDistance_mm());
eri 0:411ab20ce87d 160 wait(0.1);
eri 0:411ab20ce87d 161 }
eri 0:411ab20ce87d 162 }
eri 0:411ab20ce87d 163 @endcode
eri 0:411ab20ce87d 164 */
eri 0:411ab20ce87d 165 double getDistance_mm();
eri 0:411ab20ce87d 166
eri 0:411ab20ce87d 167 /** @param diameter_mm 測定輪半径
eri 0:411ab20ce87d 168 */
eri 0:411ab20ce87d 169 void setDiameter_mm(double diameter_mm);
eri 0:411ab20ce87d 170 /** @param gear比(エンコーダタイムプーリー/測定輪タイムプーリー)
eri 0:411ab20ce87d 171 */
eri 0:411ab20ce87d 172 void setGearRate(double gear_rate);
eri 0:411ab20ce87d 173 static double deftime;//角速度計算の間隔
eri 0:411ab20ce87d 174 static int defsolution;//エンコーダの分解能のデフォルト値
eri 0:411ab20ce87d 175 //Timer timer;
eri 0:411ab20ce87d 176 };
eri 0:411ab20ce87d 177
eri 0:411ab20ce87d 178
eri 0:411ab20ce87d 179 #endif