Electoday 2025

ไมโครคอนโทรลเลอร์ => AVR and Arduino => Topic started by: JAY on March 15, 2017, 08:32:02 PM

Title: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: JAY on March 15, 2017, 08:32:02 PM
ก่อนอื่นอธิบายคร่าวๆก่อนครับ คือผมมีค่า Output ที่ได้จากการคำนวณฟัซซี่ลอกจิก ซึ่งเป็นค่า + 0 - (-15 ถึง 15)
คือผมติดปัญหาที่จะเอา Output นี้ไปเป็นคำสั่งควบคุม PWM (0-255)
**กรณีสมมุติ**
เมื่อ Output คำนวณค่าได้ +15 ก็นำค่า +15 ไปเป็นค่า PWM
ต่อมา Output คำนวณค่าได้ +10 ก็นำค่า +10 ไปรวมกับค่า PWM ก่อนหน้า
คือ 15 + 10 = 25  ค่า PWM ก็จะเท่ากับ 25
ต่อมา Output ก็ส่งค่ามาเรื่อยๆ อาจจะเป็นได้ทั้งค่าบวก และค่าลบ
ก็นำค่า Output ไปบวกลบกับค่า PWM ก่อนหน้า
ประมาณนี้ ผมต้องเขียนโค้ดยังไงครับ ขอคำแนะนำหน่อยครับ
ขอบคุณครับ
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: avr_lover on March 16, 2017, 08:07:39 AM
code ของ Arduino หรือเปล่าครับ ลองเขียนโค้ดเท่าที่คุณเข้าใจแล้วเอาโค้ดมาวางที่นี่ครับ เดี๋ยวมีคนช่วยแก้ ช่วยอธิบายให้ แต่ถ้าลอยๆแบบนี้ไม่มีใครนึกออกว่าจะทำยังไงให้คุณเข้าใจรวมถึงคาดเดาไม่ได้หรอกว่าคุณเข้าใจแค่ไหนด้วยครับ
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: crywolf on March 16, 2017, 11:33:33 AM
ตามที่ท่าน avr_lover บอกครับ เอาโค๊ดมา เดี๋ยวมีคนช่วยแก้
เขียน Fuzzy ได้ PWM ก็เป็นเรื่องง่ายแล้วครับ
ถ้ามาลอยๆแบบนี้ผมจะตอบว่าใช้โค๊ดนี้ครับ

PWM += FuzzyOutput;
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: JAY on March 16, 2017, 12:57:19 PM
void loop()                        //ในส่วนของโค้ดผมขอยกมาแค่นี้ เนื่องจากในของโค้ด Fuzzy โค้ดยาวมาก แต่ค่อนข้างโอเคแล้ว
{                                                          และที่ติดปัญหาคือในส่วนของค่า Output คือตัวแปร Duty ที่จะนำค่านี้ไปเป็น
  fuzzy->setInput(1,Error);                      คำสั่งควบคุม PWM (0-255) 
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);                  //ค่า Duty เป็นค่าที่ได้หลังจากการคำนวณ Fuzzy เป็นค่าอยู่ในช่วง -15 ถึง 15

  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
                                                                 
  analogWrite(PWMPin, PWMValue);
  delay(1000);
}
***ผมทำแบบนี้แล้วค่าไม่ได้อย่างที่ต้องการครับ

พอดีผมไม่ถนัดด้านนี้ครับ แต่จำเป็นต้องทำ


Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: crywolf on March 16, 2017, 04:25:20 PM
น่าจะประมาณนี้

int PWMValue;

void loop()
{
  fuzzy->setInput(1,Error);
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);
/*
  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
*/
if((PWMValue+Duty)>=0)&&((PWMValue+Duty)<=255)
{
PWMValue += Duty;
}

  analogWrite(PWMPin, PWMValue);
  delay(1000);
}
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: az on March 16, 2017, 07:14:18 PM
PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: JAY on March 16, 2017, 07:20:38 PM
Quote from: az on March 16, 2017, 07:14:18 PM
PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
ต้องการใช้ทั้งช่วง 0 ถึง 255 เลยครับ
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: az on March 16, 2017, 07:50:23 PM
Quote from: JAY on March 16, 2017, 07:20:38 PM
Quote from: az on March 16, 2017, 07:14:18 PM
PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
ต้องการใช้ทั้งช่วง 0 ถึง 255 เลยครับ

Quote from: crywolf on March 16, 2017, 04:25:20 PM
น่าจะประมาณนี้

int PWMValue;

void loop()
{
  fuzzy->setInput(1,Error);
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);
/*
  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
*/
if((PWMValue+Duty)>=0)&&((PWMValue+Duty)<=255)
{
PWMValue += Duty;
}

  analogWrite(PWMPin, PWMValue);
  delay(1000);
}



ตามท่าน crywolf เลยครับ

ปล. ตรวจสอบประเภทตัวแปลต้วยนะครับ ว่าเป็น unsigned หรือ signed


int PWMValue;  // -32,768 to 32,767
int Duty;  // -32,768 to 32,767

.
.
.

if ( (PWMValue+Duty) > 255 )  {
  PWMValue = 255;
}
else if ( ((PWMValue+Duty)>=0) && ((PWMValue+Duty)<=255) )  {
  PWMValue += Duty;
}
else {
  PWMValue = 0;
}


Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: kittipron on March 24, 2017, 09:52:35 PM
ตอนนี้ผมกำลังจะเขียนโค๊ดจับความเร็วมอเตอร์ เพื่อเอาไปทำเป็นความเร็วของตัวรถแต่ผมเขียนได้แค่จำนวนการตัดผ่านเซ็นเซอร์พี่ๆทุกท่านใครพอรู้ช่วยสอนหรือบอกผมที่ผมจนปัญญาแล้วจริงๆ นี้เป็นอันที่ผมใช้นับอยู่คับint sp1 = 2;
int sp2 = 3;
int count_sp1 = 0;
int count_sp2 = 0;
void setup() {
pinMode(sp1, INPUT);
pinMode(sp2, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(sp1) == 1) {
count_sp1++;
Serial.print("speed1 = "); Serial.println(count_sp1);
}
if (digitalRead(sp2) == 1) {
count_sp2++;
Serial.print("speed2 = "); Serial.println(count_sp2);
}
}
Title: Re: ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ
Post by: yaikku on April 29, 2017, 10:59:14 PM
Quote from: kittipron on March 24, 2017, 09:52:35 PM
ตอนนี้ผมกำลังจะเขียนโค๊ดจับความเร็วมอเตอร์ เพื่อเอาไปทำเป็นความเร็วของตัวรถแต่ผมเขียนได้แค่จำนวนการตัดผ่านเซ็นเซอร์พี่ๆทุกท่านใครพอรู้ช่วยสอนหรือบอกผมที่ผมจนปัญญาแล้วจริงๆ นี้เป็นอันที่ผมใช้นับอยู่คับint sp1 = 2;
int sp2 = 3;
int count_sp1 = 0;
int count_sp2 = 0;
void setup() {
pinMode(sp1, INPUT);
pinMode(sp2, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(sp1) == 1) {
count_sp1++;
Serial.print("speed1 = "); Serial.println(count_sp1);
}
if (digitalRead(sp2) == 1) {
count_sp2++;
Serial.print("speed2 = "); Serial.println(count_sp2);
}
}

ทำไมไม่ใช้ encoder ล่ะครับ ให้มันส่งสัญญาณทาง interrupt เอา