1

Dependencies:   RemoteIR TextLCD

Committer:
jiang111
Date:
Wed Sep 23 01:45:03 2020 +0000
Revision:
0:4c4775017e8a
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jiang111 0:4c4775017e8a 1
jiang111 0:4c4775017e8a 2 /* mbed Microcontroller Library
jiang111 0:4c4775017e8a 3 * Copyright (c) 2019 ARM Limited
jiang111 0:4c4775017e8a 4 * SPDX-License-Identifier: Apache-2.0
jiang111 0:4c4775017e8a 5 */
jiang111 0:4c4775017e8a 6
jiang111 0:4c4775017e8a 7 #include "mbed.h"
jiang111 0:4c4775017e8a 8 #include "ReceiverIR.h"
jiang111 0:4c4775017e8a 9 #include "rtos.h"
jiang111 0:4c4775017e8a 10 #include <stdint.h>
jiang111 0:4c4775017e8a 11 #include "platform/mbed_thread.h"
jiang111 0:4c4775017e8a 12 #include "TextLCD.h"
jiang111 0:4c4775017e8a 13
jiang111 0:4c4775017e8a 14 RawSerial pc(USBTX, USBRX);
jiang111 0:4c4775017e8a 15
jiang111 0:4c4775017e8a 16 /* マクロ定義、列挙型定義 */
jiang111 0:4c4775017e8a 17 #define MIN_V 2.0 // 電圧の最小値
jiang111 0:4c4775017e8a 18 #define MAX_V 2.67 // 電圧の最大値
jiang111 0:4c4775017e8a 19 #define LOW 0 // モーターOFF
jiang111 0:4c4775017e8a 20 #define HIGH 1 // モーターON
jiang111 0:4c4775017e8a 21 #define NORMAL 0 // 普通
jiang111 0:4c4775017e8a 22 #define FAST 1 // 速い
jiang111 0:4c4775017e8a 23 #define VERYFAST 2 // とても速い
jiang111 0:4c4775017e8a 24
jiang111 0:4c4775017e8a 25 #define SLOW 0.8
jiang111 0:4c4775017e8a 26 #define REVERSE 0.5
jiang111 0:4c4775017e8a 27
jiang111 0:4c4775017e8a 28 #define MBED04 0.781//Mbed04号機の左右のモーター速度比(R:L = 1: 0.781)
jiang111 0:4c4775017e8a 29 #define MBED05 0.953//Mbed05号機の左右のモーター速度比(R:L = 1: 0.953)
jiang111 0:4c4775017e8a 30 #define MSR0 0.6
jiang111 0:4c4775017e8a 31 #define MSR1 0.65
jiang111 0:4c4775017e8a 32 #define MSR2 0.7
jiang111 0:4c4775017e8a 33 #define MSR3 0.75
jiang111 0:4c4775017e8a 34 #define MSR4 0.8
jiang111 0:4c4775017e8a 35 #define MSR5 0.85
jiang111 0:4c4775017e8a 36 #define MSR6 0.9
jiang111 0:4c4775017e8a 37 #define MSR7 0.95
jiang111 0:4c4775017e8a 38 #define MSR8 1
jiang111 0:4c4775017e8a 39 #define MSL0 MSR0
jiang111 0:4c4775017e8a 40 #define MSL1 MSR1
jiang111 0:4c4775017e8a 41 #define MSL2 MSR2//*MBED05
jiang111 0:4c4775017e8a 42 #define MSL3 MSR3//*MBED05
jiang111 0:4c4775017e8a 43 #define MSL4 MSR4//*MBED05
jiang111 0:4c4775017e8a 44 #define MSL5 MSR5//*MBED05
jiang111 0:4c4775017e8a 45 #define MSL6 MSR6//*MBED05
jiang111 0:4c4775017e8a 46 #define MSL7 MSR7//*MBED05
jiang111 0:4c4775017e8a 47 #define MSL8 MSR8//*MBED05
jiang111 0:4c4775017e8a 48
jiang111 0:4c4775017e8a 49 /* 操作モード定義 */
jiang111 0:4c4775017e8a 50 enum MODE{
jiang111 0:4c4775017e8a 51 READY = -1, // -1:待ち
jiang111 0:4c4775017e8a 52 ADVANCE = 1, // 1:前進
jiang111 0:4c4775017e8a 53 RIGHT, // 2:右折
jiang111 0:4c4775017e8a 54 LEFT, // 3:左折
jiang111 0:4c4775017e8a 55 BACK, // 4:後退
jiang111 0:4c4775017e8a 56 STOP, // 5:停止
jiang111 0:4c4775017e8a 57 LINE_TRACE, // 6:ライントレース
jiang111 0:4c4775017e8a 58 AVOIDANCE, // 7:障害物回避
jiang111 0:4c4775017e8a 59 SPEED, // 8:スピード制御
jiang111 0:4c4775017e8a 60 };
jiang111 0:4c4775017e8a 61
jiang111 0:4c4775017e8a 62 /* ピン配置 */
jiang111 0:4c4775017e8a 63 ReceiverIR ir(p5); // リモコン操作
jiang111 0:4c4775017e8a 64 DigitalOut trig(p6); // 超音波センサtrigger
jiang111 0:4c4775017e8a 65 DigitalIn echo(p7); // 超音波センサecho
jiang111 0:4c4775017e8a 66 DigitalIn ss1(p8); // ライントレースセンサ(左)
jiang111 0:4c4775017e8a 67 DigitalIn ss2(p9); // ライントレースセンサ
jiang111 0:4c4775017e8a 68 DigitalIn ss3(p10); // ライントレースセンサ
jiang111 0:4c4775017e8a 69 DigitalIn ss4(p11); // ライントレースセンサ
jiang111 0:4c4775017e8a 70 DigitalIn ss5(p12); // ライントレースセンサ(右)
jiang111 0:4c4775017e8a 71 RawSerial esp(p13, p14); // Wi-Fiモジュール(tx, rx)
jiang111 0:4c4775017e8a 72 AnalogIn battery(p15); // 電池残量読み取り(Max 3.3V)
jiang111 0:4c4775017e8a 73 PwmOut motorR2(p22); // 右モーター後退
jiang111 0:4c4775017e8a 74 PwmOut motorR1(p21); // 右モーター前進
jiang111 0:4c4775017e8a 75 PwmOut motorL2(p23); // 左モーター後退
jiang111 0:4c4775017e8a 76 PwmOut motorL1(p24); // 左モーター前進
jiang111 0:4c4775017e8a 77 PwmOut servo(p25); // サーボ
jiang111 0:4c4775017e8a 78 I2C i2c_lcd(p28,p27); // LCD(tx, rx)
jiang111 0:4c4775017e8a 79
jiang111 0:4c4775017e8a 80
jiang111 0:4c4775017e8a 81
jiang111 0:4c4775017e8a 82 /* 変数宣言 */
jiang111 0:4c4775017e8a 83 int mode; // 操作モード
jiang111 0:4c4775017e8a 84 int run; // 走行状態
jiang111 0:4c4775017e8a 85 int beforeRun = STOP; // 前回の走行状態
jiang111 0:4c4775017e8a 86 int beforeMode; // 前回のモード
jiang111 0:4c4775017e8a 87 int flag_sp = 0; // スピード変化フラグ
jiang111 0:4c4775017e8a 88 Timer viewTimer; // スピ―ド変更時に3秒計測タイマー
jiang111 0:4c4775017e8a 89
jiang111 0:4c4775017e8a 90 float motorSpeedR1[9] = {MSR0, MSR1, MSR2, MSR3 , MSR4 , MSR5 , MSR6 , MSR7 , MSR8 };
jiang111 0:4c4775017e8a 91 //float motorSpeedR2[9] = {MSR0, MSR1, MSR2, MSR3*REVERSE, MSR4*REVERSE, MSR5*REVERSE, MSR6*REVERSE, MSR7*REVERSE, MSR8*REVERSE};
jiang111 0:4c4775017e8a 92 float motorSpeedR2[9] = {MSR0, MSR1, MSR2, MSR3, MSR4, MSR5, MSR6, MSR7, MSR8};
jiang111 0:4c4775017e8a 93 float motorSpeedL1[9] = {MSL0, MSL1, MSL2, MSL3 , MSL4 , MSL5 , MSL6 , MSL7 , MSL8 };
jiang111 0:4c4775017e8a 94 //float motorSpeedL2[9] = {MSL0, MSL1, MSL2, MSL3*REVERSE, MSL4*REVERSE, MSL5*REVERSE, MSL6*REVERSE, MSL7*REVERSE, MSL8*REVERSE};
jiang111 0:4c4775017e8a 95 float motorSpeedL2[9] = {MSL0, MSL1, MSL2, MSL3, MSL4, MSL5, MSL6, MSL7, MSL8};
jiang111 0:4c4775017e8a 96 // モーター速度設定(後半はライントレース用)
jiang111 0:4c4775017e8a 97 // 0,1,2:基準速度
jiang111 0:4c4775017e8a 98 // 3,4,5:低速
jiang111 0:4c4775017e8a 99 // 6,7,8:高速
jiang111 0:4c4775017e8a 100 // R1 : 右前, R2 : 右後, L1 : 左前, L2 : 左後
jiang111 0:4c4775017e8a 101
jiang111 0:4c4775017e8a 102 Mutex mutex; // ミューテックス
jiang111 0:4c4775017e8a 103
jiang111 0:4c4775017e8a 104 /* decodeIR用変数 */
jiang111 0:4c4775017e8a 105 RemoteIR::Format format;
jiang111 0:4c4775017e8a 106 uint8_t buf[32];
jiang111 0:4c4775017e8a 107 uint32_t bitcount;
jiang111 0:4c4775017e8a 108 uint32_t code;
jiang111 0:4c4775017e8a 109
jiang111 0:4c4775017e8a 110 /* bChange, lcdbacklight用変数 */
jiang111 0:4c4775017e8a 111 TextLCD_I2C lcd(&i2c_lcd, (0x27 << 1), TextLCD::LCD16x2, TextLCD::HD44780);
jiang111 0:4c4775017e8a 112 int b = 0; // バッテリー残量
jiang111 0:4c4775017e8a 113 int flag_b = 0; // バックライト点滅フラグ
jiang111 0:4c4775017e8a 114 int flag_t = 0; // バックライトタイマーフラグ
jiang111 0:4c4775017e8a 115
jiang111 0:4c4775017e8a 116 /* trace用変数 */
jiang111 0:4c4775017e8a 117 int sensArray[32] = {0,6,2,4,1,2,1,4, // ライントレースセンサパターン
jiang111 0:4c4775017e8a 118 3,6,1,6,1,1,1,6, // 0:前回動作継続
jiang111 0:4c4775017e8a 119 7,1,7,1,3,1,1,1, // 1:高速前進
jiang111 0:4c4775017e8a 120 5,1,7,1,5,1,7,1}; // 2:低速右折
jiang111 0:4c4775017e8a 121 // 3:低速左折
jiang111 0:4c4775017e8a 122 // 4:中速右折
jiang111 0:4c4775017e8a 123 // 5:中速左折
jiang111 0:4c4775017e8a 124 // 6:高速右折
jiang111 0:4c4775017e8a 125 // 7:高速左折
jiang111 0:4c4775017e8a 126
jiang111 0:4c4775017e8a 127 //int sensArray[32] = {0,6,0,4,1,0,1,4, // ライントレースセンサパターン
jiang111 0:4c4775017e8a 128 // 0,6,1,6,1,1,1,6, // 0:前回動作継続
jiang111 0:4c4775017e8a 129 // 7,1,7,1,0,1,1,1, // 1:高速前進
jiang111 0:4c4775017e8a 130 // 5,1,7,1,5,1,7,1}; // 2:低速右折
jiang111 0:4c4775017e8a 131 // // 3:低速左折
jiang111 0:4c4775017e8a 132 // // 4:中速右折
jiang111 0:4c4775017e8a 133 // // 5:中速左折
jiang111 0:4c4775017e8a 134 // // 6:高速右折
jiang111 0:4c4775017e8a 135 // // 7:高速左折
jiang111 0:4c4775017e8a 136
jiang111 0:4c4775017e8a 137 /* avoidance用変数 */
jiang111 0:4c4775017e8a 138 Timer timer; // 距離計測用タイマ
jiang111 0:4c4775017e8a 139 int DT; // 距離
jiang111 0:4c4775017e8a 140 int SC; // 正面
jiang111 0:4c4775017e8a 141 int SL; // 左
jiang111 0:4c4775017e8a 142 int SR; // 右
jiang111 0:4c4775017e8a 143 int SLD; // 左前
jiang111 0:4c4775017e8a 144 int SRD; // 右前
jiang111 0:4c4775017e8a 145 int flag_a = 0; // 障害物有無のフラグ
jiang111 0:4c4775017e8a 146 const int limit = 17; // 障害物の距離のリミット(単位:cm)
jiang111 0:4c4775017e8a 147 int far; // 最も遠い距離
jiang111 0:4c4775017e8a 148 int houkou; // 進行方向(1:前 2:左 3:右)
jiang111 0:4c4775017e8a 149 int t1 = 0;
jiang111 0:4c4775017e8a 150
jiang111 0:4c4775017e8a 151 /*WiFi用変数*/
jiang111 0:4c4775017e8a 152 Timer time1;
jiang111 0:4c4775017e8a 153 Timer time2;
jiang111 0:4c4775017e8a 154 int bufflen, DataRX, ount, getcount, replycount, servreq, timeout;
jiang111 0:4c4775017e8a 155 int bufl, ipdLen, linkID, weberror, webcounter,click_flag;
jiang111 0:4c4775017e8a 156 float R1=100000, R2=10000; // resistor values to give a 10:1 reduction of measured AnalogIn voltage
jiang111 0:4c4775017e8a 157 char webcount[8];
jiang111 0:4c4775017e8a 158 char type[16];
jiang111 0:4c4775017e8a 159 char channel[2];
jiang111 0:4c4775017e8a 160 char cmdbuff[32];
jiang111 0:4c4775017e8a 161 char replybuff[1024];
jiang111 0:4c4775017e8a 162 char webdata[1024]; // This may need to be bigger depending on WEB browser used
jiang111 0:4c4775017e8a 163 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
jiang111 0:4c4775017e8a 164 int port =80; // set server port
jiang111 0:4c4775017e8a 165 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
jiang111 0:4c4775017e8a 166 char ssid[32] = "mbed05"; // enter WiFi router ssid inside the quotes
jiang111 0:4c4775017e8a 167 char pwd [32] = "0123456789a"; // enter WiFi router password inside the quotes
jiang111 0:4c4775017e8a 168
jiang111 0:4c4775017e8a 169 /* プロトタイプ宣言 */
jiang111 0:4c4775017e8a 170 void decodeIR(/*void const *argument*/);
jiang111 0:4c4775017e8a 171 void motor(/*void const *argument*/);
jiang111 0:4c4775017e8a 172 void changeSpeed();
jiang111 0:4c4775017e8a 173 void avoidance(/*void const *argument*/);
jiang111 0:4c4775017e8a 174 void trace(/*void const *argument*/);
jiang111 0:4c4775017e8a 175 void watchsurrounding3();
jiang111 0:4c4775017e8a 176 void watchsurrounding5();
jiang111 0:4c4775017e8a 177 int watch();
jiang111 0:4c4775017e8a 178 char battery_ch[8];
jiang111 0:4c4775017e8a 179 void bChange();
jiang111 0:4c4775017e8a 180 void display();
jiang111 0:4c4775017e8a 181 void lcdBacklight(void const *argument);
jiang111 0:4c4775017e8a 182 void SendCMD(),getreply(),ReadWebData(),startserver(),sendpage(),SendWEB(),sendcheck();
jiang111 0:4c4775017e8a 183 void wifi(/*void const *argument*/);
jiang111 0:4c4775017e8a 184 Thread *deco_thread; // decodeIRをスレッド化 :+3
jiang111 0:4c4775017e8a 185 Thread *wifi_thread;
jiang111 0:4c4775017e8a 186 //wifi_thread(wifi,NULL,osPriorityHigh); // wifiをスレッド化
jiang111 0:4c4775017e8a 187 Thread *motor_thread; // motorをスレッド化 :+2
jiang111 0:4c4775017e8a 188 RtosTimer bTimer(lcdBacklight, osTimerPeriodic); // lcdBacklightをタイマー割り込みで設定
jiang111 0:4c4775017e8a 189 Thread *avoi_thread; // avoidanceをスレッド化:+2
jiang111 0:4c4775017e8a 190 Thread *trace_thread; // traceをスレッド化 :+2
jiang111 0:4c4775017e8a 191
jiang111 0:4c4775017e8a 192 DigitalOut led1(LED1);
jiang111 0:4c4775017e8a 193 DigitalOut led2(LED2);
jiang111 0:4c4775017e8a 194 DigitalOut led3(LED3);
jiang111 0:4c4775017e8a 195 DigitalOut led4(LED4);
jiang111 0:4c4775017e8a 196
jiang111 0:4c4775017e8a 197 void setup(){
jiang111 0:4c4775017e8a 198 deco_thread = new Thread(decodeIR);
jiang111 0:4c4775017e8a 199 deco_thread -> set_priority(osPriorityRealtime);
jiang111 0:4c4775017e8a 200 motor_thread = new Thread(motor);
jiang111 0:4c4775017e8a 201 motor_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 202 //wifi_thread -> set_priority(osPriorityRealtime);
jiang111 0:4c4775017e8a 203 display();
jiang111 0:4c4775017e8a 204 }
jiang111 0:4c4775017e8a 205
jiang111 0:4c4775017e8a 206 /* リモコン受信スレッド */
jiang111 0:4c4775017e8a 207 void decodeIR(/*void const *argument*/){
jiang111 0:4c4775017e8a 208 while(1){
jiang111 0:4c4775017e8a 209 // 受信待ち
jiang111 0:4c4775017e8a 210 if (ir.getState() == ReceiverIR::Received){ // コード受信
jiang111 0:4c4775017e8a 211 bitcount = ir.getData(&format, buf, sizeof(buf) * 8);
jiang111 0:4c4775017e8a 212 if(bitcount > 1){ // 受信成功
jiang111 0:4c4775017e8a 213 code=0;
jiang111 0:4c4775017e8a 214 for(int j = 0; j < 4; j++){
jiang111 0:4c4775017e8a 215 code+=(buf[j]<<(8*(3-j)));
jiang111 0:4c4775017e8a 216 }
jiang111 0:4c4775017e8a 217 if(mode != SPEED){ // スピードモード以外なら
jiang111 0:4c4775017e8a 218 beforeMode=mode; // 前回のモードに現在のモードを設定
jiang111 0:4c4775017e8a 219 }
jiang111 0:4c4775017e8a 220 switch(code){
jiang111 0:4c4775017e8a 221 case 0x40bf27d8: // クイック
jiang111 0:4c4775017e8a 222 ////*-*-*-5("mode = SPEED\r\n");
jiang111 0:4c4775017e8a 223 mode = SPEED; // スピードモード
jiang111 0:4c4775017e8a 224 changeSpeed(); // 速度変更
jiang111 0:4c4775017e8a 225 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 226 mode = beforeMode; // 現在のモードに前回のモードを設定
jiang111 0:4c4775017e8a 227 break;
jiang111 0:4c4775017e8a 228 case 0x40be34cb: // レグザリンク
jiang111 0:4c4775017e8a 229 ////*-*-*-5("mode = LINE_TRACE\r\n");
jiang111 0:4c4775017e8a 230 if(trace_thread->get_state() == Thread::Deleted){
jiang111 0:4c4775017e8a 231 delete trace_thread;
jiang111 0:4c4775017e8a 232 trace_thread = new Thread(trace);
jiang111 0:4c4775017e8a 233 trace_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 234 }
jiang111 0:4c4775017e8a 235 mode=LINE_TRACE; // ライントレースモード
jiang111 0:4c4775017e8a 236 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 237 break;
jiang111 0:4c4775017e8a 238 case 0x40bf6e91: // 番組表
jiang111 0:4c4775017e8a 239 ////*-*-*-5("mode = AVOIDANCE\r\n");
jiang111 0:4c4775017e8a 240 if(avoi_thread->get_state() == Thread::Deleted){
jiang111 0:4c4775017e8a 241 delete avoi_thread;
jiang111 0:4c4775017e8a 242 avoi_thread = new Thread(avoidance);
jiang111 0:4c4775017e8a 243 avoi_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 244 }
jiang111 0:4c4775017e8a 245 flag_a = 0;
jiang111 0:4c4775017e8a 246 mode=AVOIDANCE; // 障害物回避モード
jiang111 0:4c4775017e8a 247 run = ADVANCE; // 前進
jiang111 0:4c4775017e8a 248 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 249 break;
jiang111 0:4c4775017e8a 250 case 0x40bf3ec1: // ↑
jiang111 0:4c4775017e8a 251 ////*-*-*-5("mode = ADVANCE\r\n");
jiang111 0:4c4775017e8a 252 mode = ADVANCE; // 前進モード
jiang111 0:4c4775017e8a 253 run = ADVANCE; // 前進
jiang111 0:4c4775017e8a 254 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 255 break;
jiang111 0:4c4775017e8a 256 case 0x40bf3fc0: // ↓
jiang111 0:4c4775017e8a 257 ////*-*-*-5("mode = BACK\r\n");
jiang111 0:4c4775017e8a 258 mode = BACK; // 後退モード
jiang111 0:4c4775017e8a 259 run = BACK; // 後退
jiang111 0:4c4775017e8a 260 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 261 break;
jiang111 0:4c4775017e8a 262 case 0x40bf5fa0: // ←
jiang111 0:4c4775017e8a 263 ////*-*-*-5("mode = LEFT\r\n");
jiang111 0:4c4775017e8a 264 mode = LEFT; // 左折モード
jiang111 0:4c4775017e8a 265 run = LEFT; // 左折
jiang111 0:4c4775017e8a 266 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 267 break;
jiang111 0:4c4775017e8a 268 case 0x40bf5ba4: // →
jiang111 0:4c4775017e8a 269 ////*-*-*-5("mode = RIGHT\r\n");
jiang111 0:4c4775017e8a 270 mode = RIGHT; // 右折モード
jiang111 0:4c4775017e8a 271 run = RIGHT; // 右折
jiang111 0:4c4775017e8a 272 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 273 break;
jiang111 0:4c4775017e8a 274 case 0x40bf3dc2: // 決定
jiang111 0:4c4775017e8a 275 ////*-*-*-5("mode = STOP\r\n");
jiang111 0:4c4775017e8a 276 mode = STOP; // 停止モード
jiang111 0:4c4775017e8a 277 run = STOP; // 停止
jiang111 0:4c4775017e8a 278 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 279 break;
jiang111 0:4c4775017e8a 280 default:
jiang111 0:4c4775017e8a 281 ;
jiang111 0:4c4775017e8a 282 }
jiang111 0:4c4775017e8a 283 if(mode != LINE_TRACE && trace_thread->get_state() != Thread::Deleted){
jiang111 0:4c4775017e8a 284 trace_thread->terminate();
jiang111 0:4c4775017e8a 285 }
jiang111 0:4c4775017e8a 286 if(mode != AVOIDANCE && avoi_thread->get_state() != Thread::Deleted){
jiang111 0:4c4775017e8a 287 avoi_thread->terminate();
jiang111 0:4c4775017e8a 288 servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 289 }
jiang111 0:4c4775017e8a 290 }
jiang111 0:4c4775017e8a 291 }
jiang111 0:4c4775017e8a 292 if(viewTimer.read_ms()>=3000){ // スピードモードのまま3秒経過
jiang111 0:4c4775017e8a 293 viewTimer.stop(); // タイマーストップ
jiang111 0:4c4775017e8a 294 viewTimer.reset(); // タイマーリセット
jiang111 0:4c4775017e8a 295 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 296 }
jiang111 0:4c4775017e8a 297 ThisThread::sleep_for(90); // 90ms待つ
jiang111 0:4c4775017e8a 298 }
jiang111 0:4c4775017e8a 299 }
jiang111 0:4c4775017e8a 300
jiang111 0:4c4775017e8a 301 /* モーター制御スレッド */
jiang111 0:4c4775017e8a 302 void motor(/*void const *argument*/){
jiang111 0:4c4775017e8a 303 while(1){
jiang111 0:4c4775017e8a 304 /* 走行状態の場合分け */
jiang111 0:4c4775017e8a 305 switch(run){
jiang111 0:4c4775017e8a 306 /* 前進 */
jiang111 0:4c4775017e8a 307 case ADVANCE:
jiang111 0:4c4775017e8a 308 motorR1 = motorSpeedR1[flag_sp]; // 右前進モーターON
jiang111 0:4c4775017e8a 309 motorR2 = LOW; // 右後退モーターOFF
jiang111 0:4c4775017e8a 310 motorL1 = motorSpeedL1[flag_sp]; // 左前進モーターON
jiang111 0:4c4775017e8a 311 motorL2 = LOW; // 左後退モーターOFF
jiang111 0:4c4775017e8a 312 break;
jiang111 0:4c4775017e8a 313 /* 右折 */
jiang111 0:4c4775017e8a 314 case RIGHT:
jiang111 0:4c4775017e8a 315 motorR1 = LOW; // 右前進モーターOFF
jiang111 0:4c4775017e8a 316 motorR2 = motorSpeedR2[flag_sp]; // 右後退モーターON
jiang111 0:4c4775017e8a 317 motorL1 = motorSpeedL1[flag_sp]; // 左前進モーターON
jiang111 0:4c4775017e8a 318 motorL2 = LOW; // 左後退モーターOFF
jiang111 0:4c4775017e8a 319
jiang111 0:4c4775017e8a 320 break;
jiang111 0:4c4775017e8a 321 /* 左折 */
jiang111 0:4c4775017e8a 322 case LEFT:
jiang111 0:4c4775017e8a 323 motorR1 = motorSpeedR1[flag_sp]; // 右前進モーターON
jiang111 0:4c4775017e8a 324 motorR2 = LOW; // 右後退モーターOFF
jiang111 0:4c4775017e8a 325 motorL1 = LOW; // 左前進モーターOFF
jiang111 0:4c4775017e8a 326 motorL2 = motorSpeedL2[flag_sp]; // 左後退モーターON
jiang111 0:4c4775017e8a 327
jiang111 0:4c4775017e8a 328 break;
jiang111 0:4c4775017e8a 329 /* 後退 */
jiang111 0:4c4775017e8a 330 case BACK:
jiang111 0:4c4775017e8a 331 motorR1 = LOW; // 右前進モーターOFF
jiang111 0:4c4775017e8a 332 motorR2 = motorSpeedR2[flag_sp]; // 右後退モーターON
jiang111 0:4c4775017e8a 333 motorL1 = LOW; // 左前進モーターOFF
jiang111 0:4c4775017e8a 334 motorL2 = motorSpeedL2[flag_sp]; // 左後退モーターON
jiang111 0:4c4775017e8a 335 break;
jiang111 0:4c4775017e8a 336 /* 停止 */
jiang111 0:4c4775017e8a 337 case STOP:
jiang111 0:4c4775017e8a 338 motorR1 = LOW; // 右前進モーターOFF
jiang111 0:4c4775017e8a 339 motorR2 = LOW; // 右後退モーターOFF
jiang111 0:4c4775017e8a 340 motorL1 = LOW; // 左前進モーターOFF
jiang111 0:4c4775017e8a 341 motorL2 = LOW; // 左後退モーターOFF
jiang111 0:4c4775017e8a 342 break;
jiang111 0:4c4775017e8a 343 }
jiang111 0:4c4775017e8a 344 if(flag_sp > VERYFAST){ // スピード変更フラグが2より大きいなら
jiang111 0:4c4775017e8a 345 flag_sp %= 3; // スピード変更フラグ調整
jiang111 0:4c4775017e8a 346 }
jiang111 0:4c4775017e8a 347 ThisThread::sleep_for(3); // 30ms待つ
jiang111 0:4c4775017e8a 348 }
jiang111 0:4c4775017e8a 349 }
jiang111 0:4c4775017e8a 350
jiang111 0:4c4775017e8a 351 /* スピード変更関数 */
jiang111 0:4c4775017e8a 352 void changeSpeed(){
jiang111 0:4c4775017e8a 353 // それ以外
jiang111 0:4c4775017e8a 354 flag_sp = flag_sp + 3; // スピード変更フラグを+1
jiang111 0:4c4775017e8a 355 if(flag_sp>6)flag_sp=0;
jiang111 0:4c4775017e8a 356 }
jiang111 0:4c4775017e8a 357
jiang111 0:4c4775017e8a 358 /* ライントレーススレッド */
jiang111 0:4c4775017e8a 359 void trace(){
jiang111 0:4c4775017e8a 360 while(1){
jiang111 0:4c4775017e8a 361 /* 各センサー値読み取り */
jiang111 0:4c4775017e8a 362 int sensor1 = ss1;
jiang111 0:4c4775017e8a 363 int sensor2 = ss2;
jiang111 0:4c4775017e8a 364 int sensor3 = ss3;
jiang111 0:4c4775017e8a 365 int sensor4 = ss4;
jiang111 0:4c4775017e8a 366 int sensor5 = ss5;
jiang111 0:4c4775017e8a 367 ////*-*-*-5("%d %d %d %d %d \r\n",sensor1,sensor2,sensor3,sensor4,sensor5);
jiang111 0:4c4775017e8a 368 int sensD = 0;
jiang111 0:4c4775017e8a 369 /* センサー値の決定 */
jiang111 0:4c4775017e8a 370 if(sensor1 > 0) sensD |= 0x10;
jiang111 0:4c4775017e8a 371 if(sensor2 > 0) sensD |= 0x08;
jiang111 0:4c4775017e8a 372 if(sensor3 > 0) sensD |= 0x04;
jiang111 0:4c4775017e8a 373 if(sensor4 > 0) sensD |= 0x02;
jiang111 0:4c4775017e8a 374 if(sensor5 > 0) sensD |= 0x01;
jiang111 0:4c4775017e8a 375 pc.printf("%d \r\n",sensArray[sensD]);
jiang111 0:4c4775017e8a 376 /* センサー値によって場合分け */
jiang111 0:4c4775017e8a 377 switch(sensArray[sensD]){
jiang111 0:4c4775017e8a 378 case 1:
jiang111 0:4c4775017e8a 379 flag_sp = 6;
jiang111 0:4c4775017e8a 380 beforeRun = run;
jiang111 0:4c4775017e8a 381 run = ADVANCE; // 高速で前進
jiang111 0:4c4775017e8a 382 break;
jiang111 0:4c4775017e8a 383 case 2:
jiang111 0:4c4775017e8a 384 flag_sp = 2;
jiang111 0:4c4775017e8a 385 beforeRun = run;
jiang111 0:4c4775017e8a 386 run = RIGHT;
jiang111 0:4c4775017e8a 387 break;
jiang111 0:4c4775017e8a 388 case 3:
jiang111 0:4c4775017e8a 389 flag_sp = 2;
jiang111 0:4c4775017e8a 390 beforeRun = run;
jiang111 0:4c4775017e8a 391 run = LEFT;
jiang111 0:4c4775017e8a 392 break;
jiang111 0:4c4775017e8a 393 case 4:
jiang111 0:4c4775017e8a 394 flag_sp = 0;
jiang111 0:4c4775017e8a 395 beforeRun = run;
jiang111 0:4c4775017e8a 396 run = RIGHT;
jiang111 0:4c4775017e8a 397 break;
jiang111 0:4c4775017e8a 398 case 5:
jiang111 0:4c4775017e8a 399 flag_sp = 0;
jiang111 0:4c4775017e8a 400 beforeRun = run;
jiang111 0:4c4775017e8a 401 run = LEFT;
jiang111 0:4c4775017e8a 402 break;
jiang111 0:4c4775017e8a 403 case 6:
jiang111 0:4c4775017e8a 404 flag_sp = 4;
jiang111 0:4c4775017e8a 405 beforeRun = run;
jiang111 0:4c4775017e8a 406 run = RIGHT;
jiang111 0:4c4775017e8a 407 break;
jiang111 0:4c4775017e8a 408 case 7:
jiang111 0:4c4775017e8a 409 flag_sp = 4;
jiang111 0:4c4775017e8a 410 beforeRun = run;
jiang111 0:4c4775017e8a 411 run = LEFT;
jiang111 0:4c4775017e8a 412 break;
jiang111 0:4c4775017e8a 413 default:
jiang111 0:4c4775017e8a 414 break;
jiang111 0:4c4775017e8a 415 }
jiang111 0:4c4775017e8a 416 // ThisThread::sleep_for(30); // 30ms待つ
jiang111 0:4c4775017e8a 417 ThisThread::sleep_for(3);
jiang111 0:4c4775017e8a 418 }
jiang111 0:4c4775017e8a 419 }
jiang111 0:4c4775017e8a 420
jiang111 0:4c4775017e8a 421 /* 障害物回避走行スレッド */
jiang111 0:4c4775017e8a 422 void avoidance(){
jiang111 0:4c4775017e8a 423 int i;
jiang111 0:4c4775017e8a 424 watchsurrounding3();
jiang111 0:4c4775017e8a 425 while(1){
jiang111 0:4c4775017e8a 426 if(flag_a==0){run=ADVANCE;watchsurrounding3();}
jiang111 0:4c4775017e8a 427 else{
jiang111 0:4c4775017e8a 428 i=0;
jiang111 0:4c4775017e8a 429 watchsurrounding5();
jiang111 0:4c4775017e8a 430 if(SLD>=SC&&SRD>=SC){
jiang111 0:4c4775017e8a 431 if(SL>=SR){
jiang111 0:4c4775017e8a 432 run = BACK;
jiang111 0:4c4775017e8a 433 ThisThread::sleep_for(200-flag_sp*10);
jiang111 0:4c4775017e8a 434
jiang111 0:4c4775017e8a 435 run = LEFT;
jiang111 0:4c4775017e8a 436 ThisThread::sleep_for(480-flag_sp*25);
jiang111 0:4c4775017e8a 437 run=STOP;
jiang111 0:4c4775017e8a 438 }
jiang111 0:4c4775017e8a 439 if(SL<SR){
jiang111 0:4c4775017e8a 440 run = BACK;
jiang111 0:4c4775017e8a 441 ThisThread::sleep_for(200-flag_sp*10);
jiang111 0:4c4775017e8a 442 run = RIGHT;
jiang111 0:4c4775017e8a 443 ThisThread::sleep_for(480-flag_sp*25);
jiang111 0:4c4775017e8a 444 run=STOP;}
jiang111 0:4c4775017e8a 445 }
jiang111 0:4c4775017e8a 446 if(SLD<SC){
jiang111 0:4c4775017e8a 447 run = BACK;
jiang111 0:4c4775017e8a 448 ThisThread::sleep_for(200-flag_sp*10);
jiang111 0:4c4775017e8a 449 run = RIGHT;
jiang111 0:4c4775017e8a 450 ThisThread::sleep_for(250-flag_sp*10);
jiang111 0:4c4775017e8a 451 run=STOP;
jiang111 0:4c4775017e8a 452 }
jiang111 0:4c4775017e8a 453 if(SRD<SC){
jiang111 0:4c4775017e8a 454 run = BACK;
jiang111 0:4c4775017e8a 455 ThisThread::sleep_for(200-flag_sp*10);
jiang111 0:4c4775017e8a 456 run = LEFT;
jiang111 0:4c4775017e8a 457 ThisThread::sleep_for(250-flag_sp*10);
jiang111 0:4c4775017e8a 458 run=STOP;
jiang111 0:4c4775017e8a 459 }
jiang111 0:4c4775017e8a 460
jiang111 0:4c4775017e8a 461 flag_a=0;
jiang111 0:4c4775017e8a 462
jiang111 0:4c4775017e8a 463 }
jiang111 0:4c4775017e8a 464 }
jiang111 0:4c4775017e8a 465 }
jiang111 0:4c4775017e8a 466 /* 距離計測関数 */
jiang111 0:4c4775017e8a 467 int watch(){
jiang111 0:4c4775017e8a 468 do{
jiang111 0:4c4775017e8a 469 trig = 0;
jiang111 0:4c4775017e8a 470 ThisThread::sleep_for(5); // 5ms待つ
jiang111 0:4c4775017e8a 471 trig = 1;
jiang111 0:4c4775017e8a 472 ThisThread::sleep_for(15); // 15ms待つ
jiang111 0:4c4775017e8a 473 trig = 0;
jiang111 0:4c4775017e8a 474 timer.start();
jiang111 0:4c4775017e8a 475 t1=timer.read_ms();
jiang111 0:4c4775017e8a 476 while(echo.read() == 0 && t1<10){
jiang111 0:4c4775017e8a 477 t1=timer.read_ms();
jiang111 0:4c4775017e8a 478 led1 = 1;
jiang111 0:4c4775017e8a 479 }
jiang111 0:4c4775017e8a 480 timer.stop();
jiang111 0:4c4775017e8a 481 timer.reset();
jiang111 0:4c4775017e8a 482 /*if((t1-t2) >= 10){
jiang111 0:4c4775017e8a 483 run = STOP;*/
jiang111 0:4c4775017e8a 484 }while(t1 >= 10);
jiang111 0:4c4775017e8a 485 timer.start(); // 距離計測タイマースタート
jiang111 0:4c4775017e8a 486 while(echo.read() == 1){
jiang111 0:4c4775017e8a 487 }
jiang111 0:4c4775017e8a 488 timer.stop(); // 距離計測タイマーストップ
jiang111 0:4c4775017e8a 489 DT = (int)(timer.read_us()*0.01657); // 距離計算
jiang111 0:4c4775017e8a 490 if(DT > 1000){
jiang111 0:4c4775017e8a 491 DT = -1;
jiang111 0:4c4775017e8a 492 }else if(DT > 150){ // 検知範囲外なら100cmに設定
jiang111 0:4c4775017e8a 493 DT = 150;
jiang111 0:4c4775017e8a 494 }
jiang111 0:4c4775017e8a 495 timer.reset(); // 距離計測タイマーリセット
jiang111 0:4c4775017e8a 496 led1 = 0;
jiang111 0:4c4775017e8a 497 return DT;
jiang111 0:4c4775017e8a 498 }
jiang111 0:4c4775017e8a 499
jiang111 0:4c4775017e8a 500 /* 障害物検知関数 */
jiang111 0:4c4775017e8a 501 void watchsurrounding3(){
jiang111 0:4c4775017e8a 502 //servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 503 //ThisThread::sleep_for(200); // 100ms待つ
jiang111 0:4c4775017e8a 504 SC = watch();
jiang111 0:4c4775017e8a 505 if(SC < limit){ // 正面20cm以内に障害物がある場合
jiang111 0:4c4775017e8a 506 if(SC!=-1){
jiang111 0:4c4775017e8a 507 run = STOP; // 停止
jiang111 0:4c4775017e8a 508 flag_a = 1;
jiang111 0:4c4775017e8a 509 return;
jiang111 0:4c4775017e8a 510 }
jiang111 0:4c4775017e8a 511 }
jiang111 0:4c4775017e8a 512 servo.pulsewidth_us(1925); // サーボを左に40度回転
jiang111 0:4c4775017e8a 513 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 514 SLD = watch();
jiang111 0:4c4775017e8a 515 if(SLD < limit){ // 左前20cm以内に障害物がある場合
jiang111 0:4c4775017e8a 516 run = STOP; // 停止
jiang111 0:4c4775017e8a 517 flag_a = 1;
jiang111 0:4c4775017e8a 518 return;
jiang111 0:4c4775017e8a 519 }
jiang111 0:4c4775017e8a 520 servo.pulsewidth_us(1450);
jiang111 0:4c4775017e8a 521 ThisThread::sleep_for(150);
jiang111 0:4c4775017e8a 522 SC = watch();
jiang111 0:4c4775017e8a 523 if(SC < limit){
jiang111 0:4c4775017e8a 524 if(SC!=-1){
jiang111 0:4c4775017e8a 525 run = STOP; // 停止
jiang111 0:4c4775017e8a 526 flag_a = 1;
jiang111 0:4c4775017e8a 527 return;
jiang111 0:4c4775017e8a 528 }
jiang111 0:4c4775017e8a 529 }
jiang111 0:4c4775017e8a 530 servo.pulsewidth_us(925); // サーボを右に40度回転
jiang111 0:4c4775017e8a 531 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 532 SRD = watch();
jiang111 0:4c4775017e8a 533 if(SRD < limit){ // 右前20cm以内に障害物がある場合
jiang111 0:4c4775017e8a 534 run = STOP; // 停止
jiang111 0:4c4775017e8a 535 flag_a = 1;
jiang111 0:4c4775017e8a 536 return;
jiang111 0:4c4775017e8a 537 }
jiang111 0:4c4775017e8a 538 servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 539 ThisThread::sleep_for(100); // 100ms待つ
jiang111 0:4c4775017e8a 540 /*if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
jiang111 0:4c4775017e8a 541 flag_a = 1; // 障害物有無フラグに1をセット
jiang111 0:4c4775017e8a 542 }*/
jiang111 0:4c4775017e8a 543 }
jiang111 0:4c4775017e8a 544
jiang111 0:4c4775017e8a 545 /* 障害物検知関数 */
jiang111 0:4c4775017e8a 546 void watchsurrounding5(){
jiang111 0:4c4775017e8a 547 servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 548 ThisThread::sleep_for(200); // 100ms待つ
jiang111 0:4c4775017e8a 549 SC = watch();
jiang111 0:4c4775017e8a 550 servo.pulsewidth_us(1925); // サーボを左に40度回転
jiang111 0:4c4775017e8a 551 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 552 SLD = watch();
jiang111 0:4c4775017e8a 553 servo.pulsewidth_us(2400); // サーボを左に90度回転
jiang111 0:4c4775017e8a 554 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 555 SL = watch();
jiang111 0:4c4775017e8a 556 servo.pulsewidth_us(1450);
jiang111 0:4c4775017e8a 557 ThisThread::sleep_for(250);
jiang111 0:4c4775017e8a 558 SC = watch();
jiang111 0:4c4775017e8a 559 servo.pulsewidth_us(925); // サーボを右に40度回転
jiang111 0:4c4775017e8a 560 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 561 SRD = watch();
jiang111 0:4c4775017e8a 562 servo.pulsewidth_us(500); // サーボを右に90度回転
jiang111 0:4c4775017e8a 563 ThisThread::sleep_for(100); // 250ms待つ
jiang111 0:4c4775017e8a 564 SR = watch();
jiang111 0:4c4775017e8a 565 servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 566 ThisThread::sleep_for(250); // 100ms待つ
jiang111 0:4c4775017e8a 567 }
jiang111 0:4c4775017e8a 568
jiang111 0:4c4775017e8a 569 /* ディスプレイ表示関数 */
jiang111 0:4c4775017e8a 570 void display(){
jiang111 0:4c4775017e8a 571 mutex.lock(); // ミューテックスロック
jiang111 0:4c4775017e8a 572 lcd.setAddress(0,1);
jiang111 0:4c4775017e8a 573
jiang111 0:4c4775017e8a 574 /* 操作モードによる場合分け */
jiang111 0:4c4775017e8a 575 switch(mode){
jiang111 0:4c4775017e8a 576 /* 前進 */
jiang111 0:4c4775017e8a 577 case ADVANCE:
jiang111 0:4c4775017e8a 578 lcd.printf("Mode:Advance ");
jiang111 0:4c4775017e8a 579 break;
jiang111 0:4c4775017e8a 580 /* 右折 */
jiang111 0:4c4775017e8a 581 case RIGHT:
jiang111 0:4c4775017e8a 582 lcd.printf("Mode:TurnRight ");
jiang111 0:4c4775017e8a 583 break;
jiang111 0:4c4775017e8a 584 /* 左折 */
jiang111 0:4c4775017e8a 585 case LEFT:
jiang111 0:4c4775017e8a 586 lcd.printf("Mode:TurnLeft ");
jiang111 0:4c4775017e8a 587 break;
jiang111 0:4c4775017e8a 588 /* 後退 */
jiang111 0:4c4775017e8a 589 case BACK:
jiang111 0:4c4775017e8a 590 lcd.printf("Mode:Back ");
jiang111 0:4c4775017e8a 591 break;
jiang111 0:4c4775017e8a 592 /* 停止 */
jiang111 0:4c4775017e8a 593 case STOP:
jiang111 0:4c4775017e8a 594 lcd.printf("Mode:Stop ");
jiang111 0:4c4775017e8a 595 break;
jiang111 0:4c4775017e8a 596 /* 待ち */
jiang111 0:4c4775017e8a 597 case READY:
jiang111 0:4c4775017e8a 598 lcd.printf("Mode:Ready ");
jiang111 0:4c4775017e8a 599 break;
jiang111 0:4c4775017e8a 600 /* ライントレース */
jiang111 0:4c4775017e8a 601 case LINE_TRACE:
jiang111 0:4c4775017e8a 602 lcd.printf("Mode:LineTrace ");
jiang111 0:4c4775017e8a 603 break;
jiang111 0:4c4775017e8a 604 /* 障害物回避 */
jiang111 0:4c4775017e8a 605 case AVOIDANCE:
jiang111 0:4c4775017e8a 606 lcd.printf("Mode:Avoidance ");
jiang111 0:4c4775017e8a 607 break;
jiang111 0:4c4775017e8a 608 /* スピード制御 */
jiang111 0:4c4775017e8a 609 case SPEED:
jiang111 0:4c4775017e8a 610 /* スピードの状態で場合分け */
jiang111 0:4c4775017e8a 611 switch(flag_sp % 3){
jiang111 0:4c4775017e8a 612 /* 普通 */
jiang111 0:4c4775017e8a 613 case(NORMAL):
jiang111 0:4c4775017e8a 614 lcd.printf("Speed:Normal ");
jiang111 0:4c4775017e8a 615 break;
jiang111 0:4c4775017e8a 616 /* 速い */
jiang111 0:4c4775017e8a 617 case(FAST):
jiang111 0:4c4775017e8a 618 lcd.printf("Speed:Fast ");
jiang111 0:4c4775017e8a 619 break;
jiang111 0:4c4775017e8a 620 /* とても速い */
jiang111 0:4c4775017e8a 621 case(VERYFAST):
jiang111 0:4c4775017e8a 622 lcd.printf("Speed:VeryFast ");
jiang111 0:4c4775017e8a 623 break;
jiang111 0:4c4775017e8a 624 }
jiang111 0:4c4775017e8a 625 viewTimer.reset(); // タイマーリセット
jiang111 0:4c4775017e8a 626 viewTimer.start(); // タイマースタート
jiang111 0:4c4775017e8a 627 break;
jiang111 0:4c4775017e8a 628 }
jiang111 0:4c4775017e8a 629 mutex.unlock(); // ミューテックスアンロック
jiang111 0:4c4775017e8a 630 }
jiang111 0:4c4775017e8a 631
jiang111 0:4c4775017e8a 632 /* バックライト点滅 */
jiang111 0:4c4775017e8a 633 void lcdBacklight(void const *argument){
jiang111 0:4c4775017e8a 634 if(flag_b == 1){ // バックライト点滅フラグが1なら
jiang111 0:4c4775017e8a 635 lcd.setBacklight(TextLCD::LightOn); // バックライトON
jiang111 0:4c4775017e8a 636 }else{ // バックライト点滅フラグが0なら
jiang111 0:4c4775017e8a 637 lcd.setBacklight(TextLCD::LightOff); // バックライトOFF
jiang111 0:4c4775017e8a 638 }
jiang111 0:4c4775017e8a 639 flag_b = !flag_b; // バックライト点滅フラグ切り替え
jiang111 0:4c4775017e8a 640 }
jiang111 0:4c4775017e8a 641
jiang111 0:4c4775017e8a 642 /* バッテリー残量更新関数 */
jiang111 0:4c4775017e8a 643 void bChange(){
jiang111 0:4c4775017e8a 644 ////*-*-*-5(" bChange1\r\n");
jiang111 0:4c4775017e8a 645 b = (int)(((battery.read() * 3.3 - MIN_V)/0.67)*10+0.5)*10;
jiang111 0:4c4775017e8a 646 if(b <= 0){ // バッテリー残量0%なら全ての機能停止
jiang111 0:4c4775017e8a 647 b = 0;
jiang111 0:4c4775017e8a 648 //lcd.setBacklight(TextLCD::LightOff);
jiang111 0:4c4775017e8a 649 //run = STOP;
jiang111 0:4c4775017e8a 650 //exit(1); // 電池残量が5%未満の時、LCDを消灯し、モーターを停止し、プログラムを終了する。
jiang111 0:4c4775017e8a 651 }
jiang111 0:4c4775017e8a 652 mutex.lock(); // ミューテックスロック
jiang111 0:4c4775017e8a 653 lcd.setAddress(0,0);
jiang111 0:4c4775017e8a 654 lcd.printf("Battery:%3d%%",b); // バッテリー残量表示
jiang111 0:4c4775017e8a 655 mutex.unlock(); // ミューテックスアンロック
jiang111 0:4c4775017e8a 656 if(b <= 30){ // バッテリー残量30%以下なら
jiang111 0:4c4775017e8a 657 if(flag_t == 0){ // バックライトタイマーフラグが0なら
jiang111 0:4c4775017e8a 658 //bTimer.attach(lcdBacklight,0.5);
jiang111 0:4c4775017e8a 659 bTimer.start(500); // 0.5秒周期でバックライトタイマー割り込み
jiang111 0:4c4775017e8a 660 flag_t = 1; // バックライトタイマーフラグを1に切り替え
jiang111 0:4c4775017e8a 661 }
jiang111 0:4c4775017e8a 662 }else{
jiang111 0:4c4775017e8a 663 if(flag_t == 1){ // バックライトタイマーフラグが1なら
jiang111 0:4c4775017e8a 664 //bTimer.detach();
jiang111 0:4c4775017e8a 665 bTimer.stop(); // バックライトタイマーストップ
jiang111 0:4c4775017e8a 666 lcd.setBacklight(TextLCD::LightOn); // バックライトON
jiang111 0:4c4775017e8a 667 flag_t = 0; // バックライトタイマーフラグを0に切り替え
jiang111 0:4c4775017e8a 668 }
jiang111 0:4c4775017e8a 669 }
jiang111 0:4c4775017e8a 670 }
jiang111 0:4c4775017e8a 671 // Serial Interrupt read ESP data
jiang111 0:4c4775017e8a 672 void callback()
jiang111 0:4c4775017e8a 673 {
jiang111 0:4c4775017e8a 674 ////*-*-*-5("\n\r------------ callback is being called --------------\n\r");
jiang111 0:4c4775017e8a 675 led3=1;
jiang111 0:4c4775017e8a 676 while (esp.readable()) {
jiang111 0:4c4775017e8a 677 webbuff[ount] = esp.getc();
jiang111 0:4c4775017e8a 678 ount++;
jiang111 0:4c4775017e8a 679 }
jiang111 0:4c4775017e8a 680 if(strlen(webbuff)>bufflen) {
jiang111 0:4c4775017e8a 681 // //*-*-*-5("\f\n\r------------ webbuff over bufflen --------------\n\r");
jiang111 0:4c4775017e8a 682 DataRX=1;
jiang111 0:4c4775017e8a 683 led3=0;
jiang111 0:4c4775017e8a 684 }
jiang111 0:4c4775017e8a 685 }
jiang111 0:4c4775017e8a 686
jiang111 0:4c4775017e8a 687 void wifi(/*void const *argument*/)
jiang111 0:4c4775017e8a 688 {
jiang111 0:4c4775017e8a 689 //*-*-*-5("\f\n\r------------ ESP8266 Hardware Reset psq --------------\n\r");
jiang111 0:4c4775017e8a 690 ThisThread::sleep_for(100);
jiang111 0:4c4775017e8a 691 led1=1,led2=0,led3=0;
jiang111 0:4c4775017e8a 692 timeout=6000;
jiang111 0:4c4775017e8a 693 getcount=500;
jiang111 0:4c4775017e8a 694 getreply();
jiang111 0:4c4775017e8a 695 esp.baud(115200); // ESP8266 baudrate. Maximum on KLxx' is 115200, 230400 works on K20 and K22F
jiang111 0:4c4775017e8a 696 startserver();
jiang111 0:4c4775017e8a 697
jiang111 0:4c4775017e8a 698 while(1) {
jiang111 0:4c4775017e8a 699 if(DataRX==1) {
jiang111 0:4c4775017e8a 700 //*-*-*-5("\f\n\r------------ main while > if --------------\n\r");
jiang111 0:4c4775017e8a 701 click_flag = 1;
jiang111 0:4c4775017e8a 702 ReadWebData();
jiang111 0:4c4775017e8a 703 //*-*-*-5("\f\n\r------------ click_flag=%d --------------\n\r",click_flag);
jiang111 0:4c4775017e8a 704 //if ((servreq == 1 && weberror == 0) && click_flag == 1) {
jiang111 0:4c4775017e8a 705 if (servreq == 1 && weberror == 0) {
jiang111 0:4c4775017e8a 706 //*-*-*-5("\f\n\r------------ befor send page --------------\n\r");
jiang111 0:4c4775017e8a 707 sendpage();
jiang111 0:4c4775017e8a 708 }
jiang111 0:4c4775017e8a 709 //*-*-*-5("\f\n\r------------ send_check begin --------------\n\r");
jiang111 0:4c4775017e8a 710
jiang111 0:4c4775017e8a 711 //sendcheck();
jiang111 0:4c4775017e8a 712 //*-*-*-5("\f\n\r------------ ssend_check end--------------\n\r");
jiang111 0:4c4775017e8a 713
jiang111 0:4c4775017e8a 714 esp.attach(&callback);
jiang111 0:4c4775017e8a 715 //*-*-*-5(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);
jiang111 0:4c4775017e8a 716 //*-*-*-5("\n\n HTTP Packet: \n\n%s\n", webdata);
jiang111 0:4c4775017e8a 717 //*-*-*-5(" Web Characters sent : %d\n\n", bufl);
jiang111 0:4c4775017e8a 718 //*-*-*-5(" -------------------------------------\n\n");
jiang111 0:4c4775017e8a 719 servreq=0;
jiang111 0:4c4775017e8a 720 }
jiang111 0:4c4775017e8a 721 ThisThread::sleep_for(100);
jiang111 0:4c4775017e8a 722 }
jiang111 0:4c4775017e8a 723 }
jiang111 0:4c4775017e8a 724 // Static WEB page
jiang111 0:4c4775017e8a 725 void sendpage()
jiang111 0:4c4775017e8a 726 {
jiang111 0:4c4775017e8a 727 // WEB page data
jiang111 0:4c4775017e8a 728
jiang111 0:4c4775017e8a 729 strcpy(webbuff, "<!DOCTYPE html>");
jiang111 0:4c4775017e8a 730 strcat(webbuff, "<html><head><title>RobotCar</title><meta name='viewport' content='width=device-width'/>");
jiang111 0:4c4775017e8a 731 //strcat(webbuff, "<meta http-equiv=\"refresh\" content=\"5\"; >");
jiang111 0:4c4775017e8a 732 strcat(webbuff, "<style type=\"text/css\">.noselect{ width:100px;height:60px;}.light{ width:100px;height:60px;background-color:#00ff66;}.load{ width: 50px; height: 30px;font-size:10px}</style>");
jiang111 0:4c4775017e8a 733 strcat(webbuff, "</head><body><center><p><strong>Robot Car Remote Controller");
jiang111 0:4c4775017e8a 734 strcat(webbuff, "</strong></p><td style='vertical-align:top;'><strong>Battery level ");
jiang111 0:4c4775017e8a 735 if(b > 30) { //残電量表示
jiang111 0:4c4775017e8a 736 sprintf(webbuff, "%s%3d", webbuff, b);
jiang111 0:4c4775017e8a 737 } else { //30%より下の場合残電量を赤文字
jiang111 0:4c4775017e8a 738 strcat(webbuff, "<font color=\"red\">");
jiang111 0:4c4775017e8a 739 sprintf(webbuff, "%s%3d", webbuff, b);
jiang111 0:4c4775017e8a 740 strcat(webbuff, "</font>");
jiang111 0:4c4775017e8a 741 }
jiang111 0:4c4775017e8a 742 strcat(webbuff, "%</strong>");
jiang111 0:4c4775017e8a 743 strcat(webbuff, "<button id=\"reloadbtn\" type=\"button\" class=\"load\" onclick=\"location.reload()\">RELOAD</button>");
jiang111 0:4c4775017e8a 744 strcat(webbuff, "</td></p>");
jiang111 0:4c4775017e8a 745 strcat(webbuff, "<br>");
jiang111 0:4c4775017e8a 746 strcat(webbuff, "<table><tr><td></td><td>");
jiang111 0:4c4775017e8a 747
jiang111 0:4c4775017e8a 748 switch(mode) { //ブラウザ更新時の現在の車の状態からボタンの点灯判定
jiang111 0:4c4775017e8a 749 case ADVANCE: //前進
jiang111 0:4c4775017e8a 750 strcat(webbuff, "<button id='gobtn' type='button' class=\"light\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 751 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 752 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 753 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 754 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 755 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 756 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 757 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 758 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 759 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 760 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 761 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 762 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 763 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 764 break;
jiang111 0:4c4775017e8a 765 case LEFT: //左折
jiang111 0:4c4775017e8a 766 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 767 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 768 strcat(webbuff, "<button id='leftbtn' type='button' class=\"light\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 769 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 770 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 771 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 772 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 773 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 774 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 775 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 776 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 777 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 778 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 779 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 780 break;
jiang111 0:4c4775017e8a 781 case STOP: //停止
jiang111 0:4c4775017e8a 782 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 783 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 784 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 785 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 786 strcat(webbuff, "<button id='stopbtn' type='button' class=\"light\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 787 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 788 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 789 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 790 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 791 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 792 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 793 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 794 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 795 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 796 break;
jiang111 0:4c4775017e8a 797 case RIGHT: //右折
jiang111 0:4c4775017e8a 798 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 799 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 800 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 801 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 802 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 803 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 804 strcat(webbuff, "<button id='rightbtn' type='button' class=\"light\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 805 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 806 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 807 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 808 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 809 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 810 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 811 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 812 break;
jiang111 0:4c4775017e8a 813 case BACK: //後進
jiang111 0:4c4775017e8a 814 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 815 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 816 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 817 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 818 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 819 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 820 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 821 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 822 strcat(webbuff, "<button id='backbtn' type='button' class=\"light\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 823 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr><td>");
jiang111 0:4c4775017e8a 824 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 825 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 826 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 827 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 828 break;
jiang111 0:4c4775017e8a 829 case AVOIDANCE: //障害物回避
jiang111 0:4c4775017e8a 830 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 831 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 832 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 833 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 834 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 835 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 836 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 837 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 838 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 839 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 840 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 841 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"light\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 842 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 843 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 844 break;
jiang111 0:4c4775017e8a 845 case LINE_TRACE: //ライントレース
jiang111 0:4c4775017e8a 846 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 847 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 848 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 849 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 850 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 851 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 852 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 853 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 854 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 855 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 856 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 857 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 858 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 859 strcat(webbuff, "<button id='tracebtn' type='button' class=\"light\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 860 break;
jiang111 0:4c4775017e8a 861 default: //その他
jiang111 0:4c4775017e8a 862 strcat(webbuff, "<button id='gobtn' type='button' class=\"noselect\" value=\"GO\" onClick='send_mes(this.value)'>GO");
jiang111 0:4c4775017e8a 863 strcat(webbuff, "</button></td><td></td></tr><tr><td>");
jiang111 0:4c4775017e8a 864 strcat(webbuff, "<button id='leftbtn' type='button' class=\"noselect\" value=\"LEFT\" onClick='send_mes(this.value)' >LEFT");
jiang111 0:4c4775017e8a 865 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 866 strcat(webbuff, "<button id='stopbtn' type='button' class=\"noselect\" value=\"STOP\" onClick='send_mes(this.value)' >STOP");
jiang111 0:4c4775017e8a 867 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 868 strcat(webbuff, "<button id='rightbtn' type='button' class=\"noselect\" value=\"RIGHT\" onClick='send_mes(this.value)' >RIGHT");
jiang111 0:4c4775017e8a 869 strcat(webbuff, "</button></td></tr><td></td><td>");
jiang111 0:4c4775017e8a 870 strcat(webbuff, "<button id='backbtn' type='button' class=\"noselect\" value=\"BACK\" onClick='send_mes(this.value)' >BACK");
jiang111 0:4c4775017e8a 871 strcat(webbuff, "</button></td><td style='vertical-align:top; text-align:right;'></td></tr></table>");
jiang111 0:4c4775017e8a 872 strcat(webbuff, "<strong>Mode</strong>");
jiang111 0:4c4775017e8a 873 strcat(webbuff, "<table><tr><td><button id='avoidbtn' type='button' class=\"noselect\" value=\"AVOIDANCE\" onClick='send_mes(this.value)' >");
jiang111 0:4c4775017e8a 874 strcat(webbuff, "AVOIDANCE</button></td><td>");
jiang111 0:4c4775017e8a 875 strcat(webbuff, "<button id='tracebtn' type='button' class=\"noselect\" value=\"LINE_TRACE\" onClick='send_mes(this.value)' >LINE_TRACE");
jiang111 0:4c4775017e8a 876 break;
jiang111 0:4c4775017e8a 877 }
jiang111 0:4c4775017e8a 878 strcat(webbuff, "</button></td></tr></table>");
jiang111 0:4c4775017e8a 879 strcat(webbuff, "<strong>Speed</strong>");
jiang111 0:4c4775017e8a 880 strcat(webbuff, "<table><tr><td>");
jiang111 0:4c4775017e8a 881 //ready示速度だけ点灯
jiang111 0:4c4775017e8a 882 switch (flag_sp) { //現在の速度のボタン表示
jiang111 0:4c4775017e8a 883 case 0: //ノーマル
jiang111 0:4c4775017e8a 884 strcat(webbuff, "<button id='sp1btn' type='button' class=\"light\" value=\"Normal\" onClick='send_mes_spe(this.value)' >Normal");
jiang111 0:4c4775017e8a 885 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 886 strcat(webbuff, "<button id='sp2btn' type='button' class=\"noselect\" value=\"Fast\" onClick='send_mes_spe(this.value)' >Fast");
jiang111 0:4c4775017e8a 887 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 888 strcat(webbuff, "<button id='sp3btn' type='button' class=\"noselect\" value=\"VeryFast\" onClick='send_mes_spe(this.value)' >VeryFast");
jiang111 0:4c4775017e8a 889 break;
jiang111 0:4c4775017e8a 890 case 1: //ファスト
jiang111 0:4c4775017e8a 891 strcat(webbuff, "<button id='sp1btn' type='button' class=\"noselect\" value=\"Normal\" onClick='send_mes_spe(this.value)' >Normal");
jiang111 0:4c4775017e8a 892 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 893 strcat(webbuff, "<button id='sp2btn' type='button' class=\"light\" value=\"Fast\" onClick='send_mes_spe(this.value)' >Fast");
jiang111 0:4c4775017e8a 894 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 895 strcat(webbuff, "<button id='sp3btn' type='button' class=\"noselect\" value=\"VeryFast\" onClick='send_mes_spe(this.value)' >VeryFast");
jiang111 0:4c4775017e8a 896 break;
jiang111 0:4c4775017e8a 897 case 2: //ベリーファスト
jiang111 0:4c4775017e8a 898 strcat(webbuff, "<button id='sp1btn' type='button' class=\"noselect\" value=\"Normal\" onClick='send_mes_spe(this.value)' >Normal");
jiang111 0:4c4775017e8a 899 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 900 strcat(webbuff, "<button id='sp2btn' type='button' class=\"noselect\" value=\"Fast\" onClick='send_mes_spe(this.value)' >Fast");
jiang111 0:4c4775017e8a 901 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 902 strcat(webbuff, "<button id='sp3btn' type='button' class=\"light\" value=\"VeryFast\" onClick='send_mes_spe(this.value)' >VeryFast");
jiang111 0:4c4775017e8a 903 break;
jiang111 0:4c4775017e8a 904 default: //その他
jiang111 0:4c4775017e8a 905 strcat(webbuff, "<button id='sp1btn' type='button' class=\"noselect\" value=\"Normal\" onClick='send_mes_spe(this.value)' >Normal");
jiang111 0:4c4775017e8a 906 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 907 strcat(webbuff, "<button id='sp2btn' type='button' class=\"noselect\" value=\"Fast\" onClick='send_mes_spe(this.value)' >Fast");
jiang111 0:4c4775017e8a 908 strcat(webbuff, "</button></td><td>");
jiang111 0:4c4775017e8a 909 strcat(webbuff, "<button id='sp3btn' type='button' class=\"noselect\" value=\"VeryFast\" onClick='send_mes_spe(this.value)' >VeryFast");
jiang111 0:4c4775017e8a 910 break;
jiang111 0:4c4775017e8a 911 }
jiang111 0:4c4775017e8a 912 strcat(webbuff, "</button></td></tr></table>");
jiang111 0:4c4775017e8a 913
jiang111 0:4c4775017e8a 914 strcat(webbuff, "</center>");
jiang111 0:4c4775017e8a 915 strcat(webbuff, "</body>");
jiang111 0:4c4775017e8a 916 strcat(webbuff, "</html>");
jiang111 0:4c4775017e8a 917
jiang111 0:4c4775017e8a 918 strcat(webbuff, "<script language=\"javascript\" type=\"text/javascript\">"); //機能
jiang111 0:4c4775017e8a 919
jiang111 0:4c4775017e8a 920 strcat(webbuff, "var button_9 = document.getElementsByTagName(\"button\");");
jiang111 0:4c4775017e8a 921
jiang111 0:4c4775017e8a 922 //ボタン入力時それぞれの関数から呼び出されサーバーとの通信を行う
jiang111 0:4c4775017e8a 923 strcat(webbuff, "function htmlacs(url) {");
jiang111 0:4c4775017e8a 924 strcat(webbuff, "for(var m=0;m<11;m++){button_9[m].disabled=true;}");
jiang111 0:4c4775017e8a 925 strcat(webbuff, "var xhr = new XMLHttpRequest();");
jiang111 0:4c4775017e8a 926 strcat(webbuff, "xhr.open(\"GET\", url);");
jiang111 0:4c4775017e8a 927 strcat(webbuff, "xhr.onreadystatechange = function(){");
jiang111 0:4c4775017e8a 928 strcat(webbuff, "if(this.readyState == 4 || this.status == 200){");
jiang111 0:4c4775017e8a 929 strcat(webbuff, "for(var m=0;m<11;m++){button_9[m].disabled=false;}");
jiang111 0:4c4775017e8a 930 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 931 strcat(webbuff, "};");
jiang111 0:4c4775017e8a 932 strcat(webbuff, "xhr.send(\"\");");
jiang111 0:4c4775017e8a 933 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 934
jiang111 0:4c4775017e8a 935 //mode変更ボタン入力時動作 //sendmes
jiang111 0:4c4775017e8a 936 strcat(webbuff, "function send_mes(btnval){"); //mode変更ボタン入力時の点灯消灯判定
jiang111 0:4c4775017e8a 937 strcat(webbuff, "console.log(btnval);");
jiang111 0:4c4775017e8a 938 strcat(webbuff, "var url = \"http://\" + window.location.hostname + \"/cargo?a=\" + btnval;");
jiang111 0:4c4775017e8a 939 strcat(webbuff, "htmlacs(url);");
jiang111 0:4c4775017e8a 940 strcat(webbuff, "console.log(url);");
jiang111 0:4c4775017e8a 941 strcat(webbuff, "var buttons = document.getElementsByTagName(\"button\");");
jiang111 0:4c4775017e8a 942 strcat(webbuff, "for(var i=1;i<8;i++){");
jiang111 0:4c4775017e8a 943 strcat(webbuff, "if(buttons[i].value == btnval){");
jiang111 0:4c4775017e8a 944 strcat(webbuff, "buttons[i].className=\"light\";");
jiang111 0:4c4775017e8a 945 strcat(webbuff, "}else{");
jiang111 0:4c4775017e8a 946 strcat(webbuff, "buttons[i].className=\"noselect\";");
jiang111 0:4c4775017e8a 947 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 948 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 949 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 950
jiang111 0:4c4775017e8a 951 strcat(webbuff, "function send_mes_spe(btnval){"); //speed変更ボタン入力時の点灯消灯判定
jiang111 0:4c4775017e8a 952 strcat(webbuff, "var url = \"http://\" + window.location.hostname + \"/cargo?a=\" + btnval;");
jiang111 0:4c4775017e8a 953 strcat(webbuff, "htmlacs(url);");
jiang111 0:4c4775017e8a 954 strcat(webbuff, "console.log(url);");
jiang111 0:4c4775017e8a 955 strcat(webbuff, "var buttons = document.getElementsByTagName(\"button\");");
jiang111 0:4c4775017e8a 956 strcat(webbuff, "for(var i=8;i<11;i++){");
jiang111 0:4c4775017e8a 957 strcat(webbuff, "if(buttons[i].value == btnval){");
jiang111 0:4c4775017e8a 958 strcat(webbuff, "buttons[i].className=\"light\";");
jiang111 0:4c4775017e8a 959 strcat(webbuff, "}else{");
jiang111 0:4c4775017e8a 960 strcat(webbuff, "buttons[i].className=\"noselect\";");
jiang111 0:4c4775017e8a 961 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 962 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 963 strcat(webbuff, "}");
jiang111 0:4c4775017e8a 964 strcat(webbuff, "</script>");
jiang111 0:4c4775017e8a 965
jiang111 0:4c4775017e8a 966
jiang111 0:4c4775017e8a 967 // end of WEB page data
jiang111 0:4c4775017e8a 968 bufl = strlen(webbuff); // get total page buffer length
jiang111 0:4c4775017e8a 969 //sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
jiang111 0:4c4775017e8a 970
jiang111 0:4c4775017e8a 971 sprintf(cmdbuff,"AT+CIPSENDBUF=%d,%d\r\n", linkID, (bufl>2048?2048:bufl)); // send IPD link channel and buffer character length.
jiang111 0:4c4775017e8a 972 timeout=500;
jiang111 0:4c4775017e8a 973 getcount=40;
jiang111 0:4c4775017e8a 974 SendCMD();
jiang111 0:4c4775017e8a 975 getreply();
jiang111 0:4c4775017e8a 976 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 977 ////*-*-*-5("\n++++++++++ AT+CIPSENDBUF=%d,%d+++++++++\r\n", linkID, (bufl>2048?2048:bufl));
jiang111 0:4c4775017e8a 978
jiang111 0:4c4775017e8a 979 //*-*-*-5("\n++++++++++ bufl is %d ++++++++++\r\n",bufl);
jiang111 0:4c4775017e8a 980
jiang111 0:4c4775017e8a 981 //pastthrough mode
jiang111 0:4c4775017e8a 982 SendWEB(); // send web page
jiang111 0:4c4775017e8a 983 //*-*-*-5("\n++++++++++ webbuff clear ++++++++++\r\n");
jiang111 0:4c4775017e8a 984
jiang111 0:4c4775017e8a 985 memset(webbuff, '\0', sizeof(webbuff));
jiang111 0:4c4775017e8a 986 sendcheck();
jiang111 0:4c4775017e8a 987 }
jiang111 0:4c4775017e8a 988
jiang111 0:4c4775017e8a 989 // Large WEB buffer data send
jiang111 0:4c4775017e8a 990 void SendWEB()
jiang111 0:4c4775017e8a 991 {
jiang111 0:4c4775017e8a 992 int i=0;
jiang111 0:4c4775017e8a 993 if(esp.writeable()) {
jiang111 0:4c4775017e8a 994 while(webbuff[i]!='\0') {
jiang111 0:4c4775017e8a 995 esp.putc(webbuff[i]);
jiang111 0:4c4775017e8a 996
jiang111 0:4c4775017e8a 997 //****
jiang111 0:4c4775017e8a 998 //output at command when 2000
jiang111 0:4c4775017e8a 999 if(((i%2047)==0) && (i>0)) {
jiang111 0:4c4775017e8a 1000 //wait_ms(10);
jiang111 0:4c4775017e8a 1001 ThisThread::sleep_for(100);
jiang111 0:4c4775017e8a 1002 sprintf(cmdbuff,"AT+CIPSENDBUF=%d,%d\r\n", linkID, (bufl-2048)>2048?2048:(bufl-2048)); // send IPD link channel and buffer character length.
jiang111 0:4c4775017e8a 1003 ////*-*-*-5("\r\n++++++++++ AT+CIPSENDBUF=%d,%d ++++++++++\r\n", linkID, (bufl-2048)>2048?2048:(bufl-2048));
jiang111 0:4c4775017e8a 1004 timeout=600;
jiang111 0:4c4775017e8a 1005 getcount=50;
jiang111 0:4c4775017e8a 1006 SendCMD();
jiang111 0:4c4775017e8a 1007 getreply();
jiang111 0:4c4775017e8a 1008 ////*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1009 ////*-*-*-5("\r\n+++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1010 }
jiang111 0:4c4775017e8a 1011 //****
jiang111 0:4c4775017e8a 1012 i++;
jiang111 0:4c4775017e8a 1013 ////*-*-*-5("%c",webbuff[i]);
jiang111 0:4c4775017e8a 1014 }
jiang111 0:4c4775017e8a 1015 }
jiang111 0:4c4775017e8a 1016 //*-*-*-5("\n++++++++++ send web i= %dinfo ++++++++++\r\n",i);
jiang111 0:4c4775017e8a 1017 }
jiang111 0:4c4775017e8a 1018
jiang111 0:4c4775017e8a 1019
jiang111 0:4c4775017e8a 1020 void sendcheck()
jiang111 0:4c4775017e8a 1021 {
jiang111 0:4c4775017e8a 1022 weberror=1;
jiang111 0:4c4775017e8a 1023 timeout=500;
jiang111 0:4c4775017e8a 1024 getcount=24;
jiang111 0:4c4775017e8a 1025 time2.reset();
jiang111 0:4c4775017e8a 1026 time2.start();
jiang111 0:4c4775017e8a 1027
jiang111 0:4c4775017e8a 1028 /*
jiang111 0:4c4775017e8a 1029 while(weberror==1 && time2.read() <5) {
jiang111 0:4c4775017e8a 1030 getreply();
jiang111 0:4c4775017e8a 1031 if (strstr(replybuff, "SEND OK") != NULL) {
jiang111 0:4c4775017e8a 1032 weberror=0; // wait for valid SEND OK
jiang111 0:4c4775017e8a 1033 }
jiang111 0:4c4775017e8a 1034 }
jiang111 0:4c4775017e8a 1035 */
jiang111 0:4c4775017e8a 1036 if(weberror==1) { // restart connection
jiang111 0:4c4775017e8a 1037 strcpy(cmdbuff, "AT+CIPMUX=1\r\n");
jiang111 0:4c4775017e8a 1038 timeout=500;
jiang111 0:4c4775017e8a 1039 getcount=10;
jiang111 0:4c4775017e8a 1040 SendCMD();
jiang111 0:4c4775017e8a 1041 getreply();
jiang111 0:4c4775017e8a 1042 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1043 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
jiang111 0:4c4775017e8a 1044 timeout=500;
jiang111 0:4c4775017e8a 1045 getcount=10;
jiang111 0:4c4775017e8a 1046 SendCMD();
jiang111 0:4c4775017e8a 1047 getreply();
jiang111 0:4c4775017e8a 1048 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1049 } else {
jiang111 0:4c4775017e8a 1050 sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection
jiang111 0:4c4775017e8a 1051 SendCMD();
jiang111 0:4c4775017e8a 1052 getreply();
jiang111 0:4c4775017e8a 1053 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1054 }
jiang111 0:4c4775017e8a 1055 time2.reset();
jiang111 0:4c4775017e8a 1056 }
jiang111 0:4c4775017e8a 1057
jiang111 0:4c4775017e8a 1058 // Reads and processes GET and POST web data
jiang111 0:4c4775017e8a 1059 void ReadWebData()
jiang111 0:4c4775017e8a 1060 {
jiang111 0:4c4775017e8a 1061 //*-*-*-5("+++++++++++++++++Read Web Data+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1062 ThisThread::sleep_for(200);
jiang111 0:4c4775017e8a 1063 esp.attach(NULL);
jiang111 0:4c4775017e8a 1064 ount=0;
jiang111 0:4c4775017e8a 1065 DataRX=0;
jiang111 0:4c4775017e8a 1066 weberror=0;
jiang111 0:4c4775017e8a 1067 memset(webdata, '\0', sizeof(webdata));
jiang111 0:4c4775017e8a 1068 int x = strcspn (webbuff,"+");
jiang111 0:4c4775017e8a 1069 if(x) {
jiang111 0:4c4775017e8a 1070 strcpy(webdata, webbuff + x);
jiang111 0:4c4775017e8a 1071 weberror=0;
jiang111 0:4c4775017e8a 1072 int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
jiang111 0:4c4775017e8a 1073 //int i=0;
jiang111 0:4c4775017e8a 1074 //*-*-*-5("+++++++++++++++++succed rec begin+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1075 //*-*-*-5("%s",webdata);
jiang111 0:4c4775017e8a 1076 //*-*-*-5("+++++++++++++++++succed rec end+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1077 if( strstr(webdata, "Normal") != NULL ) {
jiang111 0:4c4775017e8a 1078 //*-*-*-5("++++++++++++++++++Normal++++++++++++++++++++");
jiang111 0:4c4775017e8a 1079 mode = SPEED; // スピードモード
jiang111 0:4c4775017e8a 1080 flag_sp = 0;
jiang111 0:4c4775017e8a 1081 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1082 mode = beforeMode; // 現在のモードに前回のモードを設定
jiang111 0:4c4775017e8a 1083 }else if( strstr(webdata, "VeryFast") != NULL ) {
jiang111 0:4c4775017e8a 1084 //*-*-*-5("+++++++++++++++++++VeryFast+++++++++++++++++++");
jiang111 0:4c4775017e8a 1085 mode = SPEED; // スピードモード
jiang111 0:4c4775017e8a 1086 flag_sp = 2;
jiang111 0:4c4775017e8a 1087 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1088 mode = beforeMode; // 現在のモードに前回のモードを設定
jiang111 0:4c4775017e8a 1089 }else if( strstr(webdata, "Fast") != NULL ) {
jiang111 0:4c4775017e8a 1090 //*-*-*-5("++++++++++++++++++++Fast++++++++++++++++++");
jiang111 0:4c4775017e8a 1091 mode = SPEED; // スピードモード
jiang111 0:4c4775017e8a 1092 flag_sp = 1;
jiang111 0:4c4775017e8a 1093 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1094 mode = beforeMode; // 現在のモードに前回のモードを設定
jiang111 0:4c4775017e8a 1095 }else{
jiang111 0:4c4775017e8a 1096 beforeMode = mode;
jiang111 0:4c4775017e8a 1097 }
jiang111 0:4c4775017e8a 1098 if( strstr(webdata, "GO") != NULL ) {
jiang111 0:4c4775017e8a 1099 //*-*-*-5("+++++++++++++++++前進+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1100 //delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1101 //delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1102 run = ADVANCE; // 前進
jiang111 0:4c4775017e8a 1103 mode = ADVANCE; // モード変更
jiang111 0:4c4775017e8a 1104 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1105 }
jiang111 0:4c4775017e8a 1106
jiang111 0:4c4775017e8a 1107 if( strstr(webdata, "LEFT") != NULL ) {
jiang111 0:4c4775017e8a 1108 //*-*-*-5("+++++++++++++++++左折+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1109 //delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1110 //delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1111 run = LEFT; // 左折
jiang111 0:4c4775017e8a 1112 mode = LEFT; // モード変更
jiang111 0:4c4775017e8a 1113 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1114 }
jiang111 0:4c4775017e8a 1115
jiang111 0:4c4775017e8a 1116 if( strstr(webdata, "STOP") != NULL ) {
jiang111 0:4c4775017e8a 1117 //*-*-*-5("+++++++++++++++++停止+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1118 //delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1119 //delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1120 run = STOP; // 停止
jiang111 0:4c4775017e8a 1121 mode = STOP; // モード変更
jiang111 0:4c4775017e8a 1122 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1123 }
jiang111 0:4c4775017e8a 1124
jiang111 0:4c4775017e8a 1125 if( strstr(webdata, "RIGHT") != NULL ) {
jiang111 0:4c4775017e8a 1126 //*-*-*-5("+++++++++++++++++右折+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1127 //delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1128 //delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1129 run = RIGHT; // 右折
jiang111 0:4c4775017e8a 1130 mode = RIGHT; // モード変更
jiang111 0:4c4775017e8a 1131 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1132 }
jiang111 0:4c4775017e8a 1133
jiang111 0:4c4775017e8a 1134 if( strstr(webdata, "BACK") != NULL ) {
jiang111 0:4c4775017e8a 1135 //*-*-*-5("+++++++++++++++++後進+++++++++++++++++++++\r\n");
jiang111 0:4c4775017e8a 1136 //delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1137 //delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1138 run = BACK; // 後進
jiang111 0:4c4775017e8a 1139 mode = BACK; // モード変更
jiang111 0:4c4775017e8a 1140 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1141 }
jiang111 0:4c4775017e8a 1142 //*-*-*-5("+++++++++++++++++succed+++++++++++++++++++++");
jiang111 0:4c4775017e8a 1143
jiang111 0:4c4775017e8a 1144 if( strstr(webdata, "AVOIDANCE") != NULL ) {
jiang111 0:4c4775017e8a 1145 //*-*-*-5("+++++++++++++++++AVOIDANCE+++++++++++++++++++++");
jiang111 0:4c4775017e8a 1146 if(avoi_thread->get_state() == Thread::Deleted) {
jiang111 0:4c4775017e8a 1147 delete avoi_thread; //障害物回避スレッド停止
jiang111 0:4c4775017e8a 1148 avoi_thread = new Thread(avoidance);
jiang111 0:4c4775017e8a 1149 avoi_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 1150 }
jiang111 0:4c4775017e8a 1151 mode=AVOIDANCE;
jiang111 0:4c4775017e8a 1152 run = ADVANCE;
jiang111 0:4c4775017e8a 1153 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1154 }
jiang111 0:4c4775017e8a 1155 if( strstr(webdata, "LINE_TRACE") != NULL ) {
jiang111 0:4c4775017e8a 1156 //*-*-*-5("+++++++++++++++++LINET RACE+++++++++++++++++++++");
jiang111 0:4c4775017e8a 1157 //*-*-*-5("mode = LINE_TRACE\r\n");
jiang111 0:4c4775017e8a 1158 if(trace_thread->get_state() == Thread::Deleted) {
jiang111 0:4c4775017e8a 1159 delete trace_thread; //ライントレーススレッド停止
jiang111 0:4c4775017e8a 1160 trace_thread = new Thread(trace);
jiang111 0:4c4775017e8a 1161 trace_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 1162 }
jiang111 0:4c4775017e8a 1163 mode=LINE_TRACE;
jiang111 0:4c4775017e8a 1164 display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1165 }
jiang111 0:4c4775017e8a 1166 if(mode != LINE_TRACE && trace_thread->get_state() != Thread::Deleted){
jiang111 0:4c4775017e8a 1167 trace_thread->terminate();
jiang111 0:4c4775017e8a 1168 }
jiang111 0:4c4775017e8a 1169 if(mode != AVOIDANCE && avoi_thread->get_state() != Thread::Deleted){
jiang111 0:4c4775017e8a 1170 avoi_thread->terminate();
jiang111 0:4c4775017e8a 1171 servo.pulsewidth_us(1450); // サーボを中央位置に戻す
jiang111 0:4c4775017e8a 1172 }
jiang111 0:4c4775017e8a 1173 sprintf(channel, "%d",linkID);
jiang111 0:4c4775017e8a 1174 if (strstr(webdata, "GET") != NULL) {
jiang111 0:4c4775017e8a 1175 servreq=1;
jiang111 0:4c4775017e8a 1176 }
jiang111 0:4c4775017e8a 1177 if (strstr(webdata, "POST") != NULL) {
jiang111 0:4c4775017e8a 1178 servreq=1;
jiang111 0:4c4775017e8a 1179 }
jiang111 0:4c4775017e8a 1180 webcounter++;
jiang111 0:4c4775017e8a 1181 sprintf(webcount, "%d",webcounter);
jiang111 0:4c4775017e8a 1182 } else {
jiang111 0:4c4775017e8a 1183 memset(webbuff, '\0', sizeof(webbuff));
jiang111 0:4c4775017e8a 1184 esp.attach(&callback);
jiang111 0:4c4775017e8a 1185 weberror=1;
jiang111 0:4c4775017e8a 1186 }
jiang111 0:4c4775017e8a 1187 }
jiang111 0:4c4775017e8a 1188 // Starts and restarts webserver if errors detected.
jiang111 0:4c4775017e8a 1189 void startserver()
jiang111 0:4c4775017e8a 1190 {
jiang111 0:4c4775017e8a 1191 //*-*-*-5("++++++++++ Resetting ESP ++++++++++\r\n");
jiang111 0:4c4775017e8a 1192 strcpy(cmdbuff,"AT+RST\r\n");
jiang111 0:4c4775017e8a 1193 timeout=8000;
jiang111 0:4c4775017e8a 1194 getcount=1000;
jiang111 0:4c4775017e8a 1195 SendCMD();
jiang111 0:4c4775017e8a 1196 getreply();
jiang111 0:4c4775017e8a 1197 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1198 //*-*-*-5("%d",ount);
jiang111 0:4c4775017e8a 1199 if (strstr(replybuff, "OK") != NULL) {
jiang111 0:4c4775017e8a 1200 //*-*-*-5("\n++++++++++ Starting Server ++++++++++\r\n");
jiang111 0:4c4775017e8a 1201 strcpy(cmdbuff, "AT+CIPMUX=1\r\n"); // set multiple connections.
jiang111 0:4c4775017e8a 1202 timeout=500;
jiang111 0:4c4775017e8a 1203 getcount=20;
jiang111 0:4c4775017e8a 1204 SendCMD();
jiang111 0:4c4775017e8a 1205 getreply();
jiang111 0:4c4775017e8a 1206 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1207 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
jiang111 0:4c4775017e8a 1208 timeout=500;
jiang111 0:4c4775017e8a 1209 getcount=20;
jiang111 0:4c4775017e8a 1210 SendCMD();
jiang111 0:4c4775017e8a 1211 getreply();
jiang111 0:4c4775017e8a 1212 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1213 ThisThread::sleep_for(500);
jiang111 0:4c4775017e8a 1214 sprintf(cmdbuff,"AT+CIPSTO=%d\r\n",SERVtimeout);
jiang111 0:4c4775017e8a 1215 timeout=500;
jiang111 0:4c4775017e8a 1216 getcount=50;
jiang111 0:4c4775017e8a 1217 SendCMD();
jiang111 0:4c4775017e8a 1218 getreply();
jiang111 0:4c4775017e8a 1219 //*-*-*-5(replybuff);
jiang111 0:4c4775017e8a 1220 ThisThread::sleep_for(5000);
jiang111 0:4c4775017e8a 1221 //*-*-*-5("\n Getting Server IP \r\n");
jiang111 0:4c4775017e8a 1222 strcpy(cmdbuff, "AT+CIFSR\r\n");
jiang111 0:4c4775017e8a 1223 timeout=2500;
jiang111 0:4c4775017e8a 1224 getcount=200;
jiang111 0:4c4775017e8a 1225 while(weberror==0) {
jiang111 0:4c4775017e8a 1226 SendCMD();
jiang111 0:4c4775017e8a 1227 getreply();
jiang111 0:4c4775017e8a 1228 if (strstr(replybuff, "0.0.0.0") == NULL) {
jiang111 0:4c4775017e8a 1229 weberror=1; // wait for valid IP
jiang111 0:4c4775017e8a 1230 }
jiang111 0:4c4775017e8a 1231 }
jiang111 0:4c4775017e8a 1232 //*-*-*-5("\n Enter WEB address (IP) found below in your browser \r\n\n");
jiang111 0:4c4775017e8a 1233 //*-*-*-5("\n The MAC address is also shown below,if it is needed \r\n\n");
jiang111 0:4c4775017e8a 1234 replybuff[strlen(replybuff)-1] = '\0';
jiang111 0:4c4775017e8a 1235 //char* IP = replybuff + 5;
jiang111 0:4c4775017e8a 1236 sprintf(webdata,"%s", replybuff);
jiang111 0:4c4775017e8a 1237 //*-*-*-5(webdata);
jiang111 0:4c4775017e8a 1238 led2=1;
jiang111 0:4c4775017e8a 1239 bufflen=200;
jiang111 0:4c4775017e8a 1240 //bufflen=100;
jiang111 0:4c4775017e8a 1241 ount=0;
jiang111 0:4c4775017e8a 1242 //*-*-*-5("\n\n++++++++++ Ready ++++++++++\r\n\n");
jiang111 0:4c4775017e8a 1243 setup();
jiang111 0:4c4775017e8a 1244 esp.attach(&callback);
jiang111 0:4c4775017e8a 1245 } else {
jiang111 0:4c4775017e8a 1246 //*-*-*-5("\n++++++++++ ESP8266 error, check power/connections ++++++++++\r\n");
jiang111 0:4c4775017e8a 1247 led1=1;
jiang111 0:4c4775017e8a 1248 led2=1;
jiang111 0:4c4775017e8a 1249 led3=1;
jiang111 0:4c4775017e8a 1250 led4=1;
jiang111 0:4c4775017e8a 1251 while(1) {
jiang111 0:4c4775017e8a 1252 led1=!led1;
jiang111 0:4c4775017e8a 1253 led2=!led2;
jiang111 0:4c4775017e8a 1254 led3=!led3;
jiang111 0:4c4775017e8a 1255 led4=!led4;
jiang111 0:4c4775017e8a 1256 ThisThread::sleep_for(1000);
jiang111 0:4c4775017e8a 1257 }
jiang111 0:4c4775017e8a 1258 }
jiang111 0:4c4775017e8a 1259 time2.reset();
jiang111 0:4c4775017e8a 1260 time2.start();
jiang111 0:4c4775017e8a 1261 }
jiang111 0:4c4775017e8a 1262
jiang111 0:4c4775017e8a 1263 // ESP Command data send
jiang111 0:4c4775017e8a 1264 void SendCMD()
jiang111 0:4c4775017e8a 1265 {
jiang111 0:4c4775017e8a 1266 esp.printf("%s", cmdbuff);
jiang111 0:4c4775017e8a 1267 }
jiang111 0:4c4775017e8a 1268 // Get Command and ESP status replies
jiang111 0:4c4775017e8a 1269 void getreply()
jiang111 0:4c4775017e8a 1270 {
jiang111 0:4c4775017e8a 1271 memset(replybuff, '\0', sizeof(replybuff));
jiang111 0:4c4775017e8a 1272 time1.reset();
jiang111 0:4c4775017e8a 1273 time1.start();
jiang111 0:4c4775017e8a 1274 replycount=0;
jiang111 0:4c4775017e8a 1275 while(time1.read_ms()< timeout && replycount < getcount) {
jiang111 0:4c4775017e8a 1276 if(esp.readable()) {
jiang111 0:4c4775017e8a 1277 replybuff[replycount] = esp.getc();
jiang111 0:4c4775017e8a 1278 replycount++;
jiang111 0:4c4775017e8a 1279 }
jiang111 0:4c4775017e8a 1280 }
jiang111 0:4c4775017e8a 1281 time1.stop();
jiang111 0:4c4775017e8a 1282 }
jiang111 0:4c4775017e8a 1283
jiang111 0:4c4775017e8a 1284 /* mainスレッド */
jiang111 0:4c4775017e8a 1285 int main() {
jiang111 0:4c4775017e8a 1286 /* 初期設定 */
jiang111 0:4c4775017e8a 1287 //wifi_thread = new Thread(wifi);
jiang111 0:4c4775017e8a 1288 //wifi_thread -> set_priority(osPriorityHigh);
jiang111 0:4c4775017e8a 1289 motorR2.period_us(40);
jiang111 0:4c4775017e8a 1290 motorR1.period_us(40);
jiang111 0:4c4775017e8a 1291 motorL2.period_us(40);
jiang111 0:4c4775017e8a 1292 motorL1.period_us(40);
jiang111 0:4c4775017e8a 1293 setup();
jiang111 0:4c4775017e8a 1294 avoi_thread = new Thread(avoidance);
jiang111 0:4c4775017e8a 1295 avoi_thread->terminate();
jiang111 0:4c4775017e8a 1296 trace_thread = new Thread(trace);
jiang111 0:4c4775017e8a 1297 trace_thread->terminate();
jiang111 0:4c4775017e8a 1298 mode = READY; // 現在待ちモード
jiang111 0:4c4775017e8a 1299 beforeMode = READY; // 前回待ちモード
jiang111 0:4c4775017e8a 1300 run = STOP; // 停止
jiang111 0:4c4775017e8a 1301 flag_sp = NORMAL; // スピード(普通)
jiang111 0:4c4775017e8a 1302 lcd.setBacklight(TextLCD::LightOn); // バックライトON
jiang111 0:4c4775017e8a 1303 lcd.setAddress(0,1);
jiang111 0:4c4775017e8a 1304 lcd.printf("Mode:ready");
jiang111 0:4c4775017e8a 1305 // display(); // ディスプレイ表示
jiang111 0:4c4775017e8a 1306
jiang111 0:4c4775017e8a 1307 while(1){
jiang111 0:4c4775017e8a 1308 bChange(); // バッテリー残量更新
jiang111 0:4c4775017e8a 1309 }
jiang111 0:4c4775017e8a 1310 }