圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21824|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    2 @/ h% ^% N" _+ J
  2. #include <Wire.h>
    6 o, G9 J$ Q1 L
  3. #include <Servo.h>; n' i7 [* p) a& t. D. _
  4. - @5 v: B6 x  {9 _; t2 V  g0 U% F
  5. #include "MePort.h"
    % {0 z( k! }! N+ u' ^! z
  6. #include "MeUltrasonic.h"
    8 r+ D% m! n, a, D. l
  7. #include "MeDCMotor.h": m0 C8 `! @- i+ r

  8. 9 ~7 E- A+ ~9 U1 |* t" n2 P- D
  9. //double Input, Output ;
    5 U4 B4 D& T% |1 j
  10. float MaxSpeed = 255;
    / R% v* y1 j  N# {/ @0 k- m3 _
  11. float MaxPower = 180;; d: Q: V9 ]. J& l; P/ ?0 A1 j
  12. float MinPower = 120;8 l: G* \5 v, E4 W# ]9 t7 r2 c7 a
  13. float Error,ErrorAcc,ErrorDec;
    , r% [5 s( A4 F8 R- @; t  g$ v3 i

  14. $ J7 G3 _: S/ D9 T3 {* o0 \4 F( t
  15. float Kp=0.14;7 N9 w" ?: \' H" b
  16. float Kd=0.00020;//23;
    3 I' H+ Y7 J; X3 I& Q  E
  17. float Ki=0.000201;
    8 V5 W+ o2 q# m
  18. - N1 M( D& q- q) c2 x
  19. float nPower;5 m! g3 }( ]+ H7 u0 r
  20. MePort lightsensor_6(6);8 u* K" w' R# c5 J$ d( X( N6 u
  21. MePort lightsensor_8(8);
    / a' A* i, p% M; k; u6 D6 L* Z8 B0 `
  22. MeDCMotor motor_9(9);$ {# [5 j' ~/ S" Z0 @: W4 S
  23. MeDCMotor motor_10(10);' P, F- c  b- J+ Z" ~# ?# x9 P
  24. unsigned long previousMillis = 0;, l, x6 L% M2 \( ?) a0 F
  25. const long interval = 1;5 e# p6 \4 |( Q, w. I  ]

  26. - G, Y: y/ L4 i# A' Z+ t
  27. void setup(){
    & T% X+ N2 Q  d3 k9 H( u% |
  28.     lightsensor_6.dWrite1(1);% b4 P  e) }7 ^7 p0 Y+ T, Q8 F" x* s
  29.     nPower = 160;
    . P1 L3 g, N8 w
  30.     Error=0;
    , C. @- Q( W; y7 j
  31.     ErrorAcc=0;
    : K% E( V6 }5 N# m( F5 s) n! Q+ E
  32. }
    ' {* n- I9 e# H# P

  33. ' d" R6 o  t- ?$ S3 G$ q
  34. void loop(){" p7 ^! p" J/ ^. A/ a6 }
  35.   unsigned long StartTime = millis();
    4 d1 h: `/ }* X! {6 [- B
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){: y3 L6 ]8 n' E4 D* M4 b
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    + W' Q  ]) M% i( L$ v% t# G# ]7 d
  38.     ErrorAcc +=  nError*Kd ;
    + P+ ]) b# a1 t2 w+ j- {7 L
  39.     ErrorDec -=  nError*Ki ;. T# H& {# ^' m$ E8 S5 o
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);+ K; q* I: j4 O$ G
  41.     if(nError < 80 && nError > -80){. _! N7 k- U% ^  f$ [# l" o
  42.       if(nPower < MaxPower){
    $ x+ _  \7 K, P( n3 F; y$ ]
  43.         nPower += 3;, N# B* _8 r. s6 G
  44.       }
    9 V3 m% e' |3 @0 O5 l
  45.     } else{
    , o$ z  T$ d' W' N; {, C
  46.       if(nPower > MinPower){( |) G& Y# S1 x" N4 x" O
  47.         nPower -= 2;" J2 }1 Y4 t. t' [2 G+ O; B
  48.       }
    ; U+ T8 b# a0 M: V/ l% m$ b
  49.     } $ m9 }* z4 G, {2 C; [
  50.     MotoL(nPower-Error);( ]  k$ |) X8 }, l0 d; T+ I1 F: x# ~4 |
  51.     MotoR(nPower+Error);   
    . G+ I( l! q- P; N% O
  52.   }else{3 A' N) ~% [7 G7 s( U, H+ E
  53.     motor_9.run(0);
    % N" y7 E6 V: ~' w$ t& v
  54.     motor_10.run(0);
    , t; o1 H' D5 }
  55.   }, b3 w) m* q9 D5 L0 y' y
  56.   do{}while(millis() - StartTime < interval);! \" _' _4 N& q( q, c
  57. }! ]) ^. I2 U" @9 k# a9 t" D5 S

  58. . [9 q! T/ P3 k
  59. void MotoL(int Power){
    . q. p( N3 g2 k1 M3 R: Q
  60.   if (Power > MaxSpeed){. |9 k) f1 h% D2 h$ o: F! A
  61.      Power = MaxSpeed;
    : a- P' t( l9 I
  62.   }
    ( M) T2 `1 }$ E& m3 G
  63.   if (Power < -MaxSpeed){
    7 y3 \9 M5 h. p, H
  64.      Power = -MaxSpeed;; _( C' A( D7 }" `
  65.   }
    2 `0 r7 z! K( l  F4 F( Z
  66.   motor_9.run(Power);; w9 i  H! t5 F( {8 q% [
  67. }  
    : l  [9 y8 v' `) m; T- y

  68. 0 r3 C; \# u' D( w6 ^2 t% H& C% S
  69. void MotoR(int Power){
    ) j$ `7 j" O2 G5 q- ~: o9 T( J
  70.   if (Power > MaxSpeed){
    , G1 I/ Y. S7 h$ {: g
  71.      Power = MaxSpeed;. A, y. C, g8 Y3 ^$ E, B: N$ A8 Y5 F
  72.   }
    5 G6 Y4 g" v5 q$ a0 |* P3 {+ C4 P) f# w
  73.   if (Power < -MaxSpeed){
    - v3 l- {7 Y; |4 H2 V( @
  74.      Power = -MaxSpeed;
    / S) F% f# u) J/ v2 u
  75.   } ! R2 \  e. E, I
  76.   motor_10.run(Power);0 r8 w6 L: H7 a0 K5 x* N
  77. }  
複製代碼
( [9 R/ A7 i3 ?' d
* t6 A5 e# x/ J+ b
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
! a# X  W' T4 ~$ Q8 y. T2 N! {5 u) D& r$ Z9 R
您好,不知是否能向您請教。6 ~0 I7 e  ]4 k4 Y3 O+ Z
目前和宋修賢老師在處理Ardui Car
9 D+ \6 Y& c! v# |1 @雖然已使用較繁雜的方式處理了跑出黑線外的狀況
( U& g8 n+ W6 B; d# q2 [) T) `$ L9 ?1 s/ q+ q
但基於想追求更精簡的程式所以還是想請問一下) V! X& k7 L# w. \& L" f, L, _
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
& j: _1 B8 b  o! B2 w不知道您是否願意教我可以如何處理: N  ?/ I2 A0 |5 t
2 n2 r: p6 a8 b* Y) G# C$ a" j; ?- [$ X

  }8 o' q$ t$ c以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;7 ~, E) R' P! q! Z6 w6 L
  2. double CNY70Val = 1000;& `! a9 w2 t" H6 F. \5 B  v
  3. int interror = 0;
    ) d% U* |# k9 Y9 C9 t/ o
  4. int olderror = 0;
    , q1 m* h, D( A4 k6 c/ m: Q3 Y
  5. double values;
    5 S3 h+ F7 E* i/ U

  6. 0 Y6 p. w/ g. l( [0 D5 y
  7. & R+ ~; i/ i4 q3 O. F
  8. void CNY70()5 U; P5 [4 z+ E5 M8 I
  9. {# ?0 f" W' T8 B8 L  U
  10.   valuesRR = analogRead(RR)
    8 r; q& w8 q2 b
  11.   valuesMR = analogRead(MR);/ S6 c7 h1 a3 A6 i" ?8 b
  12.   valuesMM = analogRead(MM);, u- ?4 Q' }; e
  13.   valuesML = analogRead(ML);
    , k' v8 a6 z" I0 R  g2 c* T  A  f
  14.   valuesLL = analogRead(LL);% z" v* A) E2 H* [* h- A
  15. 5 `. x" \$ c9 u& Q3 ^1 E3 H* T& z
  16.   if (valuesRR > CNY70Val), B& A: l$ I' T/ W9 D
  17.     valuesRR = CNY70Val;7 q  ?. _( ^, ?/ I% u8 N8 K
  18.   if (valuesMR > CNY70Val), @8 t% |$ ~: @7 ~7 e3 q4 N; ?" I
  19.     valuesMR = CNY70Val;8 W' p( Y1 w1 j9 m2 T
  20.   if (valuesMM > CNY70Val)! V; y6 _6 z  A# I
  21.     valuesMM = CNY70Val;" n+ Z. B2 T7 ]3 ]$ R
  22.   if (valuesML > CNY70Val)
    , p. C0 z, s3 B4 ~' y- t
  23.     valuesML = CNY70Val;
    " [+ Z4 z9 E) \; [4 L
  24.   if (valuesLL > CNY70Val)
    % H$ R: G' @7 S* `. a3 R# `1 M
  25.     valuesLL = CNY70Val;1 Z/ O- ?: {; V7 A/ D- \
  26. 6 x" j% [6 I  [
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;8 p, }* L# k2 `2 k0 X3 E& v
  28. }* G4 K7 P  x$ }! t2 W+ w

  29. " K% F+ u/ A5 s# a- j; O  ~
  30. void Car()
    * a, S; C' w2 |: _
  31. {. \$ p  x5 R, ~9 c
  32.   while (1) {0 F1 {! N! \& n6 C) i3 L3 @
  33.     CNY70();  i# H7 \7 `5 D1 H
  34. + K+ y, ~# p  A7 W
  35.     int error = ((int)values);2 _4 ]8 {9 K, g" z  {! C( j
  36.     interror += error;
    ( X" L9 d+ d3 i4 g
  37.     int lasterror = error - olderror;
    4 l6 t" T7 x9 i+ {2 k0 Y" Y
  38.     olderror = error;: c2 [+ U3 E4 ?" t1 [
  39.     int power = error / 5 + interror / 10000 + lasterror;
    1 M/ f! X" b: _& H

  40. ( E: A7 a) L3 B- j, x
  41.     if (power > MotoSpeed)2 O# u5 J3 v6 t4 C1 n4 G2 W0 L
  42.       power = MotoSpeed;' Y8 T4 w2 b; W, G( S3 ?8 T9 Y, B
  43.     if (power < -MotoSpeed)7 Z' C9 `; M" u" @
  44.       power = -MotoSpeed;' d- i; U, k) \4 `

  45. 6 \% R$ {& j7 X, E( K" E; A# i
  46.     if (power > 0)& A* l; [" s7 g3 d
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    , Y/ K/ |- ?; D. \% v6 L: p
  48.     else6 ?* w8 E$ G/ T3 r/ s* ^3 V
  49.       Speed(MotoSpeed + power, MotoSpeed);
    % @, n# Q& u, b# ~: [
  50.   }
    1 u" [9 V4 U0 ~
  51. }
複製代碼
1 R' ?7 M8 `! R) ?

' ^5 B, j; E- y5 c" B- ]/ h5 z" Z8 S
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 22:40 , Processed in 0.024998 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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