圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21864|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    4 `% m/ P) O7 z1 `( b) m. E% z
  2. #include <Wire.h>
    % n! U) t$ J2 j( n- W" ^
  3. #include <Servo.h>1 z" i3 p% L7 i* i7 c

  4.   ~* r8 l* d6 a& G3 l3 v$ J
  5. #include "MePort.h"% b' l% K9 q- w4 o+ n6 x, J1 G) c/ O9 G
  6. #include "MeUltrasonic.h"
    ! Z, z9 A: E/ G, a' l2 u3 E
  7. #include "MeDCMotor.h"$ n. p* y# l, }4 @9 w2 d- S% r

  8. ) i4 [0 x0 K, S6 k9 S0 y6 i$ o! Z
  9. //double Input, Output ;! s5 O, e, z" ?; O
  10. float MaxSpeed = 255;/ }# E3 `1 U% Y9 r- s
  11. float MaxPower = 180;9 V8 H! L0 H7 i& Z4 N8 K2 f
  12. float MinPower = 120;2 F" r! P, B9 P. D: @( X
  13. float Error,ErrorAcc,ErrorDec;
    3 d6 M6 ~5 G3 W9 i1 o

  14. 4 ~) y4 r9 K+ v) o. }9 r7 {
  15. float Kp=0.14;( ]8 S! F9 P1 R
  16. float Kd=0.00020;//23;( e2 ^( E1 {6 C: |4 N$ S
  17. float Ki=0.000201;$ `/ g0 x7 M: `% o& `0 R' v) l

  18. ; Q) R, Z% W' ]6 {) j9 o2 C$ C
  19. float nPower;( T. c. `+ v' @8 L
  20. MePort lightsensor_6(6);/ T& i* O" d7 |, p  X
  21. MePort lightsensor_8(8);
    ; X* K3 T( _1 S) i1 e! ?
  22. MeDCMotor motor_9(9);
    + H6 R3 M! ]9 w
  23. MeDCMotor motor_10(10);
    9 s% ^: y0 E, z$ D
  24. unsigned long previousMillis = 0;2 w4 @4 l: N( p% H
  25. const long interval = 1;7 n$ r1 L4 o2 K: Y! c9 p, ?
  26. + R& |/ E; ~# Y* A( |- ?; u
  27. void setup(){; E! ^, `! R1 o8 W
  28.     lightsensor_6.dWrite1(1);& z3 B3 V& c9 w5 f5 F" }' r
  29.     nPower = 160;7 Q$ z' j! @! w# _1 o  ~9 ]9 }
  30.     Error=0;6 D3 p5 U0 T; \8 r+ ^* u2 r) Y* g
  31.     ErrorAcc=0;) F- s6 }9 B0 G  o& v/ ~! q
  32. }2 ~* c* O. @7 B" ]5 |

  33. % U6 T! E  x6 L, I8 g  ?, u" e6 ^# f- Q
  34. void loop(){
    8 T  Q5 t. B0 V4 t
  35.   unsigned long StartTime = millis();% R+ x, ]+ M. X: A" G
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){$ U+ D( m# ?9 N
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    - ^" \* z3 O8 ?1 a. p) @
  38.     ErrorAcc +=  nError*Kd ;
    ! k- s0 d6 k; m2 L' R1 o
  39.     ErrorDec -=  nError*Ki ;
    $ |0 M- k7 C0 B2 ~/ w
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);8 f! Z! w* p* E; h* T, {, e
  41.     if(nError < 80 && nError > -80){$ W, R. v, a6 d# f: W
  42.       if(nPower < MaxPower){
    9 R7 J' l. b3 F3 `+ _
  43.         nPower += 3;
    6 i' p6 j: B4 b/ E/ p
  44.       }
    & `2 W6 j+ T0 S% p2 e. ?! `0 B
  45.     } else{
    * v7 I' u  ^* G- S; |
  46.       if(nPower > MinPower){7 B; P* u- X! e: c
  47.         nPower -= 2;
    , ^6 t. W% f- H+ [* n  f
  48.       }
    5 k7 u( J" x) o" A8 ^
  49.     } ; C( C0 S2 Y  F8 q) I
  50.     MotoL(nPower-Error);0 l3 T/ a8 b, x: T3 ?
  51.     MotoR(nPower+Error);    " Z* {6 g6 F7 h% A0 J
  52.   }else{+ M/ X. R2 X: Y) U$ E
  53.     motor_9.run(0);
    ; E" k* l+ G4 Y' K
  54.     motor_10.run(0);
    9 A* A, R. u) B$ \, d  D) ?
  55.   }) P' a2 b+ W5 p. z) T
  56.   do{}while(millis() - StartTime < interval);8 |6 R' h7 }8 N4 `9 q
  57. }
      d5 Y' i* ^9 U# ]7 y0 I

  58. # ~8 M% W5 |. a' q, h( P
  59. void MotoL(int Power){
    & d3 b7 b4 z7 I
  60.   if (Power > MaxSpeed){" E1 e; u5 r+ l& t9 u7 F
  61.      Power = MaxSpeed;
    - ?0 {2 I6 T- T/ g' p5 s
  62.   } # j$ h: b  y$ ~* d
  63.   if (Power < -MaxSpeed){! }# o6 W& m9 T% S$ [
  64.      Power = -MaxSpeed;9 z6 _; H( S+ \9 E1 ^# v: h* K! M8 ]
  65.   }
    6 J, N- w5 Z+ m6 p3 i) [3 o
  66.   motor_9.run(Power);
    - X2 q% Z3 V7 {, w4 a
  67. }  0 x0 N$ o- ~" j- j
  68. - L  T3 r/ ?/ j1 {
  69. void MotoR(int Power){" n5 s: @# k1 m, }2 {/ _
  70.   if (Power > MaxSpeed){
    0 c4 V+ T( V! f, \* o
  71.      Power = MaxSpeed;8 I& u" b: K3 [# J8 {9 G8 \
  72.   } . a. A( @1 Z6 Q: S3 B
  73.   if (Power < -MaxSpeed){* t# }  n4 K$ {* T- C5 G
  74.      Power = -MaxSpeed;
    2 L: F- E' ]5 @0 G' z0 U
  75.   }
    , C& r% N6 y7 l  k) v' g6 p
  76.   motor_10.run(Power);6 }0 I. m1 E, x) y5 Y# ]
  77. }  
複製代碼

4 e; J; H1 y& l3 Y% n" s8 L2 g* v( s$ J$ ?) d( c# E8 Q2 ?
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
3 f  I9 J$ }& l' A: Q. M( q
0 b1 {, F+ z9 E您好,不知是否能向您請教。
# Q  t. g) _# d# z* y' U" g* J1 e目前和宋修賢老師在處理Ardui Car0 F1 H/ A" P" u
雖然已使用較繁雜的方式處理了跑出黑線外的狀況4 B3 m; B: I; a# o) @: L

" t2 e/ K, V. g& a. W' Z8 L7 u但基於想追求更精簡的程式所以還是想請問一下
3 `% A  I! Z/ p$ N, Q就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
. ~8 f' `! a$ R, F2 f) ^  f. ?不知道您是否願意教我可以如何處理
+ M! w0 R4 T/ `6 R  {* c! R
+ i! j* z7 e7 E8 J% @; w% v1 D; B8 U- Y* }5 s% m
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    % Z. o3 g- E+ ~5 J# u
  2. double CNY70Val = 1000;$ W& K- n) ~6 ~$ Y$ q2 n: O$ |
  3. int interror = 0;' A0 }8 U: v; d+ Y( c
  4. int olderror = 0;) H7 O" Q9 ^0 V
  5. double values;8 E$ ?6 d" i( w+ y
  6. ( }3 W, h2 @/ a# v- A7 j, W

  7. 8 m& Q. {  L/ {5 K) `
  8. void CNY70()7 |7 O0 A: q$ R) g
  9. {
    7 F+ m8 h4 Y8 T& e! y+ {
  10.   valuesRR = analogRead(RR)+ Z: o3 F1 S/ m* Q1 F8 t
  11.   valuesMR = analogRead(MR);
    % P* x, n/ q- h  J/ ?4 ?' q
  12.   valuesMM = analogRead(MM);# ^& M1 P* i& q1 ]2 q5 F6 p
  13.   valuesML = analogRead(ML);& ^, J( g5 F( |+ o/ M
  14.   valuesLL = analogRead(LL);
    ! D2 m! Y8 V$ r# g, L) N. e( v
  15. ' R4 [$ @8 ?3 X/ B) \
  16.   if (valuesRR > CNY70Val)
    / X' e% {* x3 J! L  F+ Q+ C
  17.     valuesRR = CNY70Val;
    7 Z  D: \( h4 w3 f2 l7 R8 Q
  18.   if (valuesMR > CNY70Val): w* r; L' `' j6 I" z4 Z4 r0 v
  19.     valuesMR = CNY70Val;
    4 y3 X7 O* g1 E/ n4 q+ Q# G
  20.   if (valuesMM > CNY70Val)
    # W: L$ n6 N5 c- D
  21.     valuesMM = CNY70Val;
    : z1 T. U5 z3 [/ d. u' u
  22.   if (valuesML > CNY70Val)
    0 D0 b# H9 j( L& U" N+ }8 }! {: n
  23.     valuesML = CNY70Val;( ~$ I. ?0 C$ w- J% ^
  24.   if (valuesLL > CNY70Val)% g$ o9 Z: |4 t+ d1 m, ^
  25.     valuesLL = CNY70Val;. k  ~, j3 {  I
  26. : A3 W7 g, O$ o6 e6 h
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
      L% f  d  B/ x
  28. }
    3 V% d4 y9 ?: j1 W7 n. d) J! M8 @5 W
  29. % t8 ~+ b5 C1 z& c  \$ g. @
  30. void Car()
    ) L# m1 n# c- j% d% {* [
  31. {
    2 F9 e' T. N# v1 L- k. T3 N3 l2 n' T3 }: `
  32.   while (1) {
    2 O6 s8 M" Y+ o; k
  33.     CNY70();- ]2 R/ D/ l* q; a" e0 d

  34. / q+ M5 I( @' b8 Q! }, l6 n* W
  35.     int error = ((int)values);; K- g5 a. N( T( N! r
  36.     interror += error;
    + A# \# k  e  h8 a1 b' L4 q2 x$ i0 {
  37.     int lasterror = error - olderror;+ }( O2 f. h1 ]# S* u; `& |
  38.     olderror = error;
    5 `. L# c% ?; U$ }! v
  39.     int power = error / 5 + interror / 10000 + lasterror;% P: c% x' F% v, W* w9 V! Q% H$ e

  40. ) r. O) Z  H. ?2 R: a2 m
  41.     if (power > MotoSpeed)' \) }9 w3 L- y/ m3 \5 b. Z
  42.       power = MotoSpeed;
    0 m2 F, Y! x5 R# g7 I& o
  43.     if (power < -MotoSpeed)
    8 X$ j3 _1 @0 y# w- S5 N9 d; P' x
  44.       power = -MotoSpeed;
    & B# A- @7 \. M3 c$ U, j
  45. 5 w9 `% L4 [5 C+ p; F2 M( x
  46.     if (power > 0)
    0 p/ p" B1 J4 E$ B( n
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    + J  g& G$ q/ ~
  48.     else
    + e( T* j) T/ a
  49.       Speed(MotoSpeed + power, MotoSpeed);9 t4 X" l$ t2 a
  50.   }
    5 e1 G2 `% y: L
  51. }
複製代碼
# y* q5 _! F0 B" V* u2 Z  c
* t# e% R  p" z9 `$ G4 P: W. k
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-6 16:46 , Processed in 0.016605 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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