Use IQS62X sensor and move motor by detected angle

Dependencies:   DRV8830 IQS62x IQSDisplayTerminal UIT_ACM1602NI mbed

Fork of Nucleo_ACM1602_I2C_DC by Thinkbed

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