圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21833|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    7 c( Z1 l( e' s( B" Q+ l; i; X+ X
  2. #include <Wire.h>
    ' ^9 V0 K. p) O9 S1 g) v: r- @
  3. #include <Servo.h>9 l6 o3 F# ?: k8 j2 ~* Q* Z1 T

  4. 7 h6 B! c* O) K
  5. #include "MePort.h"
    0 [3 O* j- r- b: k( c
  6. #include "MeUltrasonic.h". p( f" Y& C, ^0 G2 s8 H- n
  7. #include "MeDCMotor.h"
    5 M5 R6 n  C) L

  8. % y3 R3 n  t! W7 j. P
  9. //double Input, Output ;
    / a  N* }5 \2 \8 y$ H
  10. float MaxSpeed = 255;4 v& C& c* E  D
  11. float MaxPower = 180;0 a  g. f/ |0 C+ Y6 O3 V
  12. float MinPower = 120;
    " e# c- T1 A/ c* D6 G; O
  13. float Error,ErrorAcc,ErrorDec;9 z' L3 |; Y6 t  G3 y

  14. & T0 e+ u# e1 f1 z4 ?. @4 ?5 q
  15. float Kp=0.14;
    ( a3 g, w3 P+ l' V0 y
  16. float Kd=0.00020;//23;
    & {' R7 L& U6 q% m6 r% |$ M9 a
  17. float Ki=0.000201;% `8 A4 z4 s& j5 ~
  18. 8 C  o- w, |& q, V& h" F
  19. float nPower;5 N5 ^+ w" w  q4 v
  20. MePort lightsensor_6(6);
    , B9 u. @7 i- N
  21. MePort lightsensor_8(8);& x" b+ b6 `- F, S) I( N
  22. MeDCMotor motor_9(9);- l% C& \, {) `, E0 M' u
  23. MeDCMotor motor_10(10);
    & O9 N. v5 r; H
  24. unsigned long previousMillis = 0;; t# L. H* D; k7 T3 g8 [
  25. const long interval = 1;
    ) [3 q* h! K& i  l1 ^% c7 P

  26. 1 I* f+ h; n5 t) ]% L
  27. void setup(){5 ^' A/ U6 M' r% q
  28.     lightsensor_6.dWrite1(1);0 s4 q7 j- [$ y" J; a+ J# A
  29.     nPower = 160;
    * i$ W) R* l; l; r1 P
  30.     Error=0;
    6 F; d. S+ ?* I& Q" i
  31.     ErrorAcc=0;; U  l- T7 t5 I0 [! Q% t
  32. }: \  D+ X" a( \2 F
  33. , p* K: C  q- k  U1 Z1 F
  34. void loop(){/ ~' e( z6 w$ }% X9 s! R; v5 {/ [
  35.   unsigned long StartTime = millis();; @2 q' ]2 Z2 U/ o- q' n
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){7 b" p- b  y6 y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    : w" U3 P  u5 i3 G$ {/ b  b
  38.     ErrorAcc +=  nError*Kd ;
    2 m- S2 B8 b+ N3 _5 m
  39.     ErrorDec -=  nError*Ki ;
    8 T4 J' T) W! U% q7 m/ D
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    + _4 ]3 \( k" e$ w) t
  41.     if(nError < 80 && nError > -80){0 Q" b2 {- \/ r
  42.       if(nPower < MaxPower){
    / U! }7 F& g- ^& a4 P, `& P
  43.         nPower += 3;
    * q+ c5 b4 ]" G  p5 n/ j! O. s
  44.       }
    ; Q! x- J! ^9 u& j. w/ X
  45.     } else{* a2 s3 M6 N  Q/ i
  46.       if(nPower > MinPower){  x7 l: ^& @, Z/ g
  47.         nPower -= 2;
    7 U: I- C3 T: @7 T* }
  48.       }
    2 L2 J# ]4 B2 r+ d( X, o- d4 ?; C9 E8 X' _
  49.     }
    , [( L; i( V! J- V$ [$ Q
  50.     MotoL(nPower-Error);
    6 H* B  s% E6 Q! `9 x) }2 ?. l
  51.     MotoR(nPower+Error);    ! @, r. ~, W; F) O5 ?; _  R7 |
  52.   }else{
    * I$ O2 W5 T4 X4 w" n
  53.     motor_9.run(0);$ G, S3 t# w7 L5 ^; B
  54.     motor_10.run(0);
    # `+ q$ ~8 W7 X
  55.   }
      O, s' W  |1 Q( G0 M
  56.   do{}while(millis() - StartTime < interval);8 l& e# [- l# m* n5 c' u2 u
  57. }
    8 A) R+ M3 E$ C8 g
  58. - n: T7 t8 E6 B! w0 Y
  59. void MotoL(int Power){1 L& o: T6 A3 |: T1 v' R4 T5 d
  60.   if (Power > MaxSpeed){
    7 j. y/ P2 e( s6 f) M+ n  o
  61.      Power = MaxSpeed;
    : A" U. D8 \3 g- X+ C
  62.   }
    ) [! j2 C) E; Z1 Y, f% r
  63.   if (Power < -MaxSpeed){
    ' T- l* D1 D# x; C( Z5 ^) z7 D
  64.      Power = -MaxSpeed;
    ; C: ?8 i4 |" w8 w' i2 C
  65.   }
    8 L/ C: X( C2 m% L7 f
  66.   motor_9.run(Power);
    0 W* @- n: r7 D9 g, u
  67. }  
    , Q" s" ]0 R2 J  R$ _
  68. 4 D; R9 G, y" v7 w6 p+ {
  69. void MotoR(int Power){
    " @9 }  b$ W2 l6 }4 b
  70.   if (Power > MaxSpeed){
    $ j; D5 N( K3 H' I9 b2 g
  71.      Power = MaxSpeed;
    0 w7 J8 Y& }1 D( d
  72.   } & J: U. a! |# R
  73.   if (Power < -MaxSpeed){9 `1 k3 F6 t3 h7 v7 w
  74.      Power = -MaxSpeed;
    : \/ ?6 ~- N  Y% |; i6 I, \
  75.   }
    * d" o+ Q. o8 p" R% S
  76.   motor_10.run(Power);
    , K  w, g0 |* u- ^6 T' e
  77. }  
複製代碼
% b5 u& C* L4 \+ a/ r0 o$ h5 }
/ s9 M  d/ b+ b8 @! K
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 7 `9 {! x2 v7 V2 b. i

# c, c+ K$ Y# E1 A% o您好,不知是否能向您請教。& A  \; A; {7 n5 `/ I
目前和宋修賢老師在處理Ardui Car
. B* ?$ D; k5 n7 J! \雖然已使用較繁雜的方式處理了跑出黑線外的狀況7 L+ \5 M# `1 C6 O
; y, E/ q$ E; U! O+ ^! @
但基於想追求更精簡的程式所以還是想請問一下
' v$ D# L3 Q6 Z% D( P就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
; R. h$ p7 c; \' q4 n不知道您是否願意教我可以如何處理
# M* }( p* D5 H) B0 W5 \- i4 ]" @' z: R

: I; e4 l: B5 `  z- e以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;' A% ?0 Q. y  f5 E, ?; h& N
  2. double CNY70Val = 1000;
    ! R* W" e, K/ T$ Q
  3. int interror = 0;2 f6 B' h( |) U9 h  G8 x" j& s
  4. int olderror = 0;0 P; I1 ^2 h- s+ ^' ]5 `
  5. double values;
    9 t$ M5 P! U, c' p3 O, B

  6.   y1 c. M# E4 e1 u& R; j: B

  7. 0 W/ [; g+ l. p: ?
  8. void CNY70(), ~. }  W. K( C  R
  9. {
    : l( R4 ?* M" S
  10.   valuesRR = analogRead(RR)8 F! X2 Y8 M- A% q' u; _
  11.   valuesMR = analogRead(MR);
    0 ]  o0 K! ]8 \5 Q) k) P
  12.   valuesMM = analogRead(MM);
    * A% H9 N" g1 Q5 S9 ~
  13.   valuesML = analogRead(ML);, g" J% D2 z2 p7 B% w+ g
  14.   valuesLL = analogRead(LL);
    5 C  ~! ~' o  a' ^9 a" Y, G& \/ f

  15. / p) W* o$ Y8 x; E; t
  16.   if (valuesRR > CNY70Val)$ E2 h+ i9 l- u
  17.     valuesRR = CNY70Val;
    3 ?+ S; l. k0 z2 O" W8 J
  18.   if (valuesMR > CNY70Val)
    ' M2 ?% [' M( k. O/ t
  19.     valuesMR = CNY70Val;
    2 u! D" }' P5 P. Y6 W8 T
  20.   if (valuesMM > CNY70Val)& J  R# H  i* P9 A% R. K/ K
  21.     valuesMM = CNY70Val;
    - A# m3 p3 W' S/ R
  22.   if (valuesML > CNY70Val)% Y2 s" ?# m8 \3 r
  23.     valuesML = CNY70Val;0 l5 T* E8 v% b. L+ p0 ]& r
  24.   if (valuesLL > CNY70Val)
    : l( z9 F8 P4 U0 v2 p/ P2 P
  25.     valuesLL = CNY70Val;
    3 d3 ~6 O( n8 T  {$ N/ ]
  26. + m! h: X5 I# t8 i; w7 l$ k
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    4 e3 d9 x1 P8 a. w8 n  ]4 R
  28. }, m9 j# y3 n) h6 x4 ^

  29. 2 W: S' L. K2 Z$ \5 }9 ^( ^
  30. void Car()6 g) g3 t' g, {
  31. {
    9 N  I# m" a* j, M- T- i6 @4 I; V
  32.   while (1) {) @6 Y8 C5 c7 U+ z) ]  l
  33.     CNY70();3 ?" `; }( N; h, i. O  k% X
  34. ' r, D) Y6 p2 \- C5 h7 w% ~
  35.     int error = ((int)values);
    " h9 o- l8 S& U$ |( T
  36.     interror += error;( b5 L7 y+ A2 q4 o! g, @
  37.     int lasterror = error - olderror;7 O( |+ m" i6 i; u1 W
  38.     olderror = error;
    + _  K% u$ X0 S) p$ n
  39.     int power = error / 5 + interror / 10000 + lasterror;
    " o6 p* \4 Z- J, `2 R3 ~. T8 K6 W3 c

  40. & ?/ Q7 E! C- s: b' F7 R" V  L
  41.     if (power > MotoSpeed)
    - {0 _- F, ]% a; v( M, k
  42.       power = MotoSpeed;5 v, a2 ~0 h$ u5 A% @2 B
  43.     if (power < -MotoSpeed)
    ! X: U5 G/ l: g  w/ x& m4 M5 W
  44.       power = -MotoSpeed;
    , G% W1 f* `/ ]  k# X

  45. 9 ~4 z" D* m" P, `$ H5 u' A4 }9 u
  46.     if (power > 0)
      u5 E3 p- r# P
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    , b5 n& G; J! K# _6 y" _# _9 X5 L/ z. I
  48.     else, x* z9 m# k8 k8 M- L
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; H, U) I' t3 O  G  \' U- L# l! k
  50.   }' k- C6 b  Y' R0 Q6 c
  51. }
複製代碼
# Y  D6 `" c- Y) I: b* Z6 D
, B) a' Q: {4 h1 {5 v2 U
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-4 16:27 , Processed in 0.024528 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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