圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21726|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    7 Y! Y) Y* i5 x; K+ P  V" R( T; X
  2. #include <Wire.h>7 f- p& d% ~3 L7 R* d
  3. #include <Servo.h>
    2 N, m5 k% }( ]7 j

  4. 8 K2 Q- A+ S! h3 F5 l* j; F! Z
  5. #include "MePort.h"3 _: O2 ?6 }4 H2 {
  6. #include "MeUltrasonic.h"! ~3 Q$ n$ u( U) k6 v
  7. #include "MeDCMotor.h"* T& F6 U+ f! k6 ?% B3 ^4 [

  8. % u; c/ y) i) d  M/ ^
  9. //double Input, Output ;$ y4 H, l2 e& _- F
  10. float MaxSpeed = 255;
    ! b: M2 W4 _7 k' W! \* _
  11. float MaxPower = 180;
    0 O) m: W7 x/ E% ]& P0 }) Q
  12. float MinPower = 120;. L) D, V+ A) F; Z( r: K
  13. float Error,ErrorAcc,ErrorDec;
    ' a6 g+ k  R' [
  14. 6 G: F( S- V9 N- Q; M7 m
  15. float Kp=0.14;% d1 I9 l, A, V' p0 M
  16. float Kd=0.00020;//23;
    5 f9 a; c* ?/ V2 @+ y1 Q
  17. float Ki=0.000201;: _, ^( r- X! x/ K0 l# _

  18. + }/ R2 `6 x+ y- M  m
  19. float nPower;/ S0 J& R- ]$ O( @6 d
  20. MePort lightsensor_6(6);
    : |* [1 K1 o# s8 y% a: v
  21. MePort lightsensor_8(8);  M9 n$ K3 u: O, k0 U& f
  22. MeDCMotor motor_9(9);
    % J, p5 Y3 M; C8 `; u
  23. MeDCMotor motor_10(10);
    # o  m/ F9 H7 V$ n" v
  24. unsigned long previousMillis = 0;6 U$ L8 s- ]; ?4 F8 G' Y) \/ e9 b
  25. const long interval = 1;
    4 \" g, C! }3 A' W/ H$ p- ~2 v: ?

  26. + @" g5 ^, b5 l' Y  j" y  G! j, u
  27. void setup(){
    " |: r5 t8 h5 x! |% T
  28.     lightsensor_6.dWrite1(1);
    2 q' Z  T8 }8 \" ^$ l3 Z- Z
  29.     nPower = 160;1 ^. Q# a" e0 G* v9 K0 q7 A
  30.     Error=0;1 u& Q3 `0 d8 X% |4 v
  31.     ErrorAcc=0;
    7 L2 T: `. [$ v" _. Q, r
  32. }; F$ @& b& b* K" Z. A! Q
  33. ! g% m- M% T- Y9 p2 p- s5 H, B2 G4 S
  34. void loop(){
    ! r7 M! C! y2 l7 `! ^4 S
  35.   unsigned long StartTime = millis();: i3 r/ {  L; X6 j+ A
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){* c# v) Y9 A; D/ ?! E; @7 v4 Z$ _
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();& j0 S, e  B, R9 v. r
  38.     ErrorAcc +=  nError*Kd ;+ C+ E! |, W! w4 x1 T$ M
  39.     ErrorDec -=  nError*Ki ;
    8 |6 s, X  ]) R7 O" K- }! _7 S5 J$ J
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    $ I, }" t7 y8 p3 E# m% G
  41.     if(nError < 80 && nError > -80){4 ~* e7 ^0 B/ z. a* h$ b$ v0 H: B: s
  42.       if(nPower < MaxPower){% J2 Q9 ]) }% T1 L! k" {$ v
  43.         nPower += 3;* A8 f2 a: H* b) u9 k6 x( U
  44.       }2 s" E, n, O4 g8 y( ]0 y: Q1 K2 [8 T
  45.     } else{
    9 K1 F# g3 L$ P$ W
  46.       if(nPower > MinPower){4 f" l, L; l2 M4 H2 ]+ V* T: \+ q5 w
  47.         nPower -= 2;
    " I3 P4 e2 u% W. ?5 h" T
  48.       }
    + W0 @) a* r4 o, n9 H" C, d
  49.     }
    # |1 a$ \# }" G. c7 B
  50.     MotoL(nPower-Error);/ [5 K5 ]9 ~9 m+ F4 G& V
  51.     MotoR(nPower+Error);    1 V0 U8 c% G) D, o: u) H
  52.   }else{# p; L0 b/ r6 D- ^  }, a
  53.     motor_9.run(0);  p$ S  a6 I! Z/ i( o
  54.     motor_10.run(0);& s; J2 L6 U$ m3 P/ L- o8 |+ @
  55.   }9 A3 p' i, e$ V% H
  56.   do{}while(millis() - StartTime < interval);  ]( ?' C; [1 b& r/ H9 W, B9 J
  57. }+ |9 K/ f' G" N" f: O7 i
  58. 2 [6 Q# O4 X8 C( ^# x! M! }& Q
  59. void MotoL(int Power){
    , {9 b8 |( S, Z- R5 ]* z* Z0 \
  60.   if (Power > MaxSpeed){
    0 S$ r0 T0 k9 h
  61.      Power = MaxSpeed;3 t) ]0 b; x/ y! g$ b) |3 B7 W
  62.   } 8 r3 G3 U6 B+ B) N; V2 L6 {
  63.   if (Power < -MaxSpeed){: H7 l/ k  b  s  P
  64.      Power = -MaxSpeed;
    * Z, E  q, X; @$ H/ I" H
  65.   } ( H! {$ H2 t7 b5 |
  66.   motor_9.run(Power);
    & V& t5 w3 }8 M5 A. q( r' r. ^
  67. }  
    5 @$ D& q. }$ }  ~6 w

  68. 0 A/ {0 s0 m: v! L, E
  69. void MotoR(int Power){
    , p2 ^3 U/ I2 l/ d4 ~
  70.   if (Power > MaxSpeed){
    1 [  [6 }0 ^6 x5 \" ?4 C
  71.      Power = MaxSpeed;6 d, c: Y* ], n8 ~& g2 }9 O7 I) G
  72.   }
    # D' A5 S8 v- D& F/ e. k  D; a9 L
  73.   if (Power < -MaxSpeed){
    & y, k; m( t( c# J  u, {9 f* c
  74.      Power = -MaxSpeed;
    9 n9 b  K8 e2 M8 G7 D! v9 n
  75.   } 4 y! }3 t5 T/ }( l
  76.   motor_10.run(Power);4 ]! q: l6 U( J
  77. }  
複製代碼
4 t% Y) ?# }' F) k( ~8 g9 G

5 I. J" W7 O$ {9 B4 {
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
. K& F0 c& D+ d7 C6 w7 I- l6 x+ [! z( _
您好,不知是否能向您請教。
7 }4 a% L1 j% L4 h目前和宋修賢老師在處理Ardui Car
/ f6 ]. N% ]* z$ Y( C2 W& E6 i雖然已使用較繁雜的方式處理了跑出黑線外的狀況
5 V" F- M. X; l8 v  [1 u6 z+ R. |9 E/ B/ G0 [1 ^: U
但基於想追求更精簡的程式所以還是想請問一下
0 l! Z  F: Z+ K/ }. g9 T  [$ R就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
3 f, {: a6 s: D8 x3 z不知道您是否願意教我可以如何處理
) ^5 m4 O. x% l" M- [* D8 Z( p8 H5 D+ q* W

  L! ?5 [/ {& t( K以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;$ y% g6 S1 o* e& b  _9 U
  2. double CNY70Val = 1000;0 |1 k4 O) P0 O( t9 k" D
  3. int interror = 0;
    2 u  b+ m$ }" V* `
  4. int olderror = 0;* h8 y9 ?1 M- f, ^$ W- I5 D" v
  5. double values;* r5 N( `9 Q. e1 W, R* _

  6. ! q5 E/ N2 s) l5 ~; m5 A

  7. 4 z6 g% @. V! [6 |
  8. void CNY70()2 @  D+ ]( o- e; x
  9. {2 m5 ?! c' T2 [) b+ ^+ D
  10.   valuesRR = analogRead(RR)
    + Y: y/ e4 f8 o) U! q9 c
  11.   valuesMR = analogRead(MR);
    2 K  s# }. h/ D* m0 v
  12.   valuesMM = analogRead(MM);8 q$ X% g1 }4 Z2 G& b
  13.   valuesML = analogRead(ML);3 ^; u+ l, }$ P  [, z
  14.   valuesLL = analogRead(LL);
    " L3 S1 `. ^7 I2 R% d$ m

  15. * M& B) `  S( b0 u  z3 l' |
  16.   if (valuesRR > CNY70Val)
    5 w; a8 R& }* C+ p# c, \* Q: O
  17.     valuesRR = CNY70Val;" v  k, B- @' h1 u, n- w5 W1 \
  18.   if (valuesMR > CNY70Val)+ I' n. m' r" U# \- Z2 a
  19.     valuesMR = CNY70Val;" W- [, U6 j* w2 t1 ]: X. u
  20.   if (valuesMM > CNY70Val)% \8 A( D0 ~$ w7 n; _% G
  21.     valuesMM = CNY70Val;
    5 J, D# t! z' u  C9 ~2 `8 n( ~
  22.   if (valuesML > CNY70Val)  k: G" P! i9 |* j) z: b( n: E; v
  23.     valuesML = CNY70Val;
    ( n4 X. N- v" F* n0 x
  24.   if (valuesLL > CNY70Val)
    3 G9 y: S  X- j; V# b2 [+ b2 u! H
  25.     valuesLL = CNY70Val;0 Y2 V& z) I5 O5 E. P* U2 A* T# J

  26. * C8 z/ U" ?* S/ m& D
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    , O7 l/ ~6 S) H  o
  28. }
    6 p7 N! l! h' o7 J* K9 t. W2 a

  29. 1 l" J  l1 c3 Z1 q$ \9 u
  30. void Car()
    2 S; \' b7 e4 M' f( o8 F( K
  31. {
    ; A, y- g& l; d) X" J( m
  32.   while (1) {3 \' Y: u) H/ H, c  A
  33.     CNY70();; Z' Q+ i9 a- C4 s: a, G% z) ?3 j
  34. * a' a! y  K  x- ~1 O
  35.     int error = ((int)values);5 t+ |2 ^' r1 {; h' ?9 G! D
  36.     interror += error;
      ^& T1 S7 ~& }. P' f; v2 Q
  37.     int lasterror = error - olderror;
    # K% M, G4 ]8 [" V0 u9 P4 S
  38.     olderror = error;; T1 Z2 ~. L& D. x! c/ f
  39.     int power = error / 5 + interror / 10000 + lasterror;$ k6 h4 `/ k4 |8 k# ]' w

  40. + s8 {( a& N/ i* ~* Y& s$ g
  41.     if (power > MotoSpeed); J  N- N* i4 i
  42.       power = MotoSpeed;
    2 \9 @3 O: [& q
  43.     if (power < -MotoSpeed): N  Y5 r) N" E" g; H
  44.       power = -MotoSpeed;
    ! J  Y3 r! v, v* v$ G

  45. 9 d/ q; W8 _, ?1 h/ F( P
  46.     if (power > 0)
    ( J/ d: G; `( n) Y+ }
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。* l8 R& W: G- _7 h" r, V( r
  48.     else/ i! H4 ]) F9 [5 u( Y
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ( P4 z3 L+ k$ ?! w1 z
  50.   }
    0 `  L3 l& E+ z* Y% j6 W
  51. }
複製代碼
9 }( s& Y& j/ n  I) ]& |
9 y$ \- b$ `; N7 O1 ^+ o
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-27 13:04 , Processed in 0.025968 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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