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.
main.cpp@0:bdb7452d5dd9, 2018-08-24 (annotated)
- Committer:
- TakekazuKATO
- Date:
- Fri Aug 24 13:04:00 2018 +0000
- Revision:
- 0:bdb7452d5dd9
Summer Camp 2018 3
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| TakekazuKATO | 0:bdb7452d5dd9 | 1 | #include <mbed.h> |
| TakekazuKATO | 0:bdb7452d5dd9 | 2 | #include "utils.h" |
| TakekazuKATO | 0:bdb7452d5dd9 | 3 | Timer timer; |
| TakekazuKATO | 0:bdb7452d5dd9 | 4 | int fall_time[3] = {0, 0, 0}; |
| TakekazuKATO | 0:bdb7452d5dd9 | 5 | int pulse_width[3] = {0, 0, 0}; |
| TakekazuKATO | 0:bdb7452d5dd9 | 6 | int irpower[3] = {0, 0, 0}; |
| TakekazuKATO | 0:bdb7452d5dd9 | 7 | float alpha = 0.03; |
| TakekazuKATO | 0:bdb7452d5dd9 | 8 | int hyst = 10; |
| TakekazuKATO | 0:bdb7452d5dd9 | 9 | //信号の立ち下がりの処理 |
| TakekazuKATO | 0:bdb7452d5dd9 | 10 | void irfall(int n) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 11 | int t = timer.read_us(); |
| TakekazuKATO | 0:bdb7452d5dd9 | 12 | if (t - fall_time[n] > 1000) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 13 | //1000us以上パルスを感知していない場合は0 |
| TakekazuKATO | 0:bdb7452d5dd9 | 14 | irpower[n] = 0; |
| TakekazuKATO | 0:bdb7452d5dd9 | 15 | } else if (t - fall_time[n] > 800) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 16 | //正常ならパルスの間隔は833usになる.間隔が800us以下の場合は無視する. |
| TakekazuKATO | 0:bdb7452d5dd9 | 17 | |
| TakekazuKATO | 0:bdb7452d5dd9 | 18 | //ノイズによる時間のゆらぎを平滑化 |
| TakekazuKATO | 0:bdb7452d5dd9 | 19 | irpower[n] = (1.0 - alpha) * irpower[n] + alpha * pulse_width[n]; |
| TakekazuKATO | 0:bdb7452d5dd9 | 20 | } |
| TakekazuKATO | 0:bdb7452d5dd9 | 21 | //立ち下がり時刻を記録 |
| TakekazuKATO | 0:bdb7452d5dd9 | 22 | fall_time[n] = t; |
| TakekazuKATO | 0:bdb7452d5dd9 | 23 | } |
| TakekazuKATO | 0:bdb7452d5dd9 | 24 | //信号の立ち上がりの処理 |
| TakekazuKATO | 0:bdb7452d5dd9 | 25 | void irrise(int n) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 26 | //立ち下がりパルスの幅を記録 |
| TakekazuKATO | 0:bdb7452d5dd9 | 27 | pulse_width[n] = timer.read_us() - fall_time[n]; |
| TakekazuKATO | 0:bdb7452d5dd9 | 28 | } |
| TakekazuKATO | 0:bdb7452d5dd9 | 29 | void irright_fall() { irfall(0); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 30 | void irright_rise() { irrise(0); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 31 | void ircenter_fall() { irfall(1); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 32 | void ircenter_rise() { irrise(1); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 33 | void irleft_fall() { irfall(2); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 34 | void irleft_rise() { irrise(2); } |
| TakekazuKATO | 0:bdb7452d5dd9 | 35 | |
| TakekazuKATO | 0:bdb7452d5dd9 | 36 | int main() { |
| TakekazuKATO | 0:bdb7452d5dd9 | 37 | // A0, A1, A2ピンをパルス検出に使用 |
| TakekazuKATO | 0:bdb7452d5dd9 | 38 | InterruptIn irright(A0); |
| TakekazuKATO | 0:bdb7452d5dd9 | 39 | InterruptIn ircenter(A1); |
| TakekazuKATO | 0:bdb7452d5dd9 | 40 | InterruptIn irleft(A2); |
| TakekazuKATO | 0:bdb7452d5dd9 | 41 | |
| TakekazuKATO | 0:bdb7452d5dd9 | 42 | timer.start(); |
| TakekazuKATO | 0:bdb7452d5dd9 | 43 | irright.fall(irright_fall); |
| TakekazuKATO | 0:bdb7452d5dd9 | 44 | irright.rise(irright_rise); |
| TakekazuKATO | 0:bdb7452d5dd9 | 45 | ircenter.fall(ircenter_fall); |
| TakekazuKATO | 0:bdb7452d5dd9 | 46 | ircenter.rise(ircenter_rise); |
| TakekazuKATO | 0:bdb7452d5dd9 | 47 | irleft.fall(irleft_fall); |
| TakekazuKATO | 0:bdb7452d5dd9 | 48 | irleft.rise(irleft_rise); |
| TakekazuKATO | 0:bdb7452d5dd9 | 49 | |
| TakekazuKATO | 0:bdb7452d5dd9 | 50 | int hyst = 10; |
| TakekazuKATO | 0:bdb7452d5dd9 | 51 | //左右のモーターの速さを設定 |
| TakekazuKATO | 0:bdb7452d5dd9 | 52 | left_speed = 0.4; |
| TakekazuKATO | 0:bdb7452d5dd9 | 53 | right_speed = 0.4; |
| TakekazuKATO | 0:bdb7452d5dd9 | 54 | while (1) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 55 | printf("%d,%d,%d\n", irpower[0], irpower[1], irpower[2]); |
| TakekazuKATO | 0:bdb7452d5dd9 | 56 | if (irpower[1] > irpower[0] + hyst && irpower[1] > irpower[2] + hyst) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 57 | //右のセンサが一番強く反応する場合 |
| TakekazuKATO | 0:bdb7452d5dd9 | 58 | turn_right(); |
| TakekazuKATO | 0:bdb7452d5dd9 | 59 | } else if (irpower[2] > irpower[1] + hyst && |
| TakekazuKATO | 0:bdb7452d5dd9 | 60 | irpower[2] > irpower[0] + hyst) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 61 | //左のセンサが一番強く反応する場合 |
| TakekazuKATO | 0:bdb7452d5dd9 | 62 | turn_left(); |
| TakekazuKATO | 0:bdb7452d5dd9 | 63 | } else if (irpower[0] > irpower[1] + hyst && |
| TakekazuKATO | 0:bdb7452d5dd9 | 64 | irpower[0] > irpower[2] + hyst) { |
| TakekazuKATO | 0:bdb7452d5dd9 | 65 | //正面のセンサが一番強く反応する場合 |
| TakekazuKATO | 0:bdb7452d5dd9 | 66 | go_straight(); |
| TakekazuKATO | 0:bdb7452d5dd9 | 67 | } |
| TakekazuKATO | 0:bdb7452d5dd9 | 68 | } |
| TakekazuKATO | 0:bdb7452d5dd9 | 69 | } |