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@8:f7ad1d7176ba, 2017-09-30 (annotated)
- Committer:
- 8mona
- Date:
- Sat Sep 30 16:43:51 2017 +0000
- Revision:
- 8:f7ad1d7176ba
- Parent:
- 7:acb1074eaba6
- Child:
- 9:b58e7d72a91c
Activate IQS62X and motor and IO Switch
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 | 5:2b9614aa1171 | 9 | #include "IQS62x.h" |
8mona | 5:2b9614aa1171 | 10 | #include "IQSdisplayTerminal.h" |
8mona | 8:f7ad1d7176ba | 11 | #include "MotorMove.h" |
8mona | 3:6474ab60854e | 12 | |
8mona | 2:ea066749e515 | 13 | //Cycle |
8mona | 5:2b9614aa1171 | 14 | #define UP_DURATION 14 //On time [*100ms] |
8mona | 5:2b9614aa1171 | 15 | #define WAIT_DELAY 10 //Delay time [*100ms] |
8mona | 5:2b9614aa1171 | 16 | #define DOWN_DURATION 8 //Down time [*50ms] |
8mona | 5:2b9614aa1171 | 17 | #define SWITCH_PERIOD 50 //Cycle time[*50ms] |
8mona | 5:2b9614aa1171 | 18 | #define TOTAL_TIMES 30000 //total times n |
8mona | 8:f7ad1d7176ba | 19 | #define TIMER_COUNT 0.01 |
8mona | 8:f7ad1d7176ba | 20 | #define LOOP_WAITMS 30 |
8mona | 3:6474ab60854e | 21 | |
8mona | 8:f7ad1d7176ba | 22 | #define UP_THRESHOLD 10 |
8mona | 8:f7ad1d7176ba | 23 | #define DOWN_THRESHOLD 90 |
8mona | 3:6474ab60854e | 24 | |
8mona | 5:2b9614aa1171 | 25 | |
8mona | 8:f7ad1d7176ba | 26 | Ticker timer_; |
8mona | 2:ea066749e515 | 27 | |
MikamiUitOpen | 0:132eb47d57fb | 28 | using namespace Mikami; |
MikamiUitOpen | 0:132eb47d57fb | 29 | Acm1602Ni lcd_; // Default, OK |
MikamiUitOpen | 0:132eb47d57fb | 30 | //Acm1602Ni lcd_(D14, D15); // OK |
MikamiUitOpen | 0:132eb47d57fb | 31 | //Acm1602Ni lcd_(D14, D15, 200000); // OK |
MikamiUitOpen | 0:132eb47d57fb | 32 | //Acm1602Ni lcd_(D14, D15, 200000, true, true); // OK |
MikamiUitOpen | 0:132eb47d57fb | 33 | //Acm1602Ni lcd_(PB_3, PB_10); // OK |
MikamiUitOpen | 0:132eb47d57fb | 34 | //Acm1602Ni lcd_(PC_9, PA_8); // OK |
MikamiUitOpen | 0:132eb47d57fb | 35 | //Acm1602Ni lcd_(PB_4, PA_8); // OK |
MikamiUitOpen | 0:132eb47d57fb | 36 | |
8mona | 3:6474ab60854e | 37 | I2C i2c(D14, D15); |
8mona | 8:f7ad1d7176ba | 38 | DRV8830 motorL(i2c, DRV8830ADDR_NN); //Motor1 |
8mona | 8:f7ad1d7176ba | 39 | DRV8830 motorR(i2c, DRV8830ADDR_0N); //Motor2 |
8mona | 8:f7ad1d7176ba | 40 | MotorMove mvalL; |
8mona | 8:f7ad1d7176ba | 41 | MotorMove mvalR; |
8mona | 8:f7ad1d7176ba | 42 | |
8mona | 8:f7ad1d7176ba | 43 | IQS62xIO iqs62x; // class for basic IQS62x block read and write |
8mona | 2:ea066749e515 | 44 | InterruptIn button1(USER_BUTTON); |
8mona | 8:f7ad1d7176ba | 45 | |
8mona | 8:f7ad1d7176ba | 46 | |
8mona | 8:f7ad1d7176ba | 47 | DigitalIn in_switchs[]= |
8mona | 8:f7ad1d7176ba | 48 | { DigitalIn(A0), DigitalIn(A1), DigitalIn(A2), DigitalIn(A3)}; |
8mona | 8:f7ad1d7176ba | 49 | |
8mona | 8:f7ad1d7176ba | 50 | |
8mona | 8:f7ad1d7176ba | 51 | static int shaft_deg=0; |
8mona | 8:f7ad1d7176ba | 52 | static int shaft_speed=0; |
8mona | 8:f7ad1d7176ba | 53 | static int g_timer=0; //gloabl timer |
8mona | 8:f7ad1d7176ba | 54 | static int cnt; //total timer of loop |
8mona | 8:f7ad1d7176ba | 55 | static int sw_in[4]={0,0,0,0}; //swithc flag bit |
8mona | 8:f7ad1d7176ba | 56 | static int sp_index=0; //Movement mode 0-3 |
8mona | 8:f7ad1d7176ba | 57 | |
8mona | 8:f7ad1d7176ba | 58 | static int initial_deg=0; |
8mona | 8:f7ad1d7176ba | 59 | |
8mona | 8:f7ad1d7176ba | 60 | |
8mona | 8:f7ad1d7176ba | 61 | void ShowLCD(char * buffer, int startbyte, int endbyte); // for wheel output |
8mona | 8:f7ad1d7176ba | 62 | int ReadDegree(char * buffer); |
8mona | 8:f7ad1d7176ba | 63 | int ReadSpeed(char * buffer); |
8mona | 8:f7ad1d7176ba | 64 | void Displaylevel (int deg); |
8mona | 8:f7ad1d7176ba | 65 | void TimerIsr(); |
8mona | 8:f7ad1d7176ba | 66 | void flip(); |
8mona | 8:f7ad1d7176ba | 67 | int MainIOloop(); |
8mona | 8:f7ad1d7176ba | 68 | void DisplayStatus(); |
8mona | 8:f7ad1d7176ba | 69 | void MoveMotor(); |
8mona | 8:f7ad1d7176ba | 70 | |
8mona | 8:f7ad1d7176ba | 71 | int main() |
8mona | 8:f7ad1d7176ba | 72 | { |
8mona | 8:f7ad1d7176ba | 73 | //initialize system |
8mona | 8:f7ad1d7176ba | 74 | static int time_prev; |
8mona | 8:f7ad1d7176ba | 75 | for (int i=0;i<4;i=i++){ |
8mona | 8:f7ad1d7176ba | 76 | in_switchs[i].mode(PullUp); |
8mona | 8:f7ad1d7176ba | 77 | } |
8mona | 8:f7ad1d7176ba | 78 | |
8mona | 8:f7ad1d7176ba | 79 | //motor.speed(0); |
8mona | 8:f7ad1d7176ba | 80 | //Initialize Ic2 Device |
8mona | 8:f7ad1d7176ba | 81 | motorL.speed(0); |
8mona | 8:f7ad1d7176ba | 82 | motorR.speed(0); |
8mona | 8:f7ad1d7176ba | 83 | |
8mona | 8:f7ad1d7176ba | 84 | lcd_.WriteStringXY("IQS_Init_Start",0,0); |
8mona | 8:f7ad1d7176ba | 85 | iqs62x.configure(); // configure |
8mona | 8:f7ad1d7176ba | 86 | wait(1); |
8mona | 8:f7ad1d7176ba | 87 | iqs62x.readIqsRegisters(0,NUMBER_OF_REGISTERS); // read all the registers |
8mona | 8:f7ad1d7176ba | 88 | initial_deg = ReadDegree(iqs62x.registers); |
8mona | 8:f7ad1d7176ba | 89 | |
8mona | 8:f7ad1d7176ba | 90 | |
8mona | 8:f7ad1d7176ba | 91 | lcd_.WriteStringXY("IQS_Init_done",0,0); |
8mona | 8:f7ad1d7176ba | 92 | wait(1); |
8mona | 8:f7ad1d7176ba | 93 | |
8mona | 8:f7ad1d7176ba | 94 | //read 0deg for initialize |
8mona | 8:f7ad1d7176ba | 95 | button1.fall(&flip); |
8mona | 8:f7ad1d7176ba | 96 | |
8mona | 8:f7ad1d7176ba | 97 | //TimerIsr(); |
8mona | 8:f7ad1d7176ba | 98 | //timer_.attach(&TimerIsr, TIMER_COUNT); |
8mona | 8:f7ad1d7176ba | 99 | // bool status = motor.status(); |
8mona | 8:f7ad1d7176ba | 100 | // if (status & DRV8830_F_FAULT){ |
8mona | 8:f7ad1d7176ba | 101 | // motor.reset(); |
8mona | 8:f7ad1d7176ba | 102 | // } |
8mona | 8:f7ad1d7176ba | 103 | |
8mona | 8:f7ad1d7176ba | 104 | //Read here as Asynchronous when data gets ready |
8mona | 8:f7ad1d7176ba | 105 | while (true) { |
8mona | 8:f7ad1d7176ba | 106 | int time_current = g_timer; |
8mona | 8:f7ad1d7176ba | 107 | int time_diff = time_current - time_prev; |
8mona | 8:f7ad1d7176ba | 108 | int a= MainIOloop(); |
8mona | 8:f7ad1d7176ba | 109 | DisplayStatus(); |
8mona | 8:f7ad1d7176ba | 110 | //display_info |
8mona | 8:f7ad1d7176ba | 111 | time_prev = time_current; |
8mona | 8:f7ad1d7176ba | 112 | //motorR.speed( (shaft_deg-180.0)/200.0 ); |
8mona | 8:f7ad1d7176ba | 113 | wait_ms(LOOP_WAITMS); |
8mona | 8:f7ad1d7176ba | 114 | MoveMotor(); |
8mona | 8:f7ad1d7176ba | 115 | |
8mona | 8:f7ad1d7176ba | 116 | cnt ++; |
8mona | 8:f7ad1d7176ba | 117 | } |
8mona | 8:f7ad1d7176ba | 118 | |
8mona | 8:f7ad1d7176ba | 119 | |
8mona | 8:f7ad1d7176ba | 120 | } |
8mona | 8:f7ad1d7176ba | 121 | |
8mona | 8:f7ad1d7176ba | 122 | void MoveMotor(){ |
8mona | 8:f7ad1d7176ba | 123 | static int bflag_up_pre=0; |
8mona | 8:f7ad1d7176ba | 124 | static int bflag_down_pre=0; |
8mona | 8:f7ad1d7176ba | 125 | int bflag_up_cur =0; |
8mona | 8:f7ad1d7176ba | 126 | int bflag_down_cur =0; |
8mona | 8:f7ad1d7176ba | 127 | float lspeed; |
8mona | 8:f7ad1d7176ba | 128 | float rspeed; |
8mona | 8:f7ad1d7176ba | 129 | |
MikamiUitOpen | 0:132eb47d57fb | 130 | |
8mona | 8:f7ad1d7176ba | 131 | //detect up or donw by thredold |
8mona | 8:f7ad1d7176ba | 132 | if (shaft_deg>UP_THRESHOLD) |
8mona | 8:f7ad1d7176ba | 133 | { |
8mona | 8:f7ad1d7176ba | 134 | bflag_up_cur=1; |
8mona | 8:f7ad1d7176ba | 135 | } |
8mona | 8:f7ad1d7176ba | 136 | else |
8mona | 8:f7ad1d7176ba | 137 | { |
8mona | 8:f7ad1d7176ba | 138 | bflag_up_cur=0; |
8mona | 8:f7ad1d7176ba | 139 | }; |
8mona | 8:f7ad1d7176ba | 140 | |
8mona | 8:f7ad1d7176ba | 141 | if (shaft_deg<DOWN_THRESHOLD) |
8mona | 8:f7ad1d7176ba | 142 | { |
8mona | 8:f7ad1d7176ba | 143 | bflag_down_cur=1; |
8mona | 8:f7ad1d7176ba | 144 | } |
8mona | 8:f7ad1d7176ba | 145 | else |
8mona | 8:f7ad1d7176ba | 146 | { |
8mona | 8:f7ad1d7176ba | 147 | bflag_down_cur=0; |
8mona | 8:f7ad1d7176ba | 148 | }; |
8mona | 8:f7ad1d7176ba | 149 | |
8mona | 8:f7ad1d7176ba | 150 | |
8mona | 8:f7ad1d7176ba | 151 | //send down or up command when status had changed |
8mona | 8:f7ad1d7176ba | 152 | if(bflag_up_pre==0&& bflag_up_cur==1) |
8mona | 8:f7ad1d7176ba | 153 | { |
8mona | 8:f7ad1d7176ba | 154 | //shaft_speed |
8mona | 8:f7ad1d7176ba | 155 | mvalL.up_motor_set(cnt, 1.0); |
8mona | 8:f7ad1d7176ba | 156 | mvalR.up_motor_set(cnt, 1.0); |
8mona | 8:f7ad1d7176ba | 157 | lcd_.WriteStringXY("U",0,1); |
8mona | 8:f7ad1d7176ba | 158 | } |
8mona | 8:f7ad1d7176ba | 159 | else if(bflag_down_pre==0 && bflag_down_cur==1) |
8mona | 8:f7ad1d7176ba | 160 | { |
8mona | 8:f7ad1d7176ba | 161 | mvalL.down_motor_set(cnt, 1.0); |
8mona | 8:f7ad1d7176ba | 162 | mvalR.down_motor_set(cnt, 1.0); |
8mona | 8:f7ad1d7176ba | 163 | lcd_.WriteStringXY("D",1,1); |
8mona | 8:f7ad1d7176ba | 164 | } |
8mona | 8:f7ad1d7176ba | 165 | |
8mona | 8:f7ad1d7176ba | 166 | else{ |
8mona | 8:f7ad1d7176ba | 167 | lcd_.WriteStringXY("__",0,1); |
8mona | 8:f7ad1d7176ba | 168 | } |
8mona | 8:f7ad1d7176ba | 169 | |
8mona | 8:f7ad1d7176ba | 170 | |
8mona | 8:f7ad1d7176ba | 171 | lspeed=mvalL.ReturnMotorVol(cnt, sw_in[0],sw_in[1]); |
8mona | 8:f7ad1d7176ba | 172 | rspeed=mvalR.ReturnMotorVol(cnt, sw_in[2],sw_in[3]); |
8mona | 8:f7ad1d7176ba | 173 | |
8mona | 8:f7ad1d7176ba | 174 | motorL.speed(lspeed); |
8mona | 8:f7ad1d7176ba | 175 | motorR.speed(rspeed); |
8mona | 8:f7ad1d7176ba | 176 | |
8mona | 8:f7ad1d7176ba | 177 | lcd_.WriteValueXY("%1.2f",lspeed,3,1); |
8mona | 8:f7ad1d7176ba | 178 | lcd_.WriteValueXY("%1.2f",rspeed,8,1); |
8mona | 8:f7ad1d7176ba | 179 | |
8mona | 8:f7ad1d7176ba | 180 | |
8mona | 8:f7ad1d7176ba | 181 | bflag_up_pre = bflag_up_cur; |
8mona | 8:f7ad1d7176ba | 182 | bflag_down_pre = bflag_down_cur; |
8mona | 8:f7ad1d7176ba | 183 | } |
8mona | 8:f7ad1d7176ba | 184 | |
8mona | 8:f7ad1d7176ba | 185 | |
8mona | 5:2b9614aa1171 | 186 | |
8mona | 8:f7ad1d7176ba | 187 | void DisplayStatus() |
8mona | 8:f7ad1d7176ba | 188 | { |
8mona | 8:f7ad1d7176ba | 189 | lcd_.WriteValueXY("T%3d ",shaft_deg, 0,0); |
8mona | 8:f7ad1d7176ba | 190 | lcd_.WriteValue("V%2d",shaft_speed); |
8mona | 8:f7ad1d7176ba | 191 | |
8mona | 8:f7ad1d7176ba | 192 | lcd_.WriteStringXY("F",9,0); |
8mona | 8:f7ad1d7176ba | 193 | for (int i=0;i<4;i++){ |
8mona | 8:f7ad1d7176ba | 194 | lcd_.WriteValue("%d",sw_in[i]); |
8mona | 8:f7ad1d7176ba | 195 | } |
8mona | 8:f7ad1d7176ba | 196 | } |
8mona | 8:f7ad1d7176ba | 197 | |
8mona | 8:f7ad1d7176ba | 198 | int MainIOloop() |
8mona | 8:f7ad1d7176ba | 199 | { |
8mona | 8:f7ad1d7176ba | 200 | static int cnt=0; |
8mona | 8:f7ad1d7176ba | 201 | //iqs62x.waitForIqsReady(); |
8mona | 8:f7ad1d7176ba | 202 | iqs62x.readIqsRegisters(0,NUMBER_OF_REGISTERS); // read all the registers |
8mona | 8:f7ad1d7176ba | 203 | shaft_deg = ReadDegree(iqs62x.registers)-initial_deg; |
8mona | 8:f7ad1d7176ba | 204 | if(shaft_deg<0) |
8mona | 8:f7ad1d7176ba | 205 | { |
8mona | 8:f7ad1d7176ba | 206 | shaft_deg = shaft_deg+360; |
8mona | 8:f7ad1d7176ba | 207 | } |
8mona | 8:f7ad1d7176ba | 208 | |
8mona | 8:f7ad1d7176ba | 209 | shaft_speed= ReadSpeed(iqs62x.registers); |
8mona | 8:f7ad1d7176ba | 210 | //lcd_.WriteValueXY("%3d ",k, 0,0); |
8mona | 8:f7ad1d7176ba | 211 | |
8mona | 8:f7ad1d7176ba | 212 | for (int i=0;i<4;i=i++){ |
8mona | 8:f7ad1d7176ba | 213 | sw_in[i]=!in_switchs[i]; |
8mona | 8:f7ad1d7176ba | 214 | //sw_in[i+1]=!in_switchs[i+1]; |
8mona | 8:f7ad1d7176ba | 215 | } |
8mona | 8:f7ad1d7176ba | 216 | cnt++; |
8mona | 8:f7ad1d7176ba | 217 | return cnt; |
8mona | 8:f7ad1d7176ba | 218 | } |
8mona | 8:f7ad1d7176ba | 219 | |
8mona | 8:f7ad1d7176ba | 220 | |
8mona | 8:f7ad1d7176ba | 221 | void TimerIsr() |
8mona | 8:f7ad1d7176ba | 222 | { |
8mona | 8:f7ad1d7176ba | 223 | //For LED Time-Sec display |
8mona | 8:f7ad1d7176ba | 224 | //wait_ms(5); |
8mona | 8:f7ad1d7176ba | 225 | g_timer++; |
8mona | 8:f7ad1d7176ba | 226 | //Displaylevel(val); |
8mona | 8:f7ad1d7176ba | 227 | } |
8mona | 8:f7ad1d7176ba | 228 | |
8mona | 8:f7ad1d7176ba | 229 | |
8mona | 8:f7ad1d7176ba | 230 | |
8mona | 8:f7ad1d7176ba | 231 | |
8mona | 8:f7ad1d7176ba | 232 | void flip() { |
8mona | 8:f7ad1d7176ba | 233 | static bool b = false; |
8mona | 8:f7ad1d7176ba | 234 | |
8mona | 8:f7ad1d7176ba | 235 | if(b==false) |
8mona | 8:f7ad1d7176ba | 236 | { |
8mona | 8:f7ad1d7176ba | 237 | timer_.attach(&TimerIsr, TIMER_COUNT); |
8mona | 8:f7ad1d7176ba | 238 | } |
8mona | 8:f7ad1d7176ba | 239 | |
8mona | 8:f7ad1d7176ba | 240 | else |
8mona | 8:f7ad1d7176ba | 241 | { |
8mona | 8:f7ad1d7176ba | 242 | timer_.detach(); |
8mona | 8:f7ad1d7176ba | 243 | //Relay1=0; |
8mona | 8:f7ad1d7176ba | 244 | sp_index++; |
8mona | 8:f7ad1d7176ba | 245 | if (sp_index == 3) |
8mona | 8:f7ad1d7176ba | 246 | { |
8mona | 8:f7ad1d7176ba | 247 | sp_index = 0; |
8mona | 8:f7ad1d7176ba | 248 | } |
8mona | 8:f7ad1d7176ba | 249 | } |
8mona | 8:f7ad1d7176ba | 250 | b=!b; |
8mona | 8:f7ad1d7176ba | 251 | |
8mona | 8:f7ad1d7176ba | 252 | } |
8mona | 5:2b9614aa1171 | 253 | |
8mona | 7:acb1074eaba6 | 254 | int ReadDegree(char * buffer) |
8mona | 5:2b9614aa1171 | 255 | { |
8mona | 7:acb1074eaba6 | 256 | int ret=0; |
8mona | 7:acb1074eaba6 | 257 | //(High bit + Low bit) * 360/65536 |
8mona | 7:acb1074eaba6 | 258 | //ret = ((buffer[0x80]<<8 + buffer[0x81])*0.00549316406 ; |
8mona | 7:acb1074eaba6 | 259 | ret = (buffer[0x80]<<8 +buffer[0x81])/65536.0*360.0 ; |
8mona | 7:acb1074eaba6 | 260 | return ret; |
8mona | 5:2b9614aa1171 | 261 | } |
8mona | 5:2b9614aa1171 | 262 | |
8mona | 8:f7ad1d7176ba | 263 | |
8mona | 7:acb1074eaba6 | 264 | int ReadSpeed(char * buffer) |
8mona | 7:acb1074eaba6 | 265 | { |
8mona | 7:acb1074eaba6 | 266 | int ret=0; |
8mona | 7:acb1074eaba6 | 267 | ret = (buffer[0x8E]); |
8mona | 7:acb1074eaba6 | 268 | return ret; |
8mona | 7:acb1074eaba6 | 269 | } |
8mona | 7:acb1074eaba6 | 270 | |
8mona | 7:acb1074eaba6 | 271 | void Displaylevel (int deg) |
8mona | 7:acb1074eaba6 | 272 | { |
8mona | 7:acb1074eaba6 | 273 | |
8mona | 7:acb1074eaba6 | 274 | int level=deg>>5; |
8mona | 7:acb1074eaba6 | 275 | lcd_.WriteStringXY("@",0,0); |
8mona | 7:acb1074eaba6 | 276 | for (int i=0;i<12;i++) |
8mona | 7:acb1074eaba6 | 277 | { |
8mona | 7:acb1074eaba6 | 278 | if (i<level) |
8mona | 7:acb1074eaba6 | 279 | { |
8mona | 7:acb1074eaba6 | 280 | lcd_.WriteString("-"); |
8mona | 7:acb1074eaba6 | 281 | } |
8mona | 7:acb1074eaba6 | 282 | else |
8mona | 7:acb1074eaba6 | 283 | { |
8mona | 7:acb1074eaba6 | 284 | lcd_.WriteString(" "); |
8mona | 7:acb1074eaba6 | 285 | } |
8mona | 8:f7ad1d7176ba | 286 | } |
MikamiUitOpen | 0:132eb47d57fb | 287 | } |
MikamiUitOpen | 0:132eb47d57fb | 288 | |
8mona | 2:ea066749e515 | 289 | |
8mona | 2:ea066749e515 | 290 |