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
--- 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);
+ }
+
}
