Month: March 2018

  • Raspberry Pi 3 [Relay Control]

    จากตอนที่แล้ว เราได้ลองต่อเซนเซอร์ภายนอก ซึ่งเซนเซอร์จะเป็นประเภท Input เพื่อนำข้อมูลไปประมวลผลต่อตามที่เราต้องการ

    ยังมีอุปกรณ์บางตัวที่เราสามารถต่อเป็น Output จาก Raspberry Pi ได้ด้วย

    ซึ่งหนึ่งในนั้นจะเป็นอุปกรณ์หลักที่นำมาเชื่อมต่อกับอุปกรณ์อื่นๆ ได้อย่างหลากหลาย นั่นคือ รีเลย์ (Relay) – (ไม่ใช่ Delay นะครับ กรุณาอย่าสับสน)

     

    Relay คืออะไร

    Relay ถ้าให้พูดจากความเข้าใจคือ สวิตซ์ ประเภทหนึ่งครับ ที่จะทำงานตามกระแสไฟ นั่นคือ เมื่อมีกระแสไฟไปเหนี่ยวนำภายใน สวิตซ์ก็จะทำงาน (Energize)
    (พูดให้เข้าใจอีกครั้งหนึ่งคือ เหมือนสวิตซ์ตามผนังนี่แหละครับ แต่แทนที่จะเอามือไปกด เราก็ใช้กระแสไฟเข้าไปให้มันทำงานแทนนั่นเอง)
    และในบางครั้ง ในระบบไฟฟ้ากำลัง อาจจะเรียกอุปกรณ์นี้ว่า Magnetic Contactor ซึ่งเป็นหลักการทำงานแบบเดียวกันครับ

    (ขออภัย หากรูปจะไม่ถูกต้องตามหลักการเป๊ะๆ เพราะวาดจากความเข้าใจ)

    จากในรูปด้านบนนี้
    DC+, DC- คือ ไฟที่เราจะจ่ายให้ขดลวดแม่เหล็ก (ตาม spec ของ relay) เพื่อจะไปทำให้สวิตซ์ Relay ทำงาน
    โดยที่ขา
    C = Common ขาที่ต้องการให้กระแสไฟมารออยู่ หรือ กระแสไหลกลับ
    NC = Normal Close เมื่อไม่มีไฟจ่ายที่ขดลวดแม่เหล็ก ขา C และ NC จะเชื่อมต่อถึงกันอยู่
    NO = Normal Open จะทำงานเมื่อมีไฟจ่ายมาที่ขดลวดแม่เหล็ก จะทำให้ขา C และ NO นั้น เชื่อมถึงกัน และทำให้ขา C ขาดการเชื่อมกับ NC

    วิธีการอ่านสเปครีเลย์ (ตัวสี่เหลี่ยมสีน้ำเงินในรูปด้านบน)
    – 5VDC คือไฟที่เราจ่ายเพื่อให้รีเลย์ทำงาน (Energize)
    – 10A 250VAC คือ หน้าคอนแทคทนกระแสได้ 10A ที่ 250V AC
    – 15A 125VAC คือ หน้าคอนแทคทนกระแสได้ 15A ที่ 125V AC

     

    รีเลย์ที่จะเอามาใช้กับ Raspberry Pi ควรจะเป็นรีเลย์ที่ทำงานด้วยไฟ 5V เพราะจะได้ต่อ +5V และ GND ออกจากบอร์ดของ Raspberry Pi ได้เลย ซึ่งรีเลย์ก็จะมีด้วยกันสองแบบคือ Active Low และ Active High นั่นคือ…

    – Active Low รีเลย์จะทำงานเมื่อมีการจ่าย Logic Low เข้ามา (จ่าย GND เข้ามา)
    – Active High รีเลย์จะทำงานเมื่อมีการจ่าย Logic High เข้ามา (จ่าย +5V เข้ามา)

    รีเลย์บางรุ่นรองรับทั้งสองแบบ แต่จะมี Jumper ให้เซ็ตว่าต้องการทำงานในแบบไหน

     

    ** ถ้าหากไม่รู้จริงๆ ก็ลองเขียนโปรแกรมตามด้านล่าง เพื่อทดสอบได้ครับ ไม่พัง จ่ายผิด รีเลย์ก็แค่ไม่ทำงานครับ **

    ** รุ่นที่ผมนำเอามาใช้งาน จะเป็น Active Low นั่นคือจ่าย GND หรือ Logic 0 (เลขศูนย์) เพื่อให้รีเลย์ทำงาน **

     

    การเชื่อมต่อนั้นไม่ยากครับ

    GND ต่อกับ GND ของ Raspberry Pi
    VCC ต่อกับ +5V ของ Raspberry Pi
    IN1…4 ต่อกับ GPIO ขาที่ว่างอยู่ โดยดูจาก Pinout ของ Raspberry Pi ครับ

    โดยผมเลือกที่จะเชื่อมต่อขาของ Raspberry Pi ดังนี้

    ขาที่ [2] เพื่อจ่าย +5V ให้กับรีเลย์
    ขาที่ [6] เพื่อจ่าย GND
    ขาที่ [29] GPIO 5 เพื่อควบคุม Relay 1
    ขาที่ [31] GPIO 6 เพื่อควบคุม Relay 2
    ขาที่ [33] GPIO 13 เพื่อควบคุม Relay 3
    ขาที่ [37] GPIO 26 เพื่อควบคุม Relay 4

    ** ไม่จำเป็นต้องต่อให้ครบ ต่อเท่าที่ใช้ก็ได้ **
    ** ในตลาด มีรีเลย์หลายรุ่นทั้งแบบ 1 ตัว, 4 ตัว, 8 ตัว, 16 ตัว ให้เลือกใช้ตามความต้องการได้เลยครับ **

     

    เมื่อเชื่อมต่อเรียบร้อยแล้ว ก็ Power ON ตัว Raspberry Pi ขึ้นมาเลยครับ จากนั้นลองเขียน Python สั่งงานดู ตามด้านล่างนี้เลยครับ

    เปิด Terminal จากนั้นใช้คำสั่ง

    mkdir projects/relay

    cd projects/relay

    sudo nano test_cycle.py

    เราจะมาลองเขียนให้ on relay 1 ถึง 4 จากนั้นตามด้วย off relay 1 ถึง 4 เพื่อเป็นการทดสอบ Logic ว่ารีเลย์ทำงาน ดังนี้ครับ

    import RPi.GPIO as GPIO
    import time

    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    pins = [5, 6, 13, 26] #เป็น array
    GPIO.setup(pins, GPIO.OUT, initial = GPIO.HIGH)

    time.sleep(1)

    for pin in pins :
     GPIO.output(pin,  GPIO.HIGH)
     print(“PIN: ” + str(pin) + ” is 1 (GPIO.HIGH)”)
     time.sleep(5)
     GPIO.output(pin,  GPIO.LOW)
            print(“PIN: ” + str(pin) + ” is 0 (GPIO.LOW)”)
            time.sleep(5)

    GPIO.cleanup()
    print “Cleaned up relays”

    อธิบายโค้ดคร่าวๆ ดังนี้

    GPIO.setmode(GPIO.BCM) #มีสองแบบคือ GPIO.BCM ใช้ GPIO ID และ GPIO.BOARD ใช้ PIN NUMBER

    GPIO.setwarnings(False) #เพื่อไม่ให้ show warning ของ relay เช่น สถานะเก่าค้างอยู่ เป็นต้น

    pins = [5, 6, 13, 26] #เป็น array ตาม setmode

    GPIO.setup(pins, GPIO.OUT, initial = GPIO.HIGH) #เซ็ตอัพ pins ให้เป็นการทำงานแบบ output (เนื่องจาก gpio สามารถเป็นได้ทั้ง input และ output) และ relay ที่เรามาต่อเป็น Active LOW ซึ่งทำงานเมื่อจ่าย GPIO.LOW หรือ Logic 0 จึงเซ็ตค่าเริ่มต้นเป็น HIGH เอาไว้ไม่ให้ทำงานตอน setup (สามารถใช้ 1 แทน GPIO.HIGH ได้)

    GPIO.output(pin,  GPIO.LOW) #คือการสั่งจ่าย GPIO.LOW หรือ Logic 0 ให้กับ pin ที่เราต้องการ เพื่อให้ทำงาน (Energize)

     

    จากนั้นทดลองรัน ด้วยคำสั่ง python cycle.py

        

    ในระหว่างการทำงาน จะเห็นว่าเมื่อมีการจ่าย GPIO.HIGH หรือ Logic 1 ให้กับรีเลย์ จะไม่เกิดการเปลี่ยนแปลงใดๆ
    และเมื่อจ่าย GPIO.LOW หรือ Logic 0 ให้กับรีเลย์ จะได้ยินเสียงรีเลย์ทำงาน และเห็นว่าไฟสถานะ LED ติดขึ้น

     

    เมื่อรีเลย์ทำงานแล้ว เราสามารถนำ Terminal ของ Relay ไปควบคุมอุปกรณ์ไฟฟ้าได้ (ตามพิกัดกระแสไฟสูงสุดของรีเลย์)
    ** การทำงานอุปกรณ์ไฟฟ้า (ถึงแม้จะเป็นไฟ 220V แรงต่ำ) ควรใช้ความระมัดระวัง **
    ** ควรทำการตัดกระแสไฟก่อนทุกครั้ง เพื่อความปลอดภัยของตัวท่านเอง **

     

    วิธีการตรวจสอบช่องต่อของรีเลย์
    สามารถดูได้จากสัญลักษณ์ ทำให้เรารู้ว่าขาไหนคือ COM, NC หรือ NO (รีเลย์แต่ละตัวจะมี 3 ขา ส่วนใหญ่จะวาง pattern เหมือนกัน เพราะฉะนั้น หาขาแค่ตัวเดียวก็พอครับ)
    หรือจะใช้มัลติมิเตอร์วัด เพื่อความมั่นใจ โดยใช้วิธีการดังนี้

    เพื่อความเข้าใจที่ตรงกัน ผมขอให้ขาที่ [1] คือขาด้านบน (ของรีเลย์แต่ละตัว) ขาที่ [2] คือ ขาตรงกลาง และขาที่ [3] คือขาด้านล่าง ตามในรูปครับ

    1.ใช้โหมดวัดความต้านทาน ลองดูว่าถ้าความต้านทานเป็น 0 (ปลายของโพรบแตะกัน) จะแสดงผลอย่างไร และถ้าไม่แตะกันจะเป็นอย่างไร ถือว่าเป็นการทดสอบสายในตัว
    (ในรูปนี้เป็นเพียงตัวอย่างเท่านั้น การแสดงผลของมิเตอร์แต่ละยี่ห้อ แต่ละรุ่น แตกต่างกัน ควรศึกษาและทำความเข้าใจในมิเตอร์ของท่าน)

     

    2.ทดสอบเอาปลายโพรบแตะขาที่ [2] [3] พบว่ามีความต้านทานเป็น 0 นั่นหมายถึงว่า สองช่องนี้ติดต่อกันได้ นั่นคือขา [2] และ [3] ทำงานแบบ NC

     

    3.ทำการ Energize Relay ตัวที่เราวัดขึ้นมา เพื่อหาขา COM และ NO จากในรูปด้านบนนี้ เห็นว่าขาที่เราเคยวัด [2] และ [3] กลายเป็น Open ไปแล้ว (นั่นคือ ขาทั้งสองไม่แตะกัน – ในรูปที่มัลติมิเตอร์ จะมีมีตัว M (Mega) ขึ้นมา นั่นคือความต้านทานเป็นล้านโอห์ม ซึ่งไม่สามารถวัดได้)

     

    4.Energize Relay ทิ้งเอาไว้แบบนั้น เปลี่ยนขาวัดเป็นขา [1] และ [2] ปรากฎว่าความต้านทานเป็น 0 นั่นคือ สองช่องนี้ ไฟสามารถเดินผ่านไปได้

     

    จะเห็นว่าขาที่ใช้ร่วมกันเมื่อรีเลย์ทำงานและไม่ทำงานนั่นคือขาที่ [2] ทำให้ขาที่ [2] คือขา COM นั่นเอง และขา [1] ก็คือขา NO และขา [3] ก็คือ NC ครับ
    เมื่อเราได้ขามาแล้ว ก็ขึ้นอยู่กับการนำไปประยุกต์ใช้งาน ซึ่งส่วนใหญ่จะทำการต่อขาแบบ COM กับ NO ครับ

     

    โดยจะมีเฉพาะเส้น L (Line) เท่านั้น ที่จะผ่านสวิตซ์รีเลย์ ส่วนสาย N (Neutral) สามารถต่อเข้าโหลดได้เลย ซึ่งโหลดอาจจะเป็นหลอดไฟ พัดลม หรือเครื่องใช้ไฟฟ้าอื่นๆ ในพิกัดกระแสที่รีเลย์รับได้

     

    ผิดพลาดประการใด ขออภัยมา ณ ที่นี้ครับ

    ป.ล. การสั่งงานแบบผ่าน command line ก็ไม่สะดวกนัก สำหรับตอนหน้า จะเป็นการสั่งงาน relay ผ่านทาง web interface และรีโมทเข้ามาผ่านทาง port 80 ได้ด้วยครับ

     

  • Email tracking By Google Chrome Extension

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

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

    โดยหนึ่งวิธีที่ง่ายที่สุดคือการติดตั้ง Extension บน Google Chrome และใน Blog นี้ผู้เขียนจะขอแนะนำให้ผู้อ่านได้รู้จักกับ
    Chrome Extension ที่มีชื่อว่า “Email Tracking for Gmail & Inbox” ต้องขอบอกว่าจิ๋วแต่แจ๋วนะจ๊ะออเจ้าทั้งหลาย !!

    Email Tracking คืออะไร ???
    เอาแบบสั้นๆ เลย มันคือตัว App ที่ไว้คอย Track (ติดตาม) ว่า E-Mail ที่เราได้ส่งหรือตอบกลับไปนั้น ได้ถูกเปิดอ่านแล้วหรือไม่นั่นเอง

    วิธีติดตั้ง Email Tracking for Gmail & Inbox

    1.เปิด Google Chrome Browser เพื่อติดตั้ง Extension คลิกที่นี่ จากนั้นเลือกเพิ่ม Extension ดังกล่าว

     

     

     

     

     

     

     

     

     

     

    2. จากนั้นให้เข้าสู่ระบบ Gmail เลือก Sign in with Google

     

     

     

     

     

     

     

     

     

     

    3.จากนั้นจะปรากฏหน้าต่างให้เรา อนุญาตให้ Mailtrack เข้าถึงบัญชีของเรา

     

     

     

     

     

     

     

     

     

     

    4.ถัดมาจะให้เราเลือกว่าจะใช้งานแบบไหน และระดับเราๆแล้ว จะเลือกอะไรได้ล่ะ เลือก Free เท่านั้นก็พอ !!

     

     

     

     

     

     

     

    5.ระบบก็จะบอกเราว่า ยินดีด้วย คุณติดตั้ง Mailtrack เรียบร้อยแล้ว จากนั้นให้คลิก “Go to my email”

     

     

     

     

     

     

     

     

     

    6.เมื่อเข้าสู่หน้าจอ E-Mail ของเราแล้วนั้นจะสั่งเกตุได้ว่าจะมี Icon ของตัว Mailtrack แสดงอยู่ตรงมุมบนขวา

     

     

     

     

     

     

     

     

     

    7.ในขั้นตอนต่อไปให้เราทดสอบโดยการเขียนและส่ง E-mail ไปยัง E-Mail อื่นที่เราสามารถเข้าไปเปิดอ่านเพื่อทำการทดสอบได้
    เมื่อส่งไปแล้วก็ให้ทดสอบโดยการไปเปิดอ่าน E-Mail ดังกล่าว และกลับมายัง E-Mail หลักที่เราใช้ส่ง จะสังเกตุได้ว่าจะมีการ
    แจ้งเตือนกลับมาจาก MailTrack Alert ที่เราตั้งค่าไว้

     

     

     

     

     

     

     

     

    8.ถ้ามีการเปิดอ่าน E-Mail ของเราที่ส่งออกไป ระบบจะมี Notification แจ้งเตือนมี E-Mail แจ้งสถานะกลับมา
    และในกล่องจดหมายที่ส่งแล้ว จะมี Icon เครื่องหมายถูกคู่ซ้อนกันสีเขียว ตัวอย่างดังรูป

     

     

     

     

     

     

     

     

    สำหรับตัว Email Tracking for Gmail & Inbox ผู้ใช้สามารถเข้าไปดำเนินการตั้งค่าได้ โดยให้สังเกตุที่มุมบนด้านขวามือของตัว Gmail
    จากนั้นให้คลิกที่ Icon ของ Extension เพื่อเข้าไปในหน้า dashboard ของตัว mailtrack ในหน้านี้เราสามารถที่จะตั้งค่าต่าง ๆ ได้ตามต้องการ
    เช่น การเปิด-ปิด การแจ้งเตือน เป็นต้น

     

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

    ขอขอบคุณแหล่งข้อมูลอ้างอิง

  • Choose Network Type In VirtualBox

    เมื่อต้องไปจัดอบรม และต้องใช้ Oracle VM VirtualBox สำหรับสร้าง Virtual Machine (VM) จำนวนหนึ่ง (มากกว่า 1 ตัว ฮ่า ๆ) เราจำเป็นจะต้องรู้ว่า สภาพแวดล้อมของห้องบริการคอมพิวเตอร์ที่เราไปขอใช้งานนั้น จัด IP ให้กับเครื่อง Windows แบบใด เช่น ในกรณีที่มีการปล่อย DHCP IP แบบเหลือเฟือ การเลือกชนิด network ของ VM แต่ละตัว ก็ง่าย เราก็เลือกตั้งค่าเป็น Bridges ซึ่งแบบนี้ VM แต่ละตัวก็จะได้ IP อยู่ในชุดเดียวกันกับ Windows แต่หากจัด IP แบบตายตัวให้กับ MAC Address ของ PC นั้นเลย และไม่ปล่อย DHCP IP เพิ่มให้ อย่างนี้ เราก็ต้องออกแบบว่าจะให้ VM (Guest) เหล่านั้นใช้ IP อะไร จะทำงานร่วมกันได้อย่างไร และจะให้ VM เหล่านั้น ติดต่อกับ Windows (Host) ด้วยหรือไม่

    แบบแรก NAT Network

    แบบนี้ VirtualBox จะสร้าง network จำลองขึ้นมาในโปรแกรมมันเองเท่านั้น ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ แต่จะติดต่อกับ Windows (Host) ไม่ได้ แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP อยู่ในชุดที่ใช้สำหรับ NAT นั่นคือ 10.0.2.0/24 และ VM แต่ละตัวเมื่อได้ IP จะได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งานมาให้ด้วย ทำให้ VM สามารถติดต่อไปใช้งาน Internet ได้

    ตัวอย่างเช่น VM 2 ตัว ตั้งค่า network ชนิด NAT Network

    VM ตัวที่ 1 จะได้ IP 10.0.2.6 และได้ค่า IP DNS Server ชุดที่ใช้ใน Windows (Host) ใช้งาน Internet ได้เลย

    VM ตัวที่ 2 ได้ IP 10.0.2.15 และใช้คำสั่ง ping ไปยัง VM ตัวที่ 1 ได้

    แต่ Windows (Host) จะใช้คำสั่ง ping VM ทั้ง 2 ตัว ไม่ได้

    สำหรับวิธีการตั้งค่า NAT Network ก็เข้าไปที่ File > Preferences > Network  และเราสามารถแก้ หรือ เพิ่มใหม่ ได้

    แบบที่สอง Host-Only Adapter

    แบบนี้ VirtualBox จะสร้าง Virtual network adapter เพิ่มลงใน Windows OS ให้ด้วย ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ และติดต่อกับ Windows (Host) ได้ แต่แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP ในชุด 192.168.56.0/24 (ค่า default ซึ่งเราจะเปลี่ยนได้) แต่ VM แต่ละตัวจะได้มาเพียง IP จะไม่ได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งาน ส่งผลให้ VM ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการเพิ่ม Network Adapter อันที่สอง และตั้งค่า network เป็นชนิด NAT แล้วไป config ให้มีการ start network interface อันที่สองนี้ใน VM (Guest)

    ตัวอย่าง VM 2 ตัว ตั้งค่า network ชนิด Host-only Adapter

     

    Windows (Host) ได้ IP เพิ่มขึ้นมาคือ 10.0.0.1 (ผมแก้ค่า default มาเป็นอันใหม่ เดิม 192.168.56.1)

    VM 1 ได้ IP 10.0.0.101

    VM 2 ได้ IP 10.0.0.102

    Windows ใช้คำสั่ง ping ไปยัง VM 1 ได้

    VM 1 ใช้คำสั่ง ping ไปยัง VM 2 ได้

    VM 1 ไม่ได้ค่า IP DNS server ในไฟล์ /etc/resolv.conf ทำให้ติดต่อใช้งาน Internet ไม่ได้

    ต้องปิด VM แล้ว เราต้องเพิ่ม Adapter อันที่ 2 ให้เป็น NAT

    เปิด VM จากนั้นเข้าไปใน VM ในตัวอย่างคือ Ubuntu 16.04.4 server ให้เพิ่ม Add NAT interface แล้ว reboot

    ข้อความที่เพิ่มคือ (ชื่อ interface enp0s8 จะเปลี่ยนไป อาจไม่ใช่ชื่อนี้ เช็คด้วย ifconfig -a)

    auto enp0s8

    iface enp0s8 inet dhcp

    จะเห็นว่า มี network interface 2 อัน อันที่เพิ่มมาเป็น NAT มี IP เป็น 10.0.3.15

    ตอนนี้จะได้ค่า IP DNS Server อยู่ใน /etc/resolv.conf ทำให้ใช้งาน Internet ได้

    สำหรับวิธีการเปลี่ยนค่า ชุด IP ของ Host-Only Adapter ทำดังนี้ ผมทำการเปลี่ยนตัวเลขชุด 192.168.56 ทุกแห่งที่แท็บ Adapter และแท็บ DHCP Server

    ต้องไป disable และ enable VirtualBox Host-only Network ที่ Windows ด้วย แล้วปิดเปิดโปรแกรม VirtualBox

    แบบที่สาม Internal Network

    แบบนี้ VirtualBox ไม่ได้สร้าง network จำลอง และไม่ได้สร้าง Virtual network adapter เพิ่มลงใน Windows OS แต่ได้เตรียมชื่อไว้ให้ว่า Intnet (ค่า default) ผลลัพธ์คือ แบบนี้ VM (Guest) ทุกตัว จะต้องตั้งค่า IP เองก่อนจึงทำงานร่วมกันได้ และไม่สามารถติดต่อกับ Windows (Host) ได้ และ ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการสร้าง VM (Guest) 1 ตัว ให้ทำหน้าที่เป็น Router นั่นคือ มี Network Adapter อันที่ 1 เป็นชนิด NAT และมี Network Adapter อันที่ 2 เป็นชนิด Internal Network (ชื่อ Intnet) เมื่อสร้าง Router นี้ขึ้นมา ก็จะทำให้ VM (Guest) ทุกตัวติดต่อกับ Internet ได้ แต่ตัว Router ต้องทำหน้าที่เป็นทั้ง DHCP Server และ DNS Server เพื่อแจก IP ให้กับ VM และ แจกค่า IP ของ DNS Server ให้ด้วยตามลำดับ การตั้งค่าแบบที่สามนี้ ดู ๆ ไปก็น่าจะยุ่งยากมากในการเตรียม แต่ก็มีความสามารถที่เพิ่มมาคือ เราสามารถจำลองระบบเครือข่ายได้ เช่น สามารถสร้างโดเมนเนมให้กับ VM ที่ทำหน้าที่เป็น Web Server ได้ด้วย เช่น เราอาจจะตั้งชื่อ zone ว่า example.com แล้วเราให้ VM Web Server นี้มีชื่อโดเมนเนมว่า wordpress1.example.com อย่างนี้ เราทำได้

    ตัวอย่างเช่น VM 2 ตัวที่ตั้งค่า network แบบ Internal Network

    ผมมี myrouter.ova ให้ download ไปใช้ โดยการ import เข้าก็ใช้ได้เลย หากจะเล่าว่าต้องติดตั้งอะไรบ้างคงจะยาวมาก ๆ เอาเป็นว่า ใน myrouter.ova นี้ ผมได้ติดตั้ง DHCP Server ใช้ค่า 10.0.100.0/24, DNS Server ใช้ชื่อโดเมนคือ example.com, Apache2 Web Server และผมมี LDAP Database ou=lulu,ou=example,ou=com ไว้ให้ทดสอบ ด้วยครับ

    VM ตัวพิเศษ ทำหน้าที่เป็น Router จะมี Network Adapter 2 อัน อันแรกเป็น NAT อันที่สองเป็น Internal Network ชื่อ Intnet (ชื่อนี้เป็นค่า default เราเปลี่ยนได้)

    VM ตัวที่ 1 ตั้งค่า network ชนิด Internal Network

    VM ตัวที่ 2 ตั้งค่า network ชนิด Internal Network

    หวังว่าคงจะได้นำไปประยุกต์ใช้งานกันนะครับ

  • Raspberry Pi 3 [Temperature & Humidity Data Chart]

    จากตอนที่แล้ว เราได้เขียนคำสั่งเพื่อที่จะดึงค่าจากเซนเซอร์แล้ว

    ครั้งนี้จะเป็นการใช้วิธีดังค่าดังกล่าว มาเก็บไว้เป็นไฟล์ csv จากนั้นนำไปแสดงเป็นกราฟ โดยแสดงผลผ่าน Web Interface

    ด้วยวิธีดังต่อไปนี้ครับ

     

    สร้างที่เก็บไฟล์ด้วยคำสั่งต่อไปนี้

    mkdir p /home/pi/projects/tempandhumidity
    mkdir p /home/pi/projects/tempandhumidity/sensorvalues
    cd /home/pi/projects/tempandhumidity

    (หากใครไม่ต้องการสร้าง directory เพื่อเก็บข้อมูลตามตัวอย่างนี้ ให้แก้ไฟล์ temp_hud_csv_log.py ด้วยครับ)

    จากนั้นดาวน์โหลดสคริปด้วยคำสั่งนี้

    wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/temp_hud_csv_log.txt
    mv temp_hud_csv_log.txt temp_hud_csv_log.py

    (เนื่องจาก sysadmin นี้ไม่รองรับการอัพโหลดไฟล์ .py จึงต้องอัพโหลดเป็น .txt ไปก่อน แล้วค่อยเอามา rename เอาเอง)

     

    ตรวจสอบและติดตั้ง dependencies ด้วยคำสั่งนี้ sudo easy_install apscheduler และรอจนเสร็จ

          

     

    โดยค่า default สคริปนี้จะถูกเซ็ตให้เป็นเซนเซอร์ AM2302 และใช้ GPIO 4 ซึ่งถ้าหากเราใช้เซนเซอร์และขาคนละขากัน ให้เข้าไปแก้ไฟล์ temp_hud_csv_log.py

    จากนั้นเริ่มต้นการทำงานด้วยคำสั่ง sudo python temp_hud_csv_log.py

    รอซัก 2-3 นาที เราจะเห็นว่ามีไฟล์เกิดขึ้นใน sub folder ชื่อ sensor-values

     

    ต่อไปเราจะทำการอ่านค่าใน csv files ไปแสดงผลเป็นกราฟด้วย NVD3 charts for d3.js ใช้งานร่วมกับ node.js JavaScript ซึ่งรวมเว็บเซอร์เวอร์ node.js Express เอาไว้ในตัว (ซึ่ง node.js ได้ถูกติดตั้งเป็น official ใน raspberry pi image os file ซึ่งสามารถเช็คเวอร์ชั่นได้จากคำสั่ง node –version)

     

    ทำการดาวน์โหลด html file ใส่ไว้ในโฟลเดอร์ย่อย public ด้วยคำสั่งต่อไปนี้

    mkdir p /home/pi/projects/tempandhumidity/public
    cd /home/pi/projects/tempandhumidity/public
    wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/index.txt
    mv index.txt index.html

    ท่านสามารถแก้ไขไฟล์ index.html ได้ ไม่ว่าจะเป็น Title, DateTime Format, สีตัวอักษร, สีพื้นหลัง และอื่นๆ ได้เลย

     

    จากนั้นติดตั้ง node.js script ด้วยคำสั่งต่อไปนี้

    cd /home/pi/projects/tempandhumidity
    wget https://sysadmin.psu.ac.th/wp-content/uploads/2018/03/nodejs_webserver_soapws.txt
    mv nodejs_webserver_soapws.txt nodejs_webserver_soapws.js

     

    และทำการติดตั้ง dependencies ของ node.js ด้วยคำสั่งต่อไปนี้

    npm install express
    npm install bodyparser
    npm install csvparse@1.1.0
    npm install glob

    ** ถ้ามีปัญหาในการเรียก npm เช่น command not found. ให้ติดตั้งด้วยคำสั่ง sudo apt-get install npm ได้เลย **
     ** เป็นการติดตั้งใน home folder ของตัวเอง เพราะงั้นไม่ต้องใช้ sudo นำหน้า npm ครับ **
    ** csv-parse ผมใช้เป็นเวอร์ชั่น 1.1.0 เนื่องจากเวอร์ชั่นใหม่ ลองคอมไพล์แล้วไม่ผ่าน **

     

    เมื่อเรียบร้อยแล้วลอง start web server service ด้วยคำสั่ง sudo node nodejswebserverwithsoapservices.js

    และลองเปิดเว็บด้วย http://[ไอพีของ Raspberry Pi]:9999/


    ** รูปนี้ผมเปิดจาก gui บน raspberry pi เลย จึงใช้ 127.0.0.1 **

     

    จากนั้นทำการแก้ไขให้รันสคริปอัตโนมัติเมื่อ boot ขึ้นมา

    ติดตั้ง forever เพื่อให้รัน background ด้วยคำสั่ง sudo npm g install forever

    จากนั้นแก้ไขไฟล์ /etc/rc.local ด้วยคำสั่ง sudo nano /etc/rc.local และเพิ่มบันทัดเหล่านี้ลงไป

    cd /home/pi/projects/tempandhumidity

    /usr/bin/sudo /usr/bin/python temp_hud_csv_log.py & /usr/bin/sudo /usr/local/bin/forever start nodejs_webserver_soapws.js

     

    เรียบร้อยครับ นอกนั้นจะเป็นการแก้ไข gui ซึ่งสามารถแก้เป็น html syntax ที่ไฟล์ index.html ได้เลย

    ในตัวอย่างด้านล่างนี้ ลองทิ้งไว้ 2-3 วัน (รวมเสาร์/อาทิตย์) จากนั้นเปิดกราฟดู จะเห็นว่าเป็นกราฟเริ่มมีข้อมูลเยอะแล้ว

    (ในตัวอย่าง เริ่มเก็บ 9 มีนาคม 13.54 น. – 12 มีนาคม 12.56 น.)

     

    เมื่อเอาเมาส์ไปชี้ที่กราฟ จะปรากฎค่านั้นๆ ด้วย

     

    และเมื่อลองเลือกช่วงวันดู จะปรากฎเป็นดังนี้


    วันที่ 10 มีนาคม ความชื้นจะลดลงในช่วงกลางวัน ตั้งแต่ประมาณ 7.15 น. เป็นต้นไป
    ซึ่งสวนทางกับอุณหภูมิที่เพิ่มขึ้นจาก 27.9 องศา ไปสูงสุดที่ประมาณ 32 องศา

    วันที่ 12 มีนาคม (วันทำงาน) พบว่าอุณหภูมิและความชื้นลดลงอย่างรวดเร็วเมื่อเปิดแอร์ ที่เวลาประมาณ 8.45 น.
    จากนั้นจะสวิงตามรอบการทำงานของคอมเพรสเซอร์แอร์ (แอร์ธรรมดา มิใช่ inverter แต่อย่างใด) ระหว่าง 22.4 – 25 องศา

     

    ผิดพลาดประการใดขออภัยมา ณ โอกาสนี้ครับ ขอบคุณครับ

     

     

  • Raspberry Pi 3 [Temperature & Humidity Sensor]

    สวัสดีและขออภัยที่ห่างหายไป เนื่องจากติดภารกิจทั้งงานราษฏร์และงานหลวงครับ

     

    ครั้งนี้จะเป็นการเริ่มต่อเซนเซอร์ภายนอก เซนเซอร์พื้นฐานที่มีในปัจจุบันก็จะเป็นเซนเซอร์เกี่ยวกับสภาพแวดล้อม ไม่ว่าจะเป็น เซนเซอร์อุณหภูมิ, เซนเซอร์ความชื้นในอากาศ, เซนเซอร์ความชื้นในดิน, เซนเซอร์น้ำ (ทำงานเมื่อมีน้ำมาสัมผัสเซนเซอร์ – ใช้ตรวจเช็คฝนตก), เซนเซอร์แสง (สวิตซ์), เซนเซอร์ความเข้มแสง, เซนเซอร์วัด pH, เซนเซอร์ UV, เซนเซอร์วัดฝุ่นละอองในอากาศ, เซนเซอร์วัดความชื้นในดิน, เซนเซอร์วัดแรงสั่นสะเทือน และเซนเซอร์อื่นๆ อีกมากมาย ซึ่งหลักการทำงานนั้นส่วนใหญ่จะเหมือนกันหมด คือการอ่านค่ามาจากเซนเซอร์ และนำค่านั้นมาแปรผลที่เราสามารถอ่านได้ง่าย

     

    บทความนี้จะเริ่มด้วยเซนเซอร์ที่ Basic ที่สุด เพื่อให้ทุกท่านพอจะได้เห็นหลักการทำงานและเป็นแนวทางในการเชื่อมต่อเซนเซอร์อ่นๆ ต่อไปครับ นั่นคือ เซนเซอร์วัดอุณหภูมิและความชื้น AM2302 (DHT22) นั่นเอง

    โดยจะมี Pinout ดังนี้ (จากซ้ายบน คือขาที่ 1)
    ขาที่ 1 คือ VCC รองรับ 3.6-6V
    ขาที่ 2 คือ Data
    ขาที่ 3 คือ NC (Normal Close)
    ขาที่ 4 คือ GND

    เราจะต้องทำการต่อ R (Resistor) ด้วย 4.7KOhm ระหว่างขา Data และ VCC ไว้เพื่อป้องกันการรับ/ส่ง ข้อมูลผิดพลาด

    ดังรูปนี้

    ซึ่งถ้าเกิดเราเอามาต่อกันภายนอก จะทำให้เกิดความไม่สวยงามแยะยุ่งยาก จึงขอแนะนำเป็นอุปกรณ์ที่ Built-In R ลงในบอร์ดเลย ดังตามที่กำลังจะนำเสนอให้ดูนี้

    จากนั้นเราทำการต่อสาย ซึ่งผมใช้ Jump Wire ตัวเมียทั้งสองฝั่ง เพื่อสะดวกในการต่อเข้ากับ GPIO ของ Raspberry Pi และเพื่ออนาคตสามารถปรับเปลี่ยนได้ง่าย

    ** เนื่องจากมีแค่ 3 เส้น จึงไม่ได้เน้นว่ามีแดงต้องเป็น +5V, สีดำต้องเป็น GND แค่เสียบให้ถูกทั้งต้นและปลาย ก็พอแล้วครับ **

     

    จากนั้นทำการเสียบเข้าบอร์ด โดยดูจาก Diagram และผมเลือกต่อเข้าช่อง GPIO 4 (ขาที่ 7 – สายสีแดง ในรูป)

    ทำการประกอบลง Enclosure (ไม่จำเป็น) เพื่อความเป็นระเบียบเรียบร้อยเท่าที่จะทำได้ จากนั้นทำการต่อสายและ Boot เครื่องครับ

     

    จากนั้นมาในส่วนของโปรแกรมกันครับ

    เริ่มทำการเขียน Python อย่างง่าย เพื่อที่จะดึงค่าอุณหภูมิและความชื้นมาแสดงบนหน้าจอ ดังนี้ครับ

     

    ทำการอัพเดทระบบด้วยคำสั่ง sudo apt-get update -y

     

    จากนั้นติดตั้ง dependency ที่ต้องใช้ด้วยคำสั่ง sudo aptget install y buildessential pythondev git

    (ถ้าใครติดตั้งมาก่อนในบทความก่อนหน้านี้ ก็ผ่านไปได้เลยครับ)

    จากนั้นทำการติดตั้ง Library จาก Adafruit (เพื่อที่เราจะได้ไม่ต้องเขียน GPIO Connection เอง ซึ่งยุ่งยาก) ด้วยคำสั่งต่อไปนี้ครับ

    mkdir p /home/pi/sources
    cd /home/pi/sources
    git clone https://github.com/adafruit/Adafruit_Python_DHT.git
    cd Adafruit_Python_DHT
    sudo python setup.py install

          

    รอจนเสร็จเรียบร้อย

     

    จากนั้นทดลองเรียกค่าจากเซนเซอร์ด้วยคำสั่ง

    sudo /home/pi/sources/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 4

    โดย 2302 คือ ชนิดของเซนเซอร์และ 4 คือ GPIO ID (ดูจาก Pinout ของ Raspberry Pi และไม่ใช่เลขขานะครับ)
    ก็จะได้ค่ามาดังรูป

    ตามตัวอย่างด้านบนนี้ เป็นการใช้ Python Example ที่มีมากับ Library ที่เรา Clone มา
    อันที่จริงแล้วเราสามารถเขียน Python ให้สามารถเรียกค่าได้โดยง่ายเพียงไม่กี่บันทัด โดยผ่าน Python ดังนี้

    1. เข้า python interactive mode ด้วยคำสั่ง sudo python
    2. พิมพ์คำสั่งข้างล่างนี้ (ขึ้นบันทัดใหม่ด้วย Enter)

    import Adafruit_DHT
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 4)

    3. จากนั้นลองพิมพ์ temperature จะได้ค่าอุณหภูมิออกมา

    4. ลองพิมพ์ humidity จะได้ค่าความชื้นออกมา

    5. ออจาก python interactive mode ด้วยการกด Ctrl+D

     

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

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ