圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21600|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>; |4 G( X# c5 t1 {
  2. #include <Wire.h>
    # U, a7 e4 ?: s+ K9 ^
  3. #include <Servo.h>& m: I* C  k3 ~9 @6 i7 \& C. S: [
  4. * g9 Z- q! J- Z/ l+ S
  5. #include "MePort.h"
    8 I2 H- B- Y% G; ?1 a
  6. #include "MeUltrasonic.h"
    & L* K! Y2 o! i7 N% l
  7. #include "MeDCMotor.h"6 G* U3 \2 A8 y4 }; H. o

  8. . p& c# g5 z2 P3 [2 N
  9. //double Input, Output ;: M3 c2 J, S# n( }9 \3 L2 u
  10. float MaxSpeed = 255;
    8 I( j& I: A* I" ?2 R
  11. float MaxPower = 180;6 e+ {+ \7 z: K9 M' m; g4 r1 s/ N
  12. float MinPower = 120;- t; E( F9 i; X6 S3 b
  13. float Error,ErrorAcc,ErrorDec;7 S! F6 a2 a8 o$ j

  14. % j# F0 l9 r  z8 t- g1 Y, z
  15. float Kp=0.14;
    2 w3 V- b/ u4 H3 V3 y
  16. float Kd=0.00020;//23;5 L5 U0 ~2 M* I1 s& @/ K5 H& o
  17. float Ki=0.000201;6 N& Q- ?  T9 ]

  18. 3 K" T9 B: m- s  J8 [$ b
  19. float nPower;
    1 {6 D( L3 ~2 Z% d) L% e
  20. MePort lightsensor_6(6);
    0 U/ C- d' X& ^3 T
  21. MePort lightsensor_8(8);
    7 [" Z% Z( T+ P/ z1 E  V- C
  22. MeDCMotor motor_9(9);
    5 [; O2 N# e2 K4 t* F4 M, g& Z+ o& X
  23. MeDCMotor motor_10(10);% p1 H8 z/ E' m# m- I
  24. unsigned long previousMillis = 0;! T. \7 W, T1 y, y6 Q/ L
  25. const long interval = 1;
    9 E( T* X- }6 g5 I
  26. ( d6 F' L5 W# @4 s* [% a( `
  27. void setup(){' c3 s8 J- _/ s# w# X1 [) M/ k
  28.     lightsensor_6.dWrite1(1);
    & q( {) V3 s4 Q! s8 _: F
  29.     nPower = 160;' q4 t$ Z1 V, r; i  ~
  30.     Error=0;
    9 c, \9 P3 z, ~7 K) N- ]' V$ j
  31.     ErrorAcc=0;! G% k. \7 Z! t; b
  32. }
    & C5 G* q, ]5 j! D2 M4 d/ v9 t
  33. & y5 V. C! d- p1 X: ~6 l1 R0 A* q" G
  34. void loop(){5 t2 w; |7 ]9 r
  35.   unsigned long StartTime = millis();$ g: N4 _0 M& ?( }7 _2 }# v0 y
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){$ R  n% }3 Q6 W
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();# I% c8 ~7 y! C. [) R
  38.     ErrorAcc +=  nError*Kd ;- U4 Z7 s3 b) I6 {$ O" X% Z
  39.     ErrorDec -=  nError*Ki ;' `9 |1 s! q3 u% n% K" c8 j3 E: ^7 S$ h
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);# ~6 B' H0 N  }5 o% ^; c2 p; z) ^
  41.     if(nError < 80 && nError > -80){
    ; c& P" _6 T5 u7 h
  42.       if(nPower < MaxPower){$ F: Z+ `& C! @* m" z) G
  43.         nPower += 3;
    ( c8 E% z. F& y
  44.       }) G! z/ T# {0 Q# h6 }
  45.     } else{
    % z& w) ]( l8 `2 Y  V+ a
  46.       if(nPower > MinPower){( K9 {6 J5 l% T7 e/ V: S
  47.         nPower -= 2;8 A1 A/ {# p. h8 t- ]6 }
  48.       }
    . f% c' b5 B! \# G* _% C
  49.     } 9 J- b1 H- X% N. J
  50.     MotoL(nPower-Error);
    : c7 @5 H+ M8 Q. f1 X
  51.     MotoR(nPower+Error);   
    ; \1 N* ?) q% }0 J1 i, \9 K
  52.   }else{
    . V! N9 A1 X1 Y0 V; J3 Y* S, m5 J4 `/ K
  53.     motor_9.run(0);: o8 d: K  y& T4 k( R2 h" D2 t# Z2 S
  54.     motor_10.run(0);
    7 x& B3 ], R  G2 \) _# H8 m5 G7 B: Z
  55.   }5 `" l9 [3 u- w  @4 c2 @
  56.   do{}while(millis() - StartTime < interval);5 z6 i, ~9 X5 ]
  57. }
    - O+ e( Y9 ]$ Z4 d1 [0 I
  58. ( y- o) @9 y8 O- D6 e; L  F$ i0 O
  59. void MotoL(int Power){! z8 L: m. y) A8 u8 F; f
  60.   if (Power > MaxSpeed){; n' J  u; T( M6 E: A( b
  61.      Power = MaxSpeed;& Z+ R7 Y6 `9 R% s9 j
  62.   } $ I+ ?" q# g, H: t
  63.   if (Power < -MaxSpeed){
    . _  J/ S. j- x7 L" J
  64.      Power = -MaxSpeed;
    - ?2 b) a$ o; C8 A1 F
  65.   } & Z) b  z' z" H- F) w' l9 ~
  66.   motor_9.run(Power);5 E9 M: ~& C8 q! L; Q
  67. }  9 F" D  [5 {# V2 ]/ |

  68. 7 f; q2 `  ]" b$ h8 S. v4 |# \
  69. void MotoR(int Power){. a$ Y' d) l  I* x. o5 T
  70.   if (Power > MaxSpeed){
      v' G( T0 y* E/ u& ?
  71.      Power = MaxSpeed;. r% M3 r/ y7 z) }3 J
  72.   } " {8 A5 `1 X* y; j6 V# c& F2 w3 {
  73.   if (Power < -MaxSpeed){
    0 w0 L8 V: W2 [
  74.      Power = -MaxSpeed;8 e7 r* C: j0 q) o7 K; {* q. x) V
  75.   }
    . D' f" a$ E- ^; f4 R
  76.   motor_10.run(Power);. J8 h+ D" n* @+ s9 M5 c
  77. }  
複製代碼

) B4 E& V, u; C" g6 u* u
2 |/ V) R. R) F
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ x8 h2 f3 X2 f- R$ |$ k9 p3 K
) ^0 W  e7 m& C6 b您好,不知是否能向您請教。
; u0 W. {% x, A6 w目前和宋修賢老師在處理Ardui Car
6 g& C0 \$ l5 U" h: q* b: @雖然已使用較繁雜的方式處理了跑出黑線外的狀況
" L" Q7 k- K6 s+ E* U# C5 B6 q, n& h
但基於想追求更精簡的程式所以還是想請問一下
( y  x' @6 L7 b就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝; v7 l2 L; _$ W% b6 H/ V
不知道您是否願意教我可以如何處理
% d. p) D8 x) J1 \5 t) h; W
$ Q- |9 D) U1 u0 O4 ^' C/ L+ w  q) ~+ }. J6 O( M
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ! ^! B- d/ {% `+ z
  2. double CNY70Val = 1000;3 B  p! c2 f' w
  3. int interror = 0;
    ' i3 k& G  N1 G4 c
  4. int olderror = 0;. b! ^0 d; J* t' X, {; U# P8 j0 V
  5. double values;, r8 c( F- p9 i3 x/ `, W
  6. 9 o# D! o! L  G1 Q" E2 G7 M
  7. 1 n) \( F7 }- s
  8. void CNY70()
    0 N/ s2 v9 ~, m4 @
  9. {
    3 _0 b& [3 j  G/ g% X
  10.   valuesRR = analogRead(RR)
    % |' J  V' u1 N" U& O
  11.   valuesMR = analogRead(MR);  D. p1 X0 i0 ~, S  X
  12.   valuesMM = analogRead(MM);
    + H$ q$ a& d& t; p$ z) C( v
  13.   valuesML = analogRead(ML);
    ' y; ^+ ]* ]+ `. R! y! w) D6 J
  14.   valuesLL = analogRead(LL);% f) P3 x  v, d5 V6 o3 t
  15. 5 b, x3 t; E5 r, P( m" `
  16.   if (valuesRR > CNY70Val)
    * q, E/ {2 x/ ~0 h6 |
  17.     valuesRR = CNY70Val;
      n, k4 @7 a- o% b
  18.   if (valuesMR > CNY70Val)4 C2 l4 ?9 ~$ U  H+ H7 U- y
  19.     valuesMR = CNY70Val;; c/ N: u% `% d0 g$ ?9 p1 P
  20.   if (valuesMM > CNY70Val)# l' `" ~- I4 p8 I7 D0 g) R: g
  21.     valuesMM = CNY70Val;6 g( g, W5 Z& p7 D# L, G
  22.   if (valuesML > CNY70Val)
    6 v8 W/ W# c8 v2 R# a0 ~3 Q/ x
  23.     valuesML = CNY70Val;5 J; h' l4 V( l+ b. ^  o( Y2 j
  24.   if (valuesLL > CNY70Val)9 ^* s/ p$ |9 t) F4 `. }1 |
  25.     valuesLL = CNY70Val;+ O7 z" a8 W3 k/ m( e2 ?( d) h

  26. 5 T7 y3 {+ d  o( }8 |5 R. h
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;: R, V) N) n" H# G' o7 i7 Q
  28. }
    5 {4 R0 a) g: A; G; A

  29. 8 S0 a: S& u* g" C
  30. void Car()
    9 D. |1 D0 j/ Q- n1 R$ s' _
  31. {3 S. d6 v- C& u/ `: U2 w
  32.   while (1) {
    ) E6 k) Q# Z4 z, k3 l3 N4 u5 W
  33.     CNY70();3 g8 B! x& G, {% Q  p! y- B: @
  34. 4 h1 |( v3 D0 w3 u& e4 ?) j( c
  35.     int error = ((int)values);
    . [' O7 B. O! ]( E( o; s1 [% f$ A5 D
  36.     interror += error;
    5 o4 f$ a, n- s* n$ B
  37.     int lasterror = error - olderror;' a4 }0 u! k/ y/ V) y: S
  38.     olderror = error;% a6 J/ i# @' x3 v
  39.     int power = error / 5 + interror / 10000 + lasterror;' f8 c& R5 z0 C! b! L2 L

  40. " E9 J" K6 t6 c4 W# _
  41.     if (power > MotoSpeed)/ H+ E& L/ x% G) }+ i
  42.       power = MotoSpeed;' T# e+ W# I" G
  43.     if (power < -MotoSpeed)
    . [0 l' @+ i2 t
  44.       power = -MotoSpeed;3 }8 n* U# N8 C/ S7 k$ v* s
  45. 0 s/ P6 e, G* P# m# a& R2 x# X
  46.     if (power > 0)! b/ ^3 o" n& ~8 r
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。) `0 q4 p# O  u
  48.     else
    ! O+ C$ s: N, Q% e1 l
  49.       Speed(MotoSpeed + power, MotoSpeed);5 g! W& O5 r& S3 n9 K& O' G$ m; w
  50.   }1 p9 U, x! Y" x+ }  p- q
  51. }
複製代碼
0 w( v9 z5 \& r' i5 O9 e8 c
7 F5 M! k! \2 `2 ]8 z9 [( Q$ X
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-1 15:25 , Processed in 0.027152 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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