วันพฤหัสบดีที่ 30 กรกฎาคม พ.ศ. 2558

ความทรงจำ ที่Fibo

เนื่องด้วยการตั้งชื่อโพสต์สรุปว่าความทรงจำที่Fibo คือผมไม่อยากให้ดูว่าเป็นการฝึกงานแต่อย่างใดเพราะผมมาอยู่นี้มีความสุขดี และได้เรียนรู้เรื่องต่างๆ ไม่ว่าทางวิชาการ การเอาตัวรอดกับสิ่งแวดล้อมหรือเรียกอีกอย่างวิชาคน คนสอนคนบอกเล่า ไม่เท่าให้ทำจนเกิดประสบการณ์ ซึ่งผมจะเล่าถึงประสบการณืต่างๆโดยสรุปลงในบล๊อกนี้
      วันแรกที่เข้ามาฝึกงานผมก็ได้ทำความรู้จักกับ อ.สยาม เจริญเสียง หลังจากนั้นก็ได้ศึกษาได้รับการบรรยายจากอาจารย์ ว่า fibo คืออะไร fiboคือสถาบันที่เทียบเท่าคณะ(ไม่ใช่คณะ) ให้ปริญาเฉพาะทางได้ หุ่นยนต์ทีสร้างมีสองประเภท แบบใช้งานกับชีวิต กับหุ่นยนต์ที่สร้างผลงาน
*-เรื่องนี้ผมต้องดอกจันทร์ไว้เลย เพราะผมเป็นคนที่มีความรับผิดชอบน้อย แล้วจะเกี่ยวโยงไปเรื่องวินัย

   ในช่วงแรกอาจจะว่าเลยก็ได้ว่าไม่รู้จะปรับตัวให้เข้ากับคนที่มีความรู้เยอะกว่าเรายังไงเพื่อจะได้สื่อสารพูดคุยกกันให้เข้าใจ พี่ๆที่Fibo เก่งๆกันทุกคนเลยครับแต่อย่างไรก็ตามผมต้อกการเรียนรู้ว่าทำมั้ยพี่ๆเขาถึงได้เก่งผมจึงลองดูการพูดการทำงาน การใช้ชีวิตอยู่ใน กทม เป็นต้น

      หลังจากนั้นผมก็ได้รู้จักกับพี่ๆที่แล๊ปสอง แล้วผมก็ได้เข้าไปช่วยงานของพี่ไนท์ โปรเจ็คขอพี่เขาคือ แขนกลเขย่าสาร โดยสามารถถ่ายทอดสดออกทางเว็ปและให้นักเรียนนักศึกษาเข้ามาดูได้ และยังไม่เด่ดพอ ที่เด่ดเลยคือแขนกลตัวนี้น้องๆที่เข้ามาดูแล้วยังสามารถผสมสารเองได้อีกด้วยผมจึงมีความสนใจอยากจะรวมงานกับพี่ไนท์ ผมจึงได้ขอช่วยพี่ไนท์
       การช่วยงานเริ่มจากเขียนโปรแกรมโค้ด arduino แบบ basic ได้ประมาณสองสามสัปดาห์ผมก็ได้เริ่มทำเกี่ยวกับ motor encoder พอผมทดลอง emcoder เสร็จผมก็ได้เริ่มทำ semsor แต่ตอนที่ผมทำ encoderนั้นก็กินเวลาไปนานมาก

                         คลิปการทำงาน encoder 

หลังจากทำเสร็จผมก็ได้เริ่มทำ PH EC ไปพร้อมกันและทดลอง จนทำให้ arduino UNO r3 ที่อาจารย์ได้ให้มาพัง คือไฟย้อนกลับเข้าบอร์ดเพราะผมเล่นกลับ motor ทำให้กระแสไหลกลับได้ พอนี้เสร็จผมก็ได้เขียน sensor PH EC ลงใน arduino MEGA 2560 r3 พอทำได้สำเร็จผมก็ได้เอามารวมกับการทำงาน encoder หลังจากนั้นได้มาทำ motor PID กับencoder พอมาถึงตรงนี้แล้วปัญหาเกิดคือ จะเอาโค้ดมารวมกันแล้ว การcalibrate ไม่ทำงาน แต่motor หมุนทำให้ต้องมาการกรองคำสั่ง

การ calibrate PH

การ calibrate PH EC ด้วย

การต่อสายในบอร์ด

การกรองคำสั่งคือเราต้องวางแผนเราจะส่งคำสั่งไปกี่ตัวผมเลือกที่จะส่งไปหกตัวแล้วเลือกเอาสามตัวกลองมาสั่งคำสั่งให้ไปทำงาน แต่ต่อมาmotor ที่ทำได้เสร็จแล้วไม่ได้ใช้จิงแค่ทดลองการทำงานหรือโค้ดโปรแกรมเท่านั้น จริงๆแล้วต้องใช้ motor 12V DC แล้วใช้ TCST2202 เป็น soensor วัดรอบและหยุดการทำงานของเครื่องเขย่าสาร

การทดลองการใช้ TCST2202 มาทำงาน

แต่เวลาติดปัญหาจะมีพี่ไนท์คอยมาแก้บัคโปรแกรมให้อยู่บ่อยๆทำให้โปรแกรมการทำงานดีขึ้นแล้วยังเสถียนมากขึ้น พอต่อมาจัดวางวงจรและได้เขียนโค้ดควบคุมให้กับ sensor PH EC และ PID แล้วก็ทดลองหลายครั้งกว่าจะทำงานได้แต่สุดท้ายนี้การทำงานก็สำเร็จทำงานได้ อ่านค่าได้ วัดค่าต่างๆได้

 เครื่องเขย่าสารทดลองการทำงาน
      สุดท้ายนี้ผมเข้ามาช่วยในด้านควบคุม sensor เครื่องเขย่าสาร  และระหว่างการทำงานก็มีความสุขและได้ความรู้ไม่ใช่แค่เรื่องนี้เท่านั้นแต่ยังคงได้อีกหลายเรื่องกับสิ่งแวดล้อมต่างๆ ผมมีความสุขดีที่ได้มาฝึกงานที่นี้ และยังเป็นความทรงจำดีๆ กับการได้มาอยู่ กทม

สรุปการทำงานในคลิปวีดีโอ
ผลการทำงานทั้งหมด

โค้ดควบคุมจะมี2ส่วนแยกเพื่อความเข้าใจ ส่วนที่2จะเป็นฟังชันก์การทำงานหรือแยกออกไปเป็นฟังชันก์
ส่วนที่1
//___Pin assigned___//
const int pin_Pwm = 8;
String inputstring = "";                                                       //a string to hold incoming data from the PC
int inputstringLength = 0;


//motor interpreter
float time1 = 0.0;
float time2 = 0.0;
float s = 0.0;
float counter = 0.0;
float counterstop = 0.0;
float rpm = 0.0;
//float rpm_set = 0.0;
float err = 0;
float sum_err = 0;
float old_err = 0;
float Kp = 2.8;           //ค่าคงที่ kp
float Ki = 0.01;         //ค่าคงที่ki
float Kd = 0;           //ค่าคงที่kd
float u = 0;
float pwm_set = 0;
unsigned long Cur_time = 0;
unsigned long Prev_time = 0;
int  inputmotor;
bool ismotorON = 0;
bool isprestop = 0;
int prestopcounter =0;
bool inPC = 0;

//inputstring
boolean input_stringcomplete = false;                                          //have we received all the data from the PC

String sensorstringPH = "";                                                      //a string to hold the data from the Atlas Scientific product
boolean sensor_stringcompletePH = false;                                         //have we received all the data from the Atlas Scientific product
String PHout = "";

String sensorstringEC = "";                                                      //a string to hold the data from the Atlas Scientific product
boolean sensor_stringcompleteEC = false;                                         //have we received all the data from the Atlas Scientific product
String ECout = "";


void setup()
{
  Serial.begin(38400);                                                       //Serial with PC to 38400
  Serial2.begin(38400);                                                      //Serial with pH meter to 38400
  Serial3.begin(38400);                                                      //Serial with EC meter to 38400

  attachInterrupt(1, StopMotor, RISING);
  attachInterrupt(0, Millis, RISING);
  pinMode(pin_Pwm, OUTPUT);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  Serial.println("Initialize DONE!!!");
}

void Millis()
{
  counter++;
}

void StopMotor()
{
  counterstop ++;
  if(isprestop)
  {
    //prestopcounter =0;
    
    analogWrite(pin_Pwm, 0);
          digitalWrite(5, LOW);
          digitalWrite(6, LOW);
          isprestop=0;
  }
}

void loop()
{

  //___Receive Command___//
  if (Serial.available() > 0)
  {
    while (Serial.available() > 0)
    {

      inputstring += char(Serial.read());
      inputstringLength += 1;
      delay(1);
    }
    inPC = 1;
  }

  //read PH
  if (Serial3.available() > 0)
  {
    while (Serial3.available() > 0)
    {
      PHout += char(Serial3.read());
      delay(1);
    }
    Serial.print("PH:");
    Serial.print(PHout);
    Serial.print("\t");

  }

  //read EC
  if (Serial2.available() > 0)
  {
    while (Serial2.available() > 0)
    {
      ECout += char(Serial2.read());
      delay(1);
    }
    Serial.print("EC:");
    Serial.print(ECout);
    Serial.print("\t");
    Serial.print("inputmotor");
    Serial.print(inputmotor);
    Serial.print("\t");
    Serial.print("rpm");
    Serial.println(rpm);

  }
  PHout = "";
  ECout = "";
  //___Command Checker___//
  if (inPC)
  {
    Command_Checker();
    inPC = 0;
  } else {}
 
  if (ismotorON)
  {
    if (inputmotor <= 600 )                                                  //send to serial over 50
    {
      Cur_time = millis();                                                   //set Cur_time is millis
      s = Cur_time - Prev_time;
      if (s >= 1000)
      {
        rpm = counter/s*60000/18;  //rpm
        err = inputmotor-rpm;
        sum_err += (err*s);
        double derr = (err - s);
        u = Kp * err + Ki * sum_err + Kd * derr;
        old_err = err;
        Serial.print(u);
        Serial.print("\t");
        if(u >= 255)
        {
          u = 255;
        }
        else if(u<=0)
        {
          u = 0;
        }
        analogWrite(pin_Pwm, u);
        counter = 0;
        Prev_time = Cur_time;
      }
    }
  }else {}
}

ส่วนที่2
void Command_Checker()
{
  if (inputstringLength == 6)
  {
    if ((inputstring[4] == 'Y') && (inputstring[5] == 'U'))
    {
      if (inputstring[0] == 'M')
      {
        Serial.print("Motor Command : ");
        Serial.println(inputstring);
        String temp = "";
        temp.reserve(30);
        for (int i = 1; i < (inputstringLength - 2); i++)
        {
          temp += inputstring[i];
        }
        //Serial.println(temp);
        inputmotor = temp.toInt();
        if(inputmotor == 0)
        {
          ismotorON = 0;
          analogWrite(pin_Pwm, 255);
     delay(1000);
isprestop =1;
        }
        else
        {
          ismotorON = 1;
          digitalWrite(5, HIGH);
          digitalWrite(6, LOW);
          Prev_time = millis();
             
        }
        inputstring = "";
        inputstringLength = 0;
       
      }
      else if (inputstring[0] == 'P')
      {
        Serial.print("PH Command : ");
        Serial.println(inputstring);

        String temp = "";
        temp.reserve(30);
        for (int i = 1; i < (inputstringLength - 2); i++)
        {
          temp += inputstring[i];

        }
        Serial.println(temp);
        if (temp == "C04")
        {

          Serial.println("calibratePH4");
          Serial3.print("cal,low,4\r");
        }
        else if (temp == "C07")
        {
          Serial.println("calibratePH7");
          Serial3.print("cal,mid,7\r");
        }
        else if (temp == "C10")
        {
          Serial.println("calibratePH10");
          Serial3.print("cal,high,10\r");
        }
        else if (temp == "L00")
        {
          Serial.println("Turn off pH LED");
          Serial3.print("L,0\r");
        }
        else if (temp == "L11")
        {
          Serial.println("Turn on pH LED");
          Serial3.print("L,1\r");
        }
        else if (temp == "X00")
        {
          Serial.println("Reset PH");
          Serial3.print("x\r");
        }
        inputstring = "";
        inputstringLength = 0;
      }
      else if (inputstring[0] == 'E')
      {
        Serial.print("EC Command : ");
        Serial.println(inputstring);

        String temp = "";
        temp.reserve(30);
        for (int i = 1; i < (inputstringLength - 2); i++)
        {
          temp += inputstring[i];
        }
        Serial.println(temp);
        if (temp == "12K")
        {
          Serial.println("calibrateEC12K");
          Serial2.print("Cal,low,12880\r");
        }
        else if (temp == "80K")
        {
          Serial.println("calibrateEC80K");
          Serial2.print("Cal,low,80000\r");
        }
        else if (temp == "CLE")
        {
          Serial.println("Clear EC");
          Serial2.print("Cal,clear\r");
        }
        else if (temp == "L00")
        {
          Serial.println("Turn off pH LED");
          Serial2.print("L,0\r");
        }
        else if (temp == "L11")
        {
          Serial.println("Turn on pH LED");
          Serial2.print("L,1\r");
        }
        else if (temp == "X00")
        {
          Serial.println("Reset EC");
          Serial2.print("x\r");
        }
        inputstring = "";
        inputstringLength = 0;
      }
      else
      {
        Serial.print("Command (heading) ERROR!!! : ");
        Serial.println(inputstring);
        inputstring = "";
        inputstringLength = 0;
      }
    }
    else
    {
      Serial.print("Command (ending) ERROR!!! : ");
      Serial.println(inputstring);
      inputstring = "";
      inputstringLength = 0;
    }
  }
  else if (inputstringLength == 0)
  {
    // Do nothing
  }
  else
  {
    Serial.print("Command (overall) ERROR!!! : ");
    Serial.println(inputstring);
    Serial.println(inputstringLength);
    inputstring = "";
    inputstringLength = 0;
  }
}


ท้ายสุดนี้ผมขอบคุณพี่ อาจารย์ และทุกๆคนที่fibo

ไม่มีความคิดเห็น:

แสดงความคิดเห็น