Use IQS62X sensor and move motor by detected angle

Dependencies:   DRV8830 IQS62x IQSDisplayTerminal UIT_ACM1602NI mbed

Fork of Nucleo_ACM1602_I2C_DC by Thinkbed

Committer:
8mona
Date:
Tue Sep 05 15:05:38 2017 +0000
Revision:
4:83f7df775d46
Parent:
3:6474ab60854e
Child:
5:2b9614aa1171
Add S-Curve acceleration temporally

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:132eb47d57fb 1 //------------------------------------------------------------
MikamiUitOpen 0:132eb47d57fb 2 // Demo program for LCD ACM1602NI using I2C interface
MikamiUitOpen 0:132eb47d57fb 3 // Pullup resistors for SDA and SCL: 4.7 kΩ
MikamiUitOpen 1:d5e9bd9b38ad 4 // 2016/04/01, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:132eb47d57fb 5 //------------------------------------------------------------
MikamiUitOpen 0:132eb47d57fb 6
MikamiUitOpen 0:132eb47d57fb 7 #include "ACM1602NI.hpp"
8mona 3:6474ab60854e 8 #include "DRV8830.h"
8mona 3:6474ab60854e 9
8mona 2:ea066749e515 10 //Cycle
8mona 4:83f7df775d46 11 #define ON_DURATION 8*2 //On time [*100ms]
8mona 4:83f7df775d46 12 #define SWITCH_PERIOD 30*2 //Cycle time[*100ms]
8mona 4:83f7df775d46 13 #define WAIT_DELAY 5*2 //Delay time [*100ms]
8mona 3:6474ab60854e 14 #define TOTAL_TIMES 30000 //total times n
8mona 4:83f7df775d46 15 #define ACCEL_SIZE 6
8mona 4:83f7df775d46 16 #define DECEL_SIZE 8
8mona 3:6474ab60854e 17
8mona 3:6474ab60854e 18
8mona 3:6474ab60854e 19 const float spd_table[] = {1.0,0.7,0.5};
8mona 4:83f7df775d46 20 const float vol_accel[ACCEL_SIZE] = {0,0.3,0.6,0.8,0.95,1};
8mona 4:83f7df775d46 21 const float vol_decel[DECEL_SIZE] = {1,0.9,0.75,0.55,0.4,0.25,0.15,0};
8mona 3:6474ab60854e 22 static int sp_index=0;
8mona 2:ea066749e515 23
8mona 2:ea066749e515 24
MikamiUitOpen 0:132eb47d57fb 25 using namespace Mikami;
MikamiUitOpen 0:132eb47d57fb 26
MikamiUitOpen 0:132eb47d57fb 27 Acm1602Ni lcd_; // Default, OK
8mona 3:6474ab60854e 28
MikamiUitOpen 0:132eb47d57fb 29 //Acm1602Ni lcd_(D14, D15); // OK
MikamiUitOpen 0:132eb47d57fb 30 //Acm1602Ni lcd_(D14, D15, 200000); // OK
MikamiUitOpen 0:132eb47d57fb 31 //Acm1602Ni lcd_(D14, D15, 200000, true, true); // OK
MikamiUitOpen 0:132eb47d57fb 32 //Acm1602Ni lcd_(PB_3, PB_10); // OK
MikamiUitOpen 0:132eb47d57fb 33 //Acm1602Ni lcd_(PC_9, PA_8); // OK
MikamiUitOpen 0:132eb47d57fb 34 //Acm1602Ni lcd_(PB_4, PA_8); // OK
MikamiUitOpen 0:132eb47d57fb 35
MikamiUitOpen 0:132eb47d57fb 36 Ticker timer_;
8mona 3:6474ab60854e 37 I2C i2c(D14, D15);
8mona 3:6474ab60854e 38 DRV8830 motor(i2c, DRV8830ADDR_NN);
8mona 3:6474ab60854e 39 //DigitalOut Relay1(D2);
8mona 2:ea066749e515 40 InterruptIn button1(USER_BUTTON);
8mona 3:6474ab60854e 41 static float motor_speed;
MikamiUitOpen 0:132eb47d57fb 42
8mona 3:6474ab60854e 43
MikamiUitOpen 0:132eb47d57fb 44 // Display elapsed time in minutes and seconds
MikamiUitOpen 0:132eb47d57fb 45 void TimerIsr()
MikamiUitOpen 0:132eb47d57fb 46 {
8mona 3:6474ab60854e 47
8mona 3:6474ab60854e 48 //For LED Time-Sec display
MikamiUitOpen 0:132eb47d57fb 49 static int k = 0;
8mona 2:ea066749e515 50 static char ctext[4]="---";
8mona 2:ea066749e515 51 div_t d_Cycle = div (k, SWITCH_PERIOD);
8mona 2:ea066749e515 52
8mona 2:ea066749e515 53 //for Current time
8mona 2:ea066749e515 54 div_t d_sec = div(k,600); //60s * 10n
8mona 2:ea066749e515 55 int t_min = d_sec.quot;
8mona 2:ea066749e515 56 div_t d_min = div(t_min,60); //1min=60s
8mona 2:ea066749e515 57 int t_hr = d_min.quot;
8mona 2:ea066749e515 58
8mona 2:ea066749e515 59 //for Current time
8mona 2:ea066749e515 60 div_t df_sec = div(TOTAL_TIMES*SWITCH_PERIOD,600); //60s * 10n
8mona 2:ea066749e515 61 int tf_min = df_sec.quot;
8mona 2:ea066749e515 62 div_t df_min = div(tf_min,60); //1min=60s
8mona 2:ea066749e515 63 int tf_hr = df_min.quot;
8mona 3:6474ab60854e 64
8mona 3:6474ab60854e 65
8mona 3:6474ab60854e 66 //Motor activation
8mona 4:83f7df775d46 67 static int mode = 1;
8mona 2:ea066749e515 68
8mona 4:83f7df775d46 69 if(WAIT_DELAY <= d_Cycle.rem && d_Cycle.rem < (WAIT_DELAY+ON_DURATION) )
8mona 4:83f7df775d46 70 {
8mona 4:83f7df775d46 71 int accel_index = d_Cycle.rem - WAIT_DELAY;
8mona 4:83f7df775d46 72 if (accel_index < ACCEL_SIZE)
8mona 4:83f7df775d46 73 {
8mona 4:83f7df775d46 74 motor_speed=vol_accel[accel_index] * spd_table[sp_index];
8mona 4:83f7df775d46 75 }
8mona 4:83f7df775d46 76 else
8mona 4:83f7df775d46 77 {
8mona 4:83f7df775d46 78 motor_speed=spd_table[sp_index];
8mona 4:83f7df775d46 79 }
8mona 4:83f7df775d46 80 strcpy(ctext," CW");
8mona 4:83f7df775d46 81 //ctext="CW";
8mona 4:83f7df775d46 82
8mona 4:83f7df775d46 83 }
8mona 4:83f7df775d46 84
8mona 4:83f7df775d46 85 else if ( (WAIT_DELAY+ON_DURATION)<= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+ON_DURATION) )
8mona 3:6474ab60854e 86 {
8mona 4:83f7df775d46 87 //wait_ms(20);
8mona 4:83f7df775d46 88 int accel_index = d_Cycle.rem - (WAIT_DELAY+ON_DURATION);
8mona 4:83f7df775d46 89 if (accel_index< DECEL_SIZE)
8mona 4:83f7df775d46 90 {
8mona 4:83f7df775d46 91 motor_speed=vol_decel[accel_index] * spd_table[sp_index];
8mona 4:83f7df775d46 92 }
8mona 4:83f7df775d46 93 else
8mona 4:83f7df775d46 94 {
8mona 4:83f7df775d46 95 motor_speed=0;
8mona 4:83f7df775d46 96 }
8mona 4:83f7df775d46 97 strcpy(ctext,"OFF");
8mona 4:83f7df775d46 98 }
8mona 4:83f7df775d46 99
8mona 4:83f7df775d46 100 else if ( (2*WAIT_DELAY+ON_DURATION) <= d_Cycle.rem && d_Cycle.rem <(2*WAIT_DELAY+2* ON_DURATION) )
8mona 4:83f7df775d46 101 {
8mona 4:83f7df775d46 102 int accel_index = d_Cycle.rem - (2*WAIT_DELAY+ON_DURATION);
8mona 4:83f7df775d46 103 if (accel_index < ACCEL_SIZE)
8mona 4:83f7df775d46 104 {
8mona 4:83f7df775d46 105 motor_speed= - vol_accel[accel_index] * spd_table[sp_index];
8mona 4:83f7df775d46 106 }
8mona 4:83f7df775d46 107 else
8mona 4:83f7df775d46 108 {
8mona 4:83f7df775d46 109 motor_speed= -spd_table[sp_index];
8mona 4:83f7df775d46 110 }
8mona 3:6474ab60854e 111 strcpy(ctext," CW");
8mona 3:6474ab60854e 112 //ctext="CW";
8mona 3:6474ab60854e 113 }
8mona 3:6474ab60854e 114
8mona 4:83f7df775d46 115 else if ( (2*WAIT_DELAY+2* ON_DURATION) <= d_Cycle.rem )
8mona 2:ea066749e515 116 {
8mona 3:6474ab60854e 117 //wait_ms(20);
8mona 4:83f7df775d46 118 int accel_index = d_Cycle.rem - ((2*WAIT_DELAY+2* ON_DURATION));
8mona 4:83f7df775d46 119 if (accel_index< DECEL_SIZE)
8mona 4:83f7df775d46 120 {
8mona 4:83f7df775d46 121 motor_speed= -vol_decel[accel_index] * spd_table[sp_index];
8mona 4:83f7df775d46 122 }
8mona 4:83f7df775d46 123 else
8mona 4:83f7df775d46 124 {
8mona 4:83f7df775d46 125 motor_speed=0;
8mona 4:83f7df775d46 126 }
8mona 2:ea066749e515 127 strcpy(ctext,"OFF");
8mona 2:ea066749e515 128 }
8mona 2:ea066749e515 129
8mona 2:ea066749e515 130
8mona 2:ea066749e515 131 if(d_Cycle.quot==TOTAL_TIMES)
8mona 2:ea066749e515 132 {
8mona 2:ea066749e515 133 timer_.detach();
8mona 2:ea066749e515 134 }
8mona 3:6474ab60854e 135
8mona 2:ea066749e515 136
8mona 2:ea066749e515 137
MikamiUitOpen 1:d5e9bd9b38ad 138 /*
MikamiUitOpen 0:132eb47d57fb 139 char str[20];
8mona 2:ea066749e515 140 sprintf(str, "%d'%2d\"", msec.quot, msec.rem);
MikamiUitOpen 0:132eb47d57fb 141 lcd_.WriteStringXY(str, 0, 1);
MikamiUitOpen 1:d5e9bd9b38ad 142 */
8mona 2:ea066749e515 143
8mona 2:ea066749e515 144 //1 Row
8mona 2:ea066749e515 145 //lcd_.WriteStringXY("#",0,0);
8mona 3:6474ab60854e 146
8mona 4:83f7df775d46 147 lcd_.WriteValueXY("%1.1f", motor_speed, 0,0);
8mona 4:83f7df775d46 148 lcd_.WriteValue("%5d/", d_Cycle.quot);
8mona 2:ea066749e515 149 lcd_.WriteValue("%0d",TOTAL_TIMES);
8mona 4:83f7df775d46 150 lcd_.WriteValue("V%0d",motor_speed);
8mona 3:6474ab60854e 151
8mona 2:ea066749e515 152
8mona 2:ea066749e515 153 //2 Row
8mona 2:ea066749e515 154 lcd_.WriteValueXY("%03dh", t_hr, 0, 1);
8mona 2:ea066749e515 155 lcd_.WriteValue("%02dm", d_min.rem);
8mona 2:ea066749e515 156 lcd_.WriteValue("%03ds/", d_sec.rem);
8mona 2:ea066749e515 157 lcd_.WriteValue("%03dh", tf_hr);
8mona 2:ea066749e515 158 lcd_.WriteValue("%02dm", df_min.rem);
8mona 3:6474ab60854e 159
8mona 2:ea066749e515 160
8mona 2:ea066749e515 161 k++;
MikamiUitOpen 0:132eb47d57fb 162 }
MikamiUitOpen 0:132eb47d57fb 163
8mona 2:ea066749e515 164
8mona 2:ea066749e515 165
8mona 2:ea066749e515 166 void flip() {
8mona 2:ea066749e515 167 static bool b = false;
8mona 4:83f7df775d46 168
8mona 2:ea066749e515 169 if(b==false)
8mona 2:ea066749e515 170 {
8mona 4:83f7df775d46 171 timer_.attach(&TimerIsr, 0.05);
8mona 2:ea066749e515 172 }
8mona 2:ea066749e515 173
8mona 2:ea066749e515 174 else
8mona 2:ea066749e515 175 {
8mona 2:ea066749e515 176 timer_.detach();
8mona 3:6474ab60854e 177 //Relay1=0;
8mona 3:6474ab60854e 178 sp_index++;
8mona 3:6474ab60854e 179 if (sp_index == 3)
8mona 3:6474ab60854e 180 {
8mona 3:6474ab60854e 181 sp_index = 0;
8mona 3:6474ab60854e 182 }
8mona 2:ea066749e515 183 }
8mona 2:ea066749e515 184 b=!b;
8mona 2:ea066749e515 185
8mona 2:ea066749e515 186 }
8mona 2:ea066749e515 187
8mona 2:ea066749e515 188
MikamiUitOpen 0:132eb47d57fb 189 int main()
MikamiUitOpen 0:132eb47d57fb 190 {
8mona 3:6474ab60854e 191 //motor.speed(0);
8mona 3:6474ab60854e 192 // Check error and reset
8mona 3:6474ab60854e 193
8mona 2:ea066749e515 194
8mona 3:6474ab60854e 195
8mona 2:ea066749e515 196 //LCD_cont=0;
8mona 3:6474ab60854e 197 //if (lcd_.IsConnected()) printf("\r\nConnected");
8mona 3:6474ab60854e 198 //else printf("\r\nDisconnected");
MikamiUitOpen 0:132eb47d57fb 199
MikamiUitOpen 0:132eb47d57fb 200 TimerIsr();
8mona 2:ea066749e515 201 //timer_.attach(&TimerIsr, 0.1);
8mona 2:ea066749e515 202 button1.fall(&flip);
MikamiUitOpen 0:132eb47d57fb 203
8mona 3:6474ab60854e 204 bool status = motor.status();
8mona 3:6474ab60854e 205 if (status & DRV8830_F_FAULT){
8mona 3:6474ab60854e 206 motor.reset();
8mona 3:6474ab60854e 207 }
8mona 3:6474ab60854e 208
8mona 3:6474ab60854e 209 while (true) {
8mona 3:6474ab60854e 210 motor.speed(motor_speed);
8mona 3:6474ab60854e 211 }
MikamiUitOpen 0:132eb47d57fb 212 }
MikamiUitOpen 0:132eb47d57fb 213