圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21739|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    : E, B" ^, g  a' b/ P
  2. #include <Wire.h>
    9 l" s7 z" F; U$ r7 d
  3. #include <Servo.h>
    # A# U9 w3 a6 L% P, ]1 T
  4. " Q& ]% i* T! P4 H1 W5 x
  5. #include "MePort.h"2 c8 _/ z6 y, F2 m2 m  o: X
  6. #include "MeUltrasonic.h"
      _; D% b1 T' a
  7. #include "MeDCMotor.h"
    $ _. U5 S. P+ |" F6 o8 y3 O
  8. % A& D7 z7 z# x% w; h& d0 d
  9. //double Input, Output ;
    ' q0 L3 ?0 X, K9 C6 Q/ T
  10. float MaxSpeed = 255;8 l; c4 x. T. v7 w% C% N; q* i
  11. float MaxPower = 180;
    , ^. Y3 `+ M. U, v
  12. float MinPower = 120;
    8 |4 `: _+ g% O) c% B
  13. float Error,ErrorAcc,ErrorDec;
    2 F# ?, l1 ?" I% k$ a9 |

  14. , _- P' x; V" i6 l* T  _. }
  15. float Kp=0.14;
    ' f$ N- j2 W5 n* C1 b5 L/ B
  16. float Kd=0.00020;//23;, i, U, M2 _! u8 }# [9 \: D
  17. float Ki=0.000201;6 @7 R9 v$ ]; x4 b* X

  18. - A( @9 M, O( B/ y4 L
  19. float nPower;' J" |2 _. j/ _5 M1 {$ B
  20. MePort lightsensor_6(6);" W2 v5 e$ w4 G
  21. MePort lightsensor_8(8);
    ; q* X. g0 V) G
  22. MeDCMotor motor_9(9);
    5 X0 Z- ?6 F5 ^7 x+ B  O
  23. MeDCMotor motor_10(10);& }. H7 E0 g6 N' X# p
  24. unsigned long previousMillis = 0;
    % y& P( ]1 V3 Y" W, K: x6 _
  25. const long interval = 1;
    4 P; }8 X2 T/ i9 v

  26. : O5 y1 r5 n) D
  27. void setup(){& W5 l  e( B, C7 `, X
  28.     lightsensor_6.dWrite1(1);/ R3 V6 s% @1 ?/ f/ m2 n. T
  29.     nPower = 160;
    ; Z7 w3 Z% _% F: x
  30.     Error=0;1 K& b6 b6 l5 t( w4 ~
  31.     ErrorAcc=0;
    5 `6 T8 \6 i) x3 T
  32. }
    0 X4 K4 G3 ]' t0 `" [3 F) k3 e

  33. 7 c3 F( ~; o' o+ Z# x7 A
  34. void loop(){' P9 a, C" G; y: l$ ^
  35.   unsigned long StartTime = millis();
    9 t" B8 M+ |8 i! F7 X
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    0 S, g& z. p2 [! k8 _3 p1 b, R
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();1 Q, R1 J9 h/ V& G" t  V  u# L
  38.     ErrorAcc +=  nError*Kd ;1 S. X9 G& Q( h' W, U
  39.     ErrorDec -=  nError*Ki ;
    0 ]* u+ C% {2 L+ ], j1 E
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);. W1 x6 J0 h0 v8 B0 Z1 @! E7 I0 t
  41.     if(nError < 80 && nError > -80){
    0 Q. p  O% ]. I$ r
  42.       if(nPower < MaxPower){
    2 s8 G3 R# m) v# f& A
  43.         nPower += 3;
    ; h7 u! ?6 {" r/ c$ ]& @7 p
  44.       }
    & S9 X/ ?: M4 S- C
  45.     } else{
    & N2 {& k" P' L: V) w+ n2 N
  46.       if(nPower > MinPower){
    1 a) |* d5 m! u# J
  47.         nPower -= 2;$ [! I) L$ D- h' s2 N$ b
  48.       }
    : B- J+ u2 f- E
  49.     } ) F2 N- k3 }+ Q5 _' K( W: @9 L
  50.     MotoL(nPower-Error);/ {0 @* g& O  w, b7 d
  51.     MotoR(nPower+Error);    ' h# z  @  R3 I, j/ o( k
  52.   }else{
    ( j2 f* ?+ E" Z' w+ [* O) J" P
  53.     motor_9.run(0);! o9 w3 b4 t- V3 U7 d$ w" e( m
  54.     motor_10.run(0);- N8 `% ?. w4 Y' ]; Y4 [& E
  55.   }
    . f' G: \+ Y4 X6 m( f; s% s% S
  56.   do{}while(millis() - StartTime < interval);
    9 @6 k7 e1 t: o7 E* ~( \
  57. }- R5 f$ p9 y! Q+ u1 X
  58.   a7 u8 U) K8 ^/ n
  59. void MotoL(int Power){0 b" L7 c1 Z+ E$ m
  60.   if (Power > MaxSpeed){
    6 ~$ s# o7 n6 I0 n5 W/ b' ~
  61.      Power = MaxSpeed;: N3 T) m: P+ e1 A
  62.   } " f! h3 n, q/ i0 Z
  63.   if (Power < -MaxSpeed){
    $ J! {8 K! C' w2 r. j$ E0 V
  64.      Power = -MaxSpeed;
    0 c, T$ G8 {: Y( ^: w8 D
  65.   } ! [* O' @- a/ D8 h  W" p/ X6 l
  66.   motor_9.run(Power);
    4 t  l! i4 }3 X3 ~! v+ Y
  67. }  : N- I* e  G0 [! l

  68. ; M4 l$ \! t% q' t8 S- l+ I
  69. void MotoR(int Power){
    % u7 A& l" q- j8 g# Y# U
  70.   if (Power > MaxSpeed){7 g! t& H( X+ ~! n6 Q
  71.      Power = MaxSpeed;8 r- e8 C* D( @6 Q. x5 H
  72.   } 8 W6 o1 f% K0 Y  K7 I# m* z
  73.   if (Power < -MaxSpeed){5 W7 J; r) H# j
  74.      Power = -MaxSpeed;
    * J. I* M4 |& O: i- I( i
  75.   } 8 Y+ b9 @/ K$ {
  76.   motor_10.run(Power);
    " E( {& b9 x+ r$ I& q! T+ d
  77. }  
複製代碼
! Z/ K- X+ j/ m0 ~3 y2 y

) i! q' F6 e8 Y  S& r. m6 U
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 3 E2 V/ A) n' w$ ]- c
$ e0 Z$ ?1 I4 n0 J4 X$ a
您好,不知是否能向您請教。
, p8 G/ }/ ^* `- G/ y; |2 z目前和宋修賢老師在處理Ardui Car
4 y# r: a6 G1 w5 T: ]雖然已使用較繁雜的方式處理了跑出黑線外的狀況9 c  Z8 s( |: }+ z% Z% {2 ~9 [& J% O4 j
( r1 K& ~2 D/ z. t# X  I
但基於想追求更精簡的程式所以還是想請問一下/ }* m% ^1 Q6 \% h8 l/ p
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
+ ~$ v1 m+ J! [; U# s不知道您是否願意教我可以如何處理5 a) [) f7 O  N" W+ j# H+ d5 s
6 c* u# f9 N3 B. ^; S6 q
% \5 p0 J' \; X+ n  |" R
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;. c% A1 G" e0 o6 m# q" i' a
  2. double CNY70Val = 1000;
    7 z/ c1 G% z) `
  3. int interror = 0;: L8 Y0 Q6 L- B0 g; @# U. Z' U
  4. int olderror = 0;
    , K' M% u2 I: ?( p1 J! P6 m& m
  5. double values;1 ]0 K5 s3 Z0 B( J9 d

  6. 2 a) ^1 j9 X) ]& t; G

  7.   S# W1 c0 ]% f, Q1 r
  8. void CNY70()
    - Z! t' w( p$ Z. t6 `
  9. {
    8 ]6 w7 M8 x$ t' U4 R: Z
  10.   valuesRR = analogRead(RR)( a3 {! v& U# h1 E
  11.   valuesMR = analogRead(MR);
    1 ]4 |: @. H8 g
  12.   valuesMM = analogRead(MM);
    . o. }# f4 ?/ W
  13.   valuesML = analogRead(ML);6 i5 Y+ P* A2 u$ r0 ~' a5 B
  14.   valuesLL = analogRead(LL);7 p6 a4 V5 k/ E9 L! m/ ?) v& I

  15. ) G; q  g9 o. n% c: l  |* O1 S  R
  16.   if (valuesRR > CNY70Val)
    0 X& V6 w: F+ S0 n: `5 v+ N& \
  17.     valuesRR = CNY70Val;
    / l! C& F8 S" v" z( o( n( I- e
  18.   if (valuesMR > CNY70Val)
    - @- B& j3 w2 [: V/ O% \0 X
  19.     valuesMR = CNY70Val;+ Q2 x/ ~. P3 x6 }5 S. k
  20.   if (valuesMM > CNY70Val)% p) w; G& `! p* N3 v: \: o
  21.     valuesMM = CNY70Val;- Y/ s! V; J" Q& {. \( a
  22.   if (valuesML > CNY70Val)* w0 J5 m3 Y% s3 j! k" J
  23.     valuesML = CNY70Val;6 J) _5 r# D5 \( A" s
  24.   if (valuesLL > CNY70Val)
    . q& h0 _( A4 D9 B4 }- t
  25.     valuesLL = CNY70Val;
    % K8 F& A! G! Y( }' k

  26. 1 i) \) z0 x6 \4 Y
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ; z. I* u$ y& j. _
  28. }' K, j, n6 [" J6 ^% Z1 _0 C9 \
  29. * P, q: V6 i( g& ?% {4 t) O
  30. void Car()
    9 L1 k/ ^: c& H& ^4 ?' V
  31. {% o: s6 P' i( ?# B2 @1 S
  32.   while (1) {
    5 b9 Z& g" Y+ |, r( p8 i: `- A* @
  33.     CNY70();% B9 K8 N/ L$ ^  Z- f3 h
  34. $ E; y; W- ?3 x7 B6 N, Q( f
  35.     int error = ((int)values);' }7 s( r9 h8 u( {
  36.     interror += error;
    ' g6 g; }8 J- @* m) X1 p
  37.     int lasterror = error - olderror;
    1 Y# w( m% d2 w0 M; i, E% Z+ n
  38.     olderror = error;4 y4 o7 Z: R- y# I( K, H
  39.     int power = error / 5 + interror / 10000 + lasterror;! o, U  Z6 V9 x
  40. ( K2 }' n9 S+ P5 D6 o5 t" b
  41.     if (power > MotoSpeed)& e  u0 I, _3 Q6 r: D
  42.       power = MotoSpeed;
    ( G  |6 M1 }# o' M( b
  43.     if (power < -MotoSpeed)
    ; C$ R* k! `7 M
  44.       power = -MotoSpeed;; `& D' N1 |% C3 T

  45. 7 T* c( V; f( n: C5 x5 d! t0 E
  46.     if (power > 0)# C. `$ s* A0 Q' S" y
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
      l$ i, f$ ^0 e7 p* q+ Z
  48.     else/ h1 X" l# I, K& W
  49.       Speed(MotoSpeed + power, MotoSpeed);6 j1 I: W8 @  a6 U: h2 K
  50.   }
    : a/ F$ k( f  K6 [+ [( B" v
  51. }
複製代碼

3 [- r4 r; c, e) w5 d1 B7 P' K
9 l' g8 e. l! A9 P; d* J3 @
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 18:56 , Processed in 0.023412 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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