圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21785|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>. ?- G2 M- Y( ^7 W6 Z
  2. #include <Wire.h>  n9 W9 [+ ?1 E$ s# D2 K
  3. #include <Servo.h>
    6 v3 N' f8 k  `1 D: r" E, p

  4. 1 r* f# e& k$ X
  5. #include "MePort.h"; O3 k6 ?1 R2 B( z3 `) Z/ \
  6. #include "MeUltrasonic.h"
    * q. s" y% ^8 J4 s
  7. #include "MeDCMotor.h"  p# U7 g: l3 V

  8. ; ]& i8 k" ]- r; R0 s
  9. //double Input, Output ;
    ) R9 [1 _/ P" P+ K7 ^
  10. float MaxSpeed = 255;& o% Q% S1 d: ~& s( H
  11. float MaxPower = 180;  l( A! E! c5 C
  12. float MinPower = 120;+ o# K( R: a# ~/ T+ u* S7 r4 T
  13. float Error,ErrorAcc,ErrorDec;
    1 L2 s2 J( u. A) k# O( M' B

  14. 3 a0 I2 X: b$ P2 _/ s
  15. float Kp=0.14;; H# _* r% J8 ?2 Q6 Z/ H, r8 B
  16. float Kd=0.00020;//23;2 Q8 X- W: _( `1 K
  17. float Ki=0.000201;
    / u; Q) I9 A, S" n

  18. ) r, U" j1 ]5 N- W2 s) o
  19. float nPower;, h3 C9 h, d* Y
  20. MePort lightsensor_6(6);
    " z: ^/ b2 H6 r
  21. MePort lightsensor_8(8);
    - ~. u9 d& X6 U- n: ^7 X1 X
  22. MeDCMotor motor_9(9);' h. A& C9 a: L: f9 |& r
  23. MeDCMotor motor_10(10);) e4 r9 P' e9 w+ m' u$ S
  24. unsigned long previousMillis = 0;$ l  W1 \: O' Y3 x$ J" J( r2 R
  25. const long interval = 1;3 F# ^! G1 @/ B: f
  26. ; T, ^( o2 m$ x3 i; ~3 n+ U
  27. void setup(){
    % H" Q$ J+ |5 O/ \5 W! ^; t7 Z
  28.     lightsensor_6.dWrite1(1);( R& y- A7 `, F" K
  29.     nPower = 160;
    9 O, Z5 i0 q8 F6 [. J
  30.     Error=0;
    5 z# y. @( D2 L8 `0 d) B# }- U
  31.     ErrorAcc=0;
    % V" f3 {& J$ w" {9 L' s) |
  32. }
    : S/ H  N  F* D% o. c3 w
  33. & P" T! \) B) P& P
  34. void loop(){
    7 V1 M& G+ c+ U8 T% J$ Q
  35.   unsigned long StartTime = millis();
    / O  h" D7 Y4 R* M( z! ?9 h5 i
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    - Y: G, J7 E: g6 P) Q: ?
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();  `8 p9 n. @: A
  38.     ErrorAcc +=  nError*Kd ;
    % h7 S$ O, j- p* O9 j+ S, k7 u% e
  39.     ErrorDec -=  nError*Ki ;1 O: f3 I8 [0 r0 ?5 ^
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);- ]. L' N, w* j- f. {' |; {9 u
  41.     if(nError < 80 && nError > -80){
    + v1 F% \4 q+ [
  42.       if(nPower < MaxPower){
    3 p6 @$ I) }1 b
  43.         nPower += 3;
    * J! o% U6 m+ Q. W! @+ C  Y
  44.       }' w' u# u1 R$ E, s& h
  45.     } else{
    + H3 Y' y0 q% K1 ~# z% V$ I
  46.       if(nPower > MinPower){" _7 J6 {4 u: ]0 }+ T
  47.         nPower -= 2;$ a1 E6 s) [% O  B
  48.       }, x+ E- K" C8 W" m
  49.     } ) _7 j1 K- S/ ~! k$ _2 a
  50.     MotoL(nPower-Error);5 N6 {5 @$ b, g6 U: e
  51.     MotoR(nPower+Error);    " n- L' c. C( T2 e- S* {# L) N
  52.   }else{
    . f' |) ]8 `+ G
  53.     motor_9.run(0);- c9 c1 h! V7 U+ f2 T
  54.     motor_10.run(0);7 f7 M: j; L3 |7 a% @
  55.   }5 C) {1 _6 f. c, d$ T6 \* r# x9 q
  56.   do{}while(millis() - StartTime < interval);
    ' i7 ]) [! ^5 R/ e
  57. }
    & X- N: D9 ]& `  P+ a
  58. + t+ e- @" A* E! b$ e
  59. void MotoL(int Power){
    + I' x/ n$ D5 q3 b, z) u
  60.   if (Power > MaxSpeed){1 {2 Q% z) P& {3 x0 ]
  61.      Power = MaxSpeed;$ B4 v2 }: y* U$ x5 R/ @5 R) c
  62.   } 2 y& Z. z# j3 ]  F! T1 J! d. N& O
  63.   if (Power < -MaxSpeed){
    - t6 H4 u8 U3 M# L: F1 v8 I9 H! V
  64.      Power = -MaxSpeed;3 g9 r7 X7 X5 @" N3 n0 m: S
  65.   }
    0 l; o/ Q* H, d- s0 |5 _; M. D9 c, I
  66.   motor_9.run(Power);, F$ Q2 ~' _; Q- N
  67. }  
    + n, }! k$ V# y8 E+ p
  68. + y$ O! M9 L' J" m* I' h
  69. void MotoR(int Power){
      R9 r0 V0 f* U. c/ o* e' d
  70.   if (Power > MaxSpeed){# s  H. I# Y. {5 ]) z: m
  71.      Power = MaxSpeed;( l% e. G& `5 u& l. }; I: Z! I
  72.   } 3 m( ?* ?! F# ^8 s
  73.   if (Power < -MaxSpeed){* c3 G0 n- Q1 i- Q" T) A6 y
  74.      Power = -MaxSpeed;3 c7 F3 ~) E$ w  f# f; @$ l) L
  75.   } 4 h. F  Y7 N5 p8 [2 V0 ^1 n$ `
  76.   motor_10.run(Power);4 n1 E" }: r! L+ d* k
  77. }  
複製代碼
' N0 l/ B0 |) I! q& @

8 X9 C9 U7 K& _9 \! ?8 B
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 s" t; I+ ^  L; G8 j8 w+ R) s5 t1 ?  v. q  S
您好,不知是否能向您請教。( Z; Y0 s: k& u; n. }# y
目前和宋修賢老師在處理Ardui Car/ J) r6 u# o& l3 f0 k6 h2 i8 a' q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況$ c& |: Q; t- M& r
+ H4 u& x% s( h" B( x& p
但基於想追求更精簡的程式所以還是想請問一下0 v3 ?/ J- h& C( D' x
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝( r/ n+ h4 o, l# s0 N3 Y, H
不知道您是否願意教我可以如何處理
7 v1 I2 q; `$ q8 u$ X! a$ K3 ]2 n  M8 N: j7 k$ a  k  k

$ D6 X) Y5 t) u% ?7 }; t6 Q以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    2 T+ h0 h. v! F- j4 y+ \
  2. double CNY70Val = 1000;* M, ~/ z: ^& N* @$ ~$ O7 a
  3. int interror = 0;
    : _+ @" ?9 P6 k5 A0 c5 Z& n
  4. int olderror = 0;
    : U0 L( H( n3 d( G% Z
  5. double values;7 _" o: D3 b, ^, _9 R

  6. 6 W" a4 \' e" Y+ z* F# t  v% S  X

  7. , d( A1 r( |& e) Q
  8. void CNY70()
    $ @9 G: e- O) i  ^1 L# x
  9. {5 T1 U( \2 }2 V
  10.   valuesRR = analogRead(RR)& a6 h9 L% d0 d& G; p
  11.   valuesMR = analogRead(MR);4 |/ d& R. _/ v( a9 K& Z, \
  12.   valuesMM = analogRead(MM);
    ) r( @! `' z! D) T# A
  13.   valuesML = analogRead(ML);* O5 T1 U; g5 [9 \5 z) {! B5 ?& }/ z
  14.   valuesLL = analogRead(LL);) x7 o7 w! V  m/ V, F- v
  15. ! s, ~% u5 F5 c( y
  16.   if (valuesRR > CNY70Val)
      T% `; s4 Y- A4 L  `6 l$ w
  17.     valuesRR = CNY70Val;
    , ?' y0 `$ g' r! U% e( w( \, D
  18.   if (valuesMR > CNY70Val)6 J' d- t$ o! ]& x( L
  19.     valuesMR = CNY70Val;
    % k+ t" }, N: {3 e5 s5 o3 a4 L
  20.   if (valuesMM > CNY70Val)
    ' Q- l. B2 g6 ~& \
  21.     valuesMM = CNY70Val;, k8 I$ _7 K6 K7 {
  22.   if (valuesML > CNY70Val). J+ i. E8 z$ W
  23.     valuesML = CNY70Val;% X, W& G8 K% h1 T2 n
  24.   if (valuesLL > CNY70Val)
    2 m' e- l5 j# S* T
  25.     valuesLL = CNY70Val;) a' v4 B# ~. U- \0 H
  26. 8 b& {$ ?8 A, P  |
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ! ~5 a; F  D! Q
  28. }
    4 D  }$ C+ W1 \* U# R/ F

  29. , ~- [$ t6 _# J5 w  ^9 ~$ A9 U. ]2 m
  30. void Car()  J( |$ L: Z/ L6 d, T
  31. {
    & q  r. `) o0 D
  32.   while (1) {
    ( [4 ~9 O8 n' j9 K
  33.     CNY70();8 \/ f8 ]8 p- j- Z; H9 a8 @
  34. & K2 A  y3 a' m
  35.     int error = ((int)values);& E# X3 Q8 W9 q/ a8 W: K- Y
  36.     interror += error;% U! [5 \8 `! }1 H# c+ F
  37.     int lasterror = error - olderror;
    8 b6 r- A* a" P1 Q  @, Y9 ~
  38.     olderror = error;! l0 v4 j; j" S: l
  39.     int power = error / 5 + interror / 10000 + lasterror;
    4 g5 L, @6 g* c/ u- Y
  40. 8 @; ?: H3 K1 H' R3 o- T7 n
  41.     if (power > MotoSpeed)* j; A( x* B( \, T; n6 o0 t9 R
  42.       power = MotoSpeed;
    0 @$ K/ X% P' A
  43.     if (power < -MotoSpeed)1 y( n8 x- [# T( m! o; |
  44.       power = -MotoSpeed;( ~% w) n$ V( z% v+ U, }
  45. 1 ^5 d& D8 ?2 q" `- Z) o
  46.     if (power > 0)( u. g' S$ a+ N) {# d: p
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。- ]0 x7 E, J* |8 L' R! I
  48.     else+ |* @% E# q) s, D, d' ?" M
  49.       Speed(MotoSpeed + power, MotoSpeed);7 k' d! k* X6 t# L
  50.   }
    . D1 p& @1 p4 Z* e1 L
  51. }
複製代碼

" D5 @) n: q+ V
! U- E% |% V2 p( E- Z
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-30 17:20 , Processed in 0.017998 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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