圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21823|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>+ @* S0 y7 A4 J3 [7 s7 R" \
  2. #include <Wire.h>
    % b* T6 b1 ?& C& |; P+ B
  3. #include <Servo.h>
    ! F- w+ D2 w+ @- a6 m
  4. 2 z5 O% u/ }$ d- a9 ]% P
  5. #include "MePort.h": \, x) y* \6 e& L1 D
  6. #include "MeUltrasonic.h"  w( D/ g0 F. G& U
  7. #include "MeDCMotor.h"* n0 ]- T9 }% \% s& s$ F9 k
  8. / V. L) V$ i  `5 Z8 n
  9. //double Input, Output ;
    ! C) V2 y2 m& w9 A$ I
  10. float MaxSpeed = 255;5 I+ y' ?7 ?9 L9 H+ v/ I3 w
  11. float MaxPower = 180;! L* G) I6 F" i
  12. float MinPower = 120;
    0 t  P5 W5 y6 W! \3 w
  13. float Error,ErrorAcc,ErrorDec;
    / J- g! q' t$ W: [" v) L9 U) M
  14. & _. K0 j! C8 V  N( ]  @
  15. float Kp=0.14;
    ' |. J8 I* E7 D2 \
  16. float Kd=0.00020;//23;
      c  L( L7 b0 H5 V: u+ T
  17. float Ki=0.000201;
    , N; A8 l6 W2 Q* b. Y" q" P* @

  18. - a$ O, @; H' n  J" o2 K4 p
  19. float nPower;! P( x9 W) Z) M6 ~" X2 h
  20. MePort lightsensor_6(6);  O+ a6 d% f; d4 [! p5 I, N1 E
  21. MePort lightsensor_8(8);
    % O- ]0 f" s0 X' H" I
  22. MeDCMotor motor_9(9);
    - O5 Z8 f8 M9 i3 D; |# r
  23. MeDCMotor motor_10(10);
    8 y/ U; X' B8 F3 X6 q) F3 J
  24. unsigned long previousMillis = 0;
    1 W3 v$ e8 b/ j8 ]/ T, ]$ o
  25. const long interval = 1;% T/ I- x6 p+ s) W+ j5 k
  26. . }3 {4 f( T/ k
  27. void setup(){
    * y* T' z; i, Y# ]) ]
  28.     lightsensor_6.dWrite1(1);8 |$ v% m6 V; U0 Y9 C+ V! t
  29.     nPower = 160;
    . \+ ?6 q! G' S; A; {& K' P
  30.     Error=0;" O- N6 \' ?! \" a- @% }
  31.     ErrorAcc=0;
    , Q/ v5 h% N& S1 G
  32. }
    + H. C+ G9 ]- [( x+ r
  33. , ]( j* o0 J  l! r- g
  34. void loop(){
    & R9 _) F- R0 C/ Y
  35.   unsigned long StartTime = millis();
    - ?" A( {/ D: O4 u" H  R
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    / b' p1 f! m/ @. \& G' R& ~3 x
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();. d- ^  j7 h1 t
  38.     ErrorAcc +=  nError*Kd ;8 B3 d. ?1 v3 n* u# M% T3 M2 W5 |2 K, Y
  39.     ErrorDec -=  nError*Ki ;" y8 ^2 S5 w) B# ]( r
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);+ p8 H5 b; ]& n! ^
  41.     if(nError < 80 && nError > -80){- Z. ]: h! ]0 P. S
  42.       if(nPower < MaxPower){5 Y; J& k: H5 A) G4 i& O6 X
  43.         nPower += 3;
    # D, B$ i7 ~: P$ j
  44.       }
    5 z  x* d4 t! b/ S* |, k. f+ s6 Z; M
  45.     } else{
    * ^1 E7 A" R; K- T6 x
  46.       if(nPower > MinPower){
    & B/ ^" M' @9 A
  47.         nPower -= 2;
    8 x/ A$ |  |5 V3 m2 _, X. F. u
  48.       }6 ^$ }9 N2 c- ^0 M2 J* {) Z0 G% y
  49.     }
    0 i7 L) p1 u2 I6 m6 O( ?/ u5 X* Y
  50.     MotoL(nPower-Error);/ ^; X3 X3 i) T( @! d- f5 E
  51.     MotoR(nPower+Error);   
    3 N8 H5 k/ g5 b9 x& R% W
  52.   }else{# E$ ?1 {( r# Y" y6 v
  53.     motor_9.run(0);
    9 t* G( {8 P( h2 O
  54.     motor_10.run(0);+ S& s# I) b* j) ], G1 d
  55.   }
      B* |$ M) d  Y* X& o+ j# w  V
  56.   do{}while(millis() - StartTime < interval);
    : a+ ^: v! T- s+ H2 k( M! M
  57. }5 A) q; d. n+ }' v

  58. 4 l+ M: V. b9 U/ j4 ^6 T
  59. void MotoL(int Power){
    9 K* g5 g' A: A! P
  60.   if (Power > MaxSpeed){
    9 U3 z  Q; W5 ~* m
  61.      Power = MaxSpeed;+ ?4 b' i! \, J0 z
  62.   } % _# M/ q6 W8 Q  ^) ^
  63.   if (Power < -MaxSpeed){+ p9 ?: C. I) D, @
  64.      Power = -MaxSpeed;' q/ F0 I, d6 s! V% E
  65.   } - L  F/ X. M  V, I( H
  66.   motor_9.run(Power);
    0 x1 v6 E& K8 R0 V, i" G+ {: y, p
  67. }  * i) L' F5 L  T" f) h
  68. 7 O+ k: f5 o4 |% X. O
  69. void MotoR(int Power){
    4 Q  q  B" p9 v; r+ S
  70.   if (Power > MaxSpeed){
    % }. j1 J7 h$ }" ^# ^/ h
  71.      Power = MaxSpeed;
    $ l: s* n# L$ f6 ^* v, j2 j; _: r
  72.   } 4 f% b+ _) R, E$ J6 u6 H7 j: z
  73.   if (Power < -MaxSpeed){
    7 ^; t( M* Z* @# l4 v
  74.      Power = -MaxSpeed;
    * M, c. `1 u0 B( k
  75.   } # M- m) @. J5 C- `# G7 }! e
  76.   motor_10.run(Power);
    ) l; A8 Z1 x& y6 p* ]8 p
  77. }  
複製代碼

7 q% V1 o: m6 u+ ]( U
; ~$ T! A5 A+ h, B: X, @) ~3 q
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
8 k9 A9 \  W5 }  k7 B7 v9 G4 J
  |9 q+ c  X8 m' {- K* D' K您好,不知是否能向您請教。
3 Y* N" T4 o# F! m* C目前和宋修賢老師在處理Ardui Car
# L1 x$ l: l! f, s% c+ J7 Z4 h雖然已使用較繁雜的方式處理了跑出黑線外的狀況2 w, P8 Q8 z" E# V. e  `9 Y
' z- A2 e# ~8 n$ A
但基於想追求更精簡的程式所以還是想請問一下
% r, t1 |2 R: Y就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝. O4 U% M) @$ s% k  }
不知道您是否願意教我可以如何處理
9 Y! N* Z1 l' A5 `! k7 U; d
; t9 G  v, C. }$ R- e) r* {5 P, B. t# P( t; B8 V8 d7 W8 G
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    0 A7 d- n- {$ W0 }
  2. double CNY70Val = 1000;: q' ]# e8 R  t; s. {: Z5 I
  3. int interror = 0;
    9 w' e7 Y0 n9 R( z& L% Y  l; u- c
  4. int olderror = 0;
    8 |6 v0 q2 L6 p1 m( q6 F# Y) E$ @
  5. double values;+ \) P6 q! o' C$ [5 a9 t; \" N( C

  6. 2 [6 x% Z, ~& f  |& x  n+ I
  7. ' S+ r% v, z  P, J" ~$ P- n5 L
  8. void CNY70()  ?( t  q) P- a" |
  9. {
    2 n! o7 L5 V$ W( H" t" u: d
  10.   valuesRR = analogRead(RR)
    1 V% ^- ]0 ?' @/ I
  11.   valuesMR = analogRead(MR);
    9 Y; O0 V+ t' \1 n' E
  12.   valuesMM = analogRead(MM);* }) W4 `; w% `- i4 U8 ~5 Y; V
  13.   valuesML = analogRead(ML);' m: j- J" `/ ?2 I# N6 x0 Y/ D* \
  14.   valuesLL = analogRead(LL);6 J% F* e2 m! w, D

  15. / G; c  Z/ }' c. Y5 v* T
  16.   if (valuesRR > CNY70Val)
    . J8 F; K0 f* `
  17.     valuesRR = CNY70Val;
    1 _  x2 [* L; T! A0 m6 e& q
  18.   if (valuesMR > CNY70Val)9 D5 X( B) G9 l
  19.     valuesMR = CNY70Val;) U3 |% O" b! y& x
  20.   if (valuesMM > CNY70Val)% O$ e; U8 I0 N$ |, {4 n+ P
  21.     valuesMM = CNY70Val;
    1 M% k) p) X' b: c& f& x
  22.   if (valuesML > CNY70Val)
    8 C* ~9 S1 D- a' Y4 D- G# S
  23.     valuesML = CNY70Val;
    ' }: q5 F& @+ x# _+ G* w% L8 q% _5 p
  24.   if (valuesLL > CNY70Val)
    # d3 q+ ~0 }# j: g6 S, x
  25.     valuesLL = CNY70Val;6 M1 g( n* `1 a; [
  26. 5 B* }1 w8 X& t" X: t( M
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;) X2 S& |& h% r0 N
  28. }
    " e8 g1 z- g$ B8 c0 d/ f) l, I

  29. 9 {" t3 l. y% n& l) x
  30. void Car()
    , I7 U! ?( V$ H. c
  31. {/ k8 ~( J9 W4 O0 Q; E
  32.   while (1) {
    7 Z4 u( N* g5 v4 h9 h8 _  {
  33.     CNY70();5 u6 ^( \' _+ p
  34. 9 d& B* H7 \* L& ]  g4 `
  35.     int error = ((int)values);
    * t9 W: O$ ^0 f# {) [& P
  36.     interror += error;8 b  V; F9 r, ]7 r9 q) K- x
  37.     int lasterror = error - olderror;
    & J- ^- b" E% \  p: ^; k# r
  38.     olderror = error;  T8 m4 l# J. g1 w, ~8 a2 l
  39.     int power = error / 5 + interror / 10000 + lasterror;: b8 S+ o4 ?- l, Q7 q
  40. ; N6 k4 t3 K# ?) M' e
  41.     if (power > MotoSpeed)
    . M9 |* d; A# V
  42.       power = MotoSpeed;* U) u% |2 N- k; }5 f
  43.     if (power < -MotoSpeed)
    0 {' b+ k! C( K# Z- I
  44.       power = -MotoSpeed;; g) |9 r" Y+ O. h; v) ~& X

  45. . _9 N8 a% K" ~) P2 v- \6 l
  46.     if (power > 0)
    6 I- @3 N' j+ |# U; q. e
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    4 n% e% Y8 }3 |' @* K, L+ T
  48.     else
    4 W. U1 E9 F$ l& A
  49.       Speed(MotoSpeed + power, MotoSpeed);) P& J" {$ S8 o, i* P3 W/ L
  50.   }  r5 d  b4 K+ R3 A# `% t+ m
  51. }
複製代碼

6 ^+ `) o% x6 S+ [1 D. }' ^- M$ l) W0 x( i" r( ~1 Y
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 22:37 , Processed in 0.025485 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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