Takekazu Kato / Mbed 2 deprecated SC2018-3

Dependencies:   mbed

Committer:
TakekazuKATO
Date:
Fri Aug 24 13:04:00 2018 +0000
Revision:
0:bdb7452d5dd9
Summer Camp 2018 3

Who changed what in which revision?

UserRevisionLine numberNew 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 }