圓創力科技.MakeBlock TW

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

掃一掃,訪問微社區

查看: 364|回復: 0

mBot Ranger 高速循線範例_

  [複製鏈接]
magiccar 發表於 2018-2-13 01:51 | 顯示全部樓層 |閱讀模式
Demo Video
1 ~: c( Z4 j4 ]( b
  1. #include <Arduino.h>; \& W: }( W( n& q4 A
  2. #include <MeAuriga.h>/ O# F! J3 V  k; ^3 y, S+ [
  3. #include "MeLineFollowerArray.h"
    # ^/ Z$ ^3 y+ l# R2 ]6 q+ F) i
  4. 2 [( M0 f) Y/ Y, p
  5. MeEncoderOnBoard Encoder_1(SLOT1);
    ( g0 W/ s5 x9 Y5 R
  6. MeEncoderOnBoard Encoder_2(SLOT2);
    * d! ~" \8 V+ F" u1 R4 K6 J6 w: m
  7. MeLightSensor lightsensor_1(12);/ N: n7 l0 l; p8 ]# U2 P
  8. MeLightSensor lightsensor_2(11);( w4 X; `4 _3 J1 p
  9. MeBuzzer buzzer;/ o- n- S  I3 ?
  10. MeLineFollowerArray linefollower(PORT_6);8 g) Q9 @! N# Y* x( w8 P

  11. : R# M4 c, A- d+ @: b. _
  12. #define Error1 19 K' P8 w! p5 E) u+ f( s# E7 D
  13. #define Error2 2
    2 f' b: w# j" ~  N  V, b6 m% G
  14. #define Error3 3
    : \" s8 W3 |7 D# Q  }, y
  15. & H- F. N$ U- _
  16. #define Kp 152 }! Y, s9 V+ h2 f1 X6 I
  17. #define Ki 0.15
    , Z' P; J+ s* \
  18. #define Kd 0.038 o$ f' ]' Q( u( n5 W5 o8 `& ?. I
  19. 1 d/ |' }2 L0 `' i4 c! q+ A
  20. uint8_t sData;
    5 I1 O: k7 L# R8 }5 j( x- g
  21. uint8_t D1;
      Y' @  i7 t* v9 c+ M+ I, s
  22. uint8_t D2;& w" A, O1 v# K( v( W; F
  23. uint8_t D3;! q5 r, _8 v. c
  24. uint8_t D4;
    ( \$ Z$ ]* A- N9 E0 i# a: q/ C
  25. uint8_t D5;
    4 g4 c, W2 b2 s: _* Y2 V1 E
  26. uint8_t D6;
    . S. N! Y& s9 p! Z  p5 Q
  27. 3 [8 \' L/ V  j2 u- {0 B7 M1 b% S
  28. float previous_error = 0;% a" V" V8 ^/ T, \3 I
  29. float integral = 0;* f. [( f# b! A) \
  30. float derivative = 0;$ i  m2 C" g3 N2 }
  31. int  Speed  = 160;& P+ V4 W$ u8 \! U" ]0 o
  32. float output;3 C, }: g+ H2 _! z/ [

  33. / \, f# I8 ^8 W, |
  34. byte Left;
    0 v/ w! B& m6 M

  35. ! v7 _) |% @% \0 M' B- G; Y
  36. void setup()
    ( f9 w: D0 H- g2 L" L7 \: `
  37. {  `, N4 B) D0 ^
  38. //Set PWM 8KHz
    & i, q# u$ ^2 S
  39.   TCCR1A = _BV(WGM10);
    ; [$ L# U7 `4 _( e* m) T! k
  40.   TCCR1B = _BV(CS11) | _BV(WGM12);, Z2 w! g* X4 f0 A. q! U
  41.   TCCR2A = _BV(WGM21) | _BV(WGM20);
    8 A4 v/ K) n2 Y+ @1 k- [
  42.   TCCR2B = _BV(CS21);  J) b! s1 h% o: l) M3 V8 X# G
  43.   Serial.begin(9600);
    % p' ^$ T7 ], d/ u
  44.   buzzer.setpin(45);
    7 L) l- m9 D: a
  45. }' b: j2 y5 s$ c( @

  46. $ P- [7 I. i) M3 t4 q
  47. void loop()% S" \" s  A1 l7 E- O) ]" C1 B2 w
  48. {
    + r3 T$ R9 W7 z3 c& \0 W
  49.   while(!((lightsensor_1.read()) < (10)));
    2 z# U6 s- P, ^0 i1 Q- v
  50.   buzzer.tone(1047, 500);
    1 ?/ f! {( ~9 G, |9 `
  51.   delay(500);; [- p% n8 r# T' G' Q5 Y+ T
  52.   do
      |7 Q/ j8 d% H' ]
  53.   {7 T0 P0 W+ l' \6 B. F/ q6 q
  54.    int Err = getErr();% s9 D! ?2 B1 n% \. h% s1 c
  55.    if(D1 == 1)8 j) n/ z) l" C7 _; d& t$ S
  56.    {
    & q, k" @2 r, i$ F  O& Y
  57.      Left = 1;
    ) X+ w8 [5 M; s: x& L
  58.    }6 g- ~' V, V7 r; @' t3 t  z
  59.    if(D6 == 1)
    9 T. O" n" A, b3 N5 o* a9 R) R
  60.    {+ u( i* O. t) Q& E1 ^' m% `
  61.      Left = 0;- c; S" }( s8 a. [6 p, @: k  j+ v
  62.    }6 Q' c9 X! S" Z" ]1 M- p3 M: j
  63.    if(Err == 99)
    6 J! S: U' R; ~2 P. Q
  64.    {
    ! t* M! s0 H! p6 T: P
  65.      if(Left == 1); I; w' w  M6 u2 B2 N2 R3 k$ Q
  66.      {- \% K5 M5 a7 `/ S( l! K; k. A, L
  67.        Speed -= 5;, R! ]2 E- A+ `2 @. ?, z" ]8 Y
  68.        moto(0,Speed);! S3 F  L2 L, c
  69.        do
    ( d- S7 g# |$ k3 n9 W1 x
  70.        {
    # F! ~3 F& u! H) \) L
  71.          Err = getErr();) E+ L; f5 }8 i+ Q7 [5 J! `
  72.        }while((D1+D6) == 0);  D* J, \1 {- y" J6 f+ B
  73.      }
    ! f) d7 V( X4 e6 o6 a2 w+ ?
  74.      else
    , \2 E, L( O& ?2 ?: i
  75.      {
    8 d, L/ j/ V" j$ O! c5 i
  76.        Speed -= 5;
    8 j% Z5 }9 f, ]" B& r/ M8 d
  77.        moto(Speed,0);
    * C) K  `* K: k0 P
  78.        do; T0 ~; r/ @3 c9 a
  79.        {  g" r" e% t, x9 d9 X3 ?
  80.          Err = getErr();
    0 D9 g: D+ i8 f: r
  81.        }while((D1+D6) == 0);
    9 E+ J7 s  ^+ b$ s, m
  82.      }9 v9 }6 j( B" f- P
  83.    }
    7 I8 |6 c. @/ @- q
  84.    else# Y+ K2 ^; g# c0 a7 O' c
  85.    {
    # {: t* |1 e$ z" y1 a1 G
  86.      if((Speed < 160) & (Err < 2)) Speed+=1; + p  O2 I# t7 M' u. k) e8 w& U" ?
  87.      if((Speed > 100) & (Err > 2)) Speed-=2;
    ) [5 p3 D' v$ Y; f4 W# d$ ^
  88.      integral = integral + Err;
    5 r8 O5 `0 K% ~6 L
  89.      derivative = Err - previous_error;
    ! w7 K' H& h/ f2 F0 Z
  90.      output = Kp*Err + Ki*integral + Kd*derivative;
    $ E/ C% Z* C6 ^0 z1 \
  91.      moto(int(Speed-output),int(Speed+output));9 ?( ^" X( \: Z9 u4 f4 z
  92.      previous_error = Err;( N: t% h4 @: j, p4 @& f
  93.    }/ [5 ^2 M8 i+ \: I8 K9 a
  94.   }while(!((lightsensor_2.read()) < (10)));: i+ q+ x0 w/ a" D% `/ t
  95.   moto(0,0);. m( h( S+ ~7 C7 G8 J/ X) z
  96.   delay(500);
    3 N! P" O9 a! T' U2 s/ x
  97.   buzzer.tone(262, 500);: P& H. f+ w* ^9 f5 o1 p. P; Z
  98. }3 v( `6 ^4 L, C+ r. ^1 f

  99. ) T* R2 f/ q/ B, ?4 Y
  100. int getErr()  r. N+ i, A" A6 m7 D
  101. {  - ^9 @) @' Q- P! Q" V9 W0 W
  102.    sData = linefollower.getValue();7 X; ^. Z: g& x7 a' K" ]
  103.    D1 = ~(sData>>0)&1;0 h" ~% |% x/ d5 N3 I- c7 ]
  104.    D2 = ~(sData>>1)&1;
    5 _7 K, x$ V( h5 C3 [5 p6 o) [$ f
  105.    D3 = ~(sData>>2)&1;- c& L+ ]$ p0 f( f( _0 c' ^+ {
  106.    D4 = ~(sData>>3)&1;7 }! G4 G- c2 I3 C( t7 ]9 M
  107.    D5 = ~(sData>>4)&1;
    ' S1 a9 m* s2 O
  108.    D6 = ~(sData>>5)&1;
    6 O! v  N  f) ^1 K
  109.    int downD = D1+D2+D3+D4+D5+D6;
    - F; @1 j! b" N4 T4 [
  110.    int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);/ J" h0 {8 {7 U: {' @; c8 L
  111.    if(downD == 0)
    , w, I- }9 C' K
  112.    {
    ( t4 `% F: M" [; L! L' L) a
  113.      return 99;
    $ r7 x! \. `- s) y3 H( b, i
  114.    }
    % e3 P  e& Z  s1 Q* V/ p) y9 A
  115.    else2 `9 f% F* M( p* k0 V
  116.    {
    5 C! H- ^% E$ |
  117.     return upD/downD;
    8 w  R& z+ O0 M: a# w- m, `  a8 {
  118.    }6 v6 s) B7 [6 ^8 M
  119. }5 H5 v; v* \* ~

  120. ' i8 P, ~- Q9 X0 E% I
  121. void moto(int Speed_L,int Speed_R)1 r; ^3 w- r) ~5 x9 w
  122. {
    ! n: ^) M! z4 C6 L, I5 ]
  123.   Encoder_2.setMotorPwm(Speed_L);
    3 r5 {. Z" x  d3 q4 Q$ @4 u( Z
  124.   Encoder_1.setMotorPwm(-Speed_R);
    2 z1 e  P5 t: n! d+ q! k
  125. }
複製代碼
9 R" T$ _& q- J' d
MeLineFollowerArray.cpp( e# |2 G6 A) n4 [- S0 {$ O
  1. #include "MeLineFollowerArray.h"
    . C/ F- D. y* W9 t" e& l4 I

  2. . k+ j3 C# ~! O) @' n+ u$ p" o% a6 E
  3. #ifdef ME_PORT_DEFINED
    & {0 n! h# I' a8 X! [
  4. MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
    ' Q6 b5 a. d8 u0 [2 J/ Z  @
  5. {
    7 ?: J- O7 t$ B$ i

  6. 3 p8 F/ A0 f; @5 c- w
  7. }# ^" G3 ^; {; ^: U
  8. MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)1 g# R. x; i" }9 s9 I
  9. {0 c9 l7 s2 y! g( ~
  10.     _DataPin = mePort[port].s2;
    + t2 d( `; o2 U7 y$ _
  11.     pinMode(_DataPin, OUTPUT);
    . f0 ?7 v( [9 f
  12.     digitalWrite(_DataPin, HIGH);
    4 j- v2 P- a+ @2 M2 g1 r& z
  13. }& G2 V: i2 D9 |" ^5 }% x
  14. #else // ME_PORT_DEFINED, x; {: b. a8 M# U: W
  15. MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)
    / @& O* m9 V: _, y
  16. {& [; s/ K4 B" t2 b3 R! k. u
  17.     _DataPin = pin;
    9 }7 e* A, s' d" R) _; V% u
  18.     pinMode(_DataPin, OUTPUT);
    ; g/ B0 N0 v1 V
  19.     digitalWrite(_DataPin, HIGH);
      f/ S' V$ ^/ c) ?
  20. }
    0 M- h) p1 T' Q* {7 P
  21. #endif // ME_PORT_DEFINED" H) e) {: A1 s! U
  22. - I( a/ F& C, g6 Y9 ?

  23. * O& O# b9 N. N$ h5 H( Y
  24. void MeLineFollowerArray::setpin(uint8_t pin)
    3 M& R" _0 D& {( ^
  25. {$ |& f2 E* y7 e& E4 I
  26.     _DataPin = pin;
    " l9 `: p1 i( P9 a) j) E
  27.     pinMode(_DataPin, OUTPUT); % X  g- z+ I5 m
  28.     digitalWrite(_DataPin, HIGH);8 Y" }. f; m  ?

  29. & [3 y- @" n( g4 R0 v
  30.     #ifdef ME_PORT_DEFINED
    6 G. B* ?1 C0 _1 U( Z6 z
  31.     s2 = pin;" o0 t4 }: w! C
  32.     #endif4 m* r; v2 Y6 |; j8 C  N4 \
  33. }
    % z  I) O7 D; _/ H" x  x7 G" n
  34. 5 O4 E7 t+ `, z4 _: ~  G$ [& f8 M# t
  35. uint8_t MeLineFollowerArray::getValue()
    1 {; K" z( w0 m; B) ^: h
  36. {
    3 s& i; E( W: S% i
  37.     uint32_t LOW_level_read_time;
    ( D9 Q& f! P' I$ Z) G
  38.     uint32_t HIGH_level_read_time;
    2 M& X5 U3 Q$ ~* }% Y! m# }
  39.     uint32_t time_out_flag;
    $ Y0 g0 o, W; s" V6 t4 R0 V
  40.     uint8_t Sensor_Data[3];' I+ ]# h- z% I+ A: z1 L; S
  41.     static uint8_t old_data = 0xff;
    2 ]( n' h7 u6 x
  42. ; v5 c# w4 R) t# v$ q
  43.     pinMode(_DataPin, OUTPUT);
    , B, U* H% I( P
  44.     digitalWrite(_DataPin, LOW);
    & U" Y/ j/ t3 {7 l
  45.     delayMicroseconds(980);% p! [' G, @* A" F
  46.     digitalWrite(_DataPin, HIGH);& `3 z* j0 D1 m1 {% X" z

  47. ! @3 L$ V9 j" P2 |0 s3 n0 r0 M
  48.     pinMode(_DataPin, INPUT_PULLUP);
    3 b# _- n" |: ~( k6 e
  49.     delayMicroseconds(10);7 ^( [3 [  d: h4 T

  50. ; r2 Z9 w) O2 V2 V+ |  o+ Z
  51.     time_out_flag = millis();0 L& {2 _) d5 t
  52.     while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );( S0 y, ~" @3 O/ s: `

  53. $ c1 p/ s1 L2 @: |9 \' o
  54.     LOW_level_read_time = micros();
    : X4 }" Z) T, f9 x( V
  55.     if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)   //time out
    % u# Z+ ]; w  ?7 }$ M' y/ M
  56.     {, ?* p4 V$ z3 B5 b
  57.         return 0xff;
    + _; u$ s) ]0 H7 T  E
  58.     }' q  B' n6 F" T+ J

  59. 1 I) O# L" M) ?, ]# c4 b
  60.     while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
    * V% ~8 v) t9 \6 ?, a* Z
  61. 5 p  s4 ~: @& j) T$ m
  62.     HIGH_level_read_time = micros();" `' i+ v. V/ {5 W3 l
  63.     LOW_level_read_time  = micros() - LOW_level_read_time;    //read 100us LOW level; C) j4 s+ P' Y6 P2 n' V& T

  64. ; W/ [8 V4 {) @, _$ s+ _  I& G/ O4 E
  65.     if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)   //time out
    6 O3 `4 [" v- c' X
  66.     {- {+ Y" k! K, ?: @0 N& a
  67.         return 0xff;
    8 o2 m3 h7 Y- J6 w: y
  68.     }- B: [& K( g8 |; Z/ G9 S/ Y
  69. ) a0 ~8 r8 _# i% n6 P: I% t
  70.     if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))5 a, p& Z( M$ T3 _6 @6 E- ^5 `. S
  71.     {
    , O7 }0 ^* w2 B$ g9 g# {; K
  72.         return 0xff;: O+ L. o3 ]# Z7 s* V, Y
  73.     }8 z5 y& R' ]) ?5 |& W
  74. / ~) s. y! [+ p6 n0 B" w9 d
  75.     while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
    8 V4 w2 z0 p' f
  76.     LOW_level_read_time  = micros();
    3 F! X  L6 F9 G1 [
  77.     HIGH_level_read_time = micros() - HIGH_level_read_time;    //read 50us HIGH level
    & e8 Z. Y; Q# d% e& N2 `3 T

  78. $ q" U# O5 C  |* _- `9 b" N) t; ]- y
  79.     if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)   //time out( s$ n% M- T1 ?
  80.     {& d; W2 x2 {4 \
  81.         return 0xff;- n9 x9 P+ M, V8 s
  82.     }
    0 T" |1 P. w# c2 k+ b6 \

  83. - H% C9 I  ]* N. h8 p+ I' F
  84.     if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))
    2 t+ S8 S& _+ L8 c% I! ?
  85.     {
    4 w0 I& Q9 I# {- h+ k
  86.         return 0xff;
    ( R  a0 j% n3 \8 B( ]9 V  _
  87.     }
    . \  h' H) I" l1 H0 U7 {0 t
  88.   n3 F$ q4 O1 m+ V
  89.     for(uint8_t k=0; k<3; k++)! [" E: u$ p( o" X2 P
  90.     {+ O- W# q* e0 a5 c0 M. g
  91.         Sensor_Data[k] = 0x00;1 e& t+ c6 n! o3 S7 q* ?8 k8 ^
  92. ; f  e7 z  m! d# J% ^
  93.         for(uint8_t i=0;i<8;i++)
    . _/ J% s1 S& H7 z+ ~& o: w
  94.         {
      o$ m1 M6 B9 Y8 |; {; N
  95.             while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );   //read 50us LOW level9 K( V) Y. t# H- t- P7 D
  96.             HIGH_level_read_time = micros();
    7 `9 [! `5 f9 n' U  p4 h
  97.             LOW_level_read_time  = micros() - LOW_level_read_time;9 f: }% Q* K4 A# D0 k  [7 v0 q' n
  98. 0 x( L4 C6 E/ o# B6 N6 c1 S' N
  99.             if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
    & c: [3 u% ]0 e" ?3 M0 m2 t" [
  100.             {
    1 R% {: g- g. d
  101.                 return 0xff;$ S7 M9 Y; r- S; I. r0 ]* x9 E! J2 }
  102.             }
    " I7 ~2 `0 s! s. g' c9 R! v* d/ G
  103. * o  O3 I2 t4 Q5 Z6 o
  104.             while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
    # i, A5 X  m/ L+ O9 r
  105.             LOW_level_read_time  = micros();) B" F2 n9 p3 \9 |. h8 C( c1 t4 s3 q
  106.             HIGH_level_read_time = micros() - HIGH_level_read_time;    //read HIGH level! k" Z# o2 p* R& ]: Z" _% H
  107. , F7 T6 G8 ~7 R# C2 S" [! F0 o. y
  108.             if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100)   //bit 1# J& t1 ?% v) d# o
  109.             {% C1 {" r, p6 s. ?* t( k
  110.                 Sensor_Data[k] |= (0x80 >> i);/ u  F1 B$ L, S; h, _
  111.             }7 I# B& d9 p+ k4 ]  l) t( ?
  112.             else if(HIGH_level_read_time >= 100)
    . P* v( I* C# Q4 j( U2 ~4 B
  113.             {
    0 n0 ?4 O% E$ t" N3 O7 i
  114.                 return 0xff;2 Q* L" |' ?* s; d
  115.             }6 V8 V+ A8 W& _" A
  116. 1 ]) f9 J9 I. C5 _/ F, E5 z; w
  117.             if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)' m% Q  X6 o3 ~+ C9 @- e
  118.             {
    8 s% K  _* z2 G3 g2 ]0 T
  119.                 return 0xff;
    + J5 N; ^6 h: O/ e* J# J
  120.             }2 P1 W$ h& {3 I1 {. M8 U. I' M) d
  121.         }" }( c) b3 Q  M" A) f
  122.     }. K3 t8 a( [. e6 C
  123.   U+ ]5 o4 E  n8 [" W9 J2 L6 P
  124.     while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );   //read 50us LOW level( Z1 J. @$ G" j( a- J1 ~
  125.     HIGH_level_read_time = micros();# t2 z5 l! A9 d5 n% a; N; D
  126.     LOW_level_read_time  = micros() - LOW_level_read_time;" l3 H" J+ E- M9 u8 j7 e
  127.   V$ y+ o! G$ Z) G0 E$ F
  128.     if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
    6 p" i* r( X% S2 P5 X" @0 u, u
  129.     {2 z+ b4 W( D, }7 `
  130.         return 0xff;/ q$ E9 d+ ]  t+ l  C& S
  131.     }
    6 c2 Z& Q1 [& a( Z7 F+ f) c0 u! A
  132. . ?# F3 T9 Q# u: Q! C
  133.     pinMode(_DataPin, OUTPUT);4 z  Z. A$ g" |, L% Q, _
  134.     digitalWrite(_DataPin, HIGH);
    5 h5 W7 l/ P% b5 t* ?

  135. 6 F+ u2 w, N  `; k' P+ M
  136.     if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))
    ' [1 v: I8 D/ [! X) v3 Y6 c
  137.     {
    / U; o* z( z6 T  R; p5 Y" m
  138.         old_data = Sensor_Data[0];2 H8 O: ]6 e8 L
  139.         return Sensor_Data[0];
    8 t6 T4 Z4 t0 }- `1 Y% d" B
  140.     }
    ; d+ {$ g" ?, `# H6 A
  141.     else
    " V9 w- w1 }' c- b. v& w
  142.     {
    ( d2 W: D* V! J
  143.         return old_data;
    9 ?9 V1 [$ c6 G2 k- B
  144.     }
    , r  t0 _' G( `- W! I
  145. }
    / P0 q$ z7 ^3 R
複製代碼

5 |3 p) x# X% s/ x# b  H- OMeLineFollowerArray.h   MeLineFollowerArray.h (731 Bytes, 下載次數: 0, 售價: 100 個銅錢)
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

QQ|Archiver|手機版|小黑屋|圓創力科技有限公司 IOP Robotic Technology Co.,Ltd Tel: 07-3924582

GMT+8, 2018-4-26 13:41 , Processed in 0.052510 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表