圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21738|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>8 A' c' @/ }& ~. U& w5 x
  2. #include <Wire.h>$ R) Y6 B; z9 y8 m$ Q
  3. #include <Servo.h>
    # M5 E$ m% W7 \& [0 n

  4. ' Q! L0 J  ]. E5 f
  5. #include "MePort.h": n, O1 r! p6 v7 R' Y
  6. #include "MeUltrasonic.h". `& g4 w, B5 `3 {4 }
  7. #include "MeDCMotor.h"
      F; p7 B( }) P+ x/ G8 u: A

  8. ! D- Y+ D% A7 y5 y6 q
  9. //double Input, Output ;7 J; z. y4 J6 x* z
  10. float MaxSpeed = 255;/ Q! g/ g$ ^/ r  ]' F
  11. float MaxPower = 180;
    , y! s9 G3 N! [  B
  12. float MinPower = 120;
    - x$ c- J3 Q" A6 O- m
  13. float Error,ErrorAcc,ErrorDec;2 Y& t$ k& |. C  I9 R+ @
  14. . K- v/ k  {! U& M& o
  15. float Kp=0.14;
    7 X6 ]$ t. P' A" M& A
  16. float Kd=0.00020;//23;+ z! W( ?4 N2 C
  17. float Ki=0.000201;: Y& _& z7 D6 N) e, ^% E4 n: ~  i
  18.   }8 u, I: ?( K1 b* O3 o. s8 L
  19. float nPower;
    % G1 i8 u  R% P6 D' p) w
  20. MePort lightsensor_6(6);# m% E% h& ?3 k2 M' n
  21. MePort lightsensor_8(8);
    / ?" s% A: A+ z/ Q/ ?, ^' f
  22. MeDCMotor motor_9(9);* r4 w2 g$ m- E1 d8 d" ]
  23. MeDCMotor motor_10(10);* `- S0 p6 V. |$ e4 u7 z6 }( F
  24. unsigned long previousMillis = 0;' P9 W0 ?+ \9 |7 L! s
  25. const long interval = 1;
    % O) d& M& {: U( b

  26.   e+ M- N6 U2 z8 m0 B- e
  27. void setup(){- `% n2 x9 h- n9 E  f  n. n9 E2 [
  28.     lightsensor_6.dWrite1(1);) _# r  X; U$ H) y: o
  29.     nPower = 160;" ]7 F- u8 {; [, ^- V/ O% q/ @( F
  30.     Error=0;+ R* m2 r# |8 k. {6 U- v
  31.     ErrorAcc=0;) k$ J5 a0 F4 A% l) F& k9 o8 a/ B
  32. }5 N/ p& ?6 ]0 Y+ C' k* w/ ?2 c0 e

  33. ' K3 S, W; O5 x- Y2 m# `
  34. void loop(){1 Z5 V+ a$ F3 \- c6 e, Q
  35.   unsigned long StartTime = millis();
    & u/ M9 M5 @4 T
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    7 D* B' f. ~- p6 v
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    9 O0 ^4 p- l% \4 f8 t
  38.     ErrorAcc +=  nError*Kd ;" f+ m% D$ r: i: ?9 l
  39.     ErrorDec -=  nError*Ki ;2 V& B, q5 Z7 ~. E$ t: X
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    $ u4 ?  Y/ q% X) Q: i, f
  41.     if(nError < 80 && nError > -80){0 J0 G( s0 I, q9 O& A
  42.       if(nPower < MaxPower){
    % Y1 |' @; t: z5 R4 o  D
  43.         nPower += 3;
    3 I6 R  U% h. [! h6 n
  44.       }
    ; v* _0 ?5 F7 g1 Y
  45.     } else{
      M% d1 B: O; x
  46.       if(nPower > MinPower){/ R* t1 Y0 q7 B( a0 [
  47.         nPower -= 2;
    5 w( p2 X' M7 D0 P/ y
  48.       }6 A' L" `( m. O% U* n
  49.     } + ?- V2 G9 q' }1 L
  50.     MotoL(nPower-Error);4 Q, Y2 b3 i$ U5 Q/ r
  51.     MotoR(nPower+Error);   
    ) ~; I" r, D# N  U: B
  52.   }else{+ z0 f% s+ V! p  d! Y
  53.     motor_9.run(0);
    3 U! M6 ^$ E6 Q) y4 _' i% p2 r- Q( Z
  54.     motor_10.run(0);7 V! a5 A2 b6 f, i+ Q" I
  55.   }
    + B2 C, H9 K! S: Q% W9 X) r
  56.   do{}while(millis() - StartTime < interval);
    ' R8 y0 N% f$ |% M; D3 I( G
  57. }$ A7 v2 M# m; v. E7 S: j* P% h6 c

  58. 8 w  `0 u7 l2 F9 m$ f
  59. void MotoL(int Power){
    ) h! M3 b+ O. m
  60.   if (Power > MaxSpeed){& u# I& z6 l: N2 F. X. h) r
  61.      Power = MaxSpeed;
    ) e, F0 {. c' r
  62.   }
    5 H: e' x( z, L3 ~: A+ m
  63.   if (Power < -MaxSpeed){
    4 K! p4 j0 N! ^  G& P! t
  64.      Power = -MaxSpeed;$ I( P9 n  S& f# }: N1 h
  65.   } ) `: n; t- O+ Z
  66.   motor_9.run(Power);
    / P4 [; W" U% f$ c& c0 J
  67. }  5 C: G3 T- t+ z9 Z& k6 u" o

  68. ! w% j) I1 O3 t9 I9 ?5 v
  69. void MotoR(int Power){
    7 h' Q0 ?: Z( T5 L% R
  70.   if (Power > MaxSpeed){! M  v0 m7 l3 x! S' Q  K
  71.      Power = MaxSpeed;
    ( m4 j7 t( L. q9 x: p7 ]  B
  72.   }
    ; C; n9 d2 F# O: I% ?( X  A( G
  73.   if (Power < -MaxSpeed){7 f& ^* v' q1 B9 D7 \6 ^
  74.      Power = -MaxSpeed;
    6 _4 q" j7 P2 O0 e$ O, O3 [: E: S
  75.   } $ K! _! \. H" S. H0 o* h- x# t
  76.   motor_10.run(Power);, c; S9 @6 e( a( Z% [( j, _8 d  Q
  77. }  
複製代碼

8 u5 Z' \" u. l, y( W5 V
2 ~! V/ d+ J5 c3 H% o
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 7 d0 J) t9 ?! h) |, y8 [
( a* i! B* ]1 w3 o7 ^7 u% p
您好,不知是否能向您請教。
) d9 z9 F. H3 F8 g! N目前和宋修賢老師在處理Ardui Car
0 K. F2 y  Y1 E  e3 p. e" t" p3 F雖然已使用較繁雜的方式處理了跑出黑線外的狀況7 ~1 q' b1 l9 M+ O+ a

9 i( j. W; d( q- b) \5 c. u但基於想追求更精簡的程式所以還是想請問一下
# R2 Z9 ^) Y" R就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝" P2 [2 Y" _% v4 G2 v
不知道您是否願意教我可以如何處理
: I, {+ x! `4 x% K0 O3 |7 x" o- [( z- v8 w

  u! K; D. u2 s以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    " }5 U) T( b! D* f4 ?: K& a1 [: A, e
  2. double CNY70Val = 1000;
    & Q! H( h1 i+ @6 S$ n
  3. int interror = 0;
    : S8 r7 j+ V' }7 u- Y
  4. int olderror = 0;
      m) H/ o! J: y
  5. double values;
    2 ~& J* Z' r- i1 N# a, O& j0 U

  6. 9 n! `6 d# X- K( Z+ r2 R# L1 B3 Y3 u/ N
  7. 2 X/ H; b% H8 b( E& O1 k
  8. void CNY70()( Q+ G7 t& C8 k9 K$ m
  9. {
    2 X# e9 h' l+ n  F# c1 ?7 b7 j- H7 `$ N
  10.   valuesRR = analogRead(RR)0 k' Y2 e  m; I
  11.   valuesMR = analogRead(MR);' O! W' ]/ _& l
  12.   valuesMM = analogRead(MM);
    8 Q/ B  E& e0 ]: g1 R: S
  13.   valuesML = analogRead(ML);1 m/ C( {* ^: N) j
  14.   valuesLL = analogRead(LL);
    ) f# `5 }9 L) F7 a

  15. 1 d1 M2 J1 \0 R: L* a! q* v6 D
  16.   if (valuesRR > CNY70Val)
    9 Z$ p) u+ I. S6 h
  17.     valuesRR = CNY70Val;
    2 z4 P6 x( V! j$ E8 f
  18.   if (valuesMR > CNY70Val)
    0 l: A/ T- Z( v' H
  19.     valuesMR = CNY70Val;
    5 ]4 P$ M% B3 l- Q  l3 J' O  S
  20.   if (valuesMM > CNY70Val)
    & T; B  ~. ?0 C# e6 @# _+ N
  21.     valuesMM = CNY70Val;7 N1 i: I, t8 P4 W) M! d5 B
  22.   if (valuesML > CNY70Val)" N" c3 f: K9 _. j, ?
  23.     valuesML = CNY70Val;9 Y* m8 Z* k' v' x" c( C! c
  24.   if (valuesLL > CNY70Val)
    8 d0 p! w  l: `1 F1 L9 J) H0 J) W
  25.     valuesLL = CNY70Val;
    + M, u2 \& J% E* ^0 p8 w

  26. 9 y& g) b  F$ _0 ]0 L
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    0 m$ k% {% _& h  d1 A0 `6 a* u. R2 E! B
  28. }
    2 T* _9 K2 |3 m" i8 ~% ]+ ]* `6 V! J
  29. / Z8 Q9 Q2 ]9 G
  30. void Car()
    2 `- G, d2 i- e' Q0 P6 F
  31. {1 M% V( g% u6 [+ f  b' A- U2 ]' T
  32.   while (1) {
    / I& u, e- O; R; ?! y
  33.     CNY70();
    5 J( D/ y4 Y& i/ Q4 n! g- s
  34. 6 d2 o5 [8 _2 m6 Z# \! g
  35.     int error = ((int)values);
    2 y* Y8 d: N) J/ W, ]% G
  36.     interror += error;( M" W, k, c* D; z3 F
  37.     int lasterror = error - olderror;
    6 B4 X- f. a$ g! M
  38.     olderror = error;
    * N4 t( E/ [) y1 ]5 r1 c! d
  39.     int power = error / 5 + interror / 10000 + lasterror;
    8 F+ {. I9 m9 b  X; I6 R+ ~

  40. " x) B& H4 W  p
  41.     if (power > MotoSpeed)" B9 X3 g$ L+ I0 ^6 K# V; i( l4 y# \
  42.       power = MotoSpeed;
    : {1 [- e, m& s6 D
  43.     if (power < -MotoSpeed)$ M; Y- n4 ~6 |5 N  E( E6 U* ?
  44.       power = -MotoSpeed;" g& {# ]3 f2 ?3 E

  45. 2 f) V* |$ I- l5 l& H+ ]& }
  46.     if (power > 0)) Q& T& [& t5 m9 c! I' }% @
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。2 m9 ~2 E, A2 W* n
  48.     else' l, C  F! q/ O- |; J! j6 I; D0 I
  49.       Speed(MotoSpeed + power, MotoSpeed);
    1 V& o' w( |  o) j/ g6 ]+ n' u' I
  50.   }
    ! k! E, h: @1 N  f- o4 `1 I
  51. }
複製代碼
9 T9 {. ^7 j* X/ }2 |6 \
( o/ R4 G. i. ?) g/ X: g1 m: E: r
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 13:29 , Processed in 0.024245 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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