圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21844|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>. [& g( p4 U( C
  2. #include <Wire.h>8 J4 J* A' A  l
  3. #include <Servo.h># F. p) H8 D# g. {

  4. : z2 y4 Y& E0 ^3 V: S1 p
  5. #include "MePort.h"
    ! `0 k, c7 G" P' S4 K8 ^3 B
  6. #include "MeUltrasonic.h"
    ; Y9 P% l; c1 q9 U2 L1 ^
  7. #include "MeDCMotor.h"
    # p, F. V2 ]" B7 Y) a" |# P2 f$ A
  8. 4 m& h  O% D2 B! V% K9 g7 s
  9. //double Input, Output ;6 N. O: V1 D9 O9 Y! z& V( ~1 q% e
  10. float MaxSpeed = 255;2 a, y* y# _) `# A/ ?  I
  11. float MaxPower = 180;
    " H, l4 j2 w6 M2 x  U- b2 \+ y7 |" Q1 \0 F
  12. float MinPower = 120;2 A2 D( J! u! W  n0 F* d9 A
  13. float Error,ErrorAcc,ErrorDec;1 A  E6 @6 c" d1 C8 q2 K2 G1 `1 n
  14. 2 d( g0 S9 O- h6 P  ^& @6 x
  15. float Kp=0.14;
    , P  W8 A7 H* g) G' ]2 K* Q7 |
  16. float Kd=0.00020;//23;
    9 G$ N3 C, ]( g2 B4 ~# T
  17. float Ki=0.000201;7 z- k. O5 r1 W3 S' r5 V

  18. 4 M5 B8 o+ \9 P% E
  19. float nPower;
    6 Y) n% k" U5 V" ~
  20. MePort lightsensor_6(6);
    0 C6 U1 V+ e/ @" Y- ~: [
  21. MePort lightsensor_8(8);
    9 a* N: l* E! O4 F  n' W" O! s( w
  22. MeDCMotor motor_9(9);
    9 `$ x  R* B! a! Z+ A9 k
  23. MeDCMotor motor_10(10);
    6 A$ [' ^/ y8 R; {( v# `: O
  24. unsigned long previousMillis = 0;
    8 c* C" d- g2 b4 w
  25. const long interval = 1;+ \1 V0 n, X! `# ~0 ?

  26. 8 Y7 {5 j7 |: t  K, k+ z
  27. void setup(){: \9 X0 l0 P$ G3 F# L4 i
  28.     lightsensor_6.dWrite1(1);
    " w7 D/ |# t5 i9 d
  29.     nPower = 160;
    6 e6 w7 `! ?  [$ L
  30.     Error=0;) {9 ~% k' n: R; ]; U% w
  31.     ErrorAcc=0;; l2 R% M2 v  S8 j/ q" o
  32. }
    ) \' e( g: F( P9 b2 E; q( w8 L
  33. % B: w: r  n9 s5 y3 O8 ^
  34. void loop(){
    ) z. M* \* w$ M$ v5 k
  35.   unsigned long StartTime = millis();
    1 q0 L$ {% Z4 w5 _3 g; v
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    5 q# z' w  `9 e5 ]
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();6 \2 r8 @: m- K
  38.     ErrorAcc +=  nError*Kd ;
    # X+ C, Q) d3 _
  39.     ErrorDec -=  nError*Ki ;6 Q9 O  C) i  d+ _( i
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ! j" I! i+ J1 t' n" F
  41.     if(nError < 80 && nError > -80){
    " T! R6 O' U4 u9 {4 m1 ?5 W( s/ u
  42.       if(nPower < MaxPower){
    8 @! O+ J# T7 u! y5 ~4 p
  43.         nPower += 3;
    % c5 A& K. Z! ]) h. a+ q/ T
  44.       }/ \; t! x+ w% G9 f7 c! }
  45.     } else{
    8 s% B, U- A. p7 i* g- |7 ~
  46.       if(nPower > MinPower){  _' f' A* \, H/ g7 `# A. H# K
  47.         nPower -= 2;
    % `# M( m9 D/ m4 i4 x; i1 k
  48.       }6 J' y  ^/ [0 f: H$ j" K
  49.     }
    3 j, i2 D, Z& @% S4 H" {
  50.     MotoL(nPower-Error);
    ) D5 z7 n1 E* Z) T" _+ t+ K: ]
  51.     MotoR(nPower+Error);   
    , K) m' k! N+ D9 ?$ H
  52.   }else{
    9 {9 `& ~( ~+ S  \8 z
  53.     motor_9.run(0);9 N( H+ C8 X4 M, U- b5 ^
  54.     motor_10.run(0);! l3 J1 j/ \* M( ]1 ~
  55.   }& u" I; F- g" H6 `: U
  56.   do{}while(millis() - StartTime < interval);
    $ {: v- P% R' S$ Y
  57. }
    1 K% @" _3 v# |- j( O* Z
  58. 1 v9 ]) q4 X+ d8 _! u3 Z' s
  59. void MotoL(int Power){: ~( B/ m( T/ {
  60.   if (Power > MaxSpeed){. m. V$ a6 h5 b+ I8 b  r* A' g
  61.      Power = MaxSpeed;
    8 o& o$ Y  u% a# Z6 R+ F. Q
  62.   } ' J3 C# P2 N6 E' X) n4 n, \
  63.   if (Power < -MaxSpeed){( m8 ~$ ^7 t9 C/ y" J4 c
  64.      Power = -MaxSpeed;1 @' o; l. A5 L, }" ^6 ?7 ^& l
  65.   } 4 B0 F8 F2 P0 m6 x. B) b
  66.   motor_9.run(Power);
    . u8 P5 S% q3 c+ F; |: Y5 t
  67. }  2 W. e" l9 Y  k$ ~
  68. " Z) w% H+ C( C) K8 L; c( x
  69. void MotoR(int Power){
    8 O3 n( \! T. Z: P  P/ k
  70.   if (Power > MaxSpeed){
    8 A3 o: E" J" c9 L" H8 o* k
  71.      Power = MaxSpeed;% V7 F# w8 p7 v
  72.   }
    8 [( l5 Y7 l; |8 @5 A: z
  73.   if (Power < -MaxSpeed){. ~% u4 B( r7 D6 F& f# T
  74.      Power = -MaxSpeed;0 h3 i( |8 P! @( Z5 b# g$ m$ d) \
  75.   } & s; O, u3 i7 ?
  76.   motor_10.run(Power);
    ' g7 m' |. b7 `
  77. }  
複製代碼
" r- G# k- i3 y! h( m
1 {+ ^3 i8 S0 Y" H+ s% A
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ( j& l2 R* B1 m9 q

; ?3 [; @* e' y1 N您好,不知是否能向您請教。# W+ c3 ^! _3 c! F! s
目前和宋修賢老師在處理Ardui Car/ @# O' K& ?6 ^- P: ^* r
雖然已使用較繁雜的方式處理了跑出黑線外的狀況2 c) V8 x0 D. D+ L$ G  O' o2 s0 _9 G

2 k+ b6 Y7 P) R( J但基於想追求更精簡的程式所以還是想請問一下
: N$ [4 P: N( T6 `$ @就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝  S: |7 `3 }! E( M2 n+ ^
不知道您是否願意教我可以如何處理; a  H+ y3 ~! q3 E- Q3 E

6 a3 y: u1 e2 }+ M5 i. m1 Z
/ q+ @, Y* u* m  N% F" F8 u以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;( L+ f9 [7 S1 Q% }$ q7 d
  2. double CNY70Val = 1000;/ p( M. o8 S# M
  3. int interror = 0;& U9 H5 }) k5 x
  4. int olderror = 0;
    6 k& ?" k; `+ s
  5. double values;
    ( ^$ Q5 F6 }9 t; _. Y2 ?# m4 w

  6. " S( U$ D* V2 y8 F2 U
  7. 2 D* |, D  C' e" L9 e
  8. void CNY70()7 U! B: l! q0 M, r* Q1 j, Q$ }* _
  9. {
    9 |7 d  N1 C$ B4 X9 ~" e* x
  10.   valuesRR = analogRead(RR)
    6 h6 a- B5 r1 [" G; {9 h
  11.   valuesMR = analogRead(MR);( V3 {, p: o! p; i( Z1 G& l
  12.   valuesMM = analogRead(MM);% D' D" {6 b2 p! a* \
  13.   valuesML = analogRead(ML);( F: ~" b4 E: A$ b3 N
  14.   valuesLL = analogRead(LL);
    ! p  L& [* v' P4 W7 f

  15. % y# j( i" Q- w" j& t
  16.   if (valuesRR > CNY70Val)/ |2 G" @2 `) q# G
  17.     valuesRR = CNY70Val;/ O0 a3 M9 n; ^3 r  S; r
  18.   if (valuesMR > CNY70Val)0 |% j& {+ n( o& g: p2 ~" y) s$ `; C9 Z
  19.     valuesMR = CNY70Val;
    2 {8 Y" v" f5 d+ b8 O0 g
  20.   if (valuesMM > CNY70Val)
    * a) _/ A# x8 k; b. {" r* b# p1 \5 ]
  21.     valuesMM = CNY70Val;
    " f# Y( g4 B) E
  22.   if (valuesML > CNY70Val)3 L0 Y* a" V, [
  23.     valuesML = CNY70Val;+ r2 {* e4 @* U$ C
  24.   if (valuesLL > CNY70Val)/ X/ u. D# K- K/ Y
  25.     valuesLL = CNY70Val;
    0 W  X% z; H8 O" D3 J* v7 J

  26. . C/ n- r6 H1 I- s# e6 E# r
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% u" k" `5 G& H, {% K' G3 d
  28. }
    3 o) l* r2 H  X" J, X0 d

  29. 3 i8 k( e- Q% [+ G
  30. void Car()$ V# [2 u! q" z0 v5 ]% Z0 O: u. F. e
  31. {4 x* {5 i7 _) n! q$ \& g) V: Y. ~0 r
  32.   while (1) {
    3 ^0 _! T. d% e' F! |
  33.     CNY70();$ J: n5 l  {. W+ q+ r* U

  34. 9 t. c' n2 n7 q4 [& q# }9 j
  35.     int error = ((int)values);' Z6 z1 M6 m! n' U9 S/ e4 O
  36.     interror += error;7 P6 x$ m8 v( v" F8 _9 ~) X
  37.     int lasterror = error - olderror;
    1 `/ E, g" W5 H; W& o
  38.     olderror = error;
    . a6 V0 g+ O$ \3 q$ l0 j
  39.     int power = error / 5 + interror / 10000 + lasterror;
    6 G6 x9 j' w' k3 i

  40. 1 e- F8 a% k' g8 `! U' ?* o
  41.     if (power > MotoSpeed)- T* v" W& }2 J5 ?2 J7 X. L3 t
  42.       power = MotoSpeed;3 g7 W5 b3 |5 H# X) j! A
  43.     if (power < -MotoSpeed); Y1 n6 Q+ S# c( N, P+ L
  44.       power = -MotoSpeed;
    # L$ \$ b6 r- f3 g3 \5 n- t

  45. " k4 I; U. E* a9 {. z( `8 U
  46.     if (power > 0)" U  R+ W! p+ }
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    & H/ Z+ Q) k/ |2 T$ V
  48.     else# R3 F0 E: {) s) _
  49.       Speed(MotoSpeed + power, MotoSpeed);
    5 X0 m- N5 s1 K( M
  50.   }8 Y4 p$ Y6 n: a. W; L* W' F4 y
  51. }
複製代碼

; w) V9 n1 {5 e* t
# y/ I! m9 y3 p! k' O3 M) e
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-5 09:16 , Processed in 0.027550 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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