圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21763|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    0 o2 E3 V2 }+ [/ r
  2. #include <Wire.h>7 a6 _, ~5 C) x5 D4 t) I
  3. #include <Servo.h>
    7 g3 o1 x% x' ]+ R% Z5 J3 q
  4. / E% r8 J( L7 [- K
  5. #include "MePort.h"
      l# p: f* _0 q
  6. #include "MeUltrasonic.h"4 r8 W' J8 c6 t- h) E
  7. #include "MeDCMotor.h": a. A' N2 U+ p# J6 ^0 T
  8. 8 x" w9 o4 g9 D0 D
  9. //double Input, Output ;
    8 o9 @, d! Z$ A& e$ E
  10. float MaxSpeed = 255;6 c! J  W( f; l6 Q+ ?9 u- J6 j
  11. float MaxPower = 180;
    " _6 _: S) h2 M4 S  ?) w
  12. float MinPower = 120;
    : u) o3 Z! _9 _5 N% h
  13. float Error,ErrorAcc,ErrorDec;1 O" h6 @' X% q3 }& m

  14.   i6 J$ d$ j/ R5 z' [% l' e: L
  15. float Kp=0.14;
    " B3 r# A5 {; T% R% u9 e0 I3 J
  16. float Kd=0.00020;//23;/ P) c/ z( N  J5 h  h
  17. float Ki=0.000201;
    1 ?" \0 X/ w  A: D3 x# r% g( X
  18. % y  H3 F' D6 g; G6 b* v
  19. float nPower;
    + _" R2 y: }* C/ [- q* ^
  20. MePort lightsensor_6(6);
    ) e, V: w2 X$ _5 t4 ?; U+ W' M8 b
  21. MePort lightsensor_8(8);
    , R8 P5 |; ]% B7 Y9 C+ ?# Z# a
  22. MeDCMotor motor_9(9);
    ) ^- ]# |8 e+ G* y. X1 {
  23. MeDCMotor motor_10(10);
    " m$ m5 g9 }  @! X) W
  24. unsigned long previousMillis = 0;
    ( u0 S7 |! L- R0 s5 t
  25. const long interval = 1;% v' V( n* [7 k8 }
  26. . R) A+ i  O" b9 U- ?. T! s) @  u
  27. void setup(){
    4 K: E$ d7 B. e* Q3 Y3 j. l# D" ~
  28.     lightsensor_6.dWrite1(1);
    1 J3 m/ E! O  n* h6 ?
  29.     nPower = 160;5 c9 B( n. f6 {  Z/ Y7 \2 Z3 ?
  30.     Error=0;+ _! T& q6 F% W6 B0 {; T9 L
  31.     ErrorAcc=0;
    1 H4 S# T* b7 P* Y
  32. }
    : c: h- V9 _2 {8 y+ z

  33. ( q# s+ c# y- n9 V
  34. void loop(){
    ( k( L4 T0 U; k! g
  35.   unsigned long StartTime = millis();
    + C3 L+ Z$ u8 a' K
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){2 j; h, w6 X2 P$ ^
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();+ B& V* D' D: s, ^
  38.     ErrorAcc +=  nError*Kd ;# {) Q; M. `4 x& [
  39.     ErrorDec -=  nError*Ki ;  w6 g; h8 o7 h; b5 X8 Z- L) m5 k& d
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    2 h$ q: z& A/ _5 S% ~
  41.     if(nError < 80 && nError > -80){
    3 p1 H5 Z0 T5 u9 A# r4 }* n: A6 T
  42.       if(nPower < MaxPower){8 |1 J5 v8 D9 E9 b, K
  43.         nPower += 3;
    1 z; G& j: s' J9 h8 ]
  44.       }: Z8 i: j& U9 [3 v) ^
  45.     } else{0 e# y, ~! m7 [) z# ~
  46.       if(nPower > MinPower){
    ( l! B" N& Y* h2 J7 [
  47.         nPower -= 2;; i# d6 `% d" s8 a  Z. A. c& @5 B5 p
  48.       }- K% X) r' U2 t, d
  49.     } / r7 k3 ^& M* i) I, ~, E
  50.     MotoL(nPower-Error);+ z& b  G! Q- i# U- q% M3 M
  51.     MotoR(nPower+Error);    ' H/ h( }' [  a6 j9 }
  52.   }else{+ l) O5 y$ A. Y2 v4 M1 [
  53.     motor_9.run(0);8 u+ N% T0 t. a4 J' `0 C; F
  54.     motor_10.run(0);
    # |* v8 P8 G9 Q, M1 ?
  55.   }. A; b& w3 N- J- a( {/ }
  56.   do{}while(millis() - StartTime < interval);
    $ b- M. r9 I/ y: \+ T$ \: i5 U. |
  57. }
      E. j2 |. a& D7 z) V8 s

  58. 0 f. I8 m' C1 _0 o$ M5 T4 y
  59. void MotoL(int Power){5 X6 Q* Q5 k) ~& l
  60.   if (Power > MaxSpeed){! R& y/ A0 i/ y+ N& Y, x0 V
  61.      Power = MaxSpeed;
    $ V  X5 F+ L+ x1 i) ]
  62.   } 3 d$ F5 D" k$ o$ C" Q
  63.   if (Power < -MaxSpeed){, Z# ]9 p% S+ b& B9 P3 p
  64.      Power = -MaxSpeed;9 p. h4 y2 _" j, k9 Q! v: ?
  65.   }
      l& D( B' f! d. I/ {# `& S, o9 y! Y
  66.   motor_9.run(Power);
    4 w. q1 K" f9 i( ^  V: N% L
  67. }  
    + P, L8 J7 t0 F5 u

  68. 2 z/ k- Y( m2 G0 Q3 Y* v" U7 U
  69. void MotoR(int Power){
    0 v" m. \  b# M8 j; t% c8 [% {0 z
  70.   if (Power > MaxSpeed){
    + G9 C9 f8 t0 A9 ]
  71.      Power = MaxSpeed;
    + l$ I5 o1 O3 h6 l; `
  72.   } : b- m$ W+ y; @9 L8 J7 A
  73.   if (Power < -MaxSpeed){. t. i8 W" K; R8 y: t+ t
  74.      Power = -MaxSpeed;
    ) H( O; A& ?& s) ~5 K0 z; h: ^- c
  75.   }
    3 X6 c# Q; j" X
  76.   motor_10.run(Power);
    0 v  O+ `, n) I$ x) y1 I; H
  77. }  
複製代碼
, L+ r% ~$ v* O+ W8 U
( ]% U: n5 `; c/ C5 o7 S' I$ T
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ; {6 `. i4 m9 G: m( J

7 n8 N! `7 m$ M0 J( q, H0 o2 A您好,不知是否能向您請教。3 Q; @5 c2 j% I0 {
目前和宋修賢老師在處理Ardui Car
6 y' D+ ?" a, U) g1 r0 U2 M8 q雖然已使用較繁雜的方式處理了跑出黑線外的狀況
( Y+ N% O& g, e: }( \0 B' t" B% P
( R. W0 J3 B, w# c- s3 I但基於想追求更精簡的程式所以還是想請問一下) Y% z, ]1 t* P# [* j; C' s
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
  G) r! _# q/ B不知道您是否願意教我可以如何處理+ K+ h  }2 X* ~: |7 v2 `
3 l: W7 L1 u; a

+ r# |7 \: D% ^( @' t% E* \: r以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
      V0 A4 p( B' \  l! F! X
  2. double CNY70Val = 1000;- N9 Z+ q6 ^) B6 B7 _
  3. int interror = 0;: p/ \! j& m# @8 H  a& x9 S
  4. int olderror = 0;2 ]4 S: P9 a, h5 a  m
  5. double values;
    % Z* }5 J4 M+ u
  6. : O0 A3 I# i" \
  7. 5 T* {9 t* l6 ?! u" O, N
  8. void CNY70()) s* [* V, J$ {4 `5 ]# a
  9. {! z) K6 e' a% n6 U/ j; D+ [
  10.   valuesRR = analogRead(RR)
      @; H/ B+ a4 s& c
  11.   valuesMR = analogRead(MR);
    $ a3 v) U5 ]) V! B& t
  12.   valuesMM = analogRead(MM);7 t, [* W+ L& m& l
  13.   valuesML = analogRead(ML);
    ! E( H4 l0 ^) f+ Z# C" Y0 W
  14.   valuesLL = analogRead(LL);
    0 l4 g+ L2 `" x; O: ]

  15. 2 k! x; R. F5 e- e2 K( V4 q" I
  16.   if (valuesRR > CNY70Val)4 x! I- A, X* s4 [
  17.     valuesRR = CNY70Val;: w- z% I, T. U0 i' m% O+ L
  18.   if (valuesMR > CNY70Val), ~- E3 e9 I/ g
  19.     valuesMR = CNY70Val;
    * I2 l# E* k; \6 {* s, j2 d2 A  x
  20.   if (valuesMM > CNY70Val)
    ; o" M8 n; o2 M3 ?7 _; O$ w  N
  21.     valuesMM = CNY70Val;1 H0 Z- ~; d  k# `* @  v4 j
  22.   if (valuesML > CNY70Val)2 q8 R, @8 k$ y, T  L! E( U/ |
  23.     valuesML = CNY70Val;
      H9 ?- C. e- c
  24.   if (valuesLL > CNY70Val)- C/ y/ q; [0 S* E
  25.     valuesLL = CNY70Val;. W- M+ [4 T! I; k, j! V
  26. 0 F3 X% D! h7 ~
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;5 y. P( V$ _6 B; a' z
  28. }
    + o- L0 h/ D$ |" k2 b0 g
  29. 3 u0 i% ~0 G8 z5 D3 f
  30. void Car()
    0 t8 ]7 K% u1 e# D2 m0 f
  31. {* ~' L+ R, w, P2 J7 D
  32.   while (1) {
    . V1 e4 U) m) a; e
  33.     CNY70();2 L9 _3 P( |) c7 `) k. {1 l3 I; r
  34. + e: Y. t! `8 A3 n6 W" V& @% i. T
  35.     int error = ((int)values);" s; ^) [5 f8 v0 p3 r  S8 Y  X
  36.     interror += error;
    : h6 ]( H5 y2 h0 d7 k: M
  37.     int lasterror = error - olderror;  j. m# P# d1 O: [
  38.     olderror = error;
    4 |! f; {1 ]  l5 _) {' n3 H
  39.     int power = error / 5 + interror / 10000 + lasterror;
    , M* u8 P' i5 m

  40. 3 c1 h5 b- x, R& Z8 Z* K
  41.     if (power > MotoSpeed)
    1 u4 Z9 M: h5 w) {: z! G
  42.       power = MotoSpeed;3 x& T0 T& v7 g
  43.     if (power < -MotoSpeed)9 l) T1 M; k* P/ `% o$ j- P' A
  44.       power = -MotoSpeed;/ m' j" _  B1 z, b

  45. * d# Y$ Z) A, k* r5 \
  46.     if (power > 0)% _9 L+ P" Y4 |7 b! R* h/ B( k/ J. ]
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。0 n. H% C' [, `  B, K& c
  48.     else6 t2 p- W6 K9 C' \* ~" i6 R
  49.       Speed(MotoSpeed + power, MotoSpeed);
    0 H; e3 J( Z  [
  50.   }
    # t9 ^7 \* \+ W) L8 z/ Q5 {% a( y& n
  51. }
複製代碼
# p* j  z& N# M+ y

6 {8 Z. e/ b9 b
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-30 00:34 , Processed in 0.025486 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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