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:
Mon Oct 02 19:50:39 2017 +0000
Revision:
11:80b6c5d77073
Parent:
10:ef379cbc0004
Child:
12:8464be95bf76
Change parameter

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