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