圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21742|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>+ N- _9 X" a8 M( c
  2. #include <Wire.h>% Z# F7 x9 N! R! ~/ W+ `- D
  3. #include <Servo.h>1 E& S' p8 f; F, B* S0 s6 y" G

  4. ) p1 A; J' d$ }: o- E# u7 a! W( N
  5. #include "MePort.h"
    * E" l) {' N  t' O! S* ]
  6. #include "MeUltrasonic.h"
    $ b6 x7 ?, _$ R& b" }% z' T2 }
  7. #include "MeDCMotor.h"
    / ]' A% f9 ~+ {1 P6 M2 O9 f4 \
  8. ! K& W8 N9 h. m: R$ l
  9. //double Input, Output ;
    # \  }- y) G3 p7 Q
  10. float MaxSpeed = 255;
    1 n8 O7 G# w0 C3 L% o8 A! i$ f
  11. float MaxPower = 180;' b& {& @3 p4 Q7 p
  12. float MinPower = 120;" t" ?2 r' f1 ~* V0 J# J3 ?' O
  13. float Error,ErrorAcc,ErrorDec;, w4 y1 A; z5 V6 V- `

  14. 2 z) {2 {/ o" a+ e, h6 v
  15. float Kp=0.14;5 Y" ~7 x7 W) e- D1 X& D
  16. float Kd=0.00020;//23;/ T; x' |6 q  ^: O" R# B
  17. float Ki=0.000201;, z3 z- {, t6 P+ l$ r0 d' S
  18. 7 S5 v6 Q, \% i0 k/ U8 |0 ~
  19. float nPower;
    % N1 H$ M! |- s
  20. MePort lightsensor_6(6);9 U) n) a! l4 i6 o2 L
  21. MePort lightsensor_8(8);4 g0 x- l: s& y! K0 |; {9 `; [
  22. MeDCMotor motor_9(9);4 M  g) q7 C, m- r" g4 p
  23. MeDCMotor motor_10(10);
    7 `& H% K0 z  R" z# m6 ^; j
  24. unsigned long previousMillis = 0;
    4 @( C3 x; x+ o- i+ e, g& s, m
  25. const long interval = 1;
    $ H3 f+ ~2 [- O

  26. 4 b9 D  v" u2 e# e
  27. void setup(){
    ( O( F* `$ k% B- C  b0 K! _: Z
  28.     lightsensor_6.dWrite1(1);1 D# T% i( ^# g- o7 \6 U5 u
  29.     nPower = 160;
    % [. y+ e1 I, h
  30.     Error=0;2 U, `  P' x0 d
  31.     ErrorAcc=0;" A; n, J- d; e! D  x
  32. }
    2 R5 _8 j& V) v, `

  33. 2 g" Z, R6 z( }7 e' p8 C1 I
  34. void loop(){
    # j; e& L9 `4 N7 W- U
  35.   unsigned long StartTime = millis();4 e: A2 l& W5 ~& f$ A6 c2 C! \
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){' i' v) [4 |. {/ k  x
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    3 ?9 e& C- O" A6 B3 h3 V
  38.     ErrorAcc +=  nError*Kd ;/ ~+ _' _2 U8 P7 V) D6 Z
  39.     ErrorDec -=  nError*Ki ;  j4 G  p$ i4 l7 a/ a  }: T# z! T
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    7 o+ O, q" l" C3 ^
  41.     if(nError < 80 && nError > -80){8 U+ S1 g$ d: D3 [4 L
  42.       if(nPower < MaxPower){( |8 B& i; T3 T  d/ Y, F/ J$ {5 b
  43.         nPower += 3;
    0 o8 y( [4 u- f7 @
  44.       }
    8 V" D; [1 p2 `% i* s
  45.     } else{! h/ T! b1 M  i. G  f
  46.       if(nPower > MinPower){
    1 R8 e$ t$ X  x3 [! A7 @( f
  47.         nPower -= 2;
    : I9 \; R* u7 Y5 |( N3 y# b
  48.       }( d/ v2 H, D+ X9 A& c
  49.     }
    ' F/ B4 V& {* M- }
  50.     MotoL(nPower-Error);  R4 P% e' t2 A; k6 o) d& Y
  51.     MotoR(nPower+Error);   
    2 L; f7 [2 t* _5 T6 D
  52.   }else{
    . M2 f: Q# n; U) S: `- V2 g
  53.     motor_9.run(0);4 K5 N6 L. N; z/ D) X! e' j' \
  54.     motor_10.run(0);
    9 K2 @3 j# t: V; r$ W7 ?6 l
  55.   }  s6 R( Q0 }8 x# q* A: Q; F
  56.   do{}while(millis() - StartTime < interval);
    ( D, ~5 P1 `* b0 @* o
  57. }
    ( m) u9 k8 A: `( [( E

  58. % w$ D' h* ^* ~; Q( f; ?  b5 Z
  59. void MotoL(int Power){
    / {. t2 b. ^1 `
  60.   if (Power > MaxSpeed){
    1 Y0 ~2 w, t1 X( d
  61.      Power = MaxSpeed;' t" \+ m5 J) X8 R
  62.   }
    ' A  U& Y& ]+ z$ B0 Q6 L  y# c
  63.   if (Power < -MaxSpeed){! i4 `" ^1 a: M* p0 N
  64.      Power = -MaxSpeed;- L9 T$ @) K1 L. Z* {: y
  65.   }
    7 R* g* m% V' r4 g! W% Z/ `8 [
  66.   motor_9.run(Power);; P4 x% }* k3 d0 e/ j( G: V
  67. }  
    - Y7 h0 r5 }4 P9 r! w

  68. - j* ~# l" n1 |* i
  69. void MotoR(int Power){% T3 u0 |: M5 f& o
  70.   if (Power > MaxSpeed){
    , p" v2 ^  a. @6 I7 |* I+ d* N9 D
  71.      Power = MaxSpeed;  R- n) o7 `. S  Q
  72.   }
    / U  q6 ]+ J) p$ L9 T; R
  73.   if (Power < -MaxSpeed){
    * N2 }3 g, N5 |4 I' q, d
  74.      Power = -MaxSpeed;7 {4 u/ M# F' g; w6 I: |
  75.   } . ?: q( j+ d" j/ Y+ E
  76.   motor_10.run(Power);
    $ w% V6 P1 v- ?" I9 M
  77. }  
複製代碼
( Q# m1 |: D7 Y9 K; I$ g
4 W5 q7 G0 d: I- T7 R: p# G
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯   m8 S( q6 o9 ~* E% P: i

# F* X5 e2 z6 A" W- I4 _3 R( F您好,不知是否能向您請教。
' }1 E. ?- `9 |9 M) _目前和宋修賢老師在處理Ardui Car6 J' s2 E; |% s# |5 V  E' q; y
雖然已使用較繁雜的方式處理了跑出黑線外的狀況) S0 t  C8 q3 u

& R- Z. ?( `6 N( ~! S) Q# V0 n! a但基於想追求更精簡的程式所以還是想請問一下
' d: q% X$ U& _! d& e( u就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝7 e3 [. `; \) k  |
不知道您是否願意教我可以如何處理
5 ?+ _8 |( [' ^6 U% w7 `4 y3 w$ V; k: U% Q; _2 U' H
8 d' L4 \' \/ J. j+ t
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;$ @* X' t! P, X$ [4 ?$ y* n" Z7 H
  2. double CNY70Val = 1000;7 ]0 r- r+ E" L9 p
  3. int interror = 0;
    / Q$ M# Q* w+ E& L! `3 n, u) v
  4. int olderror = 0;4 X+ t! B8 Z& r% [! g$ j! P
  5. double values;$ h% R2 L& J! q6 [( {' r3 B

  6. 5 I, h, S8 Z0 c1 h1 e# A
  7. % T, e: H( h# g( V% m! T& t
  8. void CNY70()* D4 \) `) N; ?  S+ }
  9. {
    , k' K/ u# {- V1 w+ F" f$ t
  10.   valuesRR = analogRead(RR)! w, C! G1 A% J* a" j3 G
  11.   valuesMR = analogRead(MR);
    / z" }! S' d$ `# M
  12.   valuesMM = analogRead(MM);
    % \6 U; W7 X+ r) U& _4 M
  13.   valuesML = analogRead(ML);
    - x9 K' O, K7 `6 B4 G; w/ m
  14.   valuesLL = analogRead(LL);
    9 m# F- l6 |" t. R3 v
  15. 0 E# e  Z# {. F, A* u, N, r: g
  16.   if (valuesRR > CNY70Val)
    1 h9 O- W, D( p3 H7 ?3 D$ W
  17.     valuesRR = CNY70Val;8 J, r% R# x; l. A+ {
  18.   if (valuesMR > CNY70Val)
    % M8 E! c$ s1 m8 t( ?5 @; w
  19.     valuesMR = CNY70Val;# l8 e0 ?, q! Y8 ?% P* I
  20.   if (valuesMM > CNY70Val)  R+ u: d8 Q3 u4 `& k' e
  21.     valuesMM = CNY70Val;( F6 G: B4 ~# U/ h8 p
  22.   if (valuesML > CNY70Val)
    & A" ]+ s& U" M5 y+ e
  23.     valuesML = CNY70Val;. i2 t( w- Z7 {1 l0 g! A, `/ a
  24.   if (valuesLL > CNY70Val)
    # `; t* j# U; l, Y
  25.     valuesLL = CNY70Val;
    4 G5 ^  h- h9 `* S- M. S
  26. : g5 \/ k* l3 `! r
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% u" [. d3 [. U6 F! u+ }
  28. }! `& n6 B& @! J  J

  29. & z' t; B. D; _9 `, f  f7 u: @' K
  30. void Car()' {' Z6 }. m$ ~
  31. {
    ; v4 ], ~) I0 p- D% _8 @8 H% D
  32.   while (1) {3 W4 N7 b. b2 Y/ e" Y# ~/ t/ Q0 U1 f
  33.     CNY70();
    8 G' ?' N( b4 a9 `$ M

  34. . k% Z( n! j( v, f
  35.     int error = ((int)values);
    " H: L. s# k. `5 ~8 m' m
  36.     interror += error;
    / j; E; p! v) ?8 B& d  b# A
  37.     int lasterror = error - olderror;" i0 v% n6 E$ h# O7 b) Y  d& s
  38.     olderror = error;
    / W( c+ U4 }' b! c5 W4 @- T# c
  39.     int power = error / 5 + interror / 10000 + lasterror;0 V9 t$ X0 c! X' X; \$ o4 J

  40. ; M! v3 h: \* T' u8 \  c/ K) S
  41.     if (power > MotoSpeed)
    7 U) r4 o3 F' O$ c/ m
  42.       power = MotoSpeed;" t* Z' v! J! X: r1 o) X0 v, Q( W
  43.     if (power < -MotoSpeed), i6 t3 R% P! }0 \2 r! z
  44.       power = -MotoSpeed;& w, m, o6 F8 M; ?" ?
  45. / p7 u! o( B. N7 X# l2 F; m
  46.     if (power > 0): m# g5 I4 E1 P( N0 K
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    3 o; H* c% t5 ?; V
  48.     else
    ) t- R# ]0 D4 \! l0 f
  49.       Speed(MotoSpeed + power, MotoSpeed);) U6 W: D; m' d: C4 X2 }) P4 f, f/ w$ M
  50.   }
    8 Z! z, t( {% l# [7 i
  51. }
複製代碼

  i; V; |) s- @# C2 d) C# Q% U- T: S3 r, V  Y
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 03:20 , Processed in 0.023936 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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