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@3:6474ab60854e, 2017-09-04 (annotated)
- Committer:
- 8mona
- Date:
- Mon Sep 04 15:28:40 2017 +0000
- Revision:
- 3:6474ab60854e
- Parent:
- 2:ea066749e515
- Child:
- 4:83f7df775d46
Initial version
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:6474ab60854e | 11 | #define ON_DURATION 5 //On time [*100ms] |
8mona | 3:6474ab60854e | 12 | #define SWITCH_PERIOD 30 //Cycle time[*100ms] |
8mona | 3:6474ab60854e | 13 | #define WAIT_DELAY 5 //Delay time [*100ms] |
8mona | 3:6474ab60854e | 14 | #define TOTAL_TIMES 30000 //total times n |
8mona | 3:6474ab60854e | 15 | |
8mona | 3:6474ab60854e | 16 | |
8mona | 3:6474ab60854e | 17 | const float spd_table[] = {1.0,0.7,0.5}; |
8mona | 3:6474ab60854e | 18 | static int sp_index=0; |
8mona | 2:ea066749e515 | 19 | |
8mona | 2:ea066749e515 | 20 | |
MikamiUitOpen | 0:132eb47d57fb | 21 | using namespace Mikami; |
MikamiUitOpen | 0:132eb47d57fb | 22 | |
MikamiUitOpen | 0:132eb47d57fb | 23 | Acm1602Ni lcd_; // Default, OK |
8mona | 3:6474ab60854e | 24 | |
MikamiUitOpen | 0:132eb47d57fb | 25 | //Acm1602Ni lcd_(D14, D15); // OK |
MikamiUitOpen | 0:132eb47d57fb | 26 | //Acm1602Ni lcd_(D14, D15, 200000); // OK |
MikamiUitOpen | 0:132eb47d57fb | 27 | //Acm1602Ni lcd_(D14, D15, 200000, true, true); // OK |
MikamiUitOpen | 0:132eb47d57fb | 28 | //Acm1602Ni lcd_(PB_3, PB_10); // OK |
MikamiUitOpen | 0:132eb47d57fb | 29 | //Acm1602Ni lcd_(PC_9, PA_8); // OK |
MikamiUitOpen | 0:132eb47d57fb | 30 | //Acm1602Ni lcd_(PB_4, PA_8); // OK |
MikamiUitOpen | 0:132eb47d57fb | 31 | |
MikamiUitOpen | 0:132eb47d57fb | 32 | Ticker timer_; |
8mona | 3:6474ab60854e | 33 | I2C i2c(D14, D15); |
8mona | 3:6474ab60854e | 34 | DRV8830 motor(i2c, DRV8830ADDR_NN); |
8mona | 3:6474ab60854e | 35 | //DigitalOut Relay1(D2); |
8mona | 2:ea066749e515 | 36 | InterruptIn button1(USER_BUTTON); |
8mona | 3:6474ab60854e | 37 | static float motor_speed; |
MikamiUitOpen | 0:132eb47d57fb | 38 | |
8mona | 3:6474ab60854e | 39 | |
MikamiUitOpen | 0:132eb47d57fb | 40 | // Display elapsed time in minutes and seconds |
MikamiUitOpen | 0:132eb47d57fb | 41 | void TimerIsr() |
MikamiUitOpen | 0:132eb47d57fb | 42 | { |
8mona | 3:6474ab60854e | 43 | |
8mona | 3:6474ab60854e | 44 | //For LED Time-Sec display |
MikamiUitOpen | 0:132eb47d57fb | 45 | static int k = 0; |
8mona | 2:ea066749e515 | 46 | static char ctext[4]="---"; |
8mona | 2:ea066749e515 | 47 | div_t d_Cycle = div (k, SWITCH_PERIOD); |
8mona | 2:ea066749e515 | 48 | |
8mona | 2:ea066749e515 | 49 | //for Current time |
8mona | 2:ea066749e515 | 50 | div_t d_sec = div(k,600); //60s * 10n |
8mona | 2:ea066749e515 | 51 | int t_min = d_sec.quot; |
8mona | 2:ea066749e515 | 52 | div_t d_min = div(t_min,60); //1min=60s |
8mona | 2:ea066749e515 | 53 | int t_hr = d_min.quot; |
8mona | 2:ea066749e515 | 54 | |
8mona | 2:ea066749e515 | 55 | //for Current time |
8mona | 2:ea066749e515 | 56 | div_t df_sec = div(TOTAL_TIMES*SWITCH_PERIOD,600); //60s * 10n |
8mona | 2:ea066749e515 | 57 | int tf_min = df_sec.quot; |
8mona | 2:ea066749e515 | 58 | div_t df_min = div(tf_min,60); //1min=60s |
8mona | 2:ea066749e515 | 59 | int tf_hr = df_min.quot; |
8mona | 3:6474ab60854e | 60 | |
8mona | 3:6474ab60854e | 61 | |
8mona | 3:6474ab60854e | 62 | //Motor activation |
8mona | 2:ea066749e515 | 63 | |
8mona | 2:ea066749e515 | 64 | |
8mona | 3:6474ab60854e | 65 | if(d_Cycle.rem ==WAIT_DELAY) |
8mona | 3:6474ab60854e | 66 | { |
8mona | 3:6474ab60854e | 67 | motor_speed=spd_table[sp_index]; |
8mona | 3:6474ab60854e | 68 | strcpy(ctext," CW"); |
8mona | 3:6474ab60854e | 69 | //ctext="CW"; |
8mona | 3:6474ab60854e | 70 | } |
8mona | 3:6474ab60854e | 71 | |
8mona | 3:6474ab60854e | 72 | else if (d_Cycle.rem == (WAIT_DELAY+ON_DURATION) ) |
8mona | 2:ea066749e515 | 73 | { |
8mona | 3:6474ab60854e | 74 | //wait_ms(20); |
8mona | 3:6474ab60854e | 75 | motor_speed=0; |
8mona | 3:6474ab60854e | 76 | strcpy(ctext,"OFF"); |
8mona | 2:ea066749e515 | 77 | } |
8mona | 3:6474ab60854e | 78 | |
8mona | 3:6474ab60854e | 79 | else if (d_Cycle.rem == (2*WAIT_DELAY+ON_DURATION) ) |
8mona | 2:ea066749e515 | 80 | { |
8mona | 3:6474ab60854e | 81 | //wait_ms(20); |
8mona | 3:6474ab60854e | 82 | motor_speed=-spd_table[sp_index]; |
8mona | 3:6474ab60854e | 83 | strcpy(ctext,"CCW"); |
8mona | 3:6474ab60854e | 84 | } |
8mona | 3:6474ab60854e | 85 | |
8mona | 3:6474ab60854e | 86 | else if (d_Cycle.rem == (2*WAIT_DELAY+ON_DURATION*2) ) |
8mona | 3:6474ab60854e | 87 | { |
8mona | 3:6474ab60854e | 88 | //wait_ms(20); |
8mona | 3:6474ab60854e | 89 | motor_speed=0; |
8mona | 2:ea066749e515 | 90 | strcpy(ctext,"OFF"); |
8mona | 2:ea066749e515 | 91 | } |
8mona | 2:ea066749e515 | 92 | |
8mona | 2:ea066749e515 | 93 | |
8mona | 2:ea066749e515 | 94 | if(d_Cycle.quot==TOTAL_TIMES) |
8mona | 2:ea066749e515 | 95 | { |
8mona | 2:ea066749e515 | 96 | timer_.detach(); |
8mona | 2:ea066749e515 | 97 | } |
8mona | 3:6474ab60854e | 98 | |
8mona | 2:ea066749e515 | 99 | |
8mona | 2:ea066749e515 | 100 | |
MikamiUitOpen | 1:d5e9bd9b38ad | 101 | /* |
MikamiUitOpen | 0:132eb47d57fb | 102 | char str[20]; |
8mona | 2:ea066749e515 | 103 | sprintf(str, "%d'%2d\"", msec.quot, msec.rem); |
MikamiUitOpen | 0:132eb47d57fb | 104 | lcd_.WriteStringXY(str, 0, 1); |
MikamiUitOpen | 1:d5e9bd9b38ad | 105 | */ |
8mona | 2:ea066749e515 | 106 | |
8mona | 2:ea066749e515 | 107 | //1 Row |
8mona | 2:ea066749e515 | 108 | //lcd_.WriteStringXY("#",0,0); |
8mona | 3:6474ab60854e | 109 | |
8mona | 2:ea066749e515 | 110 | lcd_.WriteValueXY("%s", ctext, 0,0); |
8mona | 2:ea066749e515 | 111 | lcd_.WriteValue("% 5d/", d_Cycle.quot); |
8mona | 2:ea066749e515 | 112 | lcd_.WriteValue("%0d",TOTAL_TIMES); |
8mona | 3:6474ab60854e | 113 | lcd_.WriteValue("V%0d",sp_index); |
8mona | 3:6474ab60854e | 114 | |
8mona | 2:ea066749e515 | 115 | |
8mona | 2:ea066749e515 | 116 | //2 Row |
8mona | 2:ea066749e515 | 117 | lcd_.WriteValueXY("%03dh", t_hr, 0, 1); |
8mona | 2:ea066749e515 | 118 | lcd_.WriteValue("%02dm", d_min.rem); |
8mona | 2:ea066749e515 | 119 | lcd_.WriteValue("%03ds/", d_sec.rem); |
8mona | 2:ea066749e515 | 120 | lcd_.WriteValue("%03dh", tf_hr); |
8mona | 2:ea066749e515 | 121 | lcd_.WriteValue("%02dm", df_min.rem); |
8mona | 3:6474ab60854e | 122 | |
8mona | 2:ea066749e515 | 123 | |
8mona | 2:ea066749e515 | 124 | k++; |
MikamiUitOpen | 0:132eb47d57fb | 125 | } |
MikamiUitOpen | 0:132eb47d57fb | 126 | |
8mona | 2:ea066749e515 | 127 | |
8mona | 2:ea066749e515 | 128 | |
8mona | 2:ea066749e515 | 129 | void flip() { |
8mona | 2:ea066749e515 | 130 | static bool b = false; |
8mona | 2:ea066749e515 | 131 | |
8mona | 3:6474ab60854e | 132 | |
8mona | 3:6474ab60854e | 133 | |
8mona | 2:ea066749e515 | 134 | if(b==false) |
8mona | 2:ea066749e515 | 135 | { |
8mona | 2:ea066749e515 | 136 | timer_.attach(&TimerIsr, 0.1); |
8mona | 2:ea066749e515 | 137 | } |
8mona | 2:ea066749e515 | 138 | |
8mona | 2:ea066749e515 | 139 | else |
8mona | 2:ea066749e515 | 140 | { |
8mona | 2:ea066749e515 | 141 | timer_.detach(); |
8mona | 3:6474ab60854e | 142 | //Relay1=0; |
8mona | 3:6474ab60854e | 143 | sp_index++; |
8mona | 3:6474ab60854e | 144 | if (sp_index == 3) |
8mona | 3:6474ab60854e | 145 | { |
8mona | 3:6474ab60854e | 146 | sp_index = 0; |
8mona | 3:6474ab60854e | 147 | } |
8mona | 2:ea066749e515 | 148 | } |
8mona | 2:ea066749e515 | 149 | b=!b; |
8mona | 2:ea066749e515 | 150 | |
8mona | 2:ea066749e515 | 151 | } |
8mona | 2:ea066749e515 | 152 | |
8mona | 2:ea066749e515 | 153 | |
MikamiUitOpen | 0:132eb47d57fb | 154 | int main() |
MikamiUitOpen | 0:132eb47d57fb | 155 | { |
8mona | 3:6474ab60854e | 156 | //motor.speed(0); |
8mona | 3:6474ab60854e | 157 | // Check error and reset |
8mona | 3:6474ab60854e | 158 | |
8mona | 2:ea066749e515 | 159 | |
8mona | 3:6474ab60854e | 160 | |
8mona | 2:ea066749e515 | 161 | //LCD_cont=0; |
8mona | 3:6474ab60854e | 162 | //if (lcd_.IsConnected()) printf("\r\nConnected"); |
8mona | 3:6474ab60854e | 163 | //else printf("\r\nDisconnected"); |
MikamiUitOpen | 0:132eb47d57fb | 164 | |
MikamiUitOpen | 0:132eb47d57fb | 165 | TimerIsr(); |
8mona | 2:ea066749e515 | 166 | //timer_.attach(&TimerIsr, 0.1); |
8mona | 2:ea066749e515 | 167 | button1.fall(&flip); |
MikamiUitOpen | 0:132eb47d57fb | 168 | |
8mona | 3:6474ab60854e | 169 | bool status = motor.status(); |
8mona | 3:6474ab60854e | 170 | if (status & DRV8830_F_FAULT){ |
8mona | 3:6474ab60854e | 171 | motor.reset(); |
8mona | 3:6474ab60854e | 172 | } |
8mona | 3:6474ab60854e | 173 | |
8mona | 3:6474ab60854e | 174 | while (true) { |
8mona | 3:6474ab60854e | 175 | motor.speed(motor_speed); |
8mona | 3:6474ab60854e | 176 | } |
MikamiUitOpen | 0:132eb47d57fb | 177 | } |
MikamiUitOpen | 0:132eb47d57fb | 178 |