Use IQS62X sensor and move motor by detected angle
Dependencies: DRV8830 IQS62x IQSDisplayTerminal UIT_ACM1602NI mbed
Fork of Nucleo_ACM1602_I2C_DC by
Diff: main.cpp
- Revision:
- 5:2b9614aa1171
- Parent:
- 4:83f7df775d46
- Child:
- 6:e3afb1390167
diff -r 83f7df775d46 -r 2b9614aa1171 main.cpp --- 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); + } + }