เริ่มต้นกับ MicroPython โดยใช้ Thonny IDE สำหรับมือใหม่

1. แนะนำ MicroPython และ Thonny IDE

MicroPython คืออะไร?

MicroPython เป็นการนำภาษา Python 3 มาปรับให้เหมาะกับการใช้งานบนไมโครคอนโทรลเลอร์ เช่น ESP32, ESP8266, Raspberry Pi Pico และ STM32 เพื่อให้สามารถเขียนโค้ดควบคุมฮาร์ดแวร์ได้ง่ายขึ้นโดยไม่ต้องใช้ C/C++ เหมือนกับ Arduino

Thonny IDE คืออะไร?

Thonny เป็น IDE (Integrated Development Environment) ที่เหมาะสำหรับผู้เริ่มต้นเรียนรู้การเขียนโปรแกรมด้วย Python และยังรองรับ MicroPython ทำให้สามารถเขียนโค้ดและอัปโหลดไปยังบอร์ดไมโครคอนโทรลเลอร์ได้อย่างง่ายดาย

2. อุปกรณ์ที่ต้องใช้

  • คอมพิวเตอร์ (Windows, macOS หรือ Linux)
  • บอร์ดที่รองรับ MicroPython เช่น:
    • ESP32 / ESP8266
    • Raspberry Pi Pico
    • STM32, NRF52 หรือบอร์ดที่รองรับ MicroPython อื่นๆ
  • สาย USB (สำหรับเชื่อมต่อบอร์ดกับคอมพิวเตอร์)
  • Thonny IDE (สำหรับพัฒนาโค้ดและอัปโหลดไปยังบอร์ด)
  • ไฟล์เฟิร์มแวร์ MicroPython ที่เหมาะกับบอร์ดของคุณ

3. วิธีติดตั้ง Thonny IDE

  1. ดาวน์โหลด Thonny IDE จากเว็บไซต์ทางการ: https://thonny.org/
  2. ติดตั้งโปรแกรมตามขั้นตอนที่แสดงบนหน้าจอ
  3. เปิด Thonny ขึ้นมา

4. การติดตั้ง MicroPython บนบอร์ด

ดาวน์โหลดเฟิร์มแวร์ MicroPython

ไปที่เว็บไซต์ MicroPython: https://micropython.org/download/

เลือกบอร์ดที่คุณใช้งาน (เช่น ESP32, Raspberry Pi Pico) และดาวน์โหลดไฟล์ .uf2 หรือ .bin ตามที่บอร์ดรองรับ

แฟลช MicroPython ลงบอร์ด

สำหรับ Raspberry Pi Pico:

  1. กดปุ่ม BOOTSEL บนบอร์ดค้างไว้ และเสียบสาย USB เข้ากับคอมพิวเตอร์
  2. บอร์ดจะถูกตรวจพบเป็นไดรฟ์ USB
  3. คัดลอกไฟล์ .uf2 ที่ดาวน์โหลดมาแล้วลากลงไปในไดรฟ์ USB
  4. บอร์ดจะรีสตาร์ทและพร้อมใช้งาน MicroPython

สำหรับ ESP32 / ESP8266:

  1. ติดตั้งเครื่องมือ esptool.py โดยใช้คำสั่ง:
    pip install esptool
  2. เชื่อมต่อบอร์ด ESP32 หรือ ESP8266 กับคอมพิวเตอร์ผ่าน USB
  3. ใช้คำสั่งแฟลชเฟิร์มแวร์ (ปรับ /dev/ttyUSB0 หรือ COMX ตามพอร์ตที่ใช้งานจริง):
    
    esptool.py --port /dev/ttyUSB0 erase_flash
    esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash -z 0x1000 firmware.bin
                    
  4. รีสตาร์ท บอร์ด

5. ตั้งค่า Thonny IDE สำหรับ MicroPython

  1. เปิด Thonny IDE
  2. ไปที่ "Tools" > "Options..."
  3. เลือกแท็บ "Interpreter"
  4. ที่ช่อง "Which interpreter should Thonny use for running your code?" เลือก:
    • MicroPython (Raspberry Pi Pico) → สำหรับ Raspberry Pi Pico
    • MicroPython (ESP32/ESP8266) → สำหรับ ESP32 หรือ ESP8266
  5. ที่ช่อง "Port" ให้เลือกพอร์ต USB ที่บอร์ดเชื่อมต่อ (ถ้าไม่แน่ใจให้เลือก "Try to detect automatically")
  6. กด OK

6. เขียนโค้ด MicroPython เบื้องต้น

กระพริบ LED บนบอร์ด (Blink LED)

สำหรับ Raspberry Pi Pico:


from machine import Pin
from time import sleep

led = Pin(25, Pin.OUT)  # LED บนบอร์ด Pi Pico

while True:
    led.value(1)  # เปิด LED
    sleep(1)
    led.value(0)  # ปิด LED
    sleep(1)
        

สำหรับ ESP32 / ESP8266:


from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)  # ใช้ GPIO2 สำหรับ ESP32

while True:
    led.value(1)  # เปิด LED
    sleep(1)
    led.value(0)  # ปิด LED
    sleep(1)
        

บทสรุป

Thonny IDE เป็นเครื่องมือที่ง่ายสำหรับเริ่มต้นใช้งาน MicroPython และ MicroPython ทำให้การเขียนโปรแกรมบนไมโครคอนโทรลเลอร์ง่ายขึ้น สามารถใช้งานได้กับบอร์ดหลายประเภท เช่น ESP32, ESP8266, Raspberry Pi Pico และสามารถควบคุมอุปกรณ์ต่างๆ ได้ เช่น LED, Wi-Fi, เซ็นเซอร์ หากคุณเป็นมือใหม่ Thonny IDE เป็นตัวเลือกที่ดีที่สุดในการเริ่มต้น! 🚀

MLX90640 : เซนเซอร์ตรวจจับความร้อนแบบอินฟราเรด

ในยุคที่เทคโนโลยีพัฒนาอย่างรวดเร็ว การตรวจจับความร้อน (Thermal Imaging) ได้กลายเป็นเครื่องมือสำคัญในหลากหลายอุตสาหกรรม ไม่ว่าจะเป็นการตรวจสอบสภาพแวดล้อม การตรวจสอบอุปกรณ์ไฟฟ้า การแพทย์ หรือแม้แต่การใช้งานในชีวิตประจำวัน เซนเซอร์ตรวจจับความร้อนแบบอินฟราเรด (Infrared Thermal Sensor) อย่าง MLX90640 ของบริษัท Melexis ได้รับความสนใจอย่างมาก เนื่องจากความสามารถในการตรวจจับความร้อนได้อย่างแม่นยำ และ ขนาดที่กะทัดรัด

MLX90640 คืออะไร?

MLX90640 เป็นเซนเซอร์ตรวจจับความร้อนแบบอินฟราเรดที่ทำงานโดยอาศัยหลักการของการตรวจจับรังสีอินฟราเรด (Infrared Radiation) ที่ปล่อยออกมาจากร่างกายหรือวัตถุ โดยไม่ต้องสัมผัสกับวัตถุนั้นๆ เซนเซอร์นี้สามารถสร้างภาพความร้อน (Thermal Image) ได้ในรูปแบบของข้อมูลเมทริกซ์ 32x24 พิกเซล ซึ่งแม้ว่าความละเอียดจะไม่สูงเท่ากล้องตรวจจับความร้อนระดับไฮเอนด์ แต่ MLX90640 ก็โดดเด่นด้วยขนาดที่เล็ก ราคาที่เหมาะสม และประสิทธิภาพที่ยอดเยี่ยม


คุณสมบัติเด่นของ MLX90640

  1. ความละเอียด 32x24 พิกเซล

    • MLX90640 มีความละเอียด 768 พิกเซล (32x24) ซึ่งเพียงพอสำหรับการสร้างภาพความร้อนเบื้องต้นและการวิเคราะห์อุณหภูมิในพื้นที่ขนาดเล็ก
    • เหมาะสำหรับงานที่ไม่ต้องการความละเอียดสูง เช่น การตรวจสอบอุณหภูมิในอาคาร การตรวจสอบอุปกรณ์ไฟฟ้า หรือการประยุกต์ใช้งานในหุ่นยนต์
  2. ช่วงการตรวจจับอุณหภูมิ

    • MLX90640 สามารถตรวจจับอุณหภูมิได้ในช่วง -40°C ถึง 300°C (ขึ้นอยู่กับรุ่น)
    • มีความแม่นยำสูง ±1°C ในช่วงอุณหภูมิที่กำหนด
  3. ขนาดกะทัดรัด

    • เซนเซอร์ MLX90640 มีขนาดเล็กและน้ำหนักเบา ทำให้สามารถนำไปติดตั้งในอุปกรณ์ขนาดเล็กหรือระบบ IoT ได้อย่างสะดวก
  4. รองรับการเชื่อมต่อ I2C

    • MLX90640 ใช้โปรโตคอล I2C ในการสื่อสารกับไมโครคอนโทรลเลอร์หรือคอมพิวเตอร์ ทำให้การติดตั้งและการใช้งานง่ายขึ้น
  5. Field of View (FOV)

    • MLX90640 มี FOV สองรุ่นให้เลือกใช้งาน คือ 55°x35° และ 110°x75° ซึ่งเหมาะสำหรับการใช้งานที่ต้องการมุมมองกว้างหรือแคบ

การประยุกต์ใช้งาน MLX90640

MLX90640 สามารถนำมาใช้งานได้หลากหลายในหลายอุตสาหกรรม ดังนี้:

  1. การตรวจสอบอุณหภูมิในอาคาร

    • ใช้สำหรับตรวจสอบการรั่วไหลของความร้อนในอาคารหรือโรงงาน เพื่อปรับปรุงประสิทธิภาพการใช้พลังงาน
  2. การตรวจสอบอุปกรณ์ไฟฟ้า

    • ช่วยตรวจจับจุดร้อน (Hot Spot) ในอุปกรณ์ไฟฟ้าหรือแผงวงจร เพื่อป้องกันการเกิดไฟไหม้หรือความเสียหาย
  3. การแพทย์

    • ใช้ในการตรวจจับอุณหภูมิร่างกายของมนุษย์ เช่น การตรวจวัดไข้ในสถานการณ์โรคระบาด
  4. หุ่นยนต์และโดรน

    • ติดตั้งบนหุ่นยนต์หรือโดรนเพื่อสร้างภาพความร้อนสำหรับการนำทางหรือการตรวจสอบสภาพแวดล้อม
  5. การเกษตร

    • ใช้ในการตรวจสอบอุณหภูมิของพืชผลหรือสัตว์ เพื่อควบคุมสภาวะแวดล้อมให้เหมาะสม

ข้อจำกัดของ MLX90640

แม้ว่า MLX90640 จะมีคุณสมบัติที่น่าสนใจ แต่ก็ยังมีข้อจำกัดบางประการที่ควรพิจารณา:

  • ความละเอียดต่ำ : ความละเอียด 32x24 พิกเซลอาจไม่เพียงพอสำหรับงานที่ต้องการรายละเอียดสูง
  • ความเร็วในการอ่านค่า : อัตราการอ่านค่าอุณหภูมิของ MLX90640 อยู่ที่ประมาณ 1-64 Hz ซึ่งอาจช้าเกินไปสำหรับงานที่ต้องการความเร็วสูง
  • ความซับซ้อนในการประมวลผล : การแปลงข้อมูลจากเซนเซอร์เป็นภาพความร้อนจำเป็นต้องใช้การประมวลผลที่ซับซ้อน

สรุป

MLX90640 เป็นเซนเซอร์ตรวจจับความร้อนที่มีประสิทธิภาพสูงในราคาที่เหมาะสม เหมาะสำหรับการใช้งานที่ต้องการการตรวจจับอุณหภูมิแบบไม่สัมผัสในพื้นที่ขนาดเล็ก ด้วยขนาดที่กะทัดรัดและการเชื่อมต่อที่ง่าย MLX90640 จึงเป็นตัวเลือกที่ดีสำหรับนักพัฒนาและวิศวกรที่ต้องการนำเทคโนโลยีตรวจจับความร้อนมาใช้งานในโครงการต่างๆ

หากคุณกำลังมองหาเซนเซอร์ที่ตอบโจทย์การใช้งานในระดับกลาง MLX90640 อาจเป็นคำตอบที่คุณตามหา

การใช้งานเซนเซอร์ MLX90640 กับ Arduino จำเป็นต้องใช้ไลบรารีเฉพาะที่รองรับการทำงานของเซนเซอร์นี้ เนื่องจาก MLX90640 ส่งข้อมูลผ่านโปรโตคอล I2C และข้อมูลที่ได้มาจะต้องถูกประมวลผลเพื่อแปลงเป็นค่าอุณหภูมิและสร้างภาพความร้อน (Thermal Image)

ในตัวอย่างนี้ เราจะใช้ไลบรารี Adafruit MLX90640 ซึ่งเป็นไลบรารีที่พัฒนาโดย Adafruit เพื่อช่วยให้การใช้งาน MLX90640 กับ Arduino ง่ายขึ้น

ขั้นตอนการติดตั้งไลบรารี

  1. เปิด Arduino IDE
  2. ไปที่เมนู Sketch > Include Library > Manage Libraries
  3. ค้นหาคำว่า Adafruit MLX90640 และ ติดตั้งไลบรารี
  4. ตรวจสอบว่าไลบรารี Adafruit BusIO และ Wire (สำหรับ I2C) ถูกติดตั้งแล้ว หากยังไม่มี ให้ติดตั้งด้วยเช่นกัน

การต่อวงจร

  • VCC -> 5V หรือ 3.3V (ขึ้นอยู่กับโมดูล)
  • GND -> GND
  • SDA -> SDA (บน Arduino: A4 สำหรับ Uno, 20 สำหรับ Mega)
  • SCL -> SCL (บน Arduino: A5 สำหรับ Uno, 21 สำหรับ Mega)

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

ตัวอย่างโค้ดนี้จะแสดงค่าอุณหภูมิของแต่ละพิกเซลใน Serial Monitor และสามารถนำไปประยุกต์ใช้เพื่อสร้างภาพความร้อนได้

#include <Wire.h>
#include <Adafruit_MLX90640.h>

// สร้างออบเจ็กต์ MLX90640
Adafruit_MLX90640 mlx;

// ขนาดของเมทริกซ์พิกเซล
#define PIXELS 768 // 32x24 = 768 พิกเซล

// อาเรย์สำหรับเก็บค่าอุณหภูมิ
float temperatures[PIXELS];

void setup() {
  // เริ่มต้น Serial Monitor
  Serial.begin(115200);
  
  // เริ่มต้น I2C
  Wire.begin();

  // ตรวจสอบการเชื่อมต่อ MLX90640
  if (!mlx.begin(MLX90640_I2CADDR_DEFAULT, &Wire)) {
    Serial.println("MLX90640 ไม่พบเซนเซอร์!");
    while (1) delay(10);
  }

  // กำหนดค่า Refresh Rate (Hz)
  mlx.setMode(MLX90640_INTERLEAVED);
  mlx.setResolution(MLX90640_ADC_18BIT); // ความละเอียด ADC
  mlx.setRefreshRate(MLX90640_4_HZ);    // อัตราการรีเฟรช 4 Hz

  Serial.println("MLX90640 เริ่มทำงานแล้ว!");
}

void loop() {
  // อ่านค่าอุณหภูมิจากเซนเซอร์
  if (mlx.getFrame(temperatures) != 0) {
    Serial.println("เกิดข้อผิดพลาดในการอ่านค่า!");
    return;
  }

  // แสดงค่าอุณหภูมิใน Serial Monitor
  for (int i = 0; i < PIXELS; i++) {
    Serial.print(temperatures[i]);
    Serial.print("\t");
    
    // เริ่มบรรทัดใหม่ทุกๆ 32 พิกเซล (32x24)
    if ((i + 1) % 32 == 0) {
      Serial.println();
    }
  }

  Serial.println(); // ขึ้นบรรทัดใหม่หลังแสดงข้อมูลทั้งหมด
  delay(500);       // รอ 500 มิลลิวินาทีก่อนอ่านค่าครั้งถัดไป
}

คำอธิบายโค้ด

  1. การเริ่มต้นเซนเซอร์

    • ใช้ฟังก์ชัน mlx.begin() เพื่อตรวจสอบการเชื่อมต่อเซนเซอร์
    • กำหนดโหมดการทำงาน เช่น setMode, setResolution, และ setRefreshRate เพื่อปรับแต่งการทำงานของเซนเซอร์
  2. การอ่านค่าอุณหภูมิ

    • ใช้ฟังก์ชัน mlx.getFrame() เพื่ออ่านค่าอุณหภูมิจากเซนเซอร์และเก็บไว้ในอาเรย์ temperatures
    • ค่าที่ได้จะเป็นค่าอุณหภูมิในหน่วยองศาเซลเซียส (°C)
  3. การแสดงผล

    • ค่าอุณหภูมิจะถูกแสดงใน Serial Monitor โดยจัดเรียงเป็นตาราง 32x24 พิกเซล

การปรับแต่งเพิ่มเติม

  1. การแสดงภาพความร้อน

    • คุณสามารถนำค่าอุณหภูมิไปประมวลผลเพื่อสร้างภาพความร้อน โดยใช้ไลบรารีเช่น Adafruit GFX หรือ TFT_eSPI สำหรับจอแสดงผล
  2. การปรับอัตราการรีเฟรช

    • ลองเปลี่ยนค่า setRefreshRate เป็น MLX90640_8_HZ หรือ MLX90640_16_HZ เพื่อเพิ่มความเร็วในการอ่านค่า
  3. การใช้งานร่วมกับจอ LCD

    • หากต้องการแสดงผลภาพความร้อนแบบเรียลไทม์ คุณสามารถต่อจอ LCD เช่น TFT หรือ OLED และใช้ไลบรารีกราฟิกเพื่อสร้างภาพความร้อน

ข้อควรระวัง

  • MLX90640 มีความละเอียดต่ำ (32x24 พิกเซล) การแสดงผลอาจไม่คมชัดเท่ากล้องตรวจจับความร้อนระดับไฮเอนด์
  • ตรวจสอบแรงดันไฟเลี้ยงของเซนเซอร์ (3.3V หรือ 5V) เพื่อป้องกันความเสียหาย
  • หากใช้งานร่วมกับจอแสดงผล ให้แน่ใจว่า Arduino มีประสิทธิภาพเพียงพอในการประมวลผลข้อมูล

คุณสามารถใช้งาน MLX90640 กับ ESP32 โดยใช้ MicroPython ได้เช่นกัน แม้ว่า MicroPython จะไม่มีไลบรารีสำเร็จรูปอย่าง Adafruit MLX90640 ที่มีใน Arduino แต่คุณยังสามารถเขียนโค้ดเพื่ออ่านข้อมูลจากเซนเซอร์ผ่านโปรโตคอล I2C ได้โดยตรง

คุณสามารถใช้งาน MLX90640 กับ ESP32 โดยใช้ MicroPython ได้เช่นกัน แม้ว่า MicroPython จะไม่มีไลบรารีสำเร็จรูปอย่าง Adafruit MLX90640 ที่มีใน Arduino แต่คุณยังสามารถเขียนโค้ดเพื่ออ่านข้อมูลจากเซนเซอร์ผ่านโปรโตคอล I2C ได้โดยตรง

ขั้นตอนการติดตั้งและเตรียมใช้งาน

  1. ติดตั้ง MicroPython บน ESP32

    • ดาวน์โหลดเฟิร์มแวร์ MicroPython สำหรับ ESP32 จาก MicroPython Official Website
    • ใช้เครื่องมือเช่น esptool.py เพื่อแฟลชเฟิร์มแวร์ลงใน ESP32
  2. ต่อวงจร

    • เชื่อมต่อ MLX90640 กับ ESP32 ตามแผนผังด้านล่าง:
      • VCC -> 3.3V (ESP32)
      • GND -> GND
      • SDA -> GPIO21 (หรือกำหนดเอง)
      • SCL -> GPIO22 (หรือกำหนดเอง)
  3. ติดตั้งไลบรารี I2C

    • MicroPython มีโมดูล machine.I2C สำหรับการทำงานกับ I2C ซึ่งจะใช้ในการสื่อสารกับ MLX90640

โค้ดตัวอย่างสำหรับ MLX90640 บน ESP32 (MicroPython)

ตัวอย่างโค้ดนี้จะอ่านค่าอุณหภูมิจาก MLX90640 และ แสดงผลผ่าน Terminal

from machine import Pin, I2C
import time
import struct

# กำหนดพิน I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)

# ที่อยู่ I2C ของ MLX90640
MLX90640_I2C_ADDR = 0x33

# ขนาดของเมทริกซ์พิกเซล
PIXELS = 768  # 32x24 = 768 พิกเซล

def read_mlx90640_temperatures():
    # ส่งคำสั่งอ่านข้อมูลจาก MLX90640
    i2c.writeto(MLX90640_I2C_ADDR, b'\x02')  # เลือก RAM เริ่มต้น
    raw_data = i2c.readfrom(MLX90640_I2C_ADDR, PIXELS * 2)  # อ่านข้อมูล 16-bit สำหรับแต่ละพิกเซล

    # แปลงข้อมูลเป็นค่าอุณหภูมิ
    temperatures = []
    for i in range(0, len(raw_data), 2):
        # รวมข้อมูล 2 ไบต์เป็นค่า 16-bit
        raw_temp = struct.unpack('>H', raw_data[i:i+2])[0]
        
        # แปลงค่าเป็นอุณหภูมิ (ปรับค่าตามเอกสาร MLX90640)
        temp_c = (raw_temp - 32768) * 0.02 - 273.15
        temperatures.append(temp_c)
    
    return temperatures

def main():
    while True:
        try:
            # อ่านค่าอุณหภูมิ
            temperatures = read_mlx90640_temperatures()
            
            # แสดงผลค่าอุณหภูมิ
            for i, temp in enumerate(temperatures):
                print(f"{temp:.2f}", end="\t")
                if (i + 1) % 32 == 0:  # เริ่มบรรทัดใหม่ทุกๆ 32 พิกเซล
                    print()
            print("\n---\n")
        
        except Exception as e:
            print("เกิดข้อผิดพลาด:", e)
        
        # รอ 1 วินาทีก่อนอ่านค่าครั้งถัดไป
        time.sleep(1)

if __name__ == "__main__":
    main()

คำอธิบายโค้ด

  1. การตั้งค่า I2C

    • ใช้โมดูล machine.I2C เพื่อสร้างออบเจ็กต์ I2C และกำหนดพิน SDA และ SCL
    • ความถี่ I2C ถูกตั้งไว้ที่ 400kHz ซึ่งเหมาะสมสำหรับ MLX90640
  2. การอ่านข้อมูล

    • ส่งคำสั่ง I2C เพื่ออ่านข้อมูลจาก RAM ของ MLX90640
    • ข้อมูลที่อ่านมาจะเป็นค่า 16-bit สำหรับแต่ละพิกเซล (768 พิกเซล)
  3. การแปลงข้อมูล

    • ใช้ฟังก์ชัน struct.unpack เพื่อรวมข้อมูล 2 ไบต์เป็นค่า 16-bit
    • แปลงค่าดิบเป็นอุณหภูมิโดยใช้สมการที่ระบุในเอกสาร MLX90640 (Datasheet)
  4. การแสดงผล

    • ค่าอุณหภูมิจะถูกแสดงในรูปแบบตาราง 32x24 พิกเซลผ่าน Serial Monitor

ข้อควรระวัง

  1. ประสิทธิภาพของ ESP32

    • การประมวลผลข้อมูลจาก MLX90640 อาจใช้ทรัพยากรมาก เนื่องจากต้องอ่านและแปลงข้อมูล 768 พิกเซล หากต้องการแสดงผลภาพความร้อนแบบเรียลไทม์ อาจต้องใช้จอแสดงผลที่รองรับ MicroPython เช่น SSD1306 หรือ ILI9341
  2. การจัดการหน่วยความจำ

    • MicroPython มีข้อจำกัดด้านหน่วยความจำ ดังนั้นควรทดสอบโค้ดบน ESP32 ที่มีหน่วยความจำเพียงพอ (เช่น ESP32-WROOM-32)
  3. การปรับค่า Offset

    • ค่า Offset และ Gain ของ MLX90640 อาจต้องปรับตามสภาพแวดล้อมหรือการตั้งค่าเฉพาะของเซนเซอร์ โปรดตรวจสอบเอกสาร MLX90640 สำหรับรายละเอียดเพิ่มเติม

การประยุกต์ใช้งาน

  • การตรวจสอบอุณหภูมิในอาคาร : ใช้ MLX90640 เพื่อตรวจสอบจุดร้อนหรือการรั่วไหลของความร้อน
  • การตรวจสอบอุปกรณ์ไฟฟ้า : ตรวจจับจุดร้อนในแผงวงจรหรืออุปกรณ์ไฟฟ้า
  • การควบคุมระบบ IoT : นำข้อมูลอุณหภูมิไปใช้ในการควบคุมอุปกรณ์อัตโนมัติ

บทนำ

Mosquitto เป็น MQTT Broker แบบโอเพนซอร์สที่ใช้สำหรับการรับ-ส่งข้อความระหว่างอุปกรณ์ IoT ผ่านโปรโตคอล MQTT ซึ่งมีประสิทธิภาพสูงและเหมาะสำหรับระบบที่ต้องการการสื่อสารแบบเรียลไทม์

ในบทความนี้ เราจะอธิบายวิธีติดตั้งและตั้งค่า Mosquitto MQTT Broker บน Ubuntu โดยใช้ Bash Script เพื่อให้สามารถใช้งานได้อย่างง่ายดาย และ ปลอดภัย

MQTT คืออะไร?

MQTT (Message Queuing Telemetry Transport) เป็นโปรโตคอลการรับ-ส่งข้อความที่ออกแบบมาสำหรับการสื่อสารในระบบที่มีทรัพยากรจำกัด เช่น อุปกรณ์ IoT (Internet of Things) หรือระบบที่ต้องการใช้แบนด์วิดท์ต่ำและมีการเชื่อมต่อที่ไม่นิ่ง โดย MQTT ใช้โมเดล Publisher-Subscriber ซึ่งประกอบด้วย 3 องค์ประกอบหลัก ได้แก่:

  • Publisher - ผู้เผยแพร่ข้อมูล เช่น เซ็นเซอร์ที่ส่งข้อมูลไปยัง MQTT Broker
  • Broker - ตัวกลางที่ทำหน้าที่รับและแจกจ่ายข้อมูลไปยัง Subscriber ที่สนใจ
  • Subscriber - ผู้รับข้อมูลที่สมัครรับข้อมูลจาก Broker ตามหัวข้อที่ต้องการ

MQTT ทำงานผ่าน TCP/IP และใช้พอร์ตเริ่มต้นที่ 1883 (สำหรับการสื่อสารปกติ) และ 8883 (สำหรับการสื่อสารแบบเข้ารหัส TLS/SSL)

ประโยชน์ของ MQTT

MQTT เป็นโปรโตคอลที่มีประสิทธิภาพสูงและเหมาะสำหรับการใช้งานหลายรูปแบบ โดยมีข้อดีหลัก ๆ ดังนี้:

  • ใช้ทรัพยากรต่ำ - ออกแบบมาให้เหมาะสำหรับอุปกรณ์ที่มีพลังงานจำกัด เช่น Microcontroller
  • ใช้แบนด์วิดท์ต่ำ - ใช้โครงสร้างข้อมูลที่มีขนาดเล็ก ทำให้ลดปริมาณข้อมูลที่ส่งผ่านเครือข่าย
  • รองรับ QoS (Quality of Service) - มีระดับการรับ-ส่งข้อมูล 3 ระดับ ทำให้สามารถกำหนดความน่าเชื่อถือของการส่งข้อความได้
  • รองรับการเชื่อมต่อแบบไม่ต่อเนื่อง - เหมาะสำหรับอุปกรณ์ที่อาจเชื่อมต่อเครือข่ายไม่ต่อเนื่อง เช่น ระบบมือถือ
  • รองรับระบบ Pub/Sub - ช่วยให้สามารถสื่อสารแบบ one-to-many ได้ง่ายโดยไม่ต้องระบุผู้รับปลายทางโดยตรง

ขั้นตอนการติดตั้ง Mosquitto MQTT Broker

1. ดาวน์โหลดและรันสคริปต์ติดตั้ง

ให้บันทึกสคริปต์ด้านล่างเป็นไฟล์ install_mosquitto.sh

#!/bin/bash

# อัปเดตรายการแพ็กเกจ
echo "Updating package list..."
sudo apt update -y && sudo apt upgrade -y

# ติดตั้ง Mosquitto และ Mosquitto Clients
echo "Installing Mosquitto MQTT Broker..."
sudo apt install -y mosquitto mosquitto-clients

# กำหนดให้ Mosquitto เริ่มทำงานอัตโนมัติเมื่อบูต
echo "Enabling Mosquitto service..."
sudo systemctl enable mosquitto
sudo systemctl start mosquitto

# ตรวจสอบสถานะของ Mosquitto
echo "Checking Mosquitto status..."
sudo systemctl status mosquitto --no-pager

# เปิดพอร์ต MQTT (1883 และ 8883 สำหรับ TLS) ใน Firewall (ถ้ามี ufw)
if command -v ufw &> /dev/null
then
    echo "Configuring firewall..."
    sudo ufw allow 1883/tcp
    sudo ufw allow 8883/tcp
    sudo ufw reload
fi

# สร้างไฟล์คอนฟิกสำหรับ Authentication (กำหนดให้ใช้ username/password)
CONFIG_FILE="/etc/mosquitto/conf.d/mosquitto.conf"

echo "Creating Mosquitto configuration..."
sudo tee $CONFIG_FILE > /dev/null <<EOL
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
EOL

# สร้าง Username และ Password สำหรับ Mosquitto
echo "Creating MQTT user..."
MQTT_USER="mqtt_user"
MQTT_PASS="mqtt_password"
sudo mosquitto_passwd -c -b /etc/mosquitto/passwd $MQTT_USER $MQTT_PASS

# รีสตาร์ท Mosquitto เพื่อให้การตั้งค่ามีผล
echo "Restarting Mosquitto service..."
sudo systemctl restart mosquitto

# แสดงผลลัพธ์สุดท้าย
echo "============================================="
echo " Mosquitto MQTT Broker ติดตั้งเสร็จสมบูรณ์!"
echo " ใช้งานได้ที่: mqtt://localhost:1883"
echo " Username: $MQTT_USER"
echo " Password: $MQTT_PASS"
echo "============================================="

วิธีใช้

1. บันทึกสคริปต์เป็นไฟล์

บันทึกสคริปต์นี้เป็นไฟล์ เช่น install_mosquitto.sh


# ตัวอย่างคำสั่งเพื่อบันทึกสคริปต์
nano install_mosquitto.sh
    

2. ให้สิทธิ์การรันไฟล์

ใช้คำสั่ง chmod เพื่อให้สิทธิ์การรันไฟล์:


chmod +x install_mosquitto.sh
    

3. รันสคริปต์

รันสคริปต์ด้วยคำสั่ง:


sudo ./install_mosquitto.sh
    

4. การตรวจสอบการทำงาน

หลังจากติดตั้งเสร็จ ลองตรวจสอบว่าบริการ Mosquitto ทำงานอยู่หรือไม่:


systemctl status mosquitto
    

หรือทดสอบการเชื่อมต่อกับ Mosquitto Broker โดยใช้ Mosquitto Client:


# เปิด Subscriber ใน Terminal หนึ่ง
mosquitto_sub -h localhost -t "test/topic" -u "mqtt_user" -P "mqtt_password" &

# ส่งข้อความผ่าน Publisher ใน Terminal อีกหนึ่ง
mosquitto_pub -h localhost -t "test/topic" -m "Hello MQTT" -u "mqtt_user" -P "mqtt_password"

ถ้าใช้งานได้ จะเห็นข้อความ "Hello MQTT" แสดงออกมาใน Terminal ของ Subscriber

5. เพิ่มเติม

  • ค่า MQTT_USER และ MQTT_PASS ในสคริปต์สามารถเปลี่ยนแปลงได้ตามต้องการ
  • ถ้าต้องการให้ MQTT Broker ทำงานแบบ TLS/SSL ให้เพิ่มการตั้งค่า Cert ในไฟล์ mosquitto.conf
  • ถ้าใช้ Docker ก็สามารถติดตั้ง Mosquitto Broker ได้ง่าย ๆ โดยใช้คำสั่ง:
docker run -d --name mosquitto -p 1883:1883 eclipse-mosquitto
    

การใช้ Web Serial API สำหรับการติดต่อกับ Serial Port

Web Serial API เป็นเทคโนโลยีที่ช่วยให้เว็บแอปพลิเคชันสามารถสื่อสารกับอุปกรณ์ผ่านพอร์ตอนุกรม (Serial Port) ได้โดยตรงผ่านเบราว์เซอร์ โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม เทคโนโลยีนี้มีประโยชน์อย่างมากสำหรับการพัฒนาแอปพลิเคชัน IoT, การควบคุมอุปกรณ์ฮาร์ดแวร์, หรือการติดต่ออุปกรณ์ผ่านเว็บเบราว์เซอร์


ข้อดีของ Web Serial API

  1. ไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม: ผู้ใช้สามารถใช้งานได้ทันทีผ่านเบราว์เซอร์ที่รองรับ

  2. รองรับหลายแพลตฟอร์ม: ทำงานได้บน Windows, macOS, Linux และ Chrome OS

  3. ปลอดภัย: ต้องได้รับอนุญาตจากผู้ใช้ก่อนจึงจะสามารถเข้าถึง Serial Port ได้

  4. ง่ายต่อการพัฒนา: ใช้ JavaScript เพื่อสื่อสารกับอุปกรณ์


ขั้นตอนการทำงาน

  1. ขออนุญาตเข้าถึง Serial Port: ใช้ navigator.serial.requestPort() เพื่อขออนุญาตจากผู้ใช้

  2. เปิดการเชื่อมต่อ: กำหนดค่า Baud Rate และเปิดพอร์ต

  3. อ่าน/เขียนข้อมูล: ใช้ reader และ writer เพื่อรับและส่งข้อมูล

  4. ปิดการเชื่อมต่อ: ปิดพอร์ตเมื่อไม่ใช้งาน

ทดสอบการใช้งาน

Web Serial Terminal

การใช้ Arduino I/O ผ่าน Web Serial - ความน่าสนใจ และ ประโยชน์

ในยุคดิจิทัลที่เทคโนโลยี IoT (Internet of Things) และระบบอัตโนมัติกำลังเติบโตอย่างรวดเร็ว การควบคุมอุปกรณ์ฮาร์ดแวร์ เช่น Arduino ผ่านเว็บเบราว์เซอร์ได้กลายเป็นเรื่องที่น่าสนใจและมีศักยภาพสูงในการพัฒนาโปรเจกต์ต่างๆ โดยเฉพาะเมื่อเทคโนโลยี Web Serial API เข้ามาช่วยให้เราสามารถเชื่อมต่อและควบคุม Arduino ผ่านเว็บไซต์ได้อย่างสะดวกและปลอดภัย

Web Serial API คืออะไร?

Web Serial API เป็นฟีเจอร์ใหม่ของเว็บเบราว์เซอร์ที่ช่วยให้ผู้ใช้สามารถเชื่อมต่อและสื่อสารกับอุปกรณ์ฮาร์ดแวร์ เช่น Arduino, ESP32, หรืออุปกรณ์อนุกรมอื่นๆ ผ่านพอร์ตอนุกรม (Serial Port) โดยไม่จำเป็นต้องติดตั้งโปรแกรมเพิ่มเติมบนคอมพิวเตอร์ ซึ่งทำให้การควบคุมอุปกรณ์ I/O ของ Arduino ผ่านเว็บไซต์เป็นไปได้อย่างราบรื่น คุณสามารถอ่าน และ เพิ่มเติมความรู้ได้จาก Link Click เอกสารจาก MDN Web Docsที่นี่

ทำไม Arduino I/O ผ่าน Web Serial ถึงน่าสนใจ?

  • การเข้าถึงที่ง่ายขึ้น: ควบคุม Arduino ได้โดยตรงจากเว็บเบราว์เซอร์ โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม
  • การทำงานแบบ Cross-Platform: รองรับทุกระบบปฏิบัติการ (Windows, macOS, Linux)
  • การออกแบบ User Interface ที่สวยงาม: สร้างหน้าเว็บที่ใช้งานง่ายและสวยงาม
  • การขยายขอบเขตการใช้งาน: นำไปประยุกต์ใช้ในโครงการ IoT, ระบบอัตโนมัติ และการศึกษา

ประโยชน์ของการใช้ Arduino I/O ผ่าน Web Serial

  1. ลดความซับซ้อนในการติดตั้ง: ไม่ต้องติดตั้งโปรแกรมเฉพาะ
  2. รองรับการใช้งานระยะไกล: ควบคุม Arduino จากที่ไหนก็ได้ในโลกผ่าน HTTPS
  3. การพัฒนาที่ยืดหยุ่น: ปรับแต่งหน้าเว็บและฟังก์ชันการทำงานได้อย่างอิสระ
  4. ประหยัดทรัพยากร: ลดการใช้งานทรัพยากรบนคอมพิวเตอร์หรืออุปกรณ์เคลื่อนที่
  5. สนับสนุนการเรียนรู้: เหมาะสำหรับนักเรียนและผู้เริ่มต้น

ตัวอย่างการใช้งาน

ควบคุม LED ผ่านเว็บ

สร้างหน้าเว็บที่มีปุ่มสำหรับเปิด/ปิด LED บน Arduino

อ่านค่าสวิตช์หรือเซ็นเซอร์

แสดงสถานะของสวิตช์หรือค่าจากเซ็นเซอร์แบบเรียลไทม์

ระบบควบคุมหุ่นยนต์

ควบคุมหุ่นยนต์ เช่น Delta Robot หรือ แขนกล

ข้อควรระวัง

  • HTTPS Requirement: Web Serial API ต้องใช้งานบนเว็บไซต์ที่รองรับ HTTPS
  • เบราว์เซอร์ที่รองรับ: ใช้ได้เฉพาะเบราว์เซอร์ที่ทันสมัย เช่น Google Chrome, Microsoft Edge
  • การจัดการข้อผิดพลาด: ควรมีการตรวจสอบการเชื่อมต่อก่อนส่งคำสั่ง

สรุป

การใช้ Arduino I/O ผ่าน Web Serial เป็นแนวคิดที่น่าสนใจและมีประโยชน์มากมาย โดยเฉพาะในยุคที่เทคโนโลยี IoT และระบบอัตโนมัติกำลังเติบโต คุณสามารถนำแนวคิดนี้ไปพัฒนาโครงการต่างๆ ได้ทั้งในเชิงการศึกษา การทำงาน และการสร้างสรรค์นวัตกรรมใหม่ๆ

#Arduino #WebSerialAPI #IoT #Joomla #SmartControl

Arduino Firmware Code

// กำหนดขาสำหรับ LED และปุ่ม
const int ledPins[5] = {13, 12, 11, 10, 9}; // ขาสำหรับ LED 5 ดวง
const int buttonPins[2] = {2, 3};          // ขาสำหรับปุ่ม 2 ปุ่ม

void setup() {
  Serial.begin(115200);

  // กำหนดโหมดการทำงานของขา
  for (int i = 0; i < 5; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW); // ปิด LED เริ่มต้น
  }
  for (int i = 0; i < 2; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP); // ใช้ INPUT_PULLUP เพื่อป้องกัน Floating
  }

  Serial.println("Arduino LED and Button Control Ready!");
}

void loop() {
  // ตรวจสอบคำสั่งจาก Serial
  if (Serial.available() > 0) {
    String command = Serial.readStringUntil('\n');
    command.trim();

    // ควบคุม LED
    if (command.startsWith("LED")) {
      int ledIndex = command.charAt(3) - '0'; // ดึงหมายเลข LED จากคำสั่ง (เช่น LED1)
      if (command.endsWith("_ON")) {
        digitalWrite(ledPins[ledIndex - 1], HIGH);
        Serial.println("LED" + String(ledIndex) + "_ON");
      } else if (command.endsWith("_OFF")) {
        digitalWrite(ledPins[ledIndex - 1], LOW);
        Serial.println("LED" + String(ledIndex) + "_OFF");
      }
    }
  }

  // อ่านสถานะของปุ่ม
  for (int i = 0; i < 2; i++) {
    int buttonState = digitalRead(buttonPins[i]);
    if (buttonState == LOW) { // ปุ่มถูกกด
      Serial.println("BUTTON" + String(i + 1) + "_PRESSED");
    } else {
      Serial.println("BUTTON" + String(i + 1) + "_RELEASED");
    }
  }

  delay(100); // หน่วงเวลาเล็กน้อยเพื่อหลีกเลี่ยงการส่งข้อมูลซ้ำเกินไป
}

ทดสอบการควบคุมผ่าน Web Browser ไปยัง Serial Port

Arduino LED and Button Control

Not Connected

Button Status:

Button 1: Waiting...

Button 2: Waiting...