圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20347|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    0 h0 y* w9 ?5 X% Q  z
  2. #include <Wire.h>9 n" O3 [* p- ^$ d
  3. #include <Servo.h># [; k- l$ |: K

  4. $ t3 q( r9 Y& p6 y5 b5 D" V
  5. #include "MePort.h"/ X( r% k7 ]3 Q; q
  6. #include "MeUltrasonic.h"1 X5 M: g% n3 e8 H
  7. #include "MeDCMotor.h"8 E/ ~% N0 n7 J9 }( y$ ~& n, ~" j

  8. / A) n/ z) c. m( Q, g# H, }
  9. //double Input, Output ;
    & ]( G; A; @3 H8 y
  10. float MaxSpeed = 255;
    9 h9 \8 p+ @. |  T
  11. float MaxPower = 180;
    # o/ }) ~0 A1 [; A5 K/ P" j
  12. float MinPower = 120;
    + ]9 o) y8 j4 B* A- m2 e
  13. float Error,ErrorAcc,ErrorDec;( j& ^5 y8 }7 e7 v$ v, _# A. b4 v0 f

  14. 3 p: U2 g; p7 c& ^
  15. float Kp=0.14;
    + X$ z7 E# T% F4 E# F3 s; |
  16. float Kd=0.00020;//23;/ G$ N' x" z3 I* O7 a: g
  17. float Ki=0.000201;) _* n) N; c9 M3 l& y4 H' |# u" M
  18. . K% Z9 Y: }5 ?# v
  19. float nPower;$ X. Z1 o: [0 n# G+ e
  20. MePort lightsensor_6(6);
    ; A4 `; ~+ A  J% b$ b
  21. MePort lightsensor_8(8);
    ; {0 F' j' ^1 W) s/ e
  22. MeDCMotor motor_9(9);6 l  u. b0 D! u* Q
  23. MeDCMotor motor_10(10);
    - J7 o# f: `" ^( P9 C8 ^; p* J0 b
  24. unsigned long previousMillis = 0;
    5 v7 h) s3 M9 ^6 G: z
  25. const long interval = 1;
    ) m( ^, j- D, Q) x4 ]8 {8 j9 T
  26. 8 f, e4 Y( l4 ]% P7 d( [( {1 X1 t+ T( G
  27. void setup(){7 X1 f& `4 j) y, b* S
  28.     lightsensor_6.dWrite1(1);9 Y5 @& K: t5 ~1 a9 ]
  29.     nPower = 160;: o2 m$ z. L2 [! c
  30.     Error=0;
    1 E/ U/ L: p- u$ j0 O6 m/ H
  31.     ErrorAcc=0;9 w) {( i0 j+ }  O$ M
  32. }
    & L1 x& q: D/ C, [. \( f7 P
  33. 8 D+ ^2 e# g* g& b
  34. void loop(){) R' c5 S$ r9 J7 X, X7 [& \/ ?  G
  35.   unsigned long StartTime = millis();4 |3 o2 F* R. C2 `/ l( ^' C" L
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    ) L8 F4 O. K4 q& f
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    9 l4 h( d0 i+ a
  38.     ErrorAcc +=  nError*Kd ;
    7 X% z9 m3 A0 L6 G# b
  39.     ErrorDec -=  nError*Ki ;$ D/ ^# b; i7 t! Z7 U- @% P
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    2 T# c; T. P) a  Z. q( ~$ Y
  41.     if(nError < 80 && nError > -80){
    + R: G; H% r; F' w9 ]
  42.       if(nPower < MaxPower){0 t  E, C& m# u$ y" [
  43.         nPower += 3;
    , [# ^6 u; a  U, R# N, ]8 }
  44.       }
    6 b( c3 R. ^# m2 T3 a
  45.     } else{
    & m/ ]9 b: `& O/ [
  46.       if(nPower > MinPower){# {+ G/ I2 \) I3 Z/ X$ ^0 I; H. V
  47.         nPower -= 2;9 X8 b6 C, U  F+ M
  48.       }: j) l" P1 Y- O" }0 @
  49.     } ' j4 M, K, Y5 y! M7 I
  50.     MotoL(nPower-Error);$ p6 n- p/ ^1 I! k( ^
  51.     MotoR(nPower+Error);    : H6 A2 @( s  G6 Y  A( s' J
  52.   }else{* d$ P$ l# o3 i/ j) q8 G
  53.     motor_9.run(0);$ [. B# s; x6 t2 W1 H; @) C, ]
  54.     motor_10.run(0);- x+ l3 a+ Z6 C* N* B
  55.   }
    0 n5 A% M# m+ _5 g6 S
  56.   do{}while(millis() - StartTime < interval);
    & W0 T, I$ ?% C8 ]" ]! V" {0 e
  57. }
    # r$ k$ O6 N# d* z) V3 G
  58. , Y4 I/ ]) z& w& X& M9 K
  59. void MotoL(int Power){
    - m0 q3 P5 `' E  m9 l3 B( c
  60.   if (Power > MaxSpeed){
      c  L# @6 D$ o# m1 r5 |% j
  61.      Power = MaxSpeed;1 i4 S$ L# G0 q2 Z
  62.   } 4 i9 e- d8 o3 R6 Z
  63.   if (Power < -MaxSpeed){
    1 @' s5 A1 Q+ q$ u. O' x: i
  64.      Power = -MaxSpeed;+ ?& X- m/ c/ P" g9 T7 o
  65.   }
    - F; _3 l  H! k; S
  66.   motor_9.run(Power);  _' D) g" Y; O# k. z
  67. }  " F$ q) l$ m  \8 [7 R0 M# f
  68. ) _7 l8 c- u+ G, N$ u- ~% G
  69. void MotoR(int Power){
    0 X) c- \" N& ]# Q: m7 a
  70.   if (Power > MaxSpeed){
    ) `# x" ^0 C8 P% r1 C
  71.      Power = MaxSpeed;" j1 L- z1 K$ b& n. p3 b
  72.   } + I- E9 M. Z/ D& E7 h' E, j
  73.   if (Power < -MaxSpeed){
    5 x1 T2 |1 ~1 A$ \' r, z
  74.      Power = -MaxSpeed;% U3 S- o* U6 c  v8 U
  75.   }
    8 ^, N6 S. t$ U" m, I2 B- [
  76.   motor_10.run(Power);# s# f: |6 |5 Z$ a  Q- d
  77. }  
複製代碼

% J$ E3 M7 F6 ]* L" i* ~3 U3 r2 c0 Y/ {: _
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
! M/ e1 H, ^$ t- z- A& ]9 \; D  `6 O5 Z7 [* s: r1 n- }5 G; b
您好,不知是否能向您請教。6 x: J+ J( U6 G3 V1 y
目前和宋修賢老師在處理Ardui Car
1 H; G. D* u' L2 X, P9 G7 l! ~雖然已使用較繁雜的方式處理了跑出黑線外的狀況' X5 Q+ x7 x4 {& C  G6 y
1 I  [  F7 [. ^5 ~  O+ W+ c
但基於想追求更精簡的程式所以還是想請問一下
9 a+ Q6 S- N) A, M2 Y4 P就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
$ J7 }( _4 Q+ F7 k! M! O/ M不知道您是否願意教我可以如何處理
; W2 F, h* p' u8 B- w0 p7 O6 r  F/ G0 U  n9 n& {( P

- u0 l* k3 b9 n4 C  _3 z) ?, {以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;4 @. Z; x0 y4 h! t. C8 Y2 y
  2. double CNY70Val = 1000;- U8 O4 z3 h/ H$ W: h
  3. int interror = 0;
    9 a- D: I9 F4 V7 T+ z4 e! U
  4. int olderror = 0;
    + J0 r$ {4 A; d9 L0 |% j! B
  5. double values;
    ' M' `+ ^1 V" C& l" f4 V" Y
  6. ; _7 @4 r# X9 `2 j$ t& T

  7. 8 m: D7 D. _+ p; v; Y1 ?
  8. void CNY70()/ S5 G  V$ m: M
  9. {6 X4 h4 N* P& \) S; v6 N: F% p
  10.   valuesRR = analogRead(RR): B  L, J2 H# p7 m4 k
  11.   valuesMR = analogRead(MR);
    7 J# h0 O: C2 v& w: X- A7 Q- K
  12.   valuesMM = analogRead(MM);
    9 |8 E8 G- v+ m. v
  13.   valuesML = analogRead(ML);
    2 `! Y# v5 d: _
  14.   valuesLL = analogRead(LL);
    8 Q& n$ |& I/ K% a& S
  15. 2 z# W9 c0 H3 a) J- a# {
  16.   if (valuesRR > CNY70Val)" ]3 }0 U( e* E
  17.     valuesRR = CNY70Val;! B8 G( m8 q! k, p! p" |# P
  18.   if (valuesMR > CNY70Val); f5 r# _4 M. G, ^. U
  19.     valuesMR = CNY70Val;
    7 ?: R; w0 Y2 P, e8 ^* i
  20.   if (valuesMM > CNY70Val)6 y/ N; r2 f) E
  21.     valuesMM = CNY70Val;, v, F. u# H$ l, C) p; I
  22.   if (valuesML > CNY70Val)
    ' A7 ^# n5 @! t
  23.     valuesML = CNY70Val;
    $ k$ m% B. [" e3 i1 s
  24.   if (valuesLL > CNY70Val)! w: T9 P: g. ~6 i
  25.     valuesLL = CNY70Val;0 M* j5 B( W# u/ O

  26. ! c, V- J5 q' V9 a6 Q" x4 ?& m6 ^
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;" G0 j+ N; Q. ?. G5 D
  28. }
    ! |7 b+ l; ?4 s4 W4 d  s' S
  29. - L! `9 K# E( Z# U0 Y' T
  30. void Car()
    0 }  _1 e& W6 p; t0 j
  31. {
    4 U' n$ Y+ @$ U+ }9 U! Q4 T( W
  32.   while (1) {
    , J& F! d% [, N3 z. [8 J
  33.     CNY70();
      G8 n+ O& l9 @1 d% ~6 j' d) e
  34. 4 u$ p, M6 x. ?+ s- w" ~3 a9 z
  35.     int error = ((int)values);
    ) o2 x, V; C3 U' [5 F' d
  36.     interror += error;
    / V6 n- [) k# w2 \/ Z9 T4 x
  37.     int lasterror = error - olderror;
    9 N& i, N/ j, \! l( q9 q) G
  38.     olderror = error;5 v7 `$ m8 e5 X% i: z; C
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ' t! J0 i6 [3 R4 a) d
  40. # o8 E: w4 [% Y* R; Q
  41.     if (power > MotoSpeed)
    + Q3 Y$ G/ V7 E: O. z
  42.       power = MotoSpeed;
    % `: c$ h. b  u5 U; [
  43.     if (power < -MotoSpeed)3 ?8 M+ s, Q4 i, p& D
  44.       power = -MotoSpeed;
    , Q, A1 z9 b8 `2 }$ [

  45. ) b9 D7 m# G- B  U* u" ?) f3 G7 k
  46.     if (power > 0)
    . G. ]' o, ^! r# {  @- @
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ; O! X; {7 y1 \7 d0 q
  48.     else
    3 ^* S( o+ ?  D  k8 q
  49.       Speed(MotoSpeed + power, MotoSpeed);
    4 [5 y4 t. U9 Z& ?. G
  50.   }) E3 \0 R( Z/ ?4 j
  51. }
複製代碼

* r$ W6 f# I; t: J' w/ i0 X  C* Q/ l. P: s9 ]% S5 M3 K. y
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-2-19 06:08 , Processed in 0.026642 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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