LCD表示系の整理。現状の問題としては、配列への左右移動距離の記憶ができていない様子。2走目で常にHIGH_SPEEDとなってしまうので、エンコーダパルス関係の蓄積がうまくできているか?左右同じ情報が演算されていないか?といった部分を疑ってデバッグする必要がある。

Dependencies:   mbed AQM0802 CRotaryEncoder TB6612FNG

Revision:
12:dc4c569248d7
Parent:
11:2cd6f8be124e
Child:
13:97be8e29ae50
diff -r 2cd6f8be124e -r dc4c569248d7 main.cpp
--- a/main.cpp	Wed Aug 28 23:14:20 2019 +0000
+++ b/main.cpp	Thu Aug 29 00:59:01 2019 +0000
@@ -10,7 +10,7 @@
 #define     TURN_POWER      0.5     //コースアウト時の旋回力
 #define     PULSE_TO_UM     30      //エンコーダ1パルス当たりのタイヤ移動距離[um]
 #define     INTERRUPT_TIME  1000    //割りこみ周期[us]
-#define     GRAY            0.6f    //フォトリフレクタデジタル入力の閾値
+#define     DEFAULT_GRAY    0.5f    //フォトリフレクタデジタル入力の閾値
                                     //シリアル通信でSensor_Digital値を確認し調整する。
 #define     MARKER_WIDTH    15      //マーカ幅[mm](ビニルテープ幅19[mm]以内)
                                     //コースの傷によってマーカ誤検知する場合は値を大きくする。
@@ -73,8 +73,11 @@
 double Sensor_P =0.0f;        //ラインセンサP(比例成分)制御量
 double Sensor_D =0.0f;        //ラインセンサD(微分成分)制御量
 double Sensor_PD=0.0f;       //ラインセンサP,D成分の合計
+char    Gray_Str[5];        //LCD閾値表示用文字列
+float   Gray=DEFAULT_GRAY;
 long int Enc_Count_A=0,Enc_Count_B=0;        //エンコーダパルス数を格納
-long int Enc_B_Rotate=0;
+long int Enc_A_Rotate=0,Enc_B_Rotate=0;
+
 long int Distance_A=0,Distance_B=0;          //タイヤ移動距離を格納[mm]
 long int Marker_Run_Distance=0; 
 long int Speed_A=0,  Speed_B=0;              //現在速度
@@ -113,34 +116,34 @@
 void sensor_digital_read(){//8つのフォトリフレクタの入力を8ビットのデジタルパターンに変換
     Sensor_Cnt=0;
     Old_Sensor_Digital=Sensor_Digital;
-    if(S1_Data>GRAY){
+    if(S1_Data>Gray){
             Sensor_Digital |= 0x80;   //7ビット目のみセット (1にする。)
     }else   Sensor_Digital &= 0x7F;   //7ビット目のみマスク(0にする。)
-    if(S2_Data>GRAY){
+    if(S2_Data>Gray){
             Sensor_Digital |= 0x40;   //6ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else   Sensor_Digital &= 0xBF;   //6ビット目のみマスク(0にする。)
-    if(S3_Data>GRAY){
+    if(S3_Data>Gray){
             Sensor_Digital |= 0x20;   //5ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else    Sensor_Digital &= 0xDF;   //5ビット目のみマスク(0にする。)
-    if(S4_Data>GRAY){
+    if(S4_Data>Gray){
             Sensor_Digital |= 0x10;   //4ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else    Sensor_Digital &= 0xEF;   //4ビット目のみマスク(0にする。)
-    if(S5_Data>GRAY){
+    if(S5_Data>Gray){
             Sensor_Digital |= 0x08;   //3ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else   Sensor_Digital &= 0xF7;   //3ビット目のみマスク(0にする。)
-    if(S6_Data>GRAY){
+    if(S6_Data>Gray){
             Sensor_Digital |= 0x04;   //2ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else   Sensor_Digital &= 0xFB;   //2ビット目のみマスク(0にする。)
-    if(S7_Data>GRAY){
+    if(S7_Data>Gray){
             Sensor_Digital |= 0x02;   //1ビット目のみセット (1にする。)
             Sensor_Cnt++;
     }else   Sensor_Digital &= 0xFD;   //1ビット目のみマスク(0にする。)
-    if(S8_Data>GRAY){
+    if(S8_Data>Gray){
             Sensor_Digital |= 0x01;   //0ビット目のみセット (1にする。)
     }else   Sensor_Digital &= 0xFE;   //0ビット目のみマスク(0にする。)    
 }
@@ -227,7 +230,10 @@
     Speed_B=(Distance_B*1000)/INTERRUPT_TIME;
     
     if(Machine_Status&STOP){//機体停止状態の時
-        Enc_B_Rotate+=Enc_Count_B;//モード設定用に右エンコーダ値の蓄積
+        Enc_A_Rotate+=Enc_Count_A;//閾値用に左エンコーダ値の蓄積
+        if(Enc_A_Rotate<-6400)Enc_A_Rotate=-6400;
+        if(Enc_A_Rotate>6400)Enc_A_Rotate=6400;        
+        Enc_B_Rotate+=Enc_Count_B;//速度用に右エンコーダ値の蓄積
         if(Enc_B_Rotate<-6400)Enc_B_Rotate=-6400;
         if(Enc_B_Rotate>6400)Enc_B_Rotate=6400;
     }
@@ -312,8 +318,15 @@
             lcd.print("STOP");            
         }
         if(Machine_Status&STOP){//機体停止状態の時
+          
+            Gray=DEFAULT_GRAY+((float)Enc_A_Rotate/16000);//センサ閾値調整
+            sprintf(Gray_Str,"%3.2f",Gray);//速度情報文字列変換
+            lcd.locate(0,0);
+            lcd.print("      ");
+            lcd.locate(0,0);
+            lcd.print(Gray_Str);             
             Machine_Speed=DEFAULT_SPEED+(Enc_B_Rotate/16);//標準速度調整
-            sprintf(Speed_Str,"%04d",Machine_Speed);//速度情報文字列変換
+            sprintf(Speed_Str,"%04d",Machine_Speed);//速度情報文字列変換                
             lcd.locate(0,1);
             lcd.print("      ");
             lcd.locate(0,1);