圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21743|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>: i$ v' `, X6 }' W& ^
  2. #include <Wire.h>. r6 F* x0 ?6 \4 x1 y, ]
  3. #include <Servo.h>1 N" r) i, o$ l) T4 p- b
  4. 2 ~) C4 Z8 d2 j$ M
  5. #include "MePort.h"( \, x5 Q$ i# w* Y9 U% L) L$ J" g
  6. #include "MeUltrasonic.h"( t, c8 q# R, a" _$ H7 ], ]
  7. #include "MeDCMotor.h"1 h' D7 L* k- V5 m3 E& I

  8. , H# J% q7 {6 Z: W5 Z$ t' f. A
  9. //double Input, Output ;: i2 Q$ s( l* c1 U5 @$ v$ ]
  10. float MaxSpeed = 255;
    5 F# U) A& V; D
  11. float MaxPower = 180;" _9 Q+ c9 T% J) Y5 I* a$ j
  12. float MinPower = 120;* j$ o0 Z9 u& w; Y- s! b
  13. float Error,ErrorAcc,ErrorDec;
    6 T. I& K6 m+ W6 L

  14. 6 S( q, `& G9 j  z4 P
  15. float Kp=0.14;8 z0 Z3 ~& c2 B0 c+ s8 d0 h8 y  q
  16. float Kd=0.00020;//23;) y# m  o- }/ T8 i1 V5 E3 }
  17. float Ki=0.000201;
    * X! w( h% g, `7 t
  18. + g9 E3 g' ?3 I% N# H
  19. float nPower;
      Z, ?' E5 X0 t
  20. MePort lightsensor_6(6);
    0 ]0 g* D# G; ]- s' L& @9 f
  21. MePort lightsensor_8(8);+ }/ Q6 c( `" E; N1 e2 {
  22. MeDCMotor motor_9(9);
    5 A/ ~0 X( o# g
  23. MeDCMotor motor_10(10);. ~/ o# S3 G' V) E* m+ V
  24. unsigned long previousMillis = 0;
    % x& {; `- X+ }6 t3 L' r
  25. const long interval = 1;
    ( E; U2 e* R  h

  26.   I+ ]6 l# ]) ^$ s# R
  27. void setup(){0 N: T* `: _) D9 x' Q. C+ V
  28.     lightsensor_6.dWrite1(1);
    # d/ o4 ?& v% f  `: F% o% R7 v$ L
  29.     nPower = 160;3 y; h1 P$ U# k: b( r- v
  30.     Error=0;: i* I' e" B' d1 h& X3 c6 G' k8 a
  31.     ErrorAcc=0;# ^  m& G) [+ d  T
  32. }
    ! n$ }; R! ?9 V0 y' g( D" f- n
  33. " m% C" ^, v7 T  ^6 _! s( j
  34. void loop(){
    7 I' Q% J' U% d8 m' b
  35.   unsigned long StartTime = millis();
    4 l4 O) y  _" F+ [. j. }
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){) Y8 O( ]6 }7 F/ [
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    % x) k$ {& b1 w+ s* D
  38.     ErrorAcc +=  nError*Kd ;$ I! |. V8 f  o1 C* `+ T" n. }2 C
  39.     ErrorDec -=  nError*Ki ;& [" g! ~% I& z0 `+ U2 i$ _
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);8 T9 ~7 ^( C/ A. s2 P8 y
  41.     if(nError < 80 && nError > -80){
      X* W4 g. q2 K( A$ P+ F) M
  42.       if(nPower < MaxPower){
    1 e! l6 Q" R- U! F; k
  43.         nPower += 3;; l  a1 f$ X- g) i$ b! l" k: @4 P
  44.       }
    8 @9 H5 P; N" |) W0 V
  45.     } else{# |  K: c  k3 V# [* d' P# ^4 R
  46.       if(nPower > MinPower){
    + p: `2 c, W, f5 s
  47.         nPower -= 2;+ h2 k1 a; o: k  c0 h
  48.       }
    % a; D; u8 F" P( F" G( ^' d; n/ E
  49.     }
    - ]) B8 N# T% K/ ~
  50.     MotoL(nPower-Error);0 B$ T& Z# C) j  I& ?% `
  51.     MotoR(nPower+Error);   
    $ N) d! \3 L; F1 I! T6 E) x
  52.   }else{
      s4 S& r+ w6 I$ Q
  53.     motor_9.run(0);
    7 T- c" e( ?' m. m
  54.     motor_10.run(0);3 N6 D. ]# `/ t# F
  55.   }
    0 M; I! x- `" g/ u' u5 Z5 h' ^
  56.   do{}while(millis() - StartTime < interval);
    $ Q  ]0 _* E  C$ d# |6 `) a
  57. }$ X, b& O1 [/ W1 n

  58. 9 k0 o1 W  V" u7 a, u
  59. void MotoL(int Power){! K2 Z& h( F1 r* g( g$ i
  60.   if (Power > MaxSpeed){
    ! s* U7 K& W/ p
  61.      Power = MaxSpeed;
    , s( Z/ L% u$ }, _, C
  62.   } : b2 g  M% x( ]/ o
  63.   if (Power < -MaxSpeed){
    3 p( c  D# J% V2 ?: F$ C) e& \  T& U# V
  64.      Power = -MaxSpeed;
    . N( |6 `/ p2 A' G
  65.   } " _# q( @/ o: I7 d
  66.   motor_9.run(Power);2 D0 r. j2 {7 J2 H1 c# H
  67. }  
    " {0 p% I" a! d& O- c9 `

  68. 9 {6 G% y0 q! }/ v- c& s
  69. void MotoR(int Power){
    * x  P; x3 p9 W) h
  70.   if (Power > MaxSpeed){
    . Z7 L8 O# U. z
  71.      Power = MaxSpeed;& S( D! ^$ S  {$ L- i  y
  72.   } 1 v* d; t1 a$ l8 L
  73.   if (Power < -MaxSpeed){
    9 m! v+ i( V! ?
  74.      Power = -MaxSpeed;
    " m; a3 w; U7 l1 ^* N' _
  75.   }
    - A. V( o8 J. ]& w8 O9 |
  76.   motor_10.run(Power);8 v4 v+ n8 R, Z) L' N6 }4 N
  77. }  
複製代碼

, i3 X) {! o9 T9 t& W5 i& d; \
) ~; K* }2 ]! V" V
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 - G  V, u, k9 m6 V7 |& L+ D, `

* O) B3 z9 N% d* p: F: i您好,不知是否能向您請教。
- l1 I$ n, [2 `/ P& k6 }/ h3 P& ^目前和宋修賢老師在處理Ardui Car/ o9 ^( ?8 q& l9 P
雖然已使用較繁雜的方式處理了跑出黑線外的狀況% A5 M! V9 R5 H2 E' @) u

0 ]1 v2 @/ l/ y2 z但基於想追求更精簡的程式所以還是想請問一下$ Z8 x* Z  v4 m) u: M6 l
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
8 S$ x: Y! I1 J不知道您是否願意教我可以如何處理2 ?$ q/ B6 u6 D$ s

! o# [. @3 c+ Z+ ^$ o) u3 q% m, h* z+ Z7 H* y9 m9 M0 G4 d4 r
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    * p% ~9 @+ u( Q1 V, k+ H
  2. double CNY70Val = 1000;7 a) q9 {- y2 J" X+ {, Y
  3. int interror = 0;
    9 M) l( H9 M0 K# V0 W' x2 @
  4. int olderror = 0;
    ( s0 d: H9 }- `3 i
  5. double values;
    . u7 D$ E5 T$ u
  6. & T# O, l8 \  ]/ p
  7. 6 U  L% l# r$ L" Y7 J
  8. void CNY70()
    : Z, j3 J' j9 e- F5 O, c" A
  9. {
    $ {+ p7 ~5 r( ^# X5 {/ Z+ @, k6 T( `4 S
  10.   valuesRR = analogRead(RR)
    / i" t9 N9 D  d. @* ?8 b& }
  11.   valuesMR = analogRead(MR);
    ! P% J& D: @7 D/ i, {- O
  12.   valuesMM = analogRead(MM);3 i& O  U" j) ]5 n0 S! e! j
  13.   valuesML = analogRead(ML);% u6 k) b: X+ c5 q
  14.   valuesLL = analogRead(LL);
    ! n8 Q+ Z4 M+ T1 K3 L" |# t

  15. 6 S% q$ k. A/ [% l' N
  16.   if (valuesRR > CNY70Val)* Y) d8 V2 }5 C9 F. u$ T) x
  17.     valuesRR = CNY70Val;9 W* j( x3 S: `8 E, g& w! D  R
  18.   if (valuesMR > CNY70Val)" V# n+ w4 o$ d" A0 l# A, m5 g) \
  19.     valuesMR = CNY70Val;
    ) {$ N7 X6 i2 Z  L+ G' t9 L
  20.   if (valuesMM > CNY70Val)
    0 k4 L3 F$ a: U# c0 J
  21.     valuesMM = CNY70Val;
    9 d) A. R$ h- a( p8 U7 O% a
  22.   if (valuesML > CNY70Val)+ c0 C+ n% n" U) Q
  23.     valuesML = CNY70Val;# b4 ]2 Y( i! ^$ U  _
  24.   if (valuesLL > CNY70Val)
    3 \$ v/ ]3 {" ^
  25.     valuesLL = CNY70Val;
      @1 M' ^! H4 ?1 M* v
  26. , H7 Y' K, f$ e" W
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    . i/ }6 N: x  E0 u
  28. }
    : n* v# g0 J0 y/ j" h

  29. & e/ e) X& x) B1 R# z4 a/ a
  30. void Car()( J3 N" o/ B( x
  31. {8 o3 h3 s. T3 J8 Q) n1 g/ P
  32.   while (1) {
    + _/ d/ A0 c' _% R% L, N5 N
  33.     CNY70();/ l, A3 I( Q- R: C0 k
  34. : k. t' J( z, f; h
  35.     int error = ((int)values);
    + J. E4 E* }, k& L
  36.     interror += error;' i% ]/ Z+ ], p' V1 D  d% F
  37.     int lasterror = error - olderror;
    / S- z+ u' A% l
  38.     olderror = error;
    5 G- j; l1 c- }+ h( N
  39.     int power = error / 5 + interror / 10000 + lasterror;( n; z2 D: g# F) E7 g
  40. , J, k9 U4 \; M' j# M1 K
  41.     if (power > MotoSpeed)
    " w+ z2 I0 ]. d# k- X& E4 v2 Z
  42.       power = MotoSpeed;
    1 J3 _1 ^) x2 }9 B) N8 n2 S9 V. y
  43.     if (power < -MotoSpeed)
    # L% l6 p3 l, m  b: j* _4 c
  44.       power = -MotoSpeed;
    0 y% F+ L# R. e2 j
  45. $ G2 x$ g* g/ N7 v
  46.     if (power > 0)
    $ g+ {1 X- t1 b, X
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。5 x1 u) }5 ^0 H! M5 W) p( {
  48.     else5 ~* z# ?! \% W+ Z
  49.       Speed(MotoSpeed + power, MotoSpeed);% X  Q' g" j4 b- C4 \; ?
  50.   }2 x- U' ]6 E- r" B
  51. }
複製代碼
- c4 _$ d* l! z' p; Q( O$ \

+ z; U3 o8 G7 z6 e; c' e; [
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 07:47 , Processed in 0.023215 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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