Use IQS62X sensor and move motor by detected angle
Dependencies: DRV8830 IQS62x IQSDisplayTerminal UIT_ACM1602NI mbed
Fork of Nucleo_ACM1602_I2C_DC by
main.cpp
- Committer:
- 8mona
- Date:
- 2017-09-05
- Revision:
- 4:83f7df775d46
- Parent:
- 3:6474ab60854e
- Child:
- 5:2b9614aa1171
File content as of revision 4:83f7df775d46:
//------------------------------------------------------------ // Demo program for LCD ACM1602NI using I2C interface // Pullup resistors for SDA and SCL: 4.7 kΩ // 2016/04/01, Copyright (c) 2016 MIKAMI, Naoki //------------------------------------------------------------ #include "ACM1602NI.hpp" #include "DRV8830.h" //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 ACCEL_SIZE 6 #define DECEL_SIZE 8 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}; static int sp_index=0; using namespace Mikami; Acm1602Ni lcd_; // Default, OK //Acm1602Ni lcd_(D14, D15); // OK //Acm1602Ni lcd_(D14, D15, 200000); // OK //Acm1602Ni lcd_(D14, D15, 200000, true, true); // OK //Acm1602Ni lcd_(PB_3, PB_10); // OK //Acm1602Ni lcd_(PC_9, PA_8); // OK //Acm1602Ni lcd_(PB_4, PA_8); // OK Ticker timer_; I2C i2c(D14, D15); DRV8830 motor(i2c, DRV8830ADDR_NN); //DigitalOut Relay1(D2); InterruptIn button1(USER_BUTTON); static float motor_speed; // Display elapsed time in minutes and seconds void TimerIsr() { //For LED Time-Sec display static int k = 0; static char ctext[4]="---"; div_t d_Cycle = div (k, SWITCH_PERIOD); //for Current time div_t d_sec = div(k,600); //60s * 10n int t_min = d_sec.quot; div_t d_min = div(t_min,60); //1min=60s int t_hr = d_min.quot; //for Current time div_t df_sec = div(TOTAL_TIMES*SWITCH_PERIOD,600); //60s * 10n int tf_min = df_sec.quot; div_t df_min = div(tf_min,60); //1min=60s int tf_hr = df_min.quot; //Motor activation static int mode = 1; if(WAIT_DELAY <= d_Cycle.rem && d_Cycle.rem < (WAIT_DELAY+ON_DURATION) ) { int accel_index = d_Cycle.rem - WAIT_DELAY; if (accel_index < ACCEL_SIZE) { motor_speed=vol_accel[accel_index] * spd_table[sp_index]; } else { motor_speed=spd_table[sp_index]; } strcpy(ctext," CW"); //ctext="CW"; } else if ( (WAIT_DELAY+ON_DURATION)<= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+ON_DURATION) ) { //wait_ms(20); int accel_index = d_Cycle.rem - (WAIT_DELAY+ON_DURATION); if (accel_index< DECEL_SIZE) { motor_speed=vol_decel[accel_index] * spd_table[sp_index]; } else { motor_speed=0; } strcpy(ctext,"OFF"); } else if ( (2*WAIT_DELAY+ON_DURATION) <= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+2* ON_DURATION) ) { int accel_index = d_Cycle.rem - (2*WAIT_DELAY+ON_DURATION); if (accel_index < ACCEL_SIZE) { motor_speed= - vol_accel[accel_index] * spd_table[sp_index]; } else { motor_speed= -spd_table[sp_index]; } strcpy(ctext," CW"); //ctext="CW"; } else if ( (2*WAIT_DELAY+2* ON_DURATION) <= d_Cycle.rem ) { //wait_ms(20); int accel_index = d_Cycle.rem - ((2*WAIT_DELAY+2* ON_DURATION)); if (accel_index< DECEL_SIZE) { motor_speed= -vol_decel[accel_index] * spd_table[sp_index]; } else { motor_speed=0; } strcpy(ctext,"OFF"); } if(d_Cycle.quot==TOTAL_TIMES) { timer_.detach(); } /* char str[20]; sprintf(str, "%d'%2d\"", msec.quot, msec.rem); lcd_.WriteStringXY(str, 0, 1); */ //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); //2 Row lcd_.WriteValueXY("%03dh", t_hr, 0, 1); lcd_.WriteValue("%02dm", d_min.rem); lcd_.WriteValue("%03ds/", d_sec.rem); lcd_.WriteValue("%03dh", tf_hr); lcd_.WriteValue("%02dm", df_min.rem); k++; } void flip() { static bool b = false; if(b==false) { timer_.attach(&TimerIsr, 0.05); } else { timer_.detach(); //Relay1=0; sp_index++; if (sp_index == 3) { sp_index = 0; } } b=!b; } int main() { //motor.speed(0); // Check error and reset //LCD_cont=0; //if (lcd_.IsConnected()) printf("\r\nConnected"); //else printf("\r\nDisconnected"); TimerIsr(); //timer_.attach(&TimerIsr, 0.1); button1.fall(&flip); bool status = motor.status(); if (status & DRV8830_F_FAULT){ motor.reset(); } while (true) { motor.speed(motor_speed); } }