Use IQS62X sensor and move motor by detected angle

Dependencies:   DRV8830 IQS62x IQSDisplayTerminal UIT_ACM1602NI mbed

Fork of Nucleo_ACM1602_I2C_DC by Thinkbed

Revision:
5:2b9614aa1171
Parent:
4:83f7df775d46
Child:
6:e3afb1390167
--- a/main.cpp	Tue Sep 05 15:05:38 2017 +0000
+++ b/main.cpp	Thu Sep 21 11:27:10 2017 +0000
@@ -6,23 +6,37 @@
 
 #include "ACM1602NI.hpp"
 #include "DRV8830.h"
+#include "IQS62x.h"
+#include "IQSdisplayTerminal.h"
+
+
+//IQS62xDisplay terminal;   // class to display IQS62x registers on a terminal
+IQS62xIO iqs62x;          // class for basic IQS62x block read and write
 
 //Cycle 
-#define ON_DURATION    8*2   //On time   [*100ms]
-#define SWITCH_PERIOD 30*2  //Cycle time[*100ms]
-#define WAIT_DELAY 5*2      //Delay time [*100ms]
-#define TOTAL_TIMES 30000  //total times n
+#define UP_DURATION    14  //On time   [*100ms]
+#define WAIT_DELAY     10  //Delay time [*100ms]
+#define DOWN_DURATION   8  //Down time [*50ms]
+#define SWITCH_PERIOD 50  //Cycle time[*50ms]
+#define TOTAL_TIMES 30000   //total times n
 #define ACCEL_SIZE 6
-#define DECEL_SIZE 8
+#define DECEL_SIZE 6
 
 
-const float spd_table[] = {1.0,0.7,0.5};
-const float vol_accel[ACCEL_SIZE] = {0,0.3,0.6,0.8,0.95,1};
-const float vol_decel[DECEL_SIZE] = {1,0.9,0.75,0.55,0.4,0.25,0.15,0};
+
+const float spd_table[] = {1.0,0.9,0.8};
+//const float vol_accel[ACCEL_SIZE] = {0,0.3,0.6,0.8,0.95,1};
+const float vol_decel[DECEL_SIZE] = {1,0.75,0.4,0.15,0.05,0};
+const float vol_accel[ACCEL_SIZE] = {0,0.5,0.8,1,1,1};
+//const float vol_decel[DECEL_SIZE] = {1,0.75,0.15,-1,-0.2,0};
+
+const float donw_ratio=0.85;
+
 static int sp_index=0;
 
 
 using namespace Mikami;
+void ShowLCD(char * buffer,  int startbyte, int endbyte); // for wheel output
 
 Acm1602Ni lcd_;                               // Default, OK
 
@@ -42,6 +56,17 @@
 
  
 // Display elapsed time in minutes and seconds
+
+
+void ShowLCD(char * buffer,  int startbyte, int endbyte)
+{
+    for (int i=startbyte; i<=endbyte; i++) {
+            lcd_.WriteValue("%02x ", buffer[i]); // print out in black & white
+    }
+}
+    
+
+
 void TimerIsr()
 {
     
@@ -51,7 +76,7 @@
     div_t d_Cycle = div (k, SWITCH_PERIOD);
     
     //for Current time
-    div_t d_sec = div(k,600);    //60s * 10n
+    div_t d_sec = div(k,600*2);    //60s * 10n
     int t_min = d_sec.quot;
     div_t d_min = div(t_min,60);   //1min=60s
     int t_hr  = d_min.quot;
@@ -64,9 +89,9 @@
     
     
     //Motor activation
-    static int mode = 1;
     
-    if(WAIT_DELAY <= d_Cycle.rem && d_Cycle.rem < (WAIT_DELAY+ON_DURATION) )
+    //Up Movement
+    if(WAIT_DELAY <= d_Cycle.rem && d_Cycle.rem < (WAIT_DELAY+UP_DURATION) )
         {
           int accel_index = d_Cycle.rem -  WAIT_DELAY;
           if (accel_index < ACCEL_SIZE)
@@ -82,10 +107,11 @@
          
         }
         
-    else if ( (WAIT_DELAY+ON_DURATION)<= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+ON_DURATION)   )
+        //UP..stop
+    else if ( (WAIT_DELAY+UP_DURATION)<= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+UP_DURATION)   )
         {
           //wait_ms(20);
-          int accel_index = d_Cycle.rem - (WAIT_DELAY+ON_DURATION);
+          int accel_index = d_Cycle.rem - (WAIT_DELAY+UP_DURATION);
           if (accel_index< DECEL_SIZE)
             {
               motor_speed=vol_decel[accel_index] * spd_table[sp_index];
@@ -97,28 +123,32 @@
           strcpy(ctext,"OFF");
         }
         
-    else if ( (2*WAIT_DELAY+ON_DURATION) <= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+2* ON_DURATION)  )
+        
+        //down..Start 
+    else if ( (2*WAIT_DELAY+UP_DURATION) <= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+UP_DURATION+DOWN_DURATION)  )
         {
-          int accel_index = d_Cycle.rem -  (2*WAIT_DELAY+ON_DURATION);
+          int accel_index = d_Cycle.rem -  (2*WAIT_DELAY+UP_DURATION);
           if (accel_index < ACCEL_SIZE)
             {
-              motor_speed= - vol_accel[accel_index] * spd_table[sp_index];
+              motor_speed= - vol_accel[accel_index] * spd_table[sp_index]*donw_ratio;
             }
             else
             {
-              motor_speed= -spd_table[sp_index];
+              motor_speed= -spd_table[sp_index]*donw_ratio;
             }
           strcpy(ctext," CW");
          //ctext="CW";
         }
         
-    else if ( (2*WAIT_DELAY+2* ON_DURATION) <= d_Cycle.rem  )
+        
+        //down..stop
+    else if ( (2*WAIT_DELAY+UP_DURATION+DOWN_DURATION) <= d_Cycle.rem  )
         {
           //wait_ms(20);
-          int accel_index = d_Cycle.rem - ((2*WAIT_DELAY+2* ON_DURATION));
+          int accel_index = d_Cycle.rem - ((2*WAIT_DELAY+UP_DURATION+DOWN_DURATION));
           if (accel_index< DECEL_SIZE)
             {
-              motor_speed= -vol_decel[accel_index] * spd_table[sp_index];
+              motor_speed= -vol_decel[accel_index] * spd_table[sp_index]*donw_ratio;
             }
             else
             {
@@ -144,10 +174,12 @@
     //1 Row
     //lcd_.WriteStringXY("#",0,0);
     
-    lcd_.WriteValueXY("%1.1f", motor_speed, 0,0);
-    lcd_.WriteValue("%5d/", d_Cycle.quot);
-    lcd_.WriteValue("%0d",TOTAL_TIMES);
-    lcd_.WriteValue("V%0d",motor_speed);
+    
+    
+    lcd_.WriteValueXY("%5d/", d_Cycle.quot,0,0);
+    lcd_.WriteValue("%0dM",TOTAL_TIMES);
+    lcd_.WriteValue("%1.2f", motor_speed);
+    //lcd_.WriteValue("V%0d",motor_speed);
     
     
     //2 Row
@@ -158,6 +190,7 @@
     lcd_.WriteValue("%02dm",   df_min.rem);
     
     
+    
     k++;        
 }
 
@@ -188,11 +221,10 @@
 
 int main()
 {
+
     //motor.speed(0);
-     //  Check error and reset
+    //  Check error and reset
       
-    
-
     //LCD_cont=0;
     //if (lcd_.IsConnected()) printf("\r\nConnected");
     //else                    printf("\r\nDisconnected");
@@ -201,6 +233,9 @@
     //timer_.attach(&TimerIsr, 0.1);
     button1.fall(&flip);
 
+    iqs62x.configure(); // configure the ICD
+    
+    
     bool status = motor.status();
     if (status & DRV8830_F_FAULT){
         motor.reset();
@@ -208,6 +243,10 @@
     
     while (true) {
             motor.speed(motor_speed);
-            }
+            //iqs62x.readIqsRegisters(0,NUMBER_OF_REGISTERS); // read all the registers
+            //ShowLCD(iqs62x.registers,0x80,0x8f);
+            wait(1);
+    }
+            
 }