April 2020

Preview Raspberry Pi HQ Camera Module (4K@60fps) ก่อนชาวบ้านเค้า

สถานการณ์ Covid-19 ทำเอางานเปิดตัวทุกอย่างเลื่อนไปหมด แต่ตอนนี้ได้เวลาเปิดตัวผลิตภัณฑ์รุ่นใหม่จาก Raspberry Pi แล้วครับเชิญมารับชมไปพร้อมๆกัน หน้าตาของ Raspberry Pi High Quality Camera สวัสดีครับวันนี้สำนักข่าวเมกเกอร์เอเซีย จะมาทำการ preview ผลิตภัณฑ์ใหม่ล่าสุดจากทาง Raspberry Pi Foundation ซึ่งงานนี้ยังไม่ใช่บอร์ดรุ่นใหม่อย่างที่รอลุ้นกัน แต่เป็นโมดูลกล้องรุ่นใหม่ล่าสุดที่มาในชื่อ “Raspberry Pi High Quality Camera” ไม่ใช่ Raspberry Pi Camera V3 นะครับ แสดงว่าผลิตภัณฑ์นี้มีการแยกสายผลิตภัณฑ์ออกมาใหม่เลย โดยเราจะมาลองแย้มดูสเปคคร่าวๆ ไปด้วยกันเลย เซ็นเซอร์ใหม่ความละเอียด 4K กล้อง “Raspberry Pi High Quality Camera” นี้เปิดสเปคมาเลยว่าใช้เซ็นเซอร์จากค่าย Sony รุ่น IMX477R ที่มีขนาดเซ็นเซอร์รับภาพอยู่ที่ 7.857 mm(วัดทแยงมุม) ในแบบ 1/2.3″ ขนาดเซ็นเซอร์จริง ๆ คือกว้าง 7.564 mm สูง 5.476 mm สัดส่วนภาพเป็น  4:3 โดยขนาดของพิกเซลคือ 1.55 μm × 1.55 μm ทำให้ได้ความละเอียดของภาพถึง 12.3 ล้านพิกเซล ( กว้าง 4056  x สูง 3040) เท่านั้นยังไม่พอ เจ้า IMX477R นั้นมาพร้อมกับคุณสมบัติตัวเล็กๆในใบแนะนำสินค้าคือ  stacked, back-illuminated sensor ซึ่งจากข้อมูลนี้เราจะได้รู้อย่างแรกว่าเป็นเซ็นเซอร์แบบ back-illuminated [ BSI (Back-Side Illuminated) หรือ BI (Back-illuminated Sensor) เป็นเซ็นเซอร์แบบ CMOS รุ่นใหม่ที่ได้ปรับเปลี่ยนโครงสร้างใหม่ จะย้ายสายไฟและโลหะมาไว้ด้านหลังเซ็นเซอร์ ช่วยให้การรับแสงตกมาถึง micro lenses และ colour filters โดยตรง ส่งผลให้มีปริมาณโฟตอนเพิ่มขึ้น ทำให้ได้คุณภาพพิกเซลได้ดีขึ้นใสภาวะแสงน้อย ถ้าให้เข้าใจกันง่ายๆก็คือ จะมีนอยส์(noise)ในภาพน้อยลงและชัดเจนขึ้นนั่นเอง เพราะฉะนั้นกล้องที่ใช้เซ็นเซอร์แบบ BSI (Back-Side Illuminated)  จะรับแสงได้มากกว่าเซ็นเซอร์แบบ FSI (Front-Side Illuminated) ที่ใช้กันทั่วไป ช่วยให้การถ่ายภาพในสภาวะแสงน้อยได้ดีขึ้น]  ที่มา เปรียบเทียบเทคโนโลยีของเซ็นเซอร์รับแสงแบบ FSI และ BSI และด้วยความที่เป็นเทคโนโยี Sony’s Stacked CMOS Image Sensor technology ซึ่งในโมดูลนี้ได้ใส่วงจร column-parallel A/D converter ลงไปด้วย ทำให้เพิ่มความไวในการบันทึกถาพมากขึ้นโดยสามรถบันทึกภาพความไวได้สูงสุดถึง 240 fps เลยทีเดียว เปรียบเทียบเทคนิคการแปลงค่าของเซ็นเซอร์แบบทั่วไปเทียบกับแบบ column-parallel A/D converter รองรับการใช้งานอย่างมืออาชีพ ซึ่งขอบอกก่อนเลยว่าสำหรับกล้องรุ่นก่อนๆของ Raspberry Pi เราต้องออกแรงหาซื้อตัว lens mount มาดัดแปลงใส่เอง แล้วต้องนั่งแงะเอาเลนส์เก่าออก หาทางยึดตัว lens mount อีก เสร็จแล้วจะเอาไปใส่ขายึด อ้าว!! ไม่มีอีกต้องแปลงกันวุ่นวายมาก ซึ่งคุณสมบัติพิเศษเพิ่มเติมที่ทำให้เจ้ากล้อง “Raspberry Pi High Quality Camera” นั้น แตกต่างจากกล้อง “Raspberry Pi Camera Module” ทั้ง 2 รุ่นก่อนหน้าที่ผ่านมาก็คือเราจะสังเกตเห็นได้ว่าโมดูลนี้ขายมาเฉพาะกล้องพร้อมความสามารถเป็นกล้องที่สามารถเปลี่ยนเลนส์ได้เองโดยจะให้ lens mount มาเป็นแบบ C-mount  และสามารถใช้ร่วมกับ CS-mount ได้โดยจะมีแถม C-CS adapter มาให้เรียบร้อยเลย พร้อมกับช่อง tripod mount ขนาด 1/4”-20 และเพื่อให้รองรับเลนส์ที่หลากหลายตัว “Raspberry Pi High Quality Camera” นี้สามารถปรับระยะ backfocus ได้ 12.5 mm–22.4 mm เลยทีเดียว มาพร้อมกับ lens mount ให้เลือกหาเลนส์ที่ตรงกับงานมาใช้ได้ โดยในสายผลิตภัณฑ์นี้ทาง Raspberry Pi  ก็เตรียมเลนส์เอาไว้จำหน่ายแยกอีก 2 ช่วงให้เลือกใช้งานกันคือ 16mm Telephoto Lens     Specs Resolution: 10 MegaPixel Image format: 1″ Focal length: 16mm Aperture: F1.4-16 Mount: C Field Angle: 1″: 44.6°× 33.6° 2/3″: 30.0°× 23.2° 1/1.8″: 24.7°× 18.6° 1/2″: 21.8°× 16.4° Back Focal Length: 17.53mm Optical Length: 67.53mm Distortrion: 1″(-0.7%) 1/2″(-0.5%) 1/3″(-0.15%) M.O.D.: 0.20m Dimension: φ39.00×50.00mm Weight: 133.7g Structure: +9G 6mm Wide Lens   Specs Resolution: […]

Preview Raspberry Pi HQ Camera Module (4K@60fps) ก่อนชาวบ้านเค้า Read More »

จับมือติดตั้ง OpenCV4 บน Raspberry Pi4 แบบไม่มีคำว่าลงไม่ได้

มาลองกันดูว่าทำไม เราถึงลง OpenCV บน Raspberry Pi  ไม่สำเร็จทั้ง ๆ ที่ก็มีคนอีกมากมายที่ทำแล้วได้ไม่ติดอะไร สวัสดีครับวันนี้ผมจะมาแนะนำขั้นตอนการติดตั้ง OpenCV4 บนบอร์ด Raspberry Pi  ที่ติดตั้งระบบปฎิบัติการ Raspbian Buster กันดูครับ โดยผมได้ทดลองติดตั้งตามคำแนะนำจากในเว็บไซต์ https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/   ทำตามแบบเป๊ะๆเลย ซึ่งมันจะติดปัญหาครับ แล้วบางคนเห็น error แล้วไม่ใส่ใจก็ลุยทำต่อไป จนสุดท้ายใช้ไม่ได้ครับ เอาล่ะงั้นเรามาเริ่มต้นกันได้เลยครับ โดยผมจะติดตั้งโดยใช้วิธีการ compile จากซอร์สโค้ดนะครับ โดยจะขอข้ามเรื่องการติดตั้งระบบปฎิบัติการไปทั้งหมดเลยนะครับ ถือว่าเป็นการใช้งาน Raspberry Pi เบื้องต้นซึ่งศึกษาได้ด้วยตนเองหรือถ้าอยากได้ทางลัดที่อธิบายแบบหมดเปลือกก็ขอเชิญที่ [คอร์สออนไลน์ครบเครื่องเรื่องการใช้งาน Raspberry Pi สำหรับผู้เริ่มต้น]  เอาล่ะขอเข้าเนื้อหาเลยนะครับ  1) ขั้นแรกเลยสำหรับคนที่ SDcard มีขนาดเล็ก เราก็จะเอา software package ที่ติดตั้งมาให้กับ OS ออกไปก่อนหรือตอนเลือก Image  มาก็อย่าเลือกตัวเต็ม แต่ถ้าเอามาแล้วก็ถอนการติดตั้งตามนี้ครับ  ($) ไม่ต้องเอาไปวางนะครับ $ sudo apt-get purge wolfram-engine $ sudo apt-get purge libreoffice* $ sudo apt-get clean $ sudo apt-get autoremove 2)  คือการติดตั้ง Software ที่เกี่ยวข้อง โดยก่อนอื่นเลยให้ทำการ update software กันเลยเลยด้วยคำสั่ง $ sudo apt-get update && sudo apt-get upgrade จากนั้นติดตั้ง Developer tools เอาไว้ช่วง compile $ sudo apt-get install build-essential cmake pkg-config  แล้วทำการติดตั้ง image package  จะได้ใช้งานกับรูปภาพได้หลาย format. หน่อย $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev   จากนั้นจากรุปภาพเราก็ต้องมีการใช้งานวิดีโอด้วยแน่ๆก็ติดตั้งเผื่อไว้เลย $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev  ต่อไปเป็นเรื่องของด้าน GUI  บ้างเราต้องติดตั้ง GTK development library ลงไปตามนี้จะได้ใช้งาน highgui  ไว้ทำ GUI ง่าย ๆ ได้ $ sudo apt-get install libfontconfig1-dev libcairo2-dev $ sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev $ sudo apt-get install libgtk2.0-dev libgtk-3-dev ต่อไปก็ลง lib ช่วยเรื่องการคำนวนใน OpenCV  ลงไปอีก $ sudo apt-get install libatlas-base-dev gfortran  จากนั้นก็ลง HDF5 datasets กับ Qt GUIs $ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 สุดท้ายละของข้อนี้ ถ้าเราจะติดตั้ง OpenCV แล้วไปเรียกใช้ใน python เราต้องติดตั้ง python header ไฟล์ลงไปด้วยตามนี้ $ sudo apt-get install python3-dev  3) เราจะมาติดตั้งและสร้าง Python virtual environment กันโดยจะใช้เป็น virtualenv virtualenvwrapper เพราะอะไรถึงต้องตัวนี้ง่ายมากครับเพราะใน pyimagesearch เค้าใช้ตัวนี้ถ้าใช้เหมือนเค้าก็จะไปทำอะไรตามได้ง่ายกว่าเลือกลงตัวอื่นเอง update  pip   ซะก่อนเลย $ wget https://bootstrap.pypa.io/get-pip.py $ sudo python get-pip.py $ sudo python3 get-pip.py $ sudo rm -rf ~/.cache/pip  แล้วลง Python virtual environment  #ปักหมุด1 $ sudo pip install virtualenv virtualenvwrapper เปิดไฟล์ ~/.bashrc (/home/pi/.bashrc) ขึ้นมาแก้ใส่คำสั่งเพิ่มลงไป # virtualenv and virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 source /usr/local/bin/virtualenvwrapper.sh สั่ง reload .bashrc source

จับมือติดตั้ง OpenCV4 บน Raspberry Pi4 แบบไม่มีคำว่าลงไม่ได้ Read More »

สร้างปุ่ม shutdown และตรวจสอบสถานะการทำงานของบอร์ด Raspberry Pi ผ่าน dtoverlay

สวัสดีครับ วันนี้ Maker[LAB] จะมาแนะนำเกร็ดความรู้การใช้งานบอร์ด Raspberry Pi โดยเลือกมาจากคำถามที่มีคนถามมาในเพจ https://www.facebook.com/makerlab66/ กันนะครับ  มีคำถามมาว่า “มี Pin ไหนของบอร์ด Raspberry Pi ที่จะติดตอนเปิดใช้งานและดับตอนที่ shutdown ไปแล้วบ้างมั้ย” น่าสนใจนะครับคำถามนี้ คำตอบก็คือทำได้ขา GPIO26 ใช้ได้เลย แต่ถ้าต้องการเปลี่ยนค่าล่ะทำยังไง เราสามารถทำได้ด้วยการ load dtoverlay ที่ชื่อว่า gpio-poweroff มาใช้งานได้โดยใช้รูปแบบเป็น dtoverlay=gpio-poweroff,gpiopin=#BCMPinNo,active_low=[0,1] โดยเราเลือกขา output โดยระบุเป็นหมายเลขขาของ BCM ได้เลย ส่วนของ active_low เราเลือกได้ว่าจะให้ตอนที่ system ทำงานจะให้ output ออกมาเป็น LOW  หรือ HIGH เราก็เปิดไฟล์ /boot/config.txt ขึ้นมาเพิ่มบรรทัดลงไปได้เลย Raspberry Pi Pinout ลองบูตมาถ้าต่อ  LED ก็จะเห็นการติดของหลอด LED ได้เลย แต่จริงๆส่วนนี้เราเอาไปใช้งานเพื่อควบคุมระบบอื่นๆที่เชื่อมต่อได้เช่น ต่อส่วนควบคุมพัดลมที่จะติดเมื่อเปิดและดับเองเมื่อเราปิดเครื่องแล้ว เป็นต้น ซึ่งอันนี้ Pi เตรียมไว้ให้เราแล้วเป็นขา GPIO3 ซึ่งถ้าเราต้องการย้ายตำแหน่งขาก็ใช้สูตรเดิมครับใช้ overlay ที่ชื่อ gpio-shutdown โดยการใช้งานจะอยู่ในรูปแบบ dtoverlay=gpio-shutdown,gpio_pin=#BCMPinNo,active_low=[0,1],gpio_pull=[up,down,off] โดยที่ gpio_pin=#BCMPinNo active_low=[0,1] ถ้า active_low เป็น 1 สถานะของขาเมื่อเป็น LOW จะให้ค่าการกดปุ่มเป็น Keydown และเมื่อปล่อยเป็น keyup หาก active_low  เป็น 0 ก็จะให้ผลการทำงานที่สลับกัน  gpio_pull[up,down,off]=เลือกสถานะการ pull up/down ของตัวต้านทานภายใน หรือจะต่อตัวต้านทานภายนอกเองก็ดีเลย ขา default คือขา GPIO03 เป็นขา SCL ของ I2C ซึ่งมันมีต่อตัวต้านไว้อยู่แล้วเค้าเลยเลือกเอาขานี้มาเป็น default แหละ ลองทดลองดูกันครับหรือจะรับชมผ่านวิดีโอสั้นๆด้านล่างนี้ก็ได้จะได้เห็นผลการทำงานที่ชัดเจน และหากรู้สึกสนุกกับการสอนแบบอธิบายแบบนี้ สามารถไปลงทะเบียนคอร์ส https://makerasia.com/courses/%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81%E0%B8%AA%E0%B8%B9%E0%B8%95%E0%B8%A3%E0%B8%84%E0%B8%A3%E0%B8%9A%E0%B9%80%E0%B8%84%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B9%80%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-raspberry-pi-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B9%80%E0%B8%A3%E0%B8%B4%E0%B9%88%E0%B8%A1%E0%B8%95%E0%B9%89%E0%B8%99/ ได้ในราคาเพียง 1,500 บาทกับบทเรียนเนื้อหา 15 บทในเวลาเกือบ 400 นาที ที่จะสอนแนะนำจนเข้าใจ ถ้าไม่เข้าใจไปถามต่อในกลุ่มของผู้ที่ลงทะเบียนเรียนแล้วได้เลย มีคำตอบให้แน่นอน แล้วพบกับเกร็ดความรู้กับการใช้งาน Raspberry Pi กันใหมาในครั้งหน้านะครับ

สร้างปุ่ม shutdown และตรวจสอบสถานะการทำงานของบอร์ด Raspberry Pi ผ่าน dtoverlay Read More »

ติดตั้ง InfluxDB และ Grafana และ Telegraf ด้วย Docker

สวัสดีครับ ผู้อ่านทุกท่าน วันนี้เรามาทำในฝั่ง Server เพื่อเตรียมตัวทำ Database เพื่อเก็บข้อมูลในอุปกรณ์ IoT ในรูปแบบของ Time Series กันครับ ซึ่งเหมาะมากๆ การเก็บข้อมูลเซ็นเซอร์ต่างๆครับ ในบทความนี้ผมจะพูดถึงการติดตั้งด้วย Docker นะครับ นั่นแปลว่า ท่านสามารถติดตั้งในระบบปฏิบัติการอื่นได้ในรูปแบบเดียวกัน ซึ่งบทความนี้เราจะไปลุยกันที่วิธีการติดตั้ง InfluxDB และ Grafana บน Cloud (ผมเลือกใช้ Digital Ocean ไปก่อน) InfluxDB เป็น TimeSeries Database ครับซึ่งเป็น Open-source อยู่บน TICK Stack (Telegraf, InfluxDB, Chronograf, Kapacitor) ซึ่งออกแบบมาให้จัดการกับการอ่าน/เขียนข้อมูลที่หนักหน่วง และมี InfluxQL ที่ใช้ในการดึงข้อมูลที่คล้ายกับ SQL ภาษาอื่นๆครับ Grafana เป็น TimeSeries Database ครับซึ่งเป็น Opensource อยู่บน TICK Stack (Telegraf, InfluxDB, Chronograf, Kapacitor) ซึ่งออกแบบมาให้จัดการกับการอ่าน/เขียนข้อมูลที่หนักหน่วง และมี InfluxQL ที่ใช้ในการดึงข้อมูลที่คล้ายกับ SQL ภาษาอื่นๆครับ เริ่มต้นติดตั้ง สร้างพื้นที่เก็บไฟล์โดยใช้ Docker Volume ส่วน Container ของ Grafana และ InfluxDB เราจะออกแบบให้ใช้ interface ของ network อันเดียวกับเครื่องเลยนะครับ นั่นหมายถึงว่า จะใช้ port 3000 และ 8086 หรือ port ใดๆที่เปิดด้วยไฟล์ config $ docker volume create grafana-storage $ docker volume create influxdb-storage สร้างไฟล์ config docker run –rm influxdb influxd config เราจะได้หน้าตา Config ออกมาแบบนี้ครับ เราเซฟเป็นไฟล์ influxdb.conf ได้เลย ถ้าต้องการให้ Database เรามีการใช้ Authenthication ร่วมด้วย ให้เราแก้ตรงที่ผมทำตัวหนาไว้ข้างล่างนะครับ ตรง auth-enabled = true ครับ reporting-disabled = false bind-address = “127.0.0.1:8088” [meta] dir = “/var/lib/influxdb/meta” retention-autocreate = true logging-enabled = true [data] dir = “/var/lib/influxdb/data” index-version = “inmem” wal-dir = “/var/lib/influxdb/wal” wal-fsync-delay = “0s” validate-keys = false query-log-enabled = true cache-max-memory-size = 1073741824 cache-snapshot-memory-size = 26214400 cache-snapshot-write-cold-duration = “10m0s” compact-full-write-cold-duration = “4h0m0s” compact-throughput = 50331648 compact-throughput-burst = 50331648 max-series-per-database = 1000000 max-values-per-tag = 100000 max-concurrent-compactions = 0 max-index-log-file-size = 1048576 series-id-set-cache-size = 100 trace-logging-enabled = false tsm-use-madv-willneed = false [coordinator] write-timeout = “10s” max-concurrent-queries = 0 query-timeout = “0s” log-queries-after = “0s” max-select-point = 0 max-select-series = 0 max-select-buckets = 0 [retention] enabled = true check-interval = “30m0s” [shard-precreation] enabled = true check-interval = “10m0s” advance-period = “30m0s” [monitor] store-enabled = true store-database = “_internal” store-interval = “10s” [subscriber] enabled = true http-timeout

ติดตั้ง InfluxDB และ Grafana และ Telegraf ด้วย Docker Read More »

การติดตั้ง และเรียกใช้ Django Model บน Jupyter Notebook

หลังจากที่เราเรียน การติดตั้ง VirtualEnv สำหรับการแยก Python Environment และติดตั้ง Jupyter Lab กันไปแล้ว วันนี้เรามาลองปรับแต่ง หรือลงโมดูลให้ กับ Django App ของเรา ให้มีความสามารถในการติดต่อ (Shell) บน Jupyter Notebook กันได้นะครับ Django คืออะไร? Django เป็น Web framework สำหรับสาย Python ครับ ผมเลือกใช้เพราะมีหน้า Admin และ มี ORM (Object Relation Mapping) ให้ใช้ ทำให้เราสามารถทำอะไรได้สะดวก รวดเร็วมากขึ้นครับ แต่ในบทความนี้เรายังไม่พูดถึงนะครับ ใครสนใจไปอ่าน หรือทำตามจาก https://www.djangoproject.com ได้เลยครับ เริ่มติดตั้งกันดีกว่า mkvirtualenv django pip install pandas django jupyter pip install django-extensions django-pandas jupyter หลังจากที่เรา Initial ตัว Django app ไปแล้วให้เพิ่มบรรทัดนี้ในไฟล์ settings.py ครับ INSTALLED_APPS = [ ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘django.contrib.staticfiles’, ‘django_extensions’, ] หลังจากนั้นรันคำสั่งข้างล่าง จะได้ Jupyter Notebook ขึ้นมา เราสามารถกด Django Shell-Plus ได้เลยครับ ซึ่งใน Application ลักษณะนี้ ผมจะใช้แค่ Jupyter Notebook ก็พอ ไม่ต้องเป็น Jupyter Lab ก็ได้ครับ เริ่มต้นใช้งาน shell_plus python manage.py shell_plus –notebook เข้าถึง Django Model หลังจากนั้น เรามาลองเข้าถึง User Model ของ django กันเลยครับ! #!/usr/bin/env python # coding: utf-8 import os os.environ[“DJANGO_ALLOW_ASYNC_UNSAFE”] = “true” from django.contrib.auth.models import User from blog.models import Post Post.objects.all() User.objects.all() Jupyter Notebook รันใน Notebook จะได้แบบนี้ครับ! เห็นมั้ยครับ เพียงเท่านี้เราก็จะสามารถ ติดต่อกับ Django Model ผ่าน Notebook ได้เลย… ซึ่งแน่นอนครับ หลังจากนี้เราจะมาพูดถึง Django Model และ Pandas + Django + Jupyter Notebook กันต่อไปนะครับ Happy Coding!

การติดตั้ง และเรียกใช้ Django Model บน Jupyter Notebook Read More »

แสดงกราฟข้อมูลจากไฟล์ .csv โดยการใช้ Jupyter และ Pandas

หลังจากที่เรา การติดตั้ง VirtualEnv สำหรับการแยก Python Environment และ ทำ Data Logger ด้วย TTGo T1 (ESP32) และโมดูล DS3231 กันไปแล้ว วันนี้เราจึงมีไฟล์ .csv มาให้เล่นกันในวันนี้แล้วครับ! วันนี้เราจะใช้ Pandas และ Jupyter Lab เข้ามาช่วยเขียนโค๊ดกันนะครับ Pandas & Jupyter Lab Pandas เป็น Python Library ที่เอาไว้ช่วยทำ Data Analysis ครับ ทำได้ทั้งปรับปรุง เปลี่ยนแปลง เพิ่ม/ลด หรือแม้กระทั่ง Plot แผนภูมิ (หรือกราฟนั่นเอง) แต่ว่าพูดถึง Pandas อย่างเดียวคงไม่ได้ เพราะการแสดงผลที่งดงามนั้นเราจะแสดงผลกันใน Jupyter Lab (มันมี Jupyter Notebook ด้วยนะ) แต่ผู้เขียนถูกจริตกับ Jupyter Lab มากกว่าครับ วันนี้เราคงไม่ได้พูดถึงเบื้องลึกอะไรกันมากนะครับ เรามาลองเล่น Pandas และลอง Plot กราฟไปด้วยกันนะครับ สร้าง Environment และเรียกใช้ Jupyter Lab mkvirtualenv pandas-test ls workon pandas pip install pandas jupyterlab jupyter-lab เริ่มใช้งาน Jupyter การใช้งาน Jupyter ให้แปะโค๊ดลงไปใน Cell ได้เลย แล้วกดรันโดยการกด Shift + Enter ครับ ถ้ารันสำเร็จแล้วจะมี ตัวเลขลำดับของการรันขึ้นข้างหน้า Cell จกภาพตัวอย่างจะเป็นการติดตั้ง pandas และ matplotlib ทั้งหมดนี้จะติดตั้งเข้าไปอยู่ใน Environment pandas-test ที่สร้างไปข้างบนนั่นเองครับ หลังจากนั้นเราเริ่มโหลดข้อมูลจาก CSV ขึ้นมาโดยใช้ Pandas โดยให้กำหนด header ให้มีชื่อตามลำดับดังนี้ [‘time’, ‘date’, ‘temp’] df = pd.read_csv(‘20200401.CSV’, names=[‘time’,’date’,’temp’]) df.set_index(“time”) หลังจากนั้นเราจะแปลงข้อมูลให้เป็น datetime แบบ manual โดยการใช้คำสั่งของ pandas นั่นก็คือ pd.to_dataframe นั่นเอง df [‘time’] = pd.to_datetime(df[‘time’]) df [‘date’] = pd.to_datetime(df[‘date’]) เมื่อเรียบร้อยหมดแล้ว เราสามารถตรวจสอบข้อมูลต่างๆ ใน DataFrame ของเราโดยการเรียกคำสั่ง df.dtypes Plot กราฟ เราสามารถใช้ matplotlib ใน Jupyter ได้ครับ แต่ว่าเราต้อง Config มันก่อนด้วย ไม่งั้นมันจะออกมาเป็นขนาดเล็ก ไม่สวยเท่าไหร่ %matplotlib inline import matplotlib.pyplot as plt plt.rcParams[‘figure.dpi’] = 100 plt.rcParams[“figure.figsize”] = (30, 5) # (w, h) เตรียมข้อมูล ผมตั้งโจทย์ไว้ 2 โจทย์ครับ คือนับข้อมูลว่าใน 1 ชั่วโมง เราเก็บค่าได้กี่ค่า และ มีการ Resampling โดยให้ Aggregrate ข้อมูลราย 5 นาที และใช้ median เข้ามา Aggregrate ข้อมูลครับ เนื่องจากข้อมูลมีจำนวนเยอะ (1672 Rows) เราพล๊อตกราฟไม่ไหว ซึ่งข้อมูลเรามีหน้าตาแบบนี้ครับ เขียนโค๊ดได้แบบนี้ groupBy ใช้ df.groupby เพื่อให้รวบรวมข้อมูลให้เราเป็นราย 1 ชั่วโมง และใส่ Field count เพิ่มเข้าไปให้เราด้วย อาจจะมีวิธีที่ดีกว่านี้ ไว้เราค่อยมาว่ากันใหม่นะครับ resample ก่อนที่เราจะ Resample เพื่อสร้างข้อมูลใน เรท 5Minute เราต้อง Set index ให้เป็นฟิลด์ประเภท datetime ซะก่อน หลังจากนั้นเราจะเรียก df.dropna เพื่อลบข้อมูลที่ไม่มีออกไป สะดวกเนอะ! df = df.set_index(‘time’) df2 = df.resample(‘5Min’).median().reset_index() df2.dropna(inplace=True) พล๊อตกราฟ! ผมใช้ matplotlib เพื่อสั่ง plot โดยกำหนด format ของ time โดยการใช้คำสั่ง strftime เข้ามาช่วย และพล๊อตเข้ากับข้อมูล df2.temp import matplotlib.pyplot as plt plt.style.use(‘seaborn-whitegrid’) plt.title(“Temperature (DS3231)”) plt.xticks(rotation=90) plt.plot(df2.time.dt.strftime(‘%H:%M’), df2.temp)

แสดงกราฟข้อมูลจากไฟล์ .csv โดยการใช้ Jupyter และ Pandas Read More »

การลง Visual Studio Code บน windows 10 และ ลง Arduino IDE ใน Visual Studio Code

สวัสดี ผม นายอภินันท์ บุญทอง ชื่อเล่น ต๋อง จากหัวเรื่องและในปัจจุบัน เราไม่ต้องจพเป็นที่จะต้องเขียน Arduino ใน Arduino IDE อีกต่อไปก็ได้เพราะ Visual Studio Code นั้นสามารถเอา Arduino IDE ลงไปรันในนั้นได้เลยครับผม ต่อไปก็จะมาเริ่มลง Visual Studio Code ก่อนครับ อันดับแรก ไปดาวน์โหลด https://code.visualstudio.com/ พอ ดาวน์โหลดเสร็จก็ กดเข้า VSCodeUserSetup-x64-1.43.1.exe นี้เลย กด I accept the agreement แล้วกด Next ติกตามรูปแล้วกด Next แล้วกด Install รอให้เสร็จ กด Finish เสร็จจะรันโปรแกรมขึ้นมาเลย ก็จะได้หน้าตาประมาณนี้มาครับ คลิกตามลูกสร ก็จะได้ประมาณนี้ ต่อไปเราจะมาลง Arduino IDE ใน Visual Studio Code กันเลย พิม Arduino ลงในที่จุดค้นหา ก็จะได้ตามรูปเลย คลิก install ตามลูกสร หลังจากนั้นให้ โปรแกรมลง ให้เสร็จ ชักแปปหนึ่งครับ ต่อไปกด ตามรูป ไปคลิก คำว่า Settings ก็จะได้หน้าต่างตามรูป พิม arduino ตรง Search settings ก็จะได้ตามรูปครับ ต่อไป หา Arduino : Path ไปคัดลอก ที่อยู่ของโปรแกรม Arduino IDE ของเราจริงๆๆมาใส่ครับ ตามรูปเลยครับ (ที่อยู่ของผู้อ่านอาจจะไม่ได้อยู่ที่เดียวกับผม)นะครับ ใส่เสร็จแล้วก็กดออกเลยครับ กด Ctrl+Shift+P ก็จะได้หน้าต่างตามรูปเลยครับ คลิกอันแรก Arduino : Examples ก็จะได้หน้าต่างตามรูปมาครับ คลิกตรง Built-in- Examples แล้วก็เลือกตัวอย่างอะไรก็ได้ ตามใจครับ ส่วนผม เลือกตามรูปครับ แล้วก็จะได้หน้าต่างแบบนี้มาครับ คลิกเลือกตามลูกสรตามรูป ครับ แล้วก็จะได้โปรแกรม ตัวอย่างมาครับ ตามรูปครับ รูปข้างล่างคือการ compile รูปข้างล่างคือการ upload โปรแกรม ต่อไปวิธีการเลือก Board ใช้งาน ตามรูปครับ ก็จะได้หน้าตาแบบนี้มา ละก็ คลิกตรง Selected Board: ได้เลยตามรูปครับ แล้วก็คลิก compile ได้เลย ถ้า compile เสร็จก็จะขึ้นตามรูปด้านล่างครับ แค่นี้เราก็สามารถเขียน อาดูโน ในนี้เลยเลยครับ สุดทายนี้ผมหวังว่าบทความนี้อาจจะมีประประโยชน์ นะครับ

การลง Visual Studio Code บน windows 10 และ ลง Arduino IDE ใน Visual Studio Code Read More »

การเปลี่ยนความถี่ PWM ของ Arduino

pwm หรือที่มีชื่อเต็มว่า Pulse-width modulation คือเทคนิคการการสั่ง on off ขา output ที่ความถี่สูง โดยสั่งงานจากโมดุล timer ภายใน ปกติแล้ว Arduino จะมีขา pwm ให้เลือกใช้หลายขา โดยแต่ละขา pwn จะมีความถี่มาตราฐานของ pwm ที่แตกต่างกัน ขึ้นอยู่กับว่าขานั้นๆถูกควบคุมด้วย timer ตัวไหน ซึ่งขา pwm ที่ใช้ timer ร่วมกันจะต้องมีความถี่ของ pwm เท่ากันด้วย ยกตัวอย่างเช่นขา pwm ขา D5 และ D6 ของ arduino uno จะใช้ timer 0 เป็นตัวสั่งงานและความถี่ pwm มาตรฐานเท่ากับ 976.56 เฮิร์ต แต่ว่าขา pwm D9 D10 ใช้ timer 1 มีความถี่ pwm มาตรฐานคือ 490.20 เฮิร์ต โดยส่วนใหญ่แล้วเราก็มักจะใช้ขา pwm ในการสั่งงานที่ต้องการที่จะเร่งหรี่เอาพูดได้ ยกตัวอย่างเช่น การปรับความสว่างของหลอดไฟ การปรับความร้อนของฮิตเตอร์ หรือการควบคุมความเร็วของมอเตอร์ แล้วความถี่ของ pwm สำคัญอย่างไรล่ะทำไมเราถึงต้องเปลี่ยนแปลงความถี่มันด้วย เพื่อนๆคงเคยขับมอเตอร์ด้วย pwm แล้วใช่ไหมครับ บางครั้งเราจะได้ยินเสียงความถี่สูงตอนมอเตอร์ทำงาน นั่นเป็นเพราะขา pwm ที่ขับมอเตอร์นั้นมีความถี่ที่อยู่ในระดับที่มนุษย์ได้ยินหรือตัวมอเตอร์ยังตอบสนองได้(~500 เฮิร์ต หรือ ~1000 เฮิร์ต ) จึงทำให้เราได้ยินเสียงรบกวนดังนั้นถ้าเราเพิ่มความถี่ของขา pwm ที่ขับมอเตอร์ให้สูงขึ้น ยกตัวอย่างเช่น เพิ่มความถี่เ ป็นประมาณ 4,000 เฮิร์ต หรือ 8000 เฮิร์ต ก็จะทำให้เสียงความถี่สูงรบกวนตอนมอเตอร์ทำงาน ลดลง หรืออาจจะหายไปเลยก็ได้ หรือในบางครั้งเราใช้ขา pwm ในการปรับความสว่างของหลอดไฟ LED แต่เมื่อเรามองหลอดไฟ LED ผ่านกล้องมือถือหรือกล้องถ่ายรูป ปรากฏว่ากล้องถ่ายรูปนั้นเห็น หลอดไฟ LED กระพริบ เราก็สามารถเพิ่มความถี่ของขา pwm ให้สูงขึ้น เพื่อกล้องไม่สามารถจับได้ทัน ตอนถ่ายรูปหรือถ่ายวีดีโอภาพก็จะมีความสวยงามมากขึ้น แต่ในการเปลี่ยนความถี่ของขา pwm นั้น ต้องมีข้อระวังด้วย เพราะว่าก็อาจมีการทำงานของฟังก์ชันอื่นๆที่ใช้ timer มาช่วยผิดพลาดไป ยกตัวอย่าง เช่น คำสั่ง millis() หรือว่าคำสั่ง delay() ที่ใช้ timer 0 เข้ามาช่วย ถ้าหากเราปรับเปลี่ยนการทำงานของ timer 0 ก็จะทำให้การทำงานของฟังก์ชัน delay() และฟังก์ชัน millis() ผิดเพี้ยนไปจากเดิมครับ โดยด้านล่างนี้เป็นตัวอย่าง code การตั้งค่าความถี่ pwm ของ Arduino ขาต่างๆโดยแยกเป็นกลุ่มแต่ละ timer โดยจะแสดงค่า default ของความถี่ของแต่ละขาไว้ การใช้งานให้ copy code ของขาที่ต้องการเซตความถี่ไปไว้ใน function void setup () จากนั้นเลือก uncomment ความถี่ที่ต้องการใช้ Code สำหรับบอร์ด Arduino ที่ใช้ชิพ ATmega 8, 168 หรือ ATmega328 Code สำหรับบอร์ด Arduino ที่ใช้ชิพ ATmega1280 หรือ ATmega2560 ตัวอย่างการใช้เพิ่มความถี่ขา D9 เป็น 3921.16 เฮิร์ต บนบอร์ด Arduino Uno แหล่งข้อมูล: https://arduinoinfo.mywikis.net/wiki/Arduino-PWM-Frequency

การเปลี่ยนความถี่ PWM ของ Arduino Read More »

การติดตั้ง VirtualEnv สำหรับการแยก Python Environment

เมื่อเราต้องเขียนโปรแกรมด้วยภาษา Python คงหนีไม่พ้นปัญหา การเรียกใช้ Python 2 หรือ Python 3 ปนกัน หรือถ้าล้ำหน้าไปกว่านั้น อาจจะเกิดปัญหาที่ต้องเลือกเวอร์ชั่นที่ละเอียดลงไปอีก เช่น Python 3.5 หรือ Python 3.7 เป็นต้น วิธีการที่จะมาช่วยแก้ไขปัญหานี้ก็ต้องลง พวกเครื่องมีที่ทำ Version Manager อย่างเช่น NodeJS จะมี NVM, Ruby จะมี RVM ส่วน Python ก็มีหลายตัว เราอาจจะเลี่ยงไปใช้ Anaconda นำ Docker เข้ามาช่วยก็ได้ แต่บทความนี้จะแนะนำการใช้งาน virtualenv และ virtualenvwrapper และจะแนะนำถึงการใช้งานเป็นส่วนใหญ่นะครับ เริ่มติดตั้ง เริ่มต้นด้วยการติดตั้ง virtualenv และ virtualenvwrapper กันเลยครับ ไม่ยากเลย สามารถดูเพิ่มเติมได้ที่นี่ ปรับแต่ง Shell Environment *Unix สำหรับ MacOS และ Linux สามารถเซ็ตได้แบบนี้เลยครับ export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh source /usr/local/bin/virtualenvwrapper_lazy.sh Windows สำหรับ Windows ทำได้หลายทางหน่อย สามารถดูเพิ่มเติมได้ที่นี่ MSYS หากมีการใช้ MSYS ก็สามารถปรับแต่งแบบนี้ได้เลย export WORKON_HOME=$HOME/.virtualenvs export MSYS_HOME=/c/msys/1.0 source /usr/local/bin/virtualenvwrapper.sh หรือ: export WORKON_HOME=$HOME/.virtualenvs export MSYS_HOME=C:\msys\1.0 source /usr/local/bin/virtualenvwrapper.sh PowerShell อ่านเพิ่มเติมได้ที่ https://github.com/regisf/virtualenvwrapper-powershell การใช้งาน สั่ง mkvirtualenv temp เพื่อสร้าง environment ชื่อ temp ขึ้นมาใช้งาน เรียก workon tempเพื่อ activate environment temp ขึ้นมาใช้งาน ลองติดตั้ง Jupyterlab! สามารถทำได้ด้วยคำสั่ง pip install jupyterlab ได้เลย! เรียบร้อย! ลองทดสอบการเรียก Jupyterlab ขึ้นมาใช้งาน จะเห็นว่าการลง jupyterlab เข้าไปใน environement temp ไม่มีปัญหา ลองสั่ง pip freeze เพื่อดู dependencies ของ ใน environement temp ของเราขึ้นมาดูจะได้ผลลัพธ​์ดังนี้! เรียบร้อย พร้อมจะลุยกันต่อกับ Python ครับ!!

การติดตั้ง VirtualEnv สำหรับการแยก Python Environment Read More »

ทำ Data Logger ด้วย TTGo T1 (ESP32) และโมดูล DS3231

ในปัจจุบันเราต้องการ ESP32 Application ประเภท Data Logger อยู่บ่อยครั้ง ซึ่งชิพ ESP32 สามารถตอบโจทย์ทางด้านนี้ได้เป็นอย่างดี ไม่ว่าจะเป็นการทำแบบ  Online หรือ Offline ถือว่าเป็นชิพที่ครบเครื่องจริงๆครับ ในบทความนี้ผู้เขียนเลือกใช้วิธีการเก็บข้อมูลแบบ Offline เนื่องจากต้องการลดปัญหาทางด้านเครือข่าย และไม่ต้องการให้จบด้วย Module ESP32 ในตัวเดียว TTGo T1 (V1.3) ผู้เขียนเลือกใช้บอร์ด TTo T1 ซึ่งเป็น Breakout Board จาก Lilygo เนื่องจากราคาถูก และรองรับการเสียบ SDCard และแบตเตอรี่ในตัว TTGo T1 Pin Mapping RTC Module (DS3231) RTC Module หรือ โมดูลนาฬิกา เป็นสิ่งที่ขาดไม่ได้ เนื่องจากโจทย์ในรอบนี้เราไม่มีการเชื่อมต่อผ่าน Internet ดังนั้น ถ้าเราต้องการเก็บข้อมูลจากเซ็นเซอร์แล้ว เราต้องมีเวลากำกับ ไม่เช่นนั้นเราจะไม่รู้ว่าข้อมูลของช่วงเวลาไหน ซึ่งจริงๆแล้วสามารถใช้ RTC เบอร์ไหนก็ได้ครับ แต่วันนี้ผู้เขียนจะเลือก DS3231 มาใช้เนื่องจากตัวนี้สามารถบอกอุณภูมิได้ด้วยนั่นเอง!! เริ่มกันเลย! Wiring ค้นหา I2C Address หลังจากแสกนแล้วจะเจอ 2 Address ตามภาพ ติดตั้ง Library RTC By Makuna LilyGO / esp32-micro-sdcard เปิดตัวอย่าง DS3231_Simple และรัน จะได้ผลได้ภาพครับ ถ้าได้แบบนี้แล้ว แสดงว่าปกติ! ได้ค่าอุณหภูมิ และเวลามาแล้ว!!! ทดสอบ อ่าน/เขียน SDCard รันแล้วจะได้ตัวอย่างดังในภาพ แสดงว่าเราเขียน SDCard ได้แล้ว! เริ่มเขียนโค๊ดกันเลย! RTCSetup RTCSetup เป็นฟังก์ชั่นสำหรับเซ็ตเวลา โดยจะให้เป็นเวลาตอนคอมไพล์โปรแกรม loop อ่าน Sensor และ Date/Time ทุกๆ 500ms โดยเราจะเก็บไว้ในตัวแปร Global เพื่อเก็บไปใช้ในส่วนของ Save ไฟล์ลง SDCard อีกที temperatureC filenamestring datestring timestring บันทึกข้อมูล! โปรแกรมนี้เราจะสร้าง Task ขึ้นมาเพื่อบันทึกข้อมูลลงใน SDCard ครับ ซึ่งกำหนดได้ว่าจะให้บันทึกข้อมูลทุกๆ กี่วินาทีดี ซึ่งโปรแกรมตัวอย่างจะบันทึกค่าทุกๆ 5 วินาที และกระพริบไฟบอก 20ms เพื่อให้รู้ว่ามีการบันทึกข้อมูลแล้ว และเราจะ Delay การ Start Task เป็นเวลา 10วินาที เพื่อรอให้ main โปรแกรมทำงานไปก่อน เพียงเท่านี้เราก็จะได้โปรแกรมที่ทำหน้าที่เก็บข้อมูล Sensor ไว้ใน SDCard ในรูปแบบของไฟล์ CSV แล้ว!!! ซึ่งโค๊ดทั้งหมดจะมีหน้าตาแบบนี้! (สามารถกดโหลดได้โดยการคลิ๊กที่ภาพได้เลย!) ข้อมูลในไฟล์ .csv เปิดดูไฟล์กันหน่อย! จะเห็นว่ามีข้อมูลมาเรียบร้อย… เราลองมา Plot Graph ดูหน่อยดีกว่า! ซึ่งรอบนี้ผมใช้โปรแกรม Numbers (เหมือน Excel) เปิดขึ้นมาทำกราฟ อุณภูมิที่เราเก็บไว้ครับ แจ่มแจ๋วไปเลย! เห็นมั้ยครับ เพียงเท่านี้เราก็มี Data Logger ไว้ใช้งานแล้ว… รอบหน้าเรามาดูกันว่าเราจะเอาไฟล์ .csv ของเราไปทำอะไรกันต่อได้บ้าง! Happy Logging! เลือกซื้อสินค้าได้ที่ร้านของเราที่ https://www.aiiotshop.com

ทำ Data Logger ด้วย TTGo T1 (ESP32) และโมดูล DS3231 Read More »