magiccar 發表於 2015-3-31 12:45

PID 循跡自走車範例

I8_jWrEJ_X8#include <Arduino.h>
#include <Wire.h>
#include <Servo.h>

#include "MePort.h"
#include "MeUltrasonic.h"
#include "MeDCMotor.h"

//double Input, Output ;
float MaxSpeed = 255;
float MaxPower = 180;
float MinPower = 120;
float Error,ErrorAcc,ErrorDec;

float Kp=0.14;
float Kd=0.00020;//23;
float Ki=0.000201;

float nPower;
MePort lightsensor_6(6);
MePort lightsensor_8(8);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
unsigned long previousMillis = 0;
const long interval = 1;

void setup(){
    lightsensor_6.dWrite1(1);
    nPower = 160;
    Error=0;
    ErrorAcc=0;
}

void loop(){
unsigned long StartTime = millis();
if(ErrorAcc < 18000 && ErrorAcc > -18000){
    float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ErrorAcc +=nError*Kd ;
    ErrorDec -=nError*Ki ;
    Error = int(nError*Kp+ErrorAcc+ErrorDec);
    if(nError < 80 && nError > -80){
      if(nPower < MaxPower){
      nPower += 3;
      }
    } else{
      if(nPower > MinPower){
      nPower -= 2;
      }
    }
    MotoL(nPower-Error);
    MotoR(nPower+Error);   
}else{
    motor_9.run(0);
    motor_10.run(0);
}
do{}while(millis() - StartTime < interval);
}

void MotoL(int Power){
if (Power > MaxSpeed){
   Power = MaxSpeed;
}
if (Power < -MaxSpeed){
   Power = -MaxSpeed;
}
motor_9.run(Power);
}

void MotoR(int Power){
if (Power > MaxSpeed){
   Power = MaxSpeed;
}
if (Power < -MaxSpeed){
   Power = -MaxSpeed;
}
motor_10.run(Power);
}

Shiichi 發表於 2016-3-3 13:47

本帖最後由 Shiichi 於 2016-3-3 14:02 編輯

您好,不知是否能向您請教。
目前和宋修賢老師在處理Ardui Car
雖然已使用較繁雜的方式處理了跑出黑線外的狀況

但基於想追求更精簡的程式所以還是想請問一下
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
不知道您是否願意教我可以如何處理


以下是我挑出我一般寫純PID控制的Code:int MotoSpeed = 250;
double CNY70Val = 1000;
int interror = 0;
int olderror = 0;
double values;


void CNY70()
{
valuesRR = analogRead(RR)
valuesMR = analogRead(MR);
valuesMM = analogRead(MM);
valuesML = analogRead(ML);
valuesLL = analogRead(LL);

if (valuesRR > CNY70Val)
    valuesRR = CNY70Val;
if (valuesMR > CNY70Val)
    valuesMR = CNY70Val;
if (valuesMM > CNY70Val)
    valuesMM = CNY70Val;
if (valuesML > CNY70Val)
    valuesML = CNY70Val;
if (valuesLL > CNY70Val)
    valuesLL = CNY70Val;

values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
}

void Car()
{
while (1) {
    CNY70();

    int error = ((int)values);
    interror += error;
    int lasterror = error - olderror;
    olderror = error;
    int power = error / 5 + interror / 10000 + lasterror;

    if (power > MotoSpeed)
      power = MotoSpeed;
    if (power < -MotoSpeed)
      power = -MotoSpeed;

    if (power > 0)
      Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    else
      Speed(MotoSpeed + power, MotoSpeed);
}
}

delphi 發表於 2019-3-26 14:35

感謝分享

bw2014 發表於 2019-6-29 00:01

感謝分享
頁: [1]
查看完整版本: PID 循跡自走車範例