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-04
Revision:
3:6474ab60854e
Parent:
2:ea066749e515
Child:
4:83f7df775d46

File content as of revision 3:6474ab60854e:

//------------------------------------------------------------
// 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    5    //On time   [*100ms]
#define SWITCH_PERIOD 30   //Cycle time[*100ms]
#define WAIT_DELAY 5      //Delay time [*100ms]
#define TOTAL_TIMES 30000  //total times n


const float spd_table[] = {1.0,0.7,0.5};
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
    
    
    if(d_Cycle.rem ==WAIT_DELAY)
        {
          motor_speed=spd_table[sp_index];
          strcpy(ctext," CW");
         //ctext="CW";
        }
        
    else if (d_Cycle.rem == (WAIT_DELAY+ON_DURATION) )
        {
          //wait_ms(20);
          motor_speed=0;
          strcpy(ctext,"OFF");
        }
        
    else if (d_Cycle.rem == (2*WAIT_DELAY+ON_DURATION) )
        {
          //wait_ms(20);
          motor_speed=-spd_table[sp_index];
          strcpy(ctext,"CCW");
        }
        
    else if (d_Cycle.rem == (2*WAIT_DELAY+ON_DURATION*2) )
        {
          //wait_ms(20);
          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("%s", ctext, 0,0);
    lcd_.WriteValue("% 5d/", d_Cycle.quot);
    lcd_.WriteValue("%0d",TOTAL_TIMES);
    lcd_.WriteValue("V%0d",sp_index);
    
    
    //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.1);
    }
    
    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);
            }
}