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-21
Revision:
5:2b9614aa1171
Parent:
4:83f7df775d46
Child:
6:e3afb1390167

File content as of revision 5:2b9614aa1171:

//------------------------------------------------------------
// 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"
#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 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 6



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

//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 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()
{
    
    //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*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;
    
    //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
    
    //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)
            {
              motor_speed=vol_accel[accel_index] * spd_table[sp_index];
            }
            else
            {
              motor_speed=spd_table[sp_index];
            }
          strcpy(ctext," CW");
         //ctext="CW";
         
        }
        
        //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+UP_DURATION);
          if (accel_index< DECEL_SIZE)
            {
              motor_speed=vol_decel[accel_index] * spd_table[sp_index];
            }
            else
            {
              motor_speed=0;
            }
          strcpy(ctext,"OFF");
        }
        
        
        //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+UP_DURATION);
          if (accel_index < ACCEL_SIZE)
            {
              motor_speed= - vol_accel[accel_index] * spd_table[sp_index]*donw_ratio;
            }
            else
            {
              motor_speed= -spd_table[sp_index]*donw_ratio;
            }
          strcpy(ctext," CW");
         //ctext="CW";
        }
        
        
        //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+UP_DURATION+DOWN_DURATION));
          if (accel_index< DECEL_SIZE)
            {
              motor_speed= -vol_decel[accel_index] * spd_table[sp_index]*donw_ratio;
            }
            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("%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
    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);

    iqs62x.configure(); // configure the ICD
    
    
    bool status = motor.status();
    if (status & DRV8830_F_FAULT){
        motor.reset();
     } 
    
    while (true) {
            motor.speed(motor_speed);
            //iqs62x.readIqsRegisters(0,NUMBER_OF_REGISTERS); // read all the registers
            //ShowLCD(iqs62x.registers,0x80,0x8f);
            wait(1);
    }
            
}