圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20911|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    % h+ k* k1 e# ^0 H/ l  g! U2 k0 L
  2. #include <Wire.h>
    0 f/ s; K  k/ B- _$ u, A( T
  3. #include <Servo.h>
    # U$ m; ~& ]6 n5 y% p+ g2 {

  4. 8 P+ S: x" D! u4 Z7 f% i
  5. #include "MePort.h"- R- @0 x1 e/ B7 m- H
  6. #include "MeUltrasonic.h"5 \) v, Z) q) {7 J8 c$ _+ Q$ G
  7. #include "MeDCMotor.h"
    1 r! I8 r/ G) J5 L+ u6 \

  8. ) o9 e# |% V! J& e( Q
  9. //double Input, Output ;
    % L/ s" ^' `: F$ Y2 X6 d0 J. W
  10. float MaxSpeed = 255;( |, {. M9 W: N9 q* w2 h
  11. float MaxPower = 180;
    0 K# p' |/ o" T; F1 m- ?
  12. float MinPower = 120;$ V# m0 L+ n$ [, e& S; F* J5 d
  13. float Error,ErrorAcc,ErrorDec;3 K. j3 C9 u' v' z

  14. % o. l4 c4 x8 D+ p
  15. float Kp=0.14;
    2 Y( U5 ~4 Q( S5 Z  `
  16. float Kd=0.00020;//23;
    , }" V, P- j) h8 N, Z8 F& w
  17. float Ki=0.000201;6 D9 M1 X! V+ i0 ^% e1 R
  18. * h2 O3 {0 u$ K; o4 ?+ h3 R) ?9 o
  19. float nPower;5 c3 s0 m+ V8 Q7 \* E; |
  20. MePort lightsensor_6(6);
    / {( B7 o! a1 w+ ]
  21. MePort lightsensor_8(8);* d2 m  C' i. e, f' j7 S
  22. MeDCMotor motor_9(9);
    " j0 u! j1 J. A+ i& W7 [
  23. MeDCMotor motor_10(10);
    / D9 ~, k% G3 Y1 Z1 c
  24. unsigned long previousMillis = 0;
    $ z" X' \' k) _- [2 \. Y( O6 _
  25. const long interval = 1;  w+ z& R/ M( ]  O
  26. ) s# Q& u4 V/ Z1 z* K/ M1 r
  27. void setup(){
    $ e$ M3 J; M* A+ J1 `* M% A
  28.     lightsensor_6.dWrite1(1);2 Z4 ~1 g6 T3 ]* b
  29.     nPower = 160;, R4 a/ i4 q5 W7 M
  30.     Error=0;1 ?  O; m/ [" j
  31.     ErrorAcc=0;, D9 a0 M! i1 A' R% g$ O4 E! }4 O5 i. `
  32. }
    8 G5 U- `! ~3 K8 Y! N
  33.   K- {; _6 Y5 r. X) x. v8 H5 n
  34. void loop(){
      B$ A& f+ U% m+ W1 l! A2 J6 V
  35.   unsigned long StartTime = millis();
      }: Q2 f( P! b  T
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){) ?9 w* L6 R, u
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ! I5 t6 v" Z( M! y+ V4 h
  38.     ErrorAcc +=  nError*Kd ;
    + Y) \# w4 N+ e5 @; W5 `
  39.     ErrorDec -=  nError*Ki ;
    % J  z7 i# H. ?3 N, p6 J
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);5 {4 g: X+ D% @/ p# U7 Z  p
  41.     if(nError < 80 && nError > -80){% |0 D7 l$ p% d/ l5 E7 a
  42.       if(nPower < MaxPower){
    7 r- b  s/ Z$ _' d9 Y
  43.         nPower += 3;
    * ?+ R/ K9 T3 [
  44.       }
    6 I$ o3 R5 J  X# P" v
  45.     } else{
      w9 {. q& h7 x/ s2 z* o
  46.       if(nPower > MinPower){1 V% o' T& j6 ^) ?4 ^8 t
  47.         nPower -= 2;- {/ C' z' `4 O
  48.       }
    " k6 z1 ~* K) g# b+ A- P1 O9 f
  49.     }
      n$ K& X3 i: _: P
  50.     MotoL(nPower-Error);2 m1 ^+ {1 C5 ^1 F
  51.     MotoR(nPower+Error);   
    6 y, H  X# |% i/ a% r2 u1 z! z. H6 L
  52.   }else{6 t; u: [9 n  ^* c( t  Q
  53.     motor_9.run(0);
    $ t+ {( l7 `; {6 Z$ {- N
  54.     motor_10.run(0);
    + f5 z; X! {4 c: X/ E6 G
  55.   }
    $ |. b+ c) E3 w1 l5 u
  56.   do{}while(millis() - StartTime < interval);6 ~( @! h' R, a1 g; a
  57. }
    9 Y* V) j( a* q$ L+ e) j. B
  58.   o: _  B4 B6 N2 A9 N' s, d( G
  59. void MotoL(int Power){
    - Q; L& P" c6 g) ?3 `( `. d
  60.   if (Power > MaxSpeed){
    0 @4 \8 i% r0 s# V' s. J
  61.      Power = MaxSpeed;  t" b4 w6 Q* o5 }) [
  62.   }
    ; F/ J: C& p" i5 j8 O1 k( g$ `
  63.   if (Power < -MaxSpeed){: b% h$ }$ E( ^" p6 N
  64.      Power = -MaxSpeed;
    7 F5 ^& I+ o5 J# p* g/ k
  65.   }
    9 @" @+ H+ B) _" P
  66.   motor_9.run(Power);
    ' S6 f2 V- {9 }6 d7 {
  67. }  
    ' t, h; N4 T1 @$ C5 _" ]
  68. 5 z" |5 q4 `7 G& T. Q  `1 z8 c! R
  69. void MotoR(int Power){
    2 a/ Z" V7 I; d
  70.   if (Power > MaxSpeed){
    & L8 D8 Y0 e3 L
  71.      Power = MaxSpeed;
    ; U6 s; l5 |* I# x6 G
  72.   }
    7 I% T+ p6 x! M* L
  73.   if (Power < -MaxSpeed){
    3 Y2 ^6 {5 j8 h0 P" q; w6 z1 W
  74.      Power = -MaxSpeed;
    3 H' j- d8 Q3 G% [3 C" |8 _* V& n% B4 s
  75.   } # A8 _+ V6 f' v; n+ g# P
  76.   motor_10.run(Power);- a9 J( f; k9 ~9 l5 H9 R
  77. }  
複製代碼
/ G. Y- w  D+ p' }) u2 c8 J

1 E- a* l% O4 D# Y  a( s( a
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
9 p) `3 K" t5 U4 e$ R
. s3 q7 @3 z1 @# P您好,不知是否能向您請教。/ A5 z4 P% O: n5 I6 [
目前和宋修賢老師在處理Ardui Car' }+ j6 r/ s4 R( O
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
% y+ u% [0 I, [3 Q
- w( I5 O, ?2 F6 X+ g$ |" M但基於想追求更精簡的程式所以還是想請問一下* C0 D$ I8 ]5 I" i" b
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝, T0 B( \3 _1 W# n
不知道您是否願意教我可以如何處理( P% e$ e3 b6 S8 a" e5 M

9 X& O+ A: z2 A" e9 I; Z" c
0 s; f) n" Q" ?$ B) t以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;( q8 K  i+ @  n8 n' k$ u
  2. double CNY70Val = 1000;1 R- Z( y/ b0 G3 f
  3. int interror = 0;
    # J+ }1 C$ l2 p) Y
  4. int olderror = 0;) Q9 v8 H, ^' j% B: \
  5. double values;
    $ M5 W: I. X! D, k+ E: K

  6. + q/ {5 ^4 K, v% S, n
  7. 0 E  [$ [0 u$ Z
  8. void CNY70()
    6 S1 K5 i; P  j3 [$ }$ a
  9. {  Z2 I; X; L* n1 O% A& `
  10.   valuesRR = analogRead(RR)6 Z- r) l' H* |, C* ?$ ]! h
  11.   valuesMR = analogRead(MR);
    ' R- j1 e! R1 W' ^/ J4 l
  12.   valuesMM = analogRead(MM);
    5 X2 [5 A& `+ Q: m7 y+ H  {
  13.   valuesML = analogRead(ML);+ n& u6 B% L( l. t$ V0 o* `$ G
  14.   valuesLL = analogRead(LL);
    1 O3 U4 e/ i! K

  15. ( n7 c6 ?0 e6 k" d5 U3 b9 E
  16.   if (valuesRR > CNY70Val)
    5 G; o: Y# x9 N/ h
  17.     valuesRR = CNY70Val;
    & H. F; b% I+ s2 ]* [2 O6 a
  18.   if (valuesMR > CNY70Val)* K9 L9 U' {; E+ H1 n8 Q
  19.     valuesMR = CNY70Val;
    - A* g+ e. m/ V
  20.   if (valuesMM > CNY70Val)
    . |3 W4 Q3 b1 \" P, p; @/ J# \1 P
  21.     valuesMM = CNY70Val;: }- o/ l" W# u
  22.   if (valuesML > CNY70Val)( S% ~* p$ `/ G# C
  23.     valuesML = CNY70Val;
    + x; J, e' Q* L( H# d
  24.   if (valuesLL > CNY70Val)! J- n5 T. I6 B7 |% W
  25.     valuesLL = CNY70Val;/ \% Z# x  A4 {0 v- H
  26. ! ~# @& m3 E6 {" `( Z. {; Q1 ]9 S
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% Z/ R  v  S& U6 d" k
  28. }% |$ u; @! |* H/ R9 I7 D

  29. ; l) O4 @" ]& }* j0 G5 @5 Q
  30. void Car(), k7 g1 b& l8 `/ c4 N
  31. {6 ~- l, r5 m1 i8 W+ ^
  32.   while (1) {
    ; _- A# g( v" [8 X  _
  33.     CNY70();& P$ g8 ~$ O" H
  34. " i' s$ W7 @; @; T" Q6 i1 G; R
  35.     int error = ((int)values);
    , ]0 ]3 }9 v. `6 Y) A/ T
  36.     interror += error;9 T. C. E0 V0 M) X
  37.     int lasterror = error - olderror;, c, I  q* Y$ [/ ~
  38.     olderror = error;+ d+ q4 y- k* [# x, o% T+ E' Y' x. \
  39.     int power = error / 5 + interror / 10000 + lasterror;
    : r  ]' {. V' g/ N/ I5 d, [7 w

  40. ( K+ L1 }4 I7 w) W$ G7 O  r7 c; o
  41.     if (power > MotoSpeed)
    + u) ~- k" E# f4 n
  42.       power = MotoSpeed;
    4 X/ E- b: o- r. F, w
  43.     if (power < -MotoSpeed)$ ~2 y9 m8 D0 {) K' f4 q" ~
  44.       power = -MotoSpeed;
      k/ R7 v' w7 Y4 ?  E
  45. 0 n8 @& Z: l# k2 S" T; F; ~
  46.     if (power > 0)
    1 I+ Y2 H& F5 B$ F/ t' q' }, [
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。, x2 O+ r1 {/ S7 A6 l
  48.     else% X" }; C# K0 N1 `- B0 m0 U5 m7 v
  49.       Speed(MotoSpeed + power, MotoSpeed);
    - z8 @2 {& V4 i1 T9 _
  50.   }5 M' D# r3 |) @6 m; T% U5 D6 \
  51. }
複製代碼

6 {" z0 [( j( N+ Q2 a$ v/ a9 z
* S8 L, v# x1 R! B
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-1 20:40 , Processed in 0.026352 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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