|  | 
 
| % U# G' o! Q4 A8 m6 u' ~複製代碼#include <Arduino.h>- @) Q; b& m, U( a
#include <Wire.h>! R' \; D4 g; r( H" q" X) f
#include <Servo.h>5 E2 K" F& L6 d# x) v2 k! O
; o+ P& q9 Z2 r# G* n
#include "MePort.h"& N3 A& b; z/ z
#include "MeUltrasonic.h") _) B1 @- d8 B$ x1 `% c0 G
#include "MeDCMotor.h"6 k; F& X$ Q& m: }
9 K3 I4 z& c# ?9 K0 y7 a; C
//double Input, Output ;X! V) c0 Q" B4 p
float MaxSpeed = 255;+ O/ A9 I: H! y7 Q$ F8 J
float MaxPower = 180;. U! }7 i& ~7 p7 l2 \: a3 m" y$ o. O
float MinPower = 120;+ e" v+ C+ E0 @  W
float Error,ErrorAcc,ErrorDec;1 e/ k# R! G1 Y' ^% N
0 U4 P; j: O. j: l! M! R
float Kp=0.14;) I3 z8 `. a; G; r- y
float Kd=0.00020;//23;6 |6 q) @0 o, ^! X% P8 F$ @
float Ki=0.000201;" ^: ~% s7 f6 z4 _
! J, X% H9 u& e( ?
float nPower;5 ~  n9 X+ w- e+ A% R
MePort lightsensor_6(6);) @9 p2 X) h% f
MePort lightsensor_8(8);9 d! f/ y3 R$ i2 H8 A
MeDCMotor motor_9(9);8 R) w$ Q/ D  W9 s7 }3 R/ z6 {
MeDCMotor motor_10(10);3 K. K& A+ i, r0 s7 v
unsigned long previousMillis = 0;% C4 q) s# J3 `
const long interval = 1;7 T9 J3 V! x' U- p$ Q9 {1 p
1 k5 ]' h- d  P  Y& A6 h5 K6 `
void setup(){+ W! `& [. K, d: p0 g6 q; [
    lightsensor_6.dWrite1(1);2 ^2 N& n. }* q% t0 ~2 g
    nPower = 160;2 F+ ~2 l9 {0 N2 G' ^" z
    Error=0;! d1 n4 Q! ~- Z% ~8 a: B' H; v5 O" s
    ErrorAcc=0;$ P0 ~5 [- Z% L, H4 T* V
}$ b9 ~9 K$ I- \, G
, E# j3 B3 k. C1 Z/ M
void loop(){e' J" N/ }  f( w9 o. C7 i
  unsigned long StartTime = millis();- t# i# ~7 u% t& W7 b4 ^
  if(ErrorAcc < 18000 && ErrorAcc > -18000){- N0 S+ L& z8 F5 `/ p
    float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();, [! ^+ d# L1 Q/ u, x
    ErrorAcc +=  nError*Kd ;8 x" T% {# c9 S* {, S" a
    ErrorDec -=  nError*Ki ;$ v- W6 Y* R& J7 H
    Error = int(nError*Kp+ErrorAcc+ErrorDec);5 w2 s# K$ O8 Z1 K, V. \
    if(nError < 80 && nError > -80){) {. Z: u5 U+ d8 T# J3 W" c8 c) P/ z
      if(nPower < MaxPower){$ ?5 S1 G. F; Z7 }" S. W9 C
        nPower += 3;. r& a* d2 [+ d, n) h. O
      }, E: w" y* ]8 _/ j( J9 j( v- Y
    } else{2 d# b/ A3 K1 e& X" j
      if(nPower > MinPower){6 l- {& \" h/ g( e) V( I
        nPower -= 2;( i6 B8 I4 a- W* F: Q, r5 Y
      }1 z. K& n* }) L8 C7 z& k
    } ! R' P  e8 n  N9 b0 e% R+ i# \
    MotoL(nPower-Error);5 Z! m$ |' T" G8 N# \& i
    MotoR(nPower+Error);    , t( b- B! M) C$ w  n+ ~" k. K
  }else{! x1 J; |# C6 R- N; y2 I) A! d6 d
    motor_9.run(0);4 ~% F6 {: K; ]+ r2 q( N) t$ |6 g: p
    motor_10.run(0);2 Y& Y6 A% g* u" V* k, f$ j
  }, s/ E; W7 H. e" l6 ~
  do{}while(millis() - StartTime < interval);$ z4 @; A  H3 m/ w
}) D; A! B: h& Q5 q& L/ j% Y  D4 d
& E+ A" [( M) v4 {/ H! M  h, N( Q! J
void MotoL(int Power){( l1 {; V# i- v
  if (Power > MaxSpeed){8 d+ E; x4 d8 w
     Power = MaxSpeed;4 }! f  l2 o1 j! m
  } " W: b' X" m! y5 w% \
  if (Power < -MaxSpeed){' W1 @: q. n# v
     Power = -MaxSpeed;3 m: u5 `) ?0 a
  } 9 p; z3 m: n( l4 j! Y. c
  motor_9.run(Power);, M' |9 j8 j* \" y; V
}  8 |; o( B1 ]& Z6 b. i1 p/ ]
/ u7 P9 q( v& x( ]' {0 _
void MotoR(int Power){. j/ n3 Q4 `2 e7 x  j. ~( @9 `8 z* R' F
  if (Power > MaxSpeed){, c4 `2 r0 o! I8 p, D
     Power = MaxSpeed;, `; ]$ k  d4 B# c
  } ) C9 q& r* i; e4 f  V/ l( m) @# {
  if (Power < -MaxSpeed){/ K$ E( G( j) H( L; n9 {
     Power = -MaxSpeed;3 Z) }. B/ ?) I( s1 D
  } 5 f! U) D# s- c4 }2 b2 w  C
  motor_10.run(Power);/ r, r0 t$ G- \+ @: m( ~
}  
0 _0 c/ O/ j' Q/ Z' M0 w) W
 
 | 
 |