etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
Walker.cpp
[詳解]
1 #include "Walker.h"
2 
4 {
5  // init_f("Walker");
6 }
7 
9 {
10  controller.printDisplay(1, "Stopped.");
11  controller.leftWheel.stop();
12  controller.rightWheel.stop();
13 }
14 
16 {
17  controller.leftWheel.reset();
18  controller.rightWheel.reset();
19 }
20 
22 {
23  run(0, 0);
24 
25  controller.printDisplay(1, "stopping...");
26  controller.leftWheel.reset();
27  controller.rightWheel.reset();
28 }
29 
30 void Walker::run(std::int8_t pwm, std::int8_t turn)
31 {
32  controller.printDisplay(1, "running...");
33  setBrakeMotor(false);
34  /* left = p-t, right = p+t -> 右 */
35  /* left = p+t, right = p-t -> 左 */
36  // pwmは int型の -100 ~ 100
37  controller.leftWheel.setPWM(pwm - turn);
38  controller.rightWheel.setPWM(pwm + turn);
39 }
40 
41 void Walker::setBrakeMotor(bool brake)
42 {
43  // 0でフロート
44  // 1でブレーク
45  controller.leftWheel.setBrake(brake);
46  controller.rightWheel.setBrake(brake);
47 }
48 
49 std::int32_t Walker::get_count_L()
50 {
51  return controller.leftWheel.getCount();
52 }
53 
54 std::int32_t Walker::get_count_R()
55 {
56  return controller.rightWheel.getCount();
57 }
58 
60 {
61  if(leftRight == 1) {
62  run(10, 5);
63  controller.clock.sleep(10);
64  leftRight = -1;
65  } else {
66  run(10, 5);
67  controller.clock.sleep(10);
68  leftRight = 1;
69  }
70 
71  return leftRight;
72 }
73 
74 /*
75  * 車輪の回転角分だけ進む
76  */
77 void Walker::moveAngle(std::int8_t pwm, int angle)
78 {
79  controller.leftWheel.reset();
80  controller.rightWheel.reset();
81 
82  controller.leftWheel.setPWM(pwm);
83  controller.rightWheel.setPWM(pwm);
84 
85  while(1) {
86  if(controller.leftWheel.getCount() >= angle && controller.rightWheel.getCount() >= angle) break;
87  controller.clock.sleep(4);
88  }
89 
90  controller.leftWheel.reset();
91  controller.rightWheel.reset();
92 }
93 
94 /*
95  * 主機能:45度単位で回転
96  * rotation = 1 -> 反時計回り, rotation = -1 -> 時計回り
97  *
98  * beta機能:5度単位で回転
99  * 精度はあまりよろしくない
100  */
101 void Walker::angleChange(int angle, int rotation)
102 {
103  int32_t defaultAngleL;
104  int8_t dAngle = 75; // 45度におけるモーター回転数(床材によって変わる?)
105 
106  if(rotation >= 0) {
107  if(leftRight == 1) {
108  rotation = 1;
109  } else {
110  rotation = -1;
111  }
112  } else {
113  if(leftRight == 1) {
114  rotation = -1;
115  } else {
116  rotation = 1;
117  }
118  }
119 
120  /*
121  * 本来は45度単位だから、angleは45で割る
122  * ベータ機能として5度単位でも曲がれるようにしている
123  * そのため、もしangleが5度単位である場合はdAngleを9分割する
124  */
125  if(angle % 5 == 0 && angle % 45 != 0) {
126  dAngle = 8;
127  angle /= 5;
128  } else {
129  angle -= angle % 45;
130  angle /= 45;
131  }
132 
133  defaultAngleL = controller.leftWheel.getCount();
134 
135  while(1) {
136  run(0, 10 * rotation);
137  if(rotation >= 0) {
138  if(controller.leftWheel.getCount() - defaultAngleL < -dAngle * angle * rotation
139  || controller.leftWheel.getCount() - defaultAngleL > dAngle * angle * rotation) {
140  break;
141  }
142  } else {
143  if(controller.leftWheel.getCount() - defaultAngleL > -dAngle * angle * rotation
144  || controller.leftWheel.getCount() - defaultAngleL < dAngle * angle * rotation) {
145  break;
146  }
147  }
148  controller.clock.sleep(4);
149  }
150  stop();
151 }
void setPWM(int pwm)
Definition: Motor.cpp:31
void stop()
Definition: Walker.cpp:21
int edgeChange()
Definition: Walker.cpp:59
void setBrake(bool brake)
Definition: Motor.cpp:47
void reset(void)
Definition: Motor.h:55
Clock clock
Definition: Controller.h:48
void setBrakeMotor(bool brake)
Definition: Walker.cpp:41
void init()
Definition: Walker.cpp:3
void angleChange(int angle, int rotation)
Definition: Walker.cpp:101
void run(std::int8_t pwm, std::int8_t turn)
Definition: Walker.cpp:30
void terminate()
Definition: Walker.cpp:8
void sleep(uint32_t duration)
Definition: Clock.h:58
void stop()
Definition: Motor.h:97
void reset()
Definition: Walker.cpp:15
std::int32_t get_count_R()
Definition: Walker.cpp:54
Motor leftWheel
Definition: Controller.h:46
void printDisplay(int8_t row, const char *format,...)
Definition: Controller.cpp:79
void moveAngle(std::int8_t pwm, int angle)
Definition: Walker.cpp:77
int32_t getCount(void) const
Definition: Motor.h:67
std::int32_t get_count_L()
Definition: Walker.cpp:49
Motor rightWheel
Definition: Controller.h:45