Posted on

ตัวอย่างการควบคุม สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ด้วย Arduino + ไมโคร Step Driver TB6600 เบื้องต้น

ตัวอย่างการควบคุม สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ด้วย Arduino + ไมโคร Step Driver TB6600 เบื้องต้น

Linear_Slide_LSSX05_TB6600 https://drive.google.com/drive/folders/1YALYYlV6PUrQz-IYNR843RhyF7twXqQ4?usp=sharing

สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ปรับตั้ง ดิฟต์สวิตช์ของไมโคร Step Driver TB6600 ดังนี้

  • DIP Switch S1 S2 S3 ตั้งเป็น On Off On
  • DIP Switch S4 S5 S6 ตั้งเป็น On Off On
#include <AccelStepper.h>
// The X Stepper pins
#define PUL_PIN 2  // PUL_PIN
#define DIR_PIN 3  // DIR_PIN

AccelStepper stepper(AccelStepper::DRIVER, PUL_PIN, DIR_PIN);
 
void setup()
{
    stepper.setMaxSpeed(3500.0);     // ปรับความเร็ว หน่วยเป็น พัลส์ต่อวินาที steps per second
    stepper.setAcceleration(5500.0); // ปรับความเร่ง หน่วยเป็น พัลส์ต่อวินาทีกำลังสอง steps per second per second
    stepper.setCurrentPosition(0);           //เซตค่าตำแหน่งเริ่มเท่ากับ 0 ก่อนเข้าลูป
}
void loop()
{    
    stepper.runToNewPosition(0); //เริ่มต้นที่ตำแหน่ง 0
    delay(500);
    stepper.runToNewPosition(1500); // ระยะการเคลื่อนที่ไปทางบวก ด้านขวา จำนวน พัลส์
    delay(500);
    
    stepper.runToNewPosition(0);
    delay(500);
    stepper.runToNewPosition(-1500); // ระยะการเคลื่อนที่กลับ ทางลบ ด้านซ้าย จำนวน พัลส์
    delay(500);
}

 

 

Posted on

ตัวอย่างการสั่งงานด้วย Arduino Code สำหรับทดสอบการทำงานบอลสกรู

ตัวอย่างการควบคุม สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ด้วย Arduino + ไมโคร Step Driver TB6600 เบื้องต้น

Linear_Slide_LSSX05_TB6600

https://drive.google.com/drive/folders/1YALYYlV6PUrQz-IYNR843RhyF7twXqQ4?usp=sharing

สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ปรับตั้ง ดิฟต์สวิตช์ของไมโคร Step Driver TB6600 ดังนี้

  • DIP Switch S1 S2 S3 ตั้งเป็น ON OFF ON 400 P/R 2/A
  • DIP Switch S4 S5 S6 ตั้งเป็น ON OFF OFF 2.0A

ตัวอย่างการควบคุม สเต็ปปิ้งมอเตอร์ขนาด 3 แอมป์ ด้วย Arduino + ไมโคร Step Driver TB6600 เบื้องต้น

ตัวอย่างโปรแกรมควบคุมรางสไลด์ แบบไป-กลับ ตามตำแหน่งที่กำหนด

ซอร์สโค้ดเพื่อควบคุมการทำงาน ได้ตามวีดิโอด้านบน

 

 

#include <AccelStepper.h>
 //12V full step 200 pulse/rev,       1.5A
 //    S1 S2 S3                    S4  S5  S6
 //    NO NO OFF                   NO  OFF NO
 
// The X Stepper pins
#define STEPPER1_DIR_PIN 3
#define STEPPER1_STEP_PIN 2

AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);

 int MaxAcc = 10000;
 int MaxSpd = 800;
 int State = 0;
 int Step = 0;
void setup()
{  
    stepper1.setMaxSpeed(MaxSpd);
    stepper1.setAcceleration(MaxAcc);
    stepper1.setCurrentPosition(0);
    stepper1.moveTo(1000);
    Serial.begin(9600);
    delay(2000);
    Serial.println("Power ON ");
    Serial.print("State = ");
    Serial.print(State);
    Serial.print("t position = ");
    Serial.println(stepper1.currentPosition());
    delay(2000);
}
void loop()
{
 //Serial.println(stepper1.currentPosition());
  switch (State) 
  {
    case 0:    // 
      if (stepper1.distanceToGo() == 0)
      {
        State =1;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(0);
      }
      break;
    case 1:    // your hand is close to the sensor
      if (stepper1.distanceToGo() == 0)
      {
        State = 2;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(2500);
      }
      break;
    case 2:    // your hand is a few inches from the sensor
      if (stepper1.distanceToGo() == 0)
      {
        State=3;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(0);
      }
      break;
    case 3:    // your hand is nowhere near the sensor
      if (stepper1.distanceToGo() == 0)
      {
        State = 4;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(-1000);       
      }
      break;
    case 4:    // your hand is nowhere near the sensor
      if (stepper1.distanceToGo() == 0)
      {
        State = 5;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(0);       
      }
      break;
    case 5:    // your hand is nowhere near the sensor
      if (stepper1.distanceToGo() == 0)
      {
        State = 0;
        Serial.print("State = ");
        Serial.print(State);
        Serial.print("t position = ");
        Serial.println(stepper1.currentPosition());
        delay(1000);
        stepper1.moveTo(-2000);       
      }
      break;
  }
  
stepper1.run();
}

เอาต์พุตแสดงตำแหน่ง ที่เคลื่อนที่ไป โดยจะทำงานวนไปตั้งแต่ stateที่ 0 ถึง state 5

การต่อสายสัญญาณ ระหว่างบอร์ดอาดูโน่ และ ไดร์ฟเวอร์ สเต็ปเปอร์มอเตอร์

การตั้งค่าตัวไดร์ฟเวอร์ ขับสเต็ปเปอร์ ความละเอียด 200 สเต็ปต่อรอบ ตั้งค่ากระแส1.0 แอมป์

 

ตัวอย่างการสั่งงานด้วย Arduino Code

  •  กระแสที่ 3 แอมป์
  • Micro Step = 4, PPR = 800

ตัวอย่างการสั่งงานด้วย Arduino Code สำหรับทดสอบการทำงานเบื้องต้น

  • กระแสที่ 3 แอมป์
  • Micro Step = 4, PPR = 800

Linear_Slide_LSSX05_TB6600

#include <AccelStepper.h>
 
// The X Stepper pins
#define PUL_PIN 2  // PUL_PIN
#define DIR_PIN 3  // DIR_PIN

AccelStepper stepper(AccelStepper::DRIVER, PUL_PIN, DIR_PIN);
 
void setup(){
    stepper.setMaxSpeed(10000.0);     // ปรับความเร็ว
    stepper.setAcceleration(10000.0); // ปรับความเร่ง
}
void loop(){    
    stepper.runToNewPosition(0);
    delay(500);
    stepper.runToNewPosition(10000); // ระยะการเคลื่อนที่ไป
    delay(500);
    stepper.runToNewPosition(0);
    delay(500);
    stepper.runToNewPosition(-10000); // ระยะการเคลื่อนที่กลับ
    delay(500);
}

ตัวอย่างการสั่งงานด้วย Arduino Code แบบมี Home Limit Switch

#include <AccelStepper.h>
 
// The X Stepper pins
#define STEPPER1_DIR_PIN 3
#define STEPPER1_STEP_PIN 2
AccelStepper stepper(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);
 const int buttonPin = 7; //home switch
 int state = 0;
 int buttonState = 0; 
 int MaxAcc = 6000;
 int MaxSpd = 4000;
void setup()
{
     Serial.begin(9600);
     pinMode(buttonPin, INPUT_PULLUP);
    stepper.setMaxSpeed(MaxSpd); // ทดลองปรับความเร็ว
    stepper.setAcceleration(MaxAcc); // ทดลองปรับความเร่ง
}
void loop()
{    
    //Serial.println(state);
    buttonState = digitalRead(buttonPin);
    if((buttonState == HIGH)&&(state == 0))//
    {
        stepper.setMaxSpeed(MaxSpd); // หมุนช้าเข้าหาสวิตช์ Home
        stepper.setAcceleration(MaxAcc);
        stepper.setSpeed(-500);
        stepper.runSpeed();
        
    }
    else if ((buttonState == LOW) &&(state == 0))
    {
          stepper.setMaxSpeed(MaxSpd); 
          stepper.setAcceleration(MaxAcc);
          stepper.setCurrentPosition(0);
          state = 1;
          delay(1000);
    } 
    if(state ==1 )
    {
      stepper.runToNewPosition(12000);
      delay(1000);
      stepper.runToNewPosition(0);
      delay(1000);
    }
}

 

Posted on

วิธีการใช้งาน Arduino Opta PLC อย่างง่าย

วิธีการใช้งาน Arduino Opta  PLC อย่างง่าย

  • พูดถึง Ardunio เป็นแพลตฟอร์มยอดนิยมของคนที่สนใจการเขียนโปรแกรมเพื่อควบคุมฮาร์แวร์ทั้งในแบบเป็นงานอดิเรก หรือแม้กระทั้งนำไปใช้ในระดับมืออาชีพ แต่สำหรับ Arduino Opta PLC ตัวนี้ เพิ่งเปิดตัวมาได้ไม่นาน มันเกิดจากความร่วมมือกันระหว่าง Arduino และผู้ผลิตPLC ที่มีชื่อดังยี่ห้อ Finder ต่อไปเราจะเรียก PLC ตัวนี้ สั้นๆ ว่า Opta อ่านว่า ออปต้า

รูปที่1

  • ในปัจจุบัน Opta มีทั้งหมดสามรุ่นได้แก่ Opta Lite, Opta RS485, และ Opta WiFi ในบทความนี้จะได้ทดลองใช้ Opta RS485 หมายถึง ในรุ่นนี้จะมีช่องทางการสื่อสาร RS485 ให้ด้วยที่จะมีประโยชน์มาก ซึ่งจะกล่าวเพิ่มเติมในภายหลัง
  • แพลตฟอร์ม Arduino ที่ได้รับการจดจำมากที่สุดตลอดกาลตอนนี้ก็คือ Arduino Uno มันสามารถทำให้ผู้ที่ยังไม่เคยใช้งานการเขียนโปรแกรมมาก่อนสามารถเริ่มต้นได้อย่างรวดเร็ว รวมถึงการมีไลเบอรีจำนวนมากให้สามารถนำมาต่อยอดใช้งานได้ทันที ที่สำคัญคือฮาร์ดแวร์ที่เป็นมาตรฐานลดระยะเวลาที่ต้องออกแบบ PCB ใหม่ ทั้งหมดทำให้ผู้ใช้สามารถใช้งานได้ง่ายและนำไปต่อยอดได้อย่างรวดเร็ว
  • จากที่กล่าวมาทั้งหมดนี้ ผู้ผลิตสัญญาณว่า จะนำแนวคิดที่กล่าวมาข้างต้นนี้ มาใช้กับArduino Opta เช่นเดียวกัน โดยสามารถรองรับการเขียนโปรแกรมบน Arduino IDE และได้เพิ่ม PLC IDE ที่สามารถรองรับภาษา PLC ตามมาตรฐาน  IEC 61131-3 ซึ่งเป็นภาษาที่ใช้ในการเขียนโปรแกรม PLC ที่ช่างเทคนิค วิศวกร ต่างๆ คุ้นเคยกันอยู่แล้ว ผมคิดว่า ทาง Arduino พยายามที่นำ แพลตฟอร์ม Arduino เข้าสู่โลกของอุตสาหกรรม ที่ต้องการความน่าเชื่อถือ ความเข้ากันได้ของอินพุตและเอาต์พุต ร่วมถึงภาษาที่ใช้ในการพัฒนาซึ่งบุคคลากรในอุตสาหกรรมคุ้นเคยกันอยู่แล้ว

ผมสามารถสรุปข้อดีของ Arduino Opta ได้ดังนี้

  1. สามารถเขียนโปรแกรมแบบคลาสสิค ด้วยภาษาซี บน Arduino IDE หรือจะใช้ PLC IDE ซึ่งเขียนด้วยภาษา PLC ตามมาตรฐาน IEC 61131-3 ก็ได้ แล้วแต่ความถนัดของผู้ใช้งาน
  2. รองรับโปรโตคอลการสื่อสาร Fieldbus และ Modbus
  3. รองรับ WiFi (เฉพาะรุ่นที่มี)
  4. รองรับ Arduino Cloud
  5. มีการออกแบบที่ทนทาน พร้อมตัวยึดรางแบบ Dinrail

คุณลักษณะของ Arduino Opta

ในส่วนนี้ เราจะมีสำรวจสเปคของ Arduino Opta กัน ซึ่งสามารถทำตารางสรุปได้ดังนี้

รูปที่2

โดยทุกรุ่นมีสเปคคร่าวๆ ดังนี้

  • แรงดันไฟเลี้ยง สามารถใช้ได้ตั้งแต่ 12 ถึง 24 โวลต์
  • อินพุต 8 ช่อง สามารถกำหนดเป็น ดิจิตอล อินพุต หรือ เป็นอนาลอกอินพุต ก็ได้
  • เอาต์พุตเป็น รีเลย์ 4 ช่อง หน้าสัมผัสทดกระแสได้ 10 แอมป์
  • ตัวประมวลผล เป็นแบบแกนคู่ จาก ST เบอร์ STM32H747XI
  • หน่วยความจำแรม 1 เมกะไบต์
  • หน่วยความจำแฟลต 2 เมกะไบต์

อินพุตของ Arduino Opta

  • ตามเอกสารจากดาต้าชีส ตัว Opta สามารถกำหนดอินพุตให้สามารถรับได้ทั้งอนาลอกและดิจิตอล โดยเมื่อกำหนดให้อินพุตเป็นแบบดิจิตอล สามารถรองรับสัญญาณ LOW หรือ HIGH ได้ แต่เมื่อกำหนดเป็นอินพุตอนาลอก สามารถรองรับแรงดัน 0 ถึง 10 โวลต์ดีซี

เอาต์พุตของ Arduino Opta

  • เอาต์พุตของ Opta เป็นหน้าสัมผัสรีเลย์แบบ ปกติเปิด (normally open NO) โดยรีเลย์แต่ละตัวจะมีหน้าสัมผัสทนกระแสได้ 10A 250VAC

 

ทดลองเขียนโปรแกรมภาษาซี บนArduino IDE

  • เราสามารถเขียนโปรแกรมภาษาซีบน Arduino IDE แล้วโปรแกรมเข้าไปยังตัว Opta ได้แบบเดียวกับบอร์ด Arduino ทั่วไป ในบทความนี้ได้ทดสอบบน Arduino IDE 2.0.4
  • เมื่อเปิด Arduino IDE ขึ้นมา ให้ไปที่  Tools à Board à Board Manager

รูปที่ 3

ในช่องค้นหา ใส่คำว่า opta มองหา Arduino Mbed OS Opta Boards by Arduino จากนั้นคลิ๊กติดตั้งให้เรียบร้อย

รูปที่ 4

  • ขั้นต่อไป กลับมาที่ ตัว Opta ให้ต่อสายไฟเลี้ยงเข้า สามารถใช้ได้ตั้งแต่ 12 ถึง 24 โวลต์ ให้สังเกตดีๆ  เพราะมีช่องบวก สองช่อง ช่องลบ สองช่อง

รูปที่ 5

  • สุดท้ายเป็นการต่อสาย USB type C เข้ากับตัว Opta สายนี้ใช้เพื่อโหลดโค้ดและมอนิเตอร์ค่าระหว่างการทำงานได้

รูปที่ 6

  • กลับมาที่หน้าต่างของ Arduino IDE ไปที่ Tools à board àArduino Mbed OS Opta Boardà Opta

รูปที่ 7

  • ส่วนการเลือกพอร์ตให้ไปที่ Tools à Port

รูปที่ 8

  • ถึงขั้นตอนนี้ เราสามารถเริ่มต้นการเขียนโปรแกรมได้แล้ว โดยตัวอย่างโปรแกรมเป็นดังนี้

ภาพรวมของโปรแกรมจะส่งสัญญาณไปควบคุมLED ให้กะพริบในรูปแบบที่เรียกว่า Kinght Rider คือจะกะพริบแบบสแกนวนไปทั้งซ้ายและขวา ที่ตำแหน่งของ LED status ตัวอย่างโค้ด บรรทัดที่16 ถึง 25 จะสร้างการกะพริบจากตัวแรก ไปยังตัวสุดท้าย ส่วนโค้ดบรรทัดที่ 28 ถึง 37 จะสร้างการกะพริบจากท้ายกลับมายังตัวแรก วนกลับไปมาเรื่อย

รูปที่ 9

Posted on

การอ่านค่าจากขาอะนาล็อก 10 บิต บอร์ด Arduino

การอ่านค่าจากขาอะนาล็อก 10 บิต บอร์ด Arduino

Read Analog Voltage

BOARD OPERATING VOLTAGE USABLE PINS MAX RESOLUTION

Uno

5 Volts

A0 to A5

10 bits

Code

analogRead()
[Analog I/O]

การอ่านค่าจากขาอะนาล็อก 10 บิต บอร์ด Arduino มีตัวแปลงแอนะล็อกเป็นดิจิทัลแบบหลายช่องสัญญาณ 10 บิต ซึ่งหมายความว่าจะแมปแรงดันอินพุตระหว่าง 0 และแรงดันใช้งาน (5V หรือ 3.3V) เป็นค่าจำนวนเต็มระหว่าง 0 ถึง 1023 ตัวอย่างเช่น บน Arduino UNO ค่านี้จะให้ความละเอียดระหว่างการอ่าน: 5 โวลต์ / 1024 หน่วย หรือ , 0.0049 โวลต์ (4.9 มิลลิโวลต์) ต่อหน่วย

  • ช่วงอินพุตสามารถเปลี่ยนได้โดยใช้ analogReference() ในขณะที่สามารถเปลี่ยนความละเอียดได้ (สำหรับบอร์ด Zero, Due และ MKR เท่านั้น) โดยใช้ analogReadResolution()
  • บนบอร์ดที่ใช้ ATmega (UNO, Nano, Mini, Mega) จะใช้เวลาประมาณ 100 ไมโครวินาที (0.0001 วินาที) ในการอ่านอินพุตแบบอะนาล็อก ดังนั้นอัตราการอ่านสูงสุดจึงอยู่ที่ประมาณ 10,000 ครั้งต่อวินาที
  • ในโปรแกรมด้านล่าง สิ่งแรกที่คุณจะทำคือในฟังก์ชันการตั้งค่า เพื่อเริ่มการสื่อสารแบบอนุกรมที่ข้อมูล 9600 บิตต่อวินาที ระหว่างบอร์ดและคอมพิวเตอร์ของคุณด้วยสาย:
Serial.begin(9600);
  • ในลูปหลักของโค้ดต้องสร้างตัวแปรเพื่อเก็บค่าความต้านทาน (ซึ่งจะอยู่ระหว่าง 0 ถึง 1023 เหมาะสำหรับประเภทข้อมูล int) ที่มาจากโพเทนชิออมิเตอร์
int sensorValue = analogRead(A0);
  • หากต้องการเปลี่ยนค่าจาก 0-1023 เป็นช่วงที่สอดคล้องกับแรงดันไฟฟ้าที่พินกำลังอ่านจะต้องสร้างตัวแปรอื่น เช่น Float หากต้องการปรับขนาดตัวเลขระหว่าง 0.0 ถึง 5.0 ให้หาร 5.0 ด้วย 1023.0 แล้วคูณด้วย sensorValue :
float voltage= sensorValue * (5.0 / 1023.0);
  • สุดท้ายต้อง Print ข้อมูลนี้ไปยัง Serial Monitor  สามารถทำได้โดยใช้คำสั่ง Serial.println() ในโค้ดบรรทัดสุดท้าย:
Serial.println(voltage)
  • เมื่อเปิด Serial Monitor ใน Arduino IDE (โดยคลิกที่ไอคอนทางด้านขวาของแถบสีเขียวด้านบน หรือกด Ctrl+Shift+M) จะเห็นตัวเลขต่อเนื่องตั้งแต่ 0.0 – 5.0 เมื่อ หมุน Potentiometer  ค่า จะเปลี่ยนตามแรงดันไฟที่เข้าขา A0
Posted on

ควบคุมสเต็ปปิ้งมอเตอร์โดยใช้บอร์ดอาดูโน่และลิมิตสวิทช์

ควบคุมสเต็ปปิ้งมอเตอร์โดยใช้บอร์ดอาดูโน่

#define Go_L 8 // กำหนดขาที่ต่อกับสวิตช์โยก
#define Go_R 9 // กำหนดขาที่ต่อกับสวิตช์โยก
#define Limit_R 11 //กำหนดขาที่ต่อกับลิมิตสวิทช์
#define Limit_L 12 //กำหนดขาที่ต่อกับลิมิตสวิทช์
int speed1 = 900; //กำหนดความเร็ว ค่าน้อย มอเตอร์หมุนเร็ว ค่ามาก มอเตอร์หมุนช้า
void setup(){  
  pinMode(5, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(Go_L, INPUT_PULLUP);
  pinMode(Go_R, INPUT_PULLUP);
  pinMode(Limit_R, INPUT_PULLUP);
  pinMode(Limit_L, INPUT_PULLUP);     
}
void loop() {
if(digitalRead(Go_R)==0)  //โยกไปขวา
      {
            if (digitalRead(Limit_R))//ตราบเท่าที่ยังไม่ชนลิมิตสวิตช์ สั่งให้มอเตอร์หมุนต่อไป
            {
                digitalWrite(2, LOW);
                digitalWrite(5, HIGH);
                delayMicroseconds(speed1);
                digitalWrite(5, LOW);
                delayMicroseconds(speed1);  
            }  
            else
            {
              // ชนลิมิตสวิตช์แล้ว มอเตอร์หยุด
            }
      }
  if(digitalRead(Go_L)==0) //โยกไปซ้าย
      {          
            if (digitalRead(Limit_L))//ตราบเท่าที่ยังไม่ชนลิมิตสวิตช์ สั่งให้มอเตอร์หมุนต่อไป
            {
                 digitalWrite(2, HIGH);
                digitalWrite(5, HIGH);
                delayMicroseconds(speed1);
                digitalWrite(5, LOW);
                delayMicroseconds(speed1); 
            }  
            else
            {
              // ชนลิมิตสวิตช์แล้ว มอเตอร์หยุด
            }
      }
}

 

Posted on

บันทึกข้อมูล CoolTerm Arduino Serial Motitor Data ในไฟล์ TXT, CSV และ Excel

ใช้ CoolTerm เพื่อรับข้อมูลซีเรียลเป็นไฟล์ที่บันทึกได้

CoolTerm 2.0 freeware Download

https://coolterm.en.lo4d.com/windows

CoolTerm สามารถบันทึกข้อมูลขาเข้าลงในไฟล์ข้อความ ในส่วนวิธีใช้ คุณสามารถอ่านเกี่ยวกับ “ข้อมูลที่ได้รับสามารถบันทึกลงใน Textfile โดยใช้การ Connection/Capture to Textfile.”, “Capture Text Options”, “Leave File open while capturing” and “Add timestamps to received data”.

Posted on

ตัวอย่างโปรแกรม แสดงผล Counter บนคอมพิวเตอร์ Modbus RTU RS485 ด้วย Software Processing 

โปรโตคอล Modbus เป็นวิธีการมาตรฐานในอุตสาหกรรมสำหรับการถ่ายโอนข้อมูล ใช้กับระบบอัตโนมัติและระบบควบคุมในงานอุตสาหกรรม

  • Step 3 : เชื่อมต่อสายสื่อสารข้อมูล RS485-USB เข้ากับคอมพิวเตอร์
  • Step 4 : เปิด Source Code เปลี่ยน Comport ให้ตรง (ทำได้โดยแก้ไขบรรทัดที่  3 เดิมเป็น COM11 เปลี่ยน commPort เป็น COMXX ให้ตรงกับ Comport ในคอมพิวเตอร์ของเรา *ดูใน Device Manager )
import processing.serial.*;
Serial myPort; // create a Serial port instance
String commPort = "COM11";
int baud = 9600;
char parity = 'N';
int dataBits = 8;
float stopBits = 1.0;

ModbusPort port_one; // create a Modbus port instance
int timeout = 500;
int polling = 100;
int no_of_retries = 10;
int total_no_of_packets = 2;

Packet[] packets = new Packet[total_no_of_packets]; // create an array of packets to transmit
int[] readRegs1  = new int[2]; // to store the requested data
int[] readRegs2  = new int[2]; // to store the requested data
//int[] readRegs3  = new int[2]; // to store the requested data

int previousMillis = 0;
int count = 0;
void setup(){
  size(1024, 768);

  myPort = new Serial(this, commPort, baud, parity, dataBits, stopBits);   // initialize the Serial port instance
  port_one = new ModbusPort(myPort, timeout, polling, no_of_retries, packets, total_no_of_packets);   // initialize a port for modbus communications

  // The packet format for function 1, 2, 3, 4, 15 & 16 is:
  // Packet(id, function, address, data, data array)

  packets[0] = new Packet(1, 03, 01, 1, readRegs1);  //(ID, FNC READ_HOLDING_REGISTERS = 3, ADD (00=Target) (36=Count), data, data array)
  packets[1] = new Packet(1, 03, 15, 1, readRegs2);  //(ID, FNC READ_HOLDING_REGISTERS = 3, ADD (00=Target) (36=Count), data, data array)
  //packets[2] = new Packet(1, 03, 31, 1, readRegs3);  //(ID, FNC READ_HOLDING_REGISTERS = 3, ADD (00=Target) (36=Count), data, data array)

}

void draw(){  
  background(200);
  port_one.update();
  // Display the registers received using function 3
  
  fill(255, 0, 0); // RGB Color
  textSize(50); 
  text("Counter Machine S2-Innovation", 40, 50);
  
  fill(0, 255, 0); // RGB Color
  textSize(200); 
  text("TARGET : "+readRegs1[0], 50, 300);
  
  fill(0, 0, 255); // RGB Color  
  textSize(200);
  text("ACTUAL : "+readRegs2[0], 50, 600);

  //text("OUT    :" +readRegs3[0], 10, 1200);
    
}

Step 5 : กดปุ่มรัน (Run) โปรแกรมจะแสดงผลค่า Target และค่าที่นับได้ (Actual)

Posted on

ตัวอย่างโค้ด Arduino รวมเซนเซอร์ 37 ชิ้น

ตัวอย่างโค้ดรวมเซนเซอร์ Arduino 37 ชิ้น  Arduino Example Code 37 Sensor Kit

ตัวอย่างโค้ด โมดูลเซ็นเซอร์อุณหภูมิ Temperature sensor module Arduino Example Code

รหัสนี้ใช้ไลบรารี OneWire และ DallasTemperature เพื่อสื่อสารกับโมดูลเซ็นเซอร์อุณหภูมิ ไลบรารี OneWire ใช้เพื่อสร้างการสื่อสารกับโมดูลเซ็นเซอร์อุณหภูมิผ่านบัสสายเดี่ยว และไลบรารี DallasTemperature มีอินเทอร์เฟซที่ใช้งานง่ายสำหรับการอ่านค่าอุณหภูมิ ในฟังก์ชันการตั้งค่า เราเริ่มต้นพอร์ตอนุกรมและเริ่มไลบรารี DallasTemperature ในฟังก์ชันลูป เราร้องขออุณหภูมิจากเซ็นเซอร์โดยใช้ฟังก์ชัน requestTemperatures จากนั้นพิมพ์ค่าอุณหภูมิโดยใช้ฟังก์ชัน getTempCByIndex โปรดทราบว่ารหัสนี้ถือว่าโมดูลเซ็นเซอร์อุณหภูมิเชื่อมต่อกับพิน 2 บนบอร์ด Arduino และใช้ดัชนีอุปกรณ์เริ่มต้น (0) คุณอาจต้องแก้ไขค่าเหล่านี้ขึ้นอยู่กับการตั้งค่าเฉพาะของคุณ

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  // After we got the temperatures, we can print them here.
  // We use the function ByIndex, and as an example get the temperature from the first sensor only.
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));
}

 

ตัวอย่างโค้ด Automatic flashing colorful LED module Arduino Example Code

#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11

void setup() {
  // Set the pins as outputs
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
}

void loop() {
  // Turn on red LED for 1 second
  digitalWrite(RED_PIN, HIGH);
  delay(1000);
  digitalWrite(RED_PIN, LOW);

  // Turn on green LED for 1 second
  digitalWrite(GREEN_PIN, HIGH);
  delay(1000);
  digitalWrite(GREEN_PIN, LOW);

  // Turn on blue LED for 1 second
  digitalWrite(BLUE_PIN, HIGH);
  delay(1000);
  digitalWrite(BLUE_PIN, LOW);
}

 

ตัวอย่างโค้ด Mini magnetic reed modules Arduino Example Code

#define REED_SWITCH_PIN 2

void setup() {
  // Set the reed switch pin as an input
  pinMode(REED_SWITCH_PIN, INPUT);
}

void loop() {
  // Read the state of the reed switch
  int reedSwitchState = digitalRead(REED_SWITCH_PIN);

  // Print the state of the reed switch
  if (reedSwitchState == HIGH) {
    Serial.println("Reed switch is closed");
  } else {
    Serial.println("Reed switch is open");
  }

  // Wait for 1 second before reading the reed switch again
  delay(1000);
}

 

ตัวอย่างโค้ด Hall Magnetic sensor module Arduino Example Code

 

ตัวอย่างโค้ด Infrared sensor receiver module Arduino Example Code

 

ตัวอย่างโค้ด Class Bihor magnetic sensor Arduino Example Code

 

ตัวอย่างโค้ด เซนเซอร์สวิตช์ปรอทกับหลอดไฟ LED KY-027 Magic light cup module Arduino Example Code

 

ตัวอย่างโค้ด Rotary encoder module Arduino Example Code

 

ตัวอย่างโค้ด Optical broken module Arduino Example Code

 

ตัวอย่างโค้ด Detect the heartbeat module Arduino Example Code

 

ตัวอย่างโค้ด Reed module Arduino Example Code

 

ตัวอย่างโค้ด Obstacle avoidance sensor module Arduino Example Code

 

ตัวอย่างโค้ด Hunt sensor module Arduino Example Code

 

ตัวอย่างโค้ด Mercury open optical module Arduino Example Code

 

ตัวอย่างโค้ด 3mm 2 Color LED module Arduino Example Code

 

ตัวอย่างโค้ด Active buzzer module

 

ตัวอย่างโค้ด Microphone sound sensor module

 

ตัวอย่างโค้ด Laser sensor module Arduino Example Code

 

ตัวอย่างโค้ด Temperature sensor module Arduino Example Code

 

ตัวอย่างโค้ด Magnetic Hall sensors Arduino Example Code

 

ตัวอย่างโค้ด Flame sensor module Arduino Example Code

 

ตัวอย่างโค้ด Sensitive microphone sensor module Arduino Example Code

 

ตัวอย่างโค้ด Temperature&humidity sensor module Arduino Example Code

 

ตัวอย่างโค้ด 3 Color full-color LED SMD modules Arduino Example Code

 

ตัวอย่างโค้ด Infrared emission sensor module Arduino Example Code

Posted on

การควบคุมรถบังคับดีซีมอเตอร์ผ่านสมาร์ทโฟนโดยใช้อาดูโน่ Arduino Car Robot Bluetooth Module

หลักการควบคุมไดรเวอร์มอเตอร์ L298 ด้วย Arduino และสมาร์ทโฟน จะต้องตั้งค่าการสื่อสาร Bluetooth ระหว่าง Arduino และสมาร์ทโฟน ติดตั้งโมดูล Bluetooth เช่น Bluetooth HC-05 (ZS-040) บน Arduino และต่อสายตามแผ่นข้อมูลของโมดูล ส่งคำสั่งจากสมาร์ทโฟนไปยัง Arduino เพื่อควบคุม L298 และมอเตอร์ที่เชื่อมต่ออยู่ ตัวอย่างเช่น ส่ง “F” เพื่อให้มอเตอร์เคลื่อนที่ไปข้างหน้า ส่ง “B” เพื่อให้มอเตอร์เคลื่อนที่ถอยหลัง และ ส่ง “S” เพื่อหยุดมอเตอร์ สามารถส่งคำสั่งเพื่อควบคุมความเร็วของมอเตอร์ เช่น “1” สำหรับความเร็วต่ำและ “9” สำหรับความเร็วสูง

รวบรวมวัสดุที่จำเป็น:

  1. BDMC04 บอร์ดอาดุยโน่ Arduino Uno R3 Compatible DIP IC CH340 USB Cable
  2. BDSP02 บอร์ดขับมอเตอร์ DC Motor Driver L298N
  3. BDBT01 โมดูลบลูทูธ Bluetooth Module HC-06 BT06 (ZS-040)
  4. DC Gear Motor พร้อมล้อ + โครงสร้างรถหรือตัวถังรถเพื่อประกอบฐานล้อ โครงรถอลูมิเนียม Aluminum Frame Robot Car Wheel TT DC Gear Motor
  5. เครื่องมือช่างที่จำเป็นได้แก่หัวแร้งและตะกั่วบัดกรี

แผนผังการต่อสายไฟ

ติดตั้งแอพเทอร์มินัล Bluetooth บนสมาร์ทโฟน

แอพ Android และ iOS ที่ให้เราส่งและรับข้อมูลผ่านบลูทูธ โดยใช้ Bluetooth terminal app, Serial Bluetooth Terminal, Bluetooth Terminal

ตั้งค่าฮาร์ดแวร์:

เชื่อมต่อโมดูลบลูทูธ เข้ากับ Arduino

  1. โมดูลบลูทูธ VCC  >> 3.3V Arduino
  2. โมดูลบลูทูธ GND >> GND Arduino
  3. โมดูลบลูทูธ RXD >> 11 Arduino
  4. โมดูลบลูทูธ TXD >> 10 Arduino

เขียน Code: arduino

เขียน Sketch สำหรับ Arduino เพื่อควบคุม L298 ตามคำสั่งที่ได้รับผ่านการเชื่อมต่อ Bluetooth Sketch นี้ใช้ไลบรารี software serial เพื่อตั้งค่าพอร์ตอนุกรมที่สองสำหรับ Bluetooth Module และรับฟังคำสั่งผ่านพอร์ตนี้ในฟังก์ชันลูป เมื่อได้รับคำสั่ง มันจะควบคุม L298 ตามอักขระที่ได้รับ L298 ถูกควบคุมโดยใช้ฟังก์ชันเอาต์พุตดิจิตอลเพื่อกำหนดทิศทางของมอเตอร์ และฟังก์ชันเอาต์พุตแบบอะนาล็อกเพื่อตั้งค่าความเร็วของมอเตอร์โดยใช้การมอดูเลตความกว้างพัลส์ (PWM)

#include <SoftwareSerial.h>

// Set up a software serial port for the HC-05, HC-06 Bluetooth module
SoftwareSerial BTserial(10, 11); // RX, TX

// Set up constants for the L298 control pins
const int in1 = 4; // MOTOR1 DIR
const int in2 = 5; // MOTOR1 DIR 
const int enA = 6; // MOTOR1 SPEED

const int in3 = 7; // MOTOR2 DIR
const int in4 = 8; // MOTOR2 DIR 
const int enB = 9; // MOTOR2 SPEED

void setup() {
  // Initialize serial communication with the computer
  Serial.begin(9600);
  // Initialize serial communication with the HC-05
  BTserial.begin(9600);

  // Set up the L298 control pins as outputs
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  // Check if there is data available from the HC-05
  if (BTserial.available()) {
    // Read a single character from the HC-05
    char c = BTserial.read();
            Serial.print(c);
    
    // Check the character and control the L298 accordingly
    switch (c) {
      case 'f':
  // Forward
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, 255); // Full speed
  analogWrite(enB, 255); // Full speed
        break;
        
      case 'b':
  // Backward
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enA, 255); // Full speed
  analogWrite(enB, 255); // Full speed
        break;
        
      case 's':
  // Stop
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, 0); // 0% duty cycle
  analogWrite(enB, 0); // 0% duty cycle  
        break;
        
      case '1':
        // Low speed
        analogWrite(enA, 128); // 50% duty cycle
        analogWrite(enB, 128); // 50% duty cycle
        break;
      
      case '9':
        // High speed
        analogWrite(enA, 255); // 100% duty cycle
        analogWrite(enB, 255); // 100% duty cycle
        break;
      
      default:
        // Invalid command
        break;
    }
  }
}

 

Posted on

วิธีใช้อาดูโน่ควบคุมรถบังคับดีซีมอเตอร์ Arduino L298N DC Motor Car Robot

ในการควบคุมรถ RC โดยใช้ Arduino และไดรเวอร์มอเตอร์ L298N จะต้องทำตามขั้นตอนเหล่านี้

รวบรวมวัสดุที่จำเป็น:

  1. BDMC04 บอร์ดอาดุยโน่ Arduino Uno R3 Compatible DIP IC CH340 USB Cable
  2. BDSP02 บอร์ดขับมอเตอร์ DC Motor Driver L298N
  3. DC Gear Motor พร้อมล้อ + โครงสร้างรถหรือตัวถังรถเพื่อประกอบฐานล้อ RC4401 โครงรถอลูมิเนียม Aluminum Frame Robot Car 65mm Wheel TT DC Gear Motor
  4. เครื่องมือช่างที่จำเป็นได้แก่หัวแร้งและตะกั่วบัดกรี

ตั้งค่าฮาร์ดแวร์:

  1. เชื่อมต่อแหล่งจ่ายไฟเข้ากับโมดูลไดรเวอร์มอเตอร์ L298N
  2. โมดูล L298N จะต้องมีแหล่งจ่ายไฟแยกต่างหากจาก Arduino เนื่องจากจะต้องขับมอเตอร์ซึ่งต้องใช้กระแสไฟมาก
  3. เชื่อมต่อมอเตอร์เข้ากับโมดูลไดรเวอร์มอเตอร์ L298N โมดูล L298N มีเอาต์พุตมอเตอร์สองตัวสำหรับมอเตอร์ด้านซ้ายขวาของรถ RC
    1. เชื่อมต่อมอเตอร์ด้านซ้าย เข้า กับขั้วต่อ M1
    2. เชื่อมต่อมอเตอร์ด้านขวา เข้า กับขั้วต่อ M2
    3. เชื่อมต่อโมดูลไดรเวอร์มอเตอร์ L298N เข้ากับ Arduino เชื่อมต่อพิน ENA และ ENB ของโมดูล L298N
    4. เชื่อมต่อโมดูลไดรเวอร์มอเตอร์ L298Nเข้ากับพินดิจิทัล PWM ของ Arduino
    5. เชื่อมต่อพิน IN1, IN2, IN3 และ IN4 เข้ากับพินดิจิทัลเอาต์พุตของ Arduino

แผนผังการต่อสายไฟ

https://oshwlab.com/s2insupply/arduino-l298n-rc-robot-car

เขียน Code: arduino

  • เขียน Arduino Sketch เพื่อควบคุมมอเตอร์ ใช้ฟังก์ชัน digitalWrite() เพื่อตั้งค่าสถานะของพิน IN1, IN2, IN3 และ IN4 และใช้ฟังก์ชัน analogWrite() เพื่อตั้งค่าความเร็วของมอเตอร์โดยใช้พิน ENA และ ENB
  • อัปโหลด Sketch ไปยัง Arduino และทดสอบรถ RC ใช้ฟังก์ชัน digitalWrite() และ analogWrite() ใน Sketch เพื่อควบคุมทิศทางและความเร็วของมอเตอร์ และใช้รีโมทคอนโทรลหรืออุปกรณ์อินพุตอื่นๆ เพื่อส่งคำสั่งไปยัง Arduino

 

// Set up constants for the L298 control pins
const int in1 = 4; // MOTOR1 DIR
const int in2 = 5; // MOTOR1 DIR 
const int enA = 6; // MOTOR1 SPEED

const int in3 = 7; // MOTOR2 DIR
const int in4 = 8; // MOTOR2 DIR 
const int enB = 9; // MOTOR2 SPEED

void setup() {
  // Set up the L298 control pins as outputs
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enA, OUTPUT);
  
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
}

void loop() {
  // Forward
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 255); // Full speed
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 255); // Full speed
  
  // Wait for 1 second
  delay(1000);
  
  // Backward
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 255); // Full speed
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 255); // Full speed
  
  // Wait for 1 second
  delay(1000);  
  // Stop
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, 0); // 0% duty cycle
  analogWrite(enB, 0); // 0% duty cycle  
  
  // Wait for 1 second
  delay(1000);
}