圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21863|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>. d4 ^/ Q0 z( B8 E/ \+ F
  2. #include <Wire.h>9 b, k  E' t+ F$ ?
  3. #include <Servo.h>9 s$ V% e. O0 q% C+ \% {
  4. + B  m9 h7 B: u5 v9 f
  5. #include "MePort.h") Q  B& v8 G- [; [
  6. #include "MeUltrasonic.h"
    ) `3 I3 Y: ~1 o  l/ `: T
  7. #include "MeDCMotor.h"" p! r1 Z! b& x6 o" K- K
  8. , p1 @* g( g0 C0 n* U4 |% ^
  9. //double Input, Output ;
    7 k2 m; h- ~$ r- D/ ^+ v
  10. float MaxSpeed = 255;
    ; A' @. o8 R; F% X. \6 l# N( u
  11. float MaxPower = 180;
    1 j+ p- a% E& \& j' a
  12. float MinPower = 120;5 T& @# ]8 x. a2 A6 Z9 a
  13. float Error,ErrorAcc,ErrorDec;
    3 S! V. X) Z8 s6 S4 |3 Q: g

  14. % `+ I  @/ A# x& Q, T8 f
  15. float Kp=0.14;5 j/ b/ Z/ }5 `$ f5 e1 ~
  16. float Kd=0.00020;//23;: P0 v, h+ a" o
  17. float Ki=0.000201;! B6 G# |: I* W1 Y( m3 G% B
  18. 8 \7 m3 N; H' V) P
  19. float nPower;+ H6 x* C. t6 h3 \; J
  20. MePort lightsensor_6(6);
    + |& i5 X8 r$ P, ]4 J9 \7 j
  21. MePort lightsensor_8(8);% E. b' @- a# g" B% K4 ]3 h
  22. MeDCMotor motor_9(9);
    ; ^$ Z( V) V& {; [4 P
  23. MeDCMotor motor_10(10);9 S) `' R; g+ `* w! B$ z) z2 f
  24. unsigned long previousMillis = 0;( C2 r5 H7 u6 E1 l2 h  _! m2 V" [# d7 b
  25. const long interval = 1;/ H% k8 g$ r% ~' {' ?

  26. 9 J3 Q1 G; L! e  H( D; L
  27. void setup(){. F8 x0 o4 `8 E  X2 G# W2 `: c4 m
  28.     lightsensor_6.dWrite1(1);( e$ a$ _/ f* X- q) k5 @* g( I2 P/ s
  29.     nPower = 160;
    + L3 @- R; O7 q# p
  30.     Error=0;' U% E' i9 I( T3 ^& i
  31.     ErrorAcc=0;
    ( g) P% \! N8 _3 z$ M) S: a
  32. }
    % y% U( N5 c- R! @

  33. 7 H& Z1 @" F) P
  34. void loop(){' S+ h+ R+ U0 y* {
  35.   unsigned long StartTime = millis();
    , r' b4 z; [- ]" z5 Q9 q4 s+ W& P
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){% ]2 L3 [. A/ x0 K
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();, V& G- c/ @6 p7 |
  38.     ErrorAcc +=  nError*Kd ;$ [4 W2 {) Z4 v
  39.     ErrorDec -=  nError*Ki ;/ j* }1 a; Y" k1 _/ |- x' w# x
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    - t: }- Z/ d2 X5 J. p3 p, F3 c# |
  41.     if(nError < 80 && nError > -80){( M! r' _' g5 Y  }, Y( r, ^, G" q% e
  42.       if(nPower < MaxPower){( v; p- [" H& x4 P) X
  43.         nPower += 3;
      ?, ?7 {1 l/ r7 A2 Y( b# Z
  44.       }, e& U+ S& g0 i9 N9 m3 L
  45.     } else{
    ' }" r% O$ \; f: t* v
  46.       if(nPower > MinPower){- r! l, z, g! `. J
  47.         nPower -= 2;
    ! y( Z& u! m2 v0 v8 {
  48.       }
    , e7 d$ a% g& @5 O& s* w6 U
  49.     }
      t/ d6 z# A# c5 k& v
  50.     MotoL(nPower-Error);
    3 I4 n! x; j: C
  51.     MotoR(nPower+Error);   
    2 p7 n$ x8 ]1 J* U
  52.   }else{
    ( _! a' ^1 E6 E+ a( ~- d4 z
  53.     motor_9.run(0);
    3 U/ f8 B- Z. u+ J& r1 K
  54.     motor_10.run(0);4 r+ D, ]: }" g* F$ O" F  \
  55.   }
    ; l( d! f( o0 ~9 I
  56.   do{}while(millis() - StartTime < interval);4 j# I; U8 [) x3 s% ?/ X
  57. }) ^: f% a/ T! I  O, t

  58. 9 U1 r( k9 m7 T3 e* B# g5 n7 ]0 @
  59. void MotoL(int Power){
    7 I+ D: g( B+ R7 K- t* I
  60.   if (Power > MaxSpeed){
    / X% q6 {8 a9 A" v' {, k' N  ~
  61.      Power = MaxSpeed;
    * E0 t5 c: k% A) ?1 g9 H
  62.   }
    0 {& ?- h( x5 \0 j* U( n
  63.   if (Power < -MaxSpeed){
    1 `' C) G: L/ Z( Q) c! s# s
  64.      Power = -MaxSpeed;
    5 a- z) g" v; I: @7 K1 e8 ^( y
  65.   } , f# _6 E' K$ ?1 A0 ]# q
  66.   motor_9.run(Power);& _  c5 u1 f; @4 M
  67. }  # u2 y( ~' I3 W! }7 J9 X
  68. ; i" q4 s0 e* V, l
  69. void MotoR(int Power){
    " X' @% |4 K% S/ M
  70.   if (Power > MaxSpeed){, y$ i# H" f4 y. P9 B' ~! h& X! [
  71.      Power = MaxSpeed;! X* J9 t2 e$ q6 j+ |3 y
  72.   } 0 c! a3 T4 H" A& `
  73.   if (Power < -MaxSpeed){2 f% r! d6 ^% D& Q: T7 x! f+ Y
  74.      Power = -MaxSpeed;$ l* R- H% |  s! V+ U
  75.   }
    1 @* |+ i% [3 {5 |! a! z
  76.   motor_10.run(Power);
    1 {& G4 J/ u3 n0 T/ {* f
  77. }  
複製代碼

2 ^1 m# h- H* ?6 U# ~
$ n$ e  S- s; l! G5 N
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
% O( T- a7 h/ s( f  r( B9 V6 r! D% U7 |# u% D) u% ]
您好,不知是否能向您請教。' u6 v- a- N3 t; k* n& q9 ?: J
目前和宋修賢老師在處理Ardui Car
; l3 W8 [; l* I) |, e雖然已使用較繁雜的方式處理了跑出黑線外的狀況0 @! f  O- }1 S! m" g( W
3 p5 v& g: u* o* V, b
但基於想追求更精簡的程式所以還是想請問一下
: }9 Q  G( c9 r9 L就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝# [- v. l5 T. y8 c# x3 F- t, [
不知道您是否願意教我可以如何處理
/ s/ u% D$ [5 X0 m3 D* ^4 ^5 t* {7 B7 P0 @

5 n7 z* w# o& t. H' [以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ! }( ^1 H) l/ q
  2. double CNY70Val = 1000;
    : I6 d! B4 }, ]% w* P& e3 B
  3. int interror = 0;0 w+ M$ l4 @8 i# ~1 p8 k9 T
  4. int olderror = 0;* m( u, X! H. s! a5 I1 j0 u
  5. double values;
    5 q) F8 x  v6 W3 a# H& R6 o0 B2 k
  6. 6 y* a6 A% B& K( M+ N. ~. s) v: d
  7. ; z# X( V# h0 \: o
  8. void CNY70()
    / j8 s2 V  m* L9 _
  9. {7 E; r) l0 \1 ~; C4 S
  10.   valuesRR = analogRead(RR)- U5 `( q/ t; f) |
  11.   valuesMR = analogRead(MR);" A& ~% J# L1 |- }# |! M/ K
  12.   valuesMM = analogRead(MM);
    % \5 S6 s) }4 i0 u- S
  13.   valuesML = analogRead(ML);  ]) H( j. d6 R
  14.   valuesLL = analogRead(LL);
    5 I0 \0 W4 m# n7 a" H# _5 |0 e

  15. , |6 _: s: S) d# p& b1 _; }
  16.   if (valuesRR > CNY70Val)4 G8 N  A4 Z8 j$ l# D7 h
  17.     valuesRR = CNY70Val;
    3 r( i3 M9 z! z0 @% ~
  18.   if (valuesMR > CNY70Val)
    ' M: W. j0 V1 L0 [( [/ q
  19.     valuesMR = CNY70Val;' }+ _8 ^: }8 s5 ^6 ~
  20.   if (valuesMM > CNY70Val)
    9 z: z: v6 t) b8 `, C* P+ S9 |2 J6 v
  21.     valuesMM = CNY70Val;8 C% T' p9 b9 @! V
  22.   if (valuesML > CNY70Val)
    6 C) d2 A0 V/ Z; a
  23.     valuesML = CNY70Val;
    - Y5 R# n% ?, _7 H8 A& a1 H
  24.   if (valuesLL > CNY70Val)
    5 P! J' ]) \0 \: `0 p6 s
  25.     valuesLL = CNY70Val;
    . a2 B3 |  `' {1 v. r

  26. + n5 ~: D! S/ o1 p$ q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    . e) ^, `, T" e* ~4 T& B
  28. }
    + _1 {7 l. S  ?

  29. 6 I8 `9 Z7 o9 V1 E0 ]5 D7 L% _
  30. void Car()+ L! ]' C9 n( q& x
  31. {
    2 }5 X) `7 S, {6 t
  32.   while (1) {3 p+ }0 w6 \( Q" q
  33.     CNY70();
    % p2 m2 p0 X& G/ I2 V, J) g! q

  34. 8 E# V' l5 y' ~6 y; d  b6 j, o
  35.     int error = ((int)values);4 V7 j/ x$ ^4 y: ^0 R) p- W
  36.     interror += error;' f4 I, J1 R6 z5 J7 g
  37.     int lasterror = error - olderror;  ~- v  |% J' R3 K9 y
  38.     olderror = error;
    5 M# V2 q6 x4 I# _9 J0 q) L
  39.     int power = error / 5 + interror / 10000 + lasterror;
    5 [2 l( @- g: U6 j, e
  40. . `5 Q2 k. E# Y% K( g$ q
  41.     if (power > MotoSpeed)$ ~) h% |/ e2 y2 q) z
  42.       power = MotoSpeed;+ D" K& @# t: R  T
  43.     if (power < -MotoSpeed)( _0 i1 W1 p3 T) ^
  44.       power = -MotoSpeed;" W/ g5 i4 O# ]# q9 y
  45. % q3 |- x* ?- N" j+ D% a
  46.     if (power > 0)
    5 X, X8 o4 M# K/ H$ P
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    , K( }& j. r8 z7 K6 ^
  48.     else
    3 h' F- h# k& ^; _
  49.       Speed(MotoSpeed + power, MotoSpeed);
    5 K, ]/ U9 E8 }; y, \5 d
  50.   }
    " y$ |2 u5 q8 K
  51. }
複製代碼
8 G9 |4 }( l9 W; A  J/ ]

9 n- q1 {/ e' D- ^( a
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-6 14:09 , Processed in 0.029469 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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