圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20569|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    , x0 n+ H$ V/ v" {
  2. #include <Wire.h>, Y' ?3 t6 g+ S
  3. #include <Servo.h>1 Q3 E0 o6 d0 Z7 l
  4. 0 i+ \! ~2 L5 m7 A/ [  `: m
  5. #include "MePort.h"
    6 l4 L* L# [, L  _1 a  U- @& s
  6. #include "MeUltrasonic.h"
    + e+ G9 O9 F4 S. q  u2 A2 R4 l
  7. #include "MeDCMotor.h"6 ~, M) |4 S4 ^6 {, S9 S
  8. 8 u0 G8 c6 P: m/ V5 [
  9. //double Input, Output ;5 m* g+ {/ O* N: a' w
  10. float MaxSpeed = 255;6 m$ q" ^4 i9 @: D/ O( V
  11. float MaxPower = 180;! T: m3 b" g( e& q, H$ I
  12. float MinPower = 120;
    . N+ F2 c: l/ d1 k5 m  T
  13. float Error,ErrorAcc,ErrorDec;8 v; g% t: l9 l! h- ~
  14. 5 ]+ S% Y& c; A  D  h3 _
  15. float Kp=0.14;' e8 O! [1 G% w0 `& c
  16. float Kd=0.00020;//23;
    / n, G3 I$ B" i# c7 B- R- a, @! I! F
  17. float Ki=0.000201;$ e8 |: N, p6 o2 A3 }

  18. & Q3 Q+ t# G! A4 _4 r
  19. float nPower;9 ]- r- l$ z" g. U7 ~2 b1 ?; W# q
  20. MePort lightsensor_6(6);* d( G8 S; E( C9 ]1 i4 y* n3 D
  21. MePort lightsensor_8(8);
    2 B* [! [6 U( z. L  c' Y/ P2 j
  22. MeDCMotor motor_9(9);
      u4 G% M% ]. N+ B2 y
  23. MeDCMotor motor_10(10);$ P( A- N. A. a' ^4 L% k2 s
  24. unsigned long previousMillis = 0;; R% e# _( C- l# |3 c+ u6 x
  25. const long interval = 1;( g4 n" B; F: d( k# x1 r
  26. # {# C  b. x0 B* A: X5 r' Q0 \
  27. void setup(){9 S7 @; w* R* S  n, s1 e/ y3 P
  28.     lightsensor_6.dWrite1(1);
    / l4 I4 u" a$ M# E2 H; L
  29.     nPower = 160;
    ' c) q# |& b8 d
  30.     Error=0;
    : W2 Q8 g% S+ f1 w& {9 F" v: V
  31.     ErrorAcc=0;  f) Y/ H4 l7 q2 y5 b
  32. }$ Y/ W0 P, {# T$ g. D
  33. " g) |$ R- V9 O0 U% _) V
  34. void loop(){
      V% R. S) P9 y% N( x5 J
  35.   unsigned long StartTime = millis();
    6 B/ Z7 E6 K' O+ L6 T- N
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){- Q  p8 C8 G8 _, b5 [$ T/ x
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    / t( r7 F% e7 B$ x9 x% T
  38.     ErrorAcc +=  nError*Kd ;
    $ G- x7 a: a7 N" `
  39.     ErrorDec -=  nError*Ki ;
    ; h% r$ G% H7 V1 @, G3 U/ F
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    $ m; U" X0 E) W: B- h) x9 f0 o
  41.     if(nError < 80 && nError > -80){  I  `5 m. M. c$ n6 J: t
  42.       if(nPower < MaxPower){- @! R. q4 {7 H! F8 E- _1 A
  43.         nPower += 3;
    " A& e# i6 s3 Q4 m% `( Y' K* L  s
  44.       }  A) ~- R1 Q- ^- L0 U
  45.     } else{
    5 C# p" `/ R9 d. }* b$ W
  46.       if(nPower > MinPower){
    3 ]( i1 J5 o; R* T1 F
  47.         nPower -= 2;
    0 i7 o7 e4 X  ]7 J
  48.       }
    ! l* m' r  d% n1 }& L! ]9 w
  49.     }
    : f3 s! G( }& Q4 Q" Z
  50.     MotoL(nPower-Error);
    ) @8 w9 Q# m  D: J4 g7 D' X3 |
  51.     MotoR(nPower+Error);   
    ; z3 d1 T* H. d
  52.   }else{
    8 o9 L$ H$ B) `
  53.     motor_9.run(0);
    , Y: \; t+ X7 J8 s# F& F# E
  54.     motor_10.run(0);# Q% A) d. |9 S/ h( [" i
  55.   }
    * y+ T- g" Y3 ~+ [& f; c
  56.   do{}while(millis() - StartTime < interval);$ V0 o- V. t5 T: y5 `- p
  57. }7 _4 v5 Y( F: G2 D
  58. 6 l& e  F# ~4 D- o: {
  59. void MotoL(int Power){1 I0 c: S6 h( w4 ^! I( J" N- d
  60.   if (Power > MaxSpeed){3 v' U5 V/ {1 _% m+ z
  61.      Power = MaxSpeed;
    3 \6 Q% d7 |8 ~. u: S" D6 ^
  62.   }
    ( D$ o2 [: _3 J* @2 G
  63.   if (Power < -MaxSpeed){6 J7 F% p1 I+ N0 M0 c3 O2 ]
  64.      Power = -MaxSpeed;
    + \% c7 j4 L9 ~& W
  65.   }
    ! Q) A9 \* p3 H  c8 D& T& ~
  66.   motor_9.run(Power);
    - V: Y9 C- x8 B1 W8 R$ w
  67. }  " O2 E0 _9 Z% v4 J1 S/ V

  68. - [8 s! b2 O( A" r) \" `, P# @
  69. void MotoR(int Power){6 \7 i$ W  D: O, T
  70.   if (Power > MaxSpeed){
    - ^* t( Y+ I' Z5 _; r# m; o
  71.      Power = MaxSpeed;) Y% W$ p# i9 Q8 ^5 J2 L
  72.   } " f8 N/ |3 M6 i. |9 ^4 l) a
  73.   if (Power < -MaxSpeed){3 C1 A& o/ m# G$ y/ l: c( P! R
  74.      Power = -MaxSpeed;
    5 Y- U7 k2 a/ S3 x# J
  75.   } & [2 S4 \  s1 H/ s) }! ]- X
  76.   motor_10.run(Power);. G6 _- i" M+ f% Y0 {" h
  77. }  
複製代碼
; B: O! m5 _/ H4 L( U/ B* S
% n0 L1 `+ W3 S2 E* S9 n+ b9 m
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 % q7 {. C3 M* D) f' b
- D2 I6 h; V; r
您好,不知是否能向您請教。
: Y5 R+ R0 P7 d9 s目前和宋修賢老師在處理Ardui Car5 [. Z3 E2 L( z% ~  M% p
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
* }5 D3 T: @4 x/ s' s
3 q4 j+ v# d5 o3 H. [6 S但基於想追求更精簡的程式所以還是想請問一下1 \9 X/ B8 c0 j1 S" E
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
8 }. u8 n0 ^6 L" Q2 o不知道您是否願意教我可以如何處理
9 ?7 E  C, G) }2 @4 n7 U$ X
% R  z& R0 w0 D4 m) e- Z# R
& y0 b5 _4 c% Z' G2 k以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;% }1 Z# q! N/ Q: ?7 ]3 |5 j$ ?0 L; e
  2. double CNY70Val = 1000;& q& V) p+ i# b
  3. int interror = 0;
    & O4 s; }- B* J) f% q
  4. int olderror = 0;6 ?# |. ]) d! |, n9 v
  5. double values;
    8 `9 O" i, q0 Q0 n0 }  ^

  6. . N4 A6 `% U: F( G) T
  7. - l* i) D. j* H& x$ q
  8. void CNY70()
    # P( q1 o& A3 R, e8 g
  9. {) ?1 v- e0 v1 @6 ~2 U) u' f( l2 U
  10.   valuesRR = analogRead(RR)+ B% y# u' {0 q4 E
  11.   valuesMR = analogRead(MR);* ^7 z# X( P" c6 I4 Y8 C) N
  12.   valuesMM = analogRead(MM);
    ) J" A5 Y* s7 F$ z, u; F
  13.   valuesML = analogRead(ML);
    6 C# y2 i. I$ e
  14.   valuesLL = analogRead(LL);
      \% [6 b" v1 Q, Q

  15. 1 N1 |$ I2 H+ U( q$ p+ V  e
  16.   if (valuesRR > CNY70Val)
    + d$ y+ r6 r* ^8 [  o
  17.     valuesRR = CNY70Val;3 k! s4 m) p6 Q' |0 y5 z# x
  18.   if (valuesMR > CNY70Val); n2 c5 Y* E' G# r: P6 X$ P
  19.     valuesMR = CNY70Val;
    $ i0 z) f8 r' q' `$ ]
  20.   if (valuesMM > CNY70Val)" U* q+ b  @( O: |1 J( J1 p
  21.     valuesMM = CNY70Val;
    # F' }* v+ a/ G- x' z
  22.   if (valuesML > CNY70Val)) p+ l0 p% n# G
  23.     valuesML = CNY70Val;% u, W% M5 H: q6 j: S
  24.   if (valuesLL > CNY70Val)
    ) {9 K( w/ F! b6 h: e5 g$ y
  25.     valuesLL = CNY70Val;
    , }' Y: f4 z. T

  26. 2 l/ h1 Z9 H) ]- [& l' r
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    % \  ]  g% f+ E% a) Z7 g1 V  e
  28. }8 B* l. Z6 y5 q9 I6 j# K3 l

  29. , L, i% @4 y; i+ B, q! |4 X7 f* p
  30. void Car()5 B! Z( \! @* Y& v0 E/ M# t3 U9 ?* a
  31. {, Y3 ^1 j0 F; ^
  32.   while (1) {
    ( i: p/ a7 |3 m+ b$ T
  33.     CNY70();
    * y+ A8 [, b  U. m: B

  34. 8 {; A+ w0 Y5 M2 a: z
  35.     int error = ((int)values);
    ! ]! Z! N5 J# [& ^4 p. J/ m6 k
  36.     interror += error;) V# p: p" P$ x* I2 j, ^0 p- P
  37.     int lasterror = error - olderror;
    ) d6 S/ C5 |7 b" a# R3 |
  38.     olderror = error;
    ' a  z4 p, M( t+ h6 o& F- M5 f
  39.     int power = error / 5 + interror / 10000 + lasterror;
    + A: l+ F& L& I
  40. ! A) [7 Q; H5 e7 F+ b
  41.     if (power > MotoSpeed)
    6 t" o5 O  B/ n
  42.       power = MotoSpeed;5 p! v% n/ |; M' r7 S
  43.     if (power < -MotoSpeed)* z" n* }* c' W& s
  44.       power = -MotoSpeed;5 H  c& u( W( k0 K

  45. $ r0 D/ W9 S, M
  46.     if (power > 0)
    . Y+ [! @$ U, D' n9 q& L# J
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。* d0 r+ t7 I/ @. P6 U! a
  48.     else" X% S+ i8 \, D2 `
  49.       Speed(MotoSpeed + power, MotoSpeed);$ R3 z0 x* @8 X( I* |+ x1 B
  50.   }6 B9 \3 r* S3 f7 X7 p
  51. }
複製代碼
- t. J  h* A: o  u2 k' @9 A" r
+ E+ `, [% n8 B) x& s
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-4-19 15:06 , Processed in 0.024872 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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