圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21847|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    , W  v' \8 [8 Q
  2. #include <Wire.h>( ~" B1 X9 G4 }
  3. #include <Servo.h>
    / o2 l, b# t0 S: f: K& |8 m) |3 W
  4. 0 _: i( R+ ~3 ^. n
  5. #include "MePort.h": \0 k& W. T1 t& Z' Z; P4 o1 i
  6. #include "MeUltrasonic.h"
    " L4 C7 C' l1 i  `
  7. #include "MeDCMotor.h"
    ) G3 h& E( I& x. |) k9 r& V) _* ]. h/ V
  8. # h) z: D6 _8 Y" n
  9. //double Input, Output ;
    0 D$ ^2 R: r( T% N
  10. float MaxSpeed = 255;* Z/ V7 M3 r9 h
  11. float MaxPower = 180;
    3 C0 b) V. X" q9 g' |3 P: W
  12. float MinPower = 120;
    ( C6 j# W% l' g
  13. float Error,ErrorAcc,ErrorDec;
    9 \, Z- N8 G2 F( O6 }7 k* f6 c

  14. # q# N- G* T7 W5 i
  15. float Kp=0.14;  K$ K: O( c" @3 y. }
  16. float Kd=0.00020;//23;, I* j! a7 K) `6 m* P: Q1 @& ~, A
  17. float Ki=0.000201;9 M; J$ M% R# u! |% C7 J

  18. 4 H7 q4 l1 B6 F. g8 L+ G7 f
  19. float nPower;7 a. [4 m/ x) D- M6 S
  20. MePort lightsensor_6(6);
    3 a0 T8 a8 T. D4 T
  21. MePort lightsensor_8(8);
    3 |, W! @- Z% K5 q# I7 f
  22. MeDCMotor motor_9(9);
      |3 H3 _: Z# |
  23. MeDCMotor motor_10(10);2 U3 k4 L5 V7 ~' B' [( ]4 V+ a
  24. unsigned long previousMillis = 0;4 x% ^. q8 X6 d( U# u2 z
  25. const long interval = 1;$ g% P6 X) X0 m6 H6 ~5 k5 t7 Q
  26. * K$ k1 y" o9 b2 c
  27. void setup(){# ~, J: V6 o" I' {# B. M3 e8 G
  28.     lightsensor_6.dWrite1(1);
    6 ]* b6 S1 ]1 u. }; J
  29.     nPower = 160;& m( K. h; ~% ]- A
  30.     Error=0;/ r. y# }  {- |0 T' M' t
  31.     ErrorAcc=0;  J3 [$ D, Q  s! L) x- o
  32. }
    / Q. a: u+ m) C4 C

  33. $ f) x0 u) h% n" v3 t
  34. void loop(){
    ; G7 R, O5 Z! z) Y
  35.   unsigned long StartTime = millis();
    7 A- c9 o6 W$ d; P6 g
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){2 E# A, Y: A+ Q7 _) O% k3 z( ~& G
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    & i* ~& h0 ]! K. k6 Y0 w) {
  38.     ErrorAcc +=  nError*Kd ;
    6 U+ G' B6 T# ^( p0 n
  39.     ErrorDec -=  nError*Ki ;
    ; L! F! k7 s( f, f3 q7 }4 n% n9 m
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);! z* s+ ~  j! p8 f6 m4 z: q% r
  41.     if(nError < 80 && nError > -80){
    9 G- t0 O( {  S! j6 |& \' _
  42.       if(nPower < MaxPower){
    ! A1 `4 p5 }' |, N
  43.         nPower += 3;9 R/ U$ X3 p4 W, Y+ |; l/ v7 W
  44.       }
    - ]6 d+ Q* B7 B& Z& F0 W* E/ r
  45.     } else{
    7 d) Z( J8 Z& A
  46.       if(nPower > MinPower){
    $ Q( i# i% ?2 _4 J
  47.         nPower -= 2;# b- x( e1 D9 g. k& S
  48.       }( ^' i5 }# v/ O, J/ K: ]
  49.     }
    % ~4 e2 B" k$ _1 c' m
  50.     MotoL(nPower-Error);' [3 l  V/ a3 p* ]- J1 Q
  51.     MotoR(nPower+Error);   
    & f5 @% R1 }7 q: F% m5 B
  52.   }else{
    % A! L7 {0 t' e$ X8 A6 J
  53.     motor_9.run(0);
    1 z& Z3 Q, w) R6 M
  54.     motor_10.run(0);  m+ I* v( j/ F% H$ z  R7 \, A7 |
  55.   }3 ]% c& _1 y9 r4 z. G1 b2 j
  56.   do{}while(millis() - StartTime < interval);8 K' `( ~0 d! B/ t, f' I( R% m
  57. }
    2 Z0 @+ C9 S( ^- T& Z5 Q8 K

  58. % N6 f; `$ V3 k$ A2 u
  59. void MotoL(int Power){. c/ s% H# n6 G
  60.   if (Power > MaxSpeed){8 o6 q1 m3 T  b3 u
  61.      Power = MaxSpeed;% o, u8 T1 y  q- e2 s! Z3 q
  62.   } " m) [; e/ Y3 {. J. E5 c
  63.   if (Power < -MaxSpeed){4 ?7 ~6 n; |- r0 d- q
  64.      Power = -MaxSpeed;1 F* p' l2 q  F4 e( I
  65.   }
    ) e3 u* D7 E3 p/ R, U. T) y
  66.   motor_9.run(Power);0 j" C4 o; X! ]  u0 j
  67. }  & X- j8 C0 G5 D( Q  _- b1 W1 o
  68. 5 e8 M- m, _7 |- S5 t
  69. void MotoR(int Power){. H: g9 }( }8 M8 n1 n5 B3 Y
  70.   if (Power > MaxSpeed){
    5 ^& ?* K6 }" v& T: x
  71.      Power = MaxSpeed;
    0 q' ?& |/ \( w5 p; S
  72.   }
    : [! ?4 C; [( [' I3 U& B1 M
  73.   if (Power < -MaxSpeed){
    1 Z6 @# H. m4 v* [! l+ F
  74.      Power = -MaxSpeed;
    # N0 V7 l" i8 `" r/ v) ~/ {: T+ j
  75.   }
    : g" ]! R) @+ W1 Q0 {2 G2 W# U1 }
  76.   motor_10.run(Power);0 f4 q4 B$ i" K( m' k
  77. }  
複製代碼

+ {% G  j1 f8 a0 j  L
% q" [' c! `0 @3 f" M3 s. y0 D- ~. I
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
, x$ \' |7 f# a3 L5 b5 F1 ~' T
$ @0 D( T2 A8 N1 A* Y4 ^您好,不知是否能向您請教。9 Q& N8 p$ y5 g& c
目前和宋修賢老師在處理Ardui Car
4 D& @0 X' {" W' z! g5 o9 M雖然已使用較繁雜的方式處理了跑出黑線外的狀況# ~1 U" i3 A8 T/ q7 \( u

5 \' s( j  y: }0 G6 `但基於想追求更精簡的程式所以還是想請問一下4 B4 N  O) ~# [" x+ ^7 ^3 ]- o
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝# y9 t! i  j# R! Y
不知道您是否願意教我可以如何處理2 d: X1 m. J1 r' }
7 w6 }* L% O' ]# b

* W/ H+ B2 M7 \; _以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    5 H3 P8 N: T" n; ~
  2. double CNY70Val = 1000;
    " [% Z( O" h/ z, ?) a; I
  3. int interror = 0;
    # s! Q& ?; y3 j5 Q3 y0 h
  4. int olderror = 0;- e& ~4 n% ?5 ~. U/ C- G
  5. double values;
    6 k/ q" Q9 O5 ]
  6. ! J! }1 s' A8 u' \! k
  7. % Y( a. U+ h: V3 ~$ T. A: d, v
  8. void CNY70()
    0 S, f8 O0 t- E# y/ ^
  9. {9 g; J" n9 r& U2 C: f* t  o9 u. Q
  10.   valuesRR = analogRead(RR)- U( s$ ]6 o$ t5 F/ O  r! h
  11.   valuesMR = analogRead(MR);% i8 `/ S& H0 R2 v* k* a
  12.   valuesMM = analogRead(MM);# j& Y' C+ X  j7 J
  13.   valuesML = analogRead(ML);/ k2 C$ G1 j6 @2 {
  14.   valuesLL = analogRead(LL);2 n. `8 Y# J4 p1 g$ b, T2 M% X
  15. ; p8 D2 a3 r+ O0 l7 e+ O( r$ J
  16.   if (valuesRR > CNY70Val)& {) U* ^% b7 g2 s5 I% ^7 f6 S1 j
  17.     valuesRR = CNY70Val;
    7 Q: s1 z; \# Z; |% U
  18.   if (valuesMR > CNY70Val)( R2 ?. o/ ~& j6 _* M
  19.     valuesMR = CNY70Val;
    8 K2 V# u6 U: ]
  20.   if (valuesMM > CNY70Val)
    . c; `: U0 Q, m/ ]% L5 l
  21.     valuesMM = CNY70Val;
    " S3 s% L+ G7 b7 I3 G4 T) m1 s
  22.   if (valuesML > CNY70Val)7 U) f$ f# ?( e  e$ D6 n
  23.     valuesML = CNY70Val;: P8 ?6 v# I, Z& k  h+ p
  24.   if (valuesLL > CNY70Val)
    4 ]5 u3 A/ d2 C
  25.     valuesLL = CNY70Val;
    : v6 U2 n, s" O6 h

  26. 9 W, Y, Z2 c4 c& h) d4 R
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    7 {/ E% Y: Z( ~+ a* {9 A5 D5 |  P
  28. }
    & R* C! z- g. Q- H9 `, B, f

  29. % ^' Z; |4 M# W" h. i1 _
  30. void Car()
    2 y) L" F7 p' {& k
  31. {  i5 w" k, D: S1 F7 v& |  C
  32.   while (1) {/ n9 V8 P! x) R
  33.     CNY70();
    . Q. M5 ^! u2 }" j5 E6 ~
  34. # @. r1 X2 b2 ]6 s0 j/ f$ l  K2 H
  35.     int error = ((int)values);8 O3 S% \" E) b6 g
  36.     interror += error;" v! C5 U4 v4 k( ~& q$ T" `
  37.     int lasterror = error - olderror;% G. t5 w" [" j$ M" E
  38.     olderror = error;
    % r. \. O+ h. a0 v% w
  39.     int power = error / 5 + interror / 10000 + lasterror;
    0 y/ c( k+ h) p6 p; p

  40. 4 O8 |: _9 N- K# H9 N9 [4 l4 g
  41.     if (power > MotoSpeed)+ N) g  i/ ^' l/ Y7 W, [( z% e( Q% x
  42.       power = MotoSpeed;
    ! A! |$ U( O0 R" Z9 V7 V# q
  43.     if (power < -MotoSpeed)
    1 Y: E' f! J3 Z5 ~  d
  44.       power = -MotoSpeed;  B9 }- m8 K  G6 Q
  45. . Q5 h. x4 H3 R& n/ R
  46.     if (power > 0)8 p% D" m: U1 O' G% r9 u
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    % l# l3 N- C% W- {1 w% I
  48.     else
      L1 }; C) [( [% R
  49.       Speed(MotoSpeed + power, MotoSpeed);. M& M+ B8 U3 g& z+ z
  50.   }
    - y; O9 T" E2 [. N  {
  51. }
複製代碼
( e- Q2 {4 c; Z! B+ H' v
# N9 [, I0 _- o0 V' ~
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-5 12:42 , Processed in 0.024828 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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