圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21803|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>. o" }2 l& e. V' L) h
  2. #include <Wire.h>8 w/ h" \2 u3 A) U/ F' S* v; ~
  3. #include <Servo.h>
    ! B0 ~! V3 i2 {) Q

  4. 6 \; T# c# f+ _$ p
  5. #include "MePort.h"
    : T3 E* V" C0 Y; s( g/ p
  6. #include "MeUltrasonic.h"
    + N- Z; \: l. r: N+ `9 d
  7. #include "MeDCMotor.h"
    9 k  t; J, |( T. `6 o* o
  8. + F! K6 e4 }  `% E
  9. //double Input, Output ;
    / P  W: X7 Z: ?# A8 x3 \
  10. float MaxSpeed = 255;
    - D3 S: Y7 ?; G! \! E6 `
  11. float MaxPower = 180;0 s, p! \7 \9 x% w/ [! @: b$ x5 D
  12. float MinPower = 120;: `, y! M  _4 S( t  D* Z- i
  13. float Error,ErrorAcc,ErrorDec;
    ; ]% v( c9 F; |" r# T8 z- C
  14. 4 u& u1 z! A; `/ `* C5 {, `
  15. float Kp=0.14;2 S$ `' p8 E; \) \- }4 W
  16. float Kd=0.00020;//23;
    3 R; E6 O. U' c( C, M* x
  17. float Ki=0.000201;
    : E3 ^# _" g2 |( o0 A

  18. # e; o2 ~5 c3 C5 v
  19. float nPower;5 N% S' `/ U8 Q5 v+ o9 B" A
  20. MePort lightsensor_6(6);
    ! u6 Z! w5 C% w, P# S1 i
  21. MePort lightsensor_8(8);# N6 z& C+ ~- H% |1 J( h; E
  22. MeDCMotor motor_9(9);5 K9 P& L  j$ [
  23. MeDCMotor motor_10(10);: l2 [0 W. m$ |; k0 e" U
  24. unsigned long previousMillis = 0;( e7 g# `" I0 ^
  25. const long interval = 1;! K- O& F) x8 @2 S8 T" t
  26. / R+ I* a6 _1 o* I* G& [# i9 I8 T
  27. void setup(){
    2 X. g" [; j1 C* Q& E) V3 D
  28.     lightsensor_6.dWrite1(1);
    9 O& ]1 m/ G# x$ [( e8 v
  29.     nPower = 160;* Z7 g! I% P0 J
  30.     Error=0;/ D# o. N/ ?/ W9 G, G
  31.     ErrorAcc=0;
    7 U& h1 Z# [+ }2 f
  32. }) g- t! h( u6 x* P5 t' p2 U8 J

  33. 3 ~) d& H7 m2 d  E# v" k) |
  34. void loop(){
    - V( k* ?  u& ]+ g, C8 g8 b3 C* @
  35.   unsigned long StartTime = millis();# p' k# Y5 e" p+ X9 C
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    5 Y8 R* K: I0 D) N9 V' t, Y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();/ C& n$ ^8 U5 ]: Z* h# z
  38.     ErrorAcc +=  nError*Kd ;8 |9 n4 \# {" a$ G, J2 A
  39.     ErrorDec -=  nError*Ki ;
    ) f: M7 ~4 P6 S$ i$ G) v& _3 K5 ]
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);) p5 s' B! S8 D
  41.     if(nError < 80 && nError > -80){
    ) C) t/ v/ Y& V) X: G
  42.       if(nPower < MaxPower){
    & l6 o! M1 Q  h$ |+ G* w
  43.         nPower += 3;
    7 O  E0 h: k0 u( L
  44.       }
    8 H- }. Z" z* k' p" [2 P
  45.     } else{
    8 z2 T  I) _/ e: I5 s
  46.       if(nPower > MinPower){
    3 C9 W' T9 @3 H0 s0 f% P" a
  47.         nPower -= 2;
    ; \& t0 E: m2 k5 [* ^
  48.       }) i% A$ c. H. [. t' c' [$ H
  49.     } ) j8 Y, x* _4 |5 P+ \
  50.     MotoL(nPower-Error);
    5 x0 z- {! R- e; p* O
  51.     MotoR(nPower+Error);   
    6 |/ a% \6 H! c: S# t" f
  52.   }else{
    8 y- j( r7 \! D( c' y4 v1 q9 x
  53.     motor_9.run(0);
    9 r8 ^! T! v% Y6 S/ E- J* V
  54.     motor_10.run(0);0 `; O3 S8 V: b/ w. Z: C# t
  55.   }
    - D8 d5 v* ]" u# ~1 z6 C- k) k
  56.   do{}while(millis() - StartTime < interval);5 X; U. x+ n3 z' ^; f
  57. }
    " d% g& V+ O( i, H

  58. ; N5 e: O' G( o3 u, m+ f" j
  59. void MotoL(int Power){% }9 D8 g; O5 V
  60.   if (Power > MaxSpeed){6 _" R, E' S! O; `
  61.      Power = MaxSpeed;
    1 b; Q' M& }/ C0 A7 e. C
  62.   } 2 i* j2 i# r$ I, W+ @' e
  63.   if (Power < -MaxSpeed){
    6 V9 g. u6 i, B
  64.      Power = -MaxSpeed;* P( y7 ?; |6 f8 N
  65.   }
    + _% D3 x% `3 o
  66.   motor_9.run(Power);3 {7 k3 G0 }1 S; u0 ~+ U
  67. }  , C3 X: a. U  ]8 k* ?4 X
  68. / G# ]+ V& z9 R! d& n4 Y( l& ~5 b* I3 N
  69. void MotoR(int Power){
    . t0 ?7 L3 b1 [, @% k* u6 q
  70.   if (Power > MaxSpeed){& T2 |5 k3 a, p3 C6 d& F/ q
  71.      Power = MaxSpeed;
    . a0 E. t: M/ @; b" u: O
  72.   }
    4 Q4 \0 x, ^$ x
  73.   if (Power < -MaxSpeed){( d- j% a8 g7 L5 {. a, l) v$ Q
  74.      Power = -MaxSpeed;- V# s* N! |( p5 O3 O5 {2 k3 B
  75.   } 5 s" c9 d4 m$ Q* i' w5 d2 g, m
  76.   motor_10.run(Power);
    $ t1 M0 V% z9 L  \% l$ q5 C8 b
  77. }  
複製代碼
% p1 k& z5 T8 g* `% T+ C
0 d3 {4 h' S! p) \; y
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ \# N/ X' M' R1 V
' @7 d1 t) J# ^% Q* b您好,不知是否能向您請教。' x6 m- I  L* E1 m
目前和宋修賢老師在處理Ardui Car
8 B" T' k4 z6 t7 h5 I" M; t- w+ ?雖然已使用較繁雜的方式處理了跑出黑線外的狀況
. z6 s8 x$ X" P0 J' C. c* p9 v9 c9 I4 C# Z& O9 k. B) j0 ]
但基於想追求更精簡的程式所以還是想請問一下: k! `' p( \6 Y. V0 s( m
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝0 ]! i! h* E0 P5 @3 h
不知道您是否願意教我可以如何處理" R4 ~" y( s. Q9 f
" d6 Q3 O1 M; P3 Q3 Y# F

4 O& S/ N" z% \9 V以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    & E" v9 ~0 r9 _
  2. double CNY70Val = 1000;
    - j8 f- G$ h; P0 |
  3. int interror = 0;
    / c1 a& |7 z& B2 V/ l9 B/ k& L; j
  4. int olderror = 0;
    6 l8 E1 S1 I% s0 ]  v. D
  5. double values;- L! _9 l+ t, \$ ]& b+ `- g

  6. 3 g, D# ^$ h9 F& O

  7. 7 X0 l+ k7 M( N2 Y  A
  8. void CNY70()
    . S: `' y+ T2 ~: }  ^9 ^/ F/ t$ f
  9. {; ^0 a  J/ s) D0 w/ U$ m; ]5 y
  10.   valuesRR = analogRead(RR)
    : D% `( o9 q+ b, s' ~. o
  11.   valuesMR = analogRead(MR);: m0 s( N* }$ n* D
  12.   valuesMM = analogRead(MM);
    0 c3 k0 i# W7 L/ W# T) |
  13.   valuesML = analogRead(ML);" S6 e- N! L" e0 C  S( k; }
  14.   valuesLL = analogRead(LL);
    9 o1 O; J5 b+ s+ |. F# b
  15. ( N% Z. |; n- ]+ O1 I) z' f
  16.   if (valuesRR > CNY70Val)
    . e' W! p' D: E1 S; }
  17.     valuesRR = CNY70Val;
    4 ], m5 R- ]. |, B8 z
  18.   if (valuesMR > CNY70Val)
    5 `8 v) K/ {8 r8 L% R4 n+ j
  19.     valuesMR = CNY70Val;
    : t1 q+ Q6 w5 _" _! {, P* Z* c% S
  20.   if (valuesMM > CNY70Val)+ e& M( l* a- v' y$ `
  21.     valuesMM = CNY70Val;! y4 t; k- L' I- I1 q5 o% [
  22.   if (valuesML > CNY70Val)/ p4 i* H6 r+ G/ H  h: \+ q( U
  23.     valuesML = CNY70Val;
    " X$ A0 c- `+ ^' d
  24.   if (valuesLL > CNY70Val)% G# L$ n# S2 a! y! z
  25.     valuesLL = CNY70Val;  |& p6 b" p  z: c

  26. # f$ _/ l* B0 {  V9 c/ i2 `$ @
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    * q7 Z; o. v7 F2 M- v- J2 B
  28. }3 g# b. a% Q2 l* x5 u& y: `7 {
  29. . X, Y( w7 [0 }( ?6 F% _# ~0 Z
  30. void Car()
    ( u6 t; _+ z0 }
  31. {$ f4 [  Q4 S3 L
  32.   while (1) {( F: j) l* k5 P6 m. v2 ]# _0 F
  33.     CNY70();
    4 o/ D: D/ w0 {# H' o

  34. 8 f1 E/ X( g0 c0 ?
  35.     int error = ((int)values);8 `5 G5 S2 G. V2 N, N: q2 V
  36.     interror += error;6 O. ?  b7 Y7 P: m' l6 e
  37.     int lasterror = error - olderror;9 G4 J+ a4 t! M/ \
  38.     olderror = error;+ ~  F. t! i! E, ~; c) O7 Z
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ) `* [* u4 L$ c% J+ n

  40. 1 k1 s8 R0 w" O& Y( M
  41.     if (power > MotoSpeed)
    * P# N2 v' A3 g+ u9 O
  42.       power = MotoSpeed;- J4 m* R5 E/ I  E: _1 m
  43.     if (power < -MotoSpeed)
    + X$ a4 t0 \! k" P. e$ }) a0 V
  44.       power = -MotoSpeed;
    3 a' z& d3 W% P

  45. * X. z) L  P4 n+ V4 M; f, ?% m- B
  46.     if (power > 0)3 O8 a$ s/ A$ l) C
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。3 k$ o9 D' w. m+ i( d5 M
  48.     else  c$ q+ N$ G$ Q9 `
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; M7 \2 T, s1 ~( g% F4 E
  50.   }
    % B; [9 h. j& _2 ~: o- p
  51. }
複製代碼

4 l8 o/ D7 C& F3 P
! F6 }  o/ ~, B* {
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-2 00:17 , Processed in 0.024481 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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