Categories
บทความ

ESP32 Font ภาษาไทยสำหรับจอ LCD

    ในบทความนี้จะแสดงตัวอย่างการสร้าง Font จากโปรแกรม BM Font แปลง Font ที่ได้ไปเป็น Array ภาษาซี และใช้งาน Library font ภาษาไทย สำหรับแสดงผลบนจอ LCD โดยใช้ ESP32 บน Eclipse + esp-idf

ขาสัญญาณของ ESP32 ที่ใช้เชื่อมต่อกับ LCD ILI9341 มีดังนี้

ขา ESP32 ขาของจอ LCD
GPIO12 MISO
GPIO13 MOSI
GPIO14 SCK
GPIO15 CS
GPIO23 DC
GPIO22 RESET
GPIO21 LED Backlight

    วิธีการสร้าง Bitmap font จากโปรแกรม BM Font มีขั้นตอนดังนี้
เริ่มต้นด้วยการเปิดโปรแกรม BM Font ขึ้นมา แล้วเลือกที่เมนู Option -> Font settings แล้วเลือก Font ที่ต้องการแปลงในช่อง Font หรือเลือก Font ที่ไม่ได้ติดตั้งในเครื่องโดยกดที่ปุ่ม Add font file
ทำเครื่องหมายในช่อง OEM แล้วเลือก Font เป็น Thai กำหนดขนาดของ Font ตรง Size โดยขนาดที่เรากำหนดจะเป็นขนาดความสูงของ Font มีหน่วยเป็น Pixel หลังจากที่ตั้งค่าต่างๆเสร็จแล้วก็กดที่ปุ่ม OK

    ขั้นตอนต่อไปคือการเลือกตัวอักษรที่ต้องการแปลงไปเป็น Bitmap font โดยคลิกซ้ายที่ตัวอักษรที่ต้องการใช้งานให้ครบทุกตัว หรือหากต้องการแปลง Font ทุกตัวอักษรให้คลิกขวาแล้วเลือกที่ Select marked subset(s)

  หลังจากนั้นให้คลิกที่เมนู Option -> Export option เพื่อกำหนดรูปแบบของ Font ที่ต้องการแปลง โดยต้องกำหนดขนาดของ Texture ให้ครอบคลุมกับตัวอักษรที่เลือก ตรง File format ในช่อง Textures ให้เลือกเป็น png- Portable Network Graphic หลังจากที่ตั้งค่าต่างๆเสร็จแล้วให้คลิดปุ่ม OK

    หากต้องการดูตัวอย่างรูปของ Font ที่ต้องการแปลง ให้เลือกที่เมนู Option -> Visualize จะมีหน้าต่าง Preview รูปของ Bitmap font ออกมา

    เมื่อตั้งค่าต่างๆเสร็จแล้ว ให้คลิกที่เมนู Option -> Save bitmap font as เพื่อบันทึก Font ที่ต้องการแปลงเป็นรูปภาพ เมื่อคลิดแล้วโปรแกรมจะให้เราตั้งชื่อไฟล์ ในตัวอย่างนี้จะตั้งชื่อไฟล์ว่า loma40 ตาม Font และความสูงที่เลือกไว้ Output ของโปรแกรมนี้จะมีอยู่ 2 ไฟล์คือ loma40.fnt และ loma40.png โดยไฟล์ .fnt จะเป็นตัวเก็บรายละเอียดของตัวอักษรแต่ละตัว ส่วนไฟล์ .png จะเป็น bitmap ที่ได้จาก Font ที่เราแปลง ตัวอย่างดังรูป

    การเลือกใช้ Font มีข้อสำคัญอย่างหนึ่งคือ ต้องเลือก Font ที่สามารถพิมพ์สระได้โดยไม่มีวงกลมแสดงหน้าสระ ตัวอย่างของ Font Loma ที่สามารถพิมพ์สระได้โดยไม่มีวงกลมแสดงหน้าสระ https://www.micro.in.th/esp32-font-converter/national.7z

    หลังจากได้ไฟล์ .fnt และ .png มาแล้ว ให้เข้าไปที่หน้า https://www.micro.in.th/esp32-font-converter เพื่อทำการแปลงไฟล์ Bitmap font ไปเป็น Array ในภาษาซี สำหรับนำไปใช้กับ esp-idf เมื่อเข้าไปที่หน้าเว็บแปลงไฟล์แล้ว ให้เลือกไฟล์ .fnt และ .png แล้วกดปุ่ม Convert ตัว Server ก็จะทำหน้าที่แปลงไฟล์ Bitmap font ไปเป็น Array แล้วให้เราบันทึกไฟล์ดังกล่าวลงบนคอมพิวเตอร์ หลังจากนั้นก็นำไฟล์ดังกล่าวเข้าไปในโปรเจคของ esp-idf ที่สร้างจาก Eclipse เพื่อเรียกใช้ Font จากไฟล์ดังกล่าว
    สำหรับการเรียกใช้งาน Font นั้นทำได้โดยดูจากตัวอย่างดังนี
ใส่ extern const char loma40px[]; ในไฟล์ที่ต้องการใช้ Font ภาษาไทย หรือจะใส่ไว้ใน header file แล้ว include ไปใช้งานก็ได้

#define BLINK_GPIO 2

extern const char loma40px[];

void app_main()
{
    gpio_pad_select_gpio(BLINK_GPIO);
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);

    ili9341_init();

    ili9341_fill_bar(COLOR_WHITE, 0, 0, 240, 320);

    thaifont_set_font((char*)&loma40px);
    while(1) {
        ili9341_fill_bar(COLOR_YELLOW, 0, 0, 240, 120);
        thaifont_set_color(COLOR_RED);
        thaifont_draw_text((char*)"Hello world", 5, 0);
        thaifont_set_color(COLOR_GREEN);
        thaifont_draw_text((char*)"สวัสดีชาวโลก", 5, 40);
        thaifont_set_color(COLOR_BLUE);
        thaifont_draw_text((char*)"0123456789", 5, 80);

        /* Blink off (output low) */
        gpio_set_level(BLINK_GPIO, 0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        ili9341_fill_bar(COLOR_CYAN, 0, 0, 240, 120);
        thaifont_set_color(COLOR_GREEN);
        thaifont_draw_text((char*)"0123456789", 5, 0);
        thaifont_set_color(COLOR_BLUE);
        thaifont_draw_text((char*)"Hello world", 5, 40);
        thaifont_set_color(COLOR_RED);
        thaifont_draw_text((char*)"สวัสดีชาวโลก", 5, 80);

        /* Blink on (output high) */
        gpio_set_level(BLINK_GPIO, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

Download source code จาก https://www.micro.in.th/files/esp32/ili9341_thai_font.7z

Categories
บทความ

เชื่อมต่อ ESP32 กับจอ LCD TFT 2.8″

ตัวอย่างการเชื่อมต่อ ESP32 กับจอ LCD 2.8″ โดยตัว TFT Controller จะใช้เบอร์ ILI9341 Interface ของจอจะเป็น SPI โดยขาของ ESP32 ที่ใช้เชื่อมต่อกับจอมีดังนี้

ขา ESP32 ขาของจอ LCD
GPIO12 MISO
GPIO13 MOSI
GPIO14 SCK
GPIO15 CS
GPIO23 DC
GPIO22 RESET
GPIO21 LED Backlight

รูปภาพที่จะนำมาทดสอบกับจอ LCD จะทำการแปลงจากไฟล์รูปภาพบนคอมโดยใช้โปรแกรม LCD Image Converter สามารถดาวน์โหลดได้จาก http://www.riuson.com/lcd-image-converter

ขั้นตอนการ Convert รูปภาพ เพื่อนำไปใช้กับ esp-idf v4.0.1 มีดังนี้
เปิดโปรแกรม LCD Image Converter ขึ้น แล้วเลือกที่เมนู File -> New Image

หลังจากนั้นให้เลือกที่เมนู Image -> Import แล้วเลือกรูปที่ต้องการ Convert

หลังจากนั้นให้เลือกที่เมนู Option -> Conversion แล้วเลือกที่ Tab Image โดยตั้งค่า Block size = 16 bit, Byte order = Big-Endian เสร็จแล้วกดปุ่ม OK ข้อสังเกตุการจัดเรียงข้อมูลในหน่วยความจำของ ESP32 เป็นแบบ Little endian ดังนั้น Byte order ของโปรแกรมนี้น่าจะสลับกันอยู่

หลังจากนั้นให้เลือกที่เมนู File -> Convert All เพื่อแปลงรูปภาพไปเป็น Array ในภาษาซี

หลังจากที่ Convert รูปภาพไปเป็น Array ภาษาซีแล้ว ให้คัดลอกไฟล์ดังกล่าวไปไว้ในโปรเจคที่สร้าง Eclipse หรือ สร้างเองจาก esp-idf ตัวอย่าง Source code โปรเจคดาวน์โหลดได้จาก https://www.micro.in.th/files/esp32/test_ili9341.7z

 

Categories
บทความ

SAMA5D4 Xplained Ultra Flash Image

ขั้นตอนการ Flash ไฟล์ Image ของบอร์ด SAMA5D4 Xplained Ultra

  • ใส่ Jumper  JP7 เพื่อไม่ให้บอร์ด boot จาก NAND Flash แล้วเสียบสาย Micro USB เข้ากับ J11 แล้วก็เสียบเข้ากับ Computer
  • หากยังไม่ได้ติดตั้ง Driver ให้ทำการติดตั้ง USB Driver เสียก่อน เปิด Device Manager ขึ้นมาเพื่อดูว่าบอร์ดต่ออยู่กับพอร์ทอะไร
  • ต่อไปให้เปิดโปรแกรม SAM-BA เวอร์ชั่น 2.17 ขึ้นมา เลือกพอร์ทที่เชื่อต่อ และบอร์ดที่จะใช้เป็น at91sama5d4x-explained แล้วคลิกปุ่ม Connect
  • หลังจากเชื่อมต่อกับบอร์ดได้แล้ว ให้คลิกที่ Tab NandFlash เลือก Enable NandFlash ตรงช่อง Scripts และคลิกที่ปุ่ม Execute เพื่อให้เริ่มการทำงานของ NandFlash
  • หลังจากนั้นในช่อง Scripts ให้เลือก Erase All แล้วคลิกปุ่ม Execute เพื่อลบข้อมูลใน NAND Flash
  • ขั้นตอนต่อไปคือการ Enable PMECC ให้เลือก Enable OS PMECC parameters ที่ช่อง Scripts แล้วคลิกที่ปุ่ม Execute
  • เสร็จแล้วก็ตั้งค่า PMECC โดยเลือก Pmecc Configuration แล้วคลิกที่ปุ่ม Execute จะมีหน้าต่างการตั้งค่า ECC ขึ้นมา ให้ตั้งค่าตามรูปแล้วคลิกที่ปุ่ม OK
  • ต่อไปเป็นการเขียนไฟลื AT91 Bootstap ไปยัง NAND Flash โดยเลือก Send Boot File ในช่อง Script คลิกที่ปุ่ม Execute แล้ว browse ไปหาไฟล์ at91bootstrap-sama5d4_xplained.bin แล้วคลิกที่ปุ่ม Open
  • ขั้นตอนต่อไปคือการเขียนไฟล์ uboot ไปยัง NAND Flash ในช่อง Address ให้ใส่ 0x40000 แล้ว browse ไปหาไฟล์ u-boot-sama5d4-xplained.bin แล้วคลิกที่ปุ่ม Send File
  • ต่อไปเป็นการเขียนไฟล์ dtb ไปยัง NAND Flash ในช่อง Address ให้ใส่เป็น 0x180000 แล้ว browse ไปหาไฟล์ at91-sama5d4_xplained_hdmi.dtb แล้วคลิกที่ปุ่ม Send File
  • ต่อไปเป็นการเขียนไฟล์ Linux kernel ไปยัง NAND Flash ในช่อง Address ให้ใส่เป็น 0x200000 แล้ว browse ไปยังไฟล์ zImage-sama5d4-xplained.bin แล้วคลิกที่ปุ่ม Send File
  • ไฟล์สุดท้ายที่จะเขียนลงไปยัง NAND Flash คือ rootfs หรือ root file system ในช่อง Address ให้ใส่ค่าเป็น 0x800000 แล้ว browse ไปหาไฟล์ atmel-qt5-demo-image-sama5d4-xplained.ubi แล้วคลิกที่ปุ่ม Send File และรอจนกว่าการเขียนไฟล์จะเสร็จ

หลังจากเขียนไฟล์ทุกไฟล์ลงไปยัง NAND Flash แล้ว ให้กดปุ่ม Reset เพื่อเริ่มการ boot จาก NAND Flash ในระหว่างการเขียนไฟล์ สามารถดูสถานะต่างๆจาก Debug terminal โดยใช้ USB to Serial ต่อเข้ากับ J1 และใช้โปรแกรม Putty เป็น terminal และถ้า Boot เสร็จแล้วก็สามารถ Login จาก Debug terminal ได้ โดยใช้ชื่อ user คือ root

Categories
บทความ

การใช้ Timer ทำระบบรดน้ำอัตโนมัติ

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

อุปกรณ์ต่างที่ใช้ทำระบบรดน้ำอัตโนมัติมีดังนี้ครับ

  • Timer 12V DC ใช้สำหรับเป็นตัวตั้งเวลาว่าจะให้เปิดน้ำตอนกี่โมง ปิดกี่โมง โดย Timer ในบทความนี้ สามารถตั้งค่าโปรแกรมได้ 16 โปรแกรม
  • Solenoid Valve ใช้เป็นตัวเปิดปิดน้ำ โดยควบคุมจากตัว Timer อีกทีหนึ่ง
  • Power supply สำหรับจ่ายไฟเลี้ยงให้กับ Timer
  • กล่องใส่ Power supply และ Timer เพื่อป้องกันไม่ให้โดนน้ำฝน กรณีที่ติดตั้งไว้นอกบ้าน
  • สายไฟสำหรับต่อ Power supply เข้ากับไฟบ้าน และต่อจาก Timer ไปหา Solenoid valve
  • ข้อต่อและวาวล์ขนาด 1/2″ สำหรับต่อท่อ PE เข้ากับท่อน้ำ PVC
  • ท่อ PE สำหรับส่งน้ำไปให้สปริงเกอร์ ในบทความนี้จะใช้ขนาด 20mm
  • ตัวล็อคท่อ PE เข้ากับข้อต่อ ขนาด 20mm
  • สายไมโคร PE สำหรับเชื่อต่อสปริงเกอร์เข้ากับท่อ PE ขนาด 4/7mm
  • ข้อต่อมินิสปริงเกอร์ สำหรับเชื่อมต่อสายไมโคร PE เข้ากับท่อ PE
  • ตัวเจาะท่อ PE หรือจะใช้ดอกสว่าน 3mm เจาะแทนก็ได้ครับ
  • ขายึดมินิสปริงเกอร์ หรือจะใช้ไม้ หรือเหล็กยึดแทนก็ได้ครับ
  • เทปพันเกลียวสำหรับพันเกลียวของข้อต่อต่างๆ
  • หัวมินิสปริงเกอร์ เลือกขนาดและแบบตามที่ต้องการ

ขั้นตอนการทำระบบรดน้ำอัตโนมัติ

  • ยึด Power supply เข้ากับกล่อง แล้วทำการเดินสายไฟให้กับ Power supply โดยสายไฟจะมีอยู่ 3 ชุดคือสายไฟจาก Power supply 220V ไปหาไฟบ้าน สายไฟ 12V จาก Power supply ไปเลี้ยง Timer สายไฟจาก Timer ต่อไปหา Solenoid valve
  • เชื่อมต่อวาวล์ปิด/เปิดน้ำเข้ากับท่อน้ำ และต่อ Solenoid valve เข้ากับวาวล์ ปิด/เปิด น้ำ และต่อข้อต่อท่อ PE ขนาด 20mm เข้ากับ Solenoid valve
  • เสียบท่อ PE เข้ากับข้อต่อ PE แล้วใช้ตัวล็อคท่อ PE ล็อคท่อให้แน่น กันท่อ PE หลุดออกจากข้อต่อ
  • ตัดสายไมโคร PE ให้มีความยาวพอดีกับตัวยึดมินิสปริงเกอร์ เสียบสายไมโคร PE เข้ากับมินิสปริงเกอร์ แล้วเสียบสายไมโคร PE อีกด้านเข้ากับข้อต่อมินิสปริงเกอร์ แล้วเจาะท่อ PE แล้วนำข้อต่อมินิสปริงเกอร์เสียบเข้าไปที่ท่อ PE
  • ทำการยึดมินิสปริงเกอร์เข้ากับขายึด หรือเหล็กที่ทำขึ้น แล้วทำการเปิด Timer ให้ ON ในโหมด Manual โดยการกดปุ่ม Manual จนกว่าตัวหนังสือ ON ที่หน้าจอติดขึ้นมา เปิดวาวล์น้ำแล้วปรับให้ความแรงของมินิสปริงเกอร์จ่ายน้ำในรัศมีที่กำหนดเป็นอันว่าใช้งานได้แล้วครับ
  • ขั้นตอนต่อไปก็คือการตั้งเวลาให้ Timer จ่ายน้ำอัตโนมัติ โดยผมจะตั้งไว้ที่ Program 1 สำหรับจ่ายน้ำตอนเช้า โดยกดปุ่มที่โปรแกรม แล้วกดปุ่ม Hour/Min ตั้งเวลาสำหรับ ON เช่นให้เริ่มจ่ายน้ำที่ 7:00 ก็ให้กดปุ่ม Hour เป็น 7 และกดปุ่ม Min ให้เป็น 00 แล้วก็ตั้งเวลาให้หยุดจ่ายน้ำโดยกดปุ่ม Program ให้แสดง Off แล้วกดปุ่ม Hour/Min ตั้งเวลาหยุดจ่ายน้ำตามที่ต้องการครับ สำหรับใครที่ต้องการรดน้ำหลายๆครั้งในหนึ่งวัน สามารถกดปุ่ม Prog เพื่อตั้งเวลาของโปรแกรมอื่นๆอีกได้ 16 โปรแกรมครับ

รูปตัวอย่างอุปกรณ์ต่างๆที่ใช้สำหรับทำระบบรดน้ำอัตโนมัต

Timer 12V และ Power supply ที่ติดอยู่ในกล่องกันน้ำฝน

หัวมินิสปริงเกอร์ แบบปรับแรงดันได้

ข้อต่อมินิสปริงเกอร์สำหรับเชื่อต่อสายไมโคร PE เข้ากับท่อ PE

ตัวล็อคท่อ PE เข้ากับข้อต่อ

ข้อต่อท่อ หรือข้องอ PE ขนาด 20mm และอีกด้านเป็นแบบเกลียวนอก 1/2″

ตัวเจาะท่อ PE หากไม่มีสามารถใช้ดอกสว่านเจาะแทนได้

เทปพันเกลียวสำหรับพันเกลียวข้อต่อให้แน่น

Solenoid valve 12V สำหรับ ปิด/เปิด น้ำโดยใช้ไฟฟ้า

ท่อ PE ขนาด 20mm

สายไมโคร PE ขนาด 4/7mm

Categories
บทความ

แนะนำบอร์ด Orange Pi 2G-IOT

Orange Pi เพิ่งเปิดตัวบอร์ด Orange Pi 2G-IOT เป็นบอร์ด Embedded รองรับ OS ubuntu linux และ android ราคาที่เปิดตัวออกมาคือ $9.90 Interface หลักๆของบอร์ดมีดังนี้ Wifi + Bluetooth, USB, LCD, CSI, Micro SD Card, และ Module GSM 2G ถึงแม้ว่า Module 2G อาจจะใช้งานไม่ได้ในบ้านเราในอนาคต แต่ด้วยราคาที่เปิดตัวมาที่ $9.90 และได้ Wifi + Bluetooth มาใช้งาน ก็ถือว่าคุ้มค่ามากครับ

Orange Pi 2G-IOT Specification:

  • SoC – RDA Micro 8810PL ARM Cortex A5 processor @ up to 1.0 GHz with 2Gbit (256 MB) on-chip LPDDR2 RAM, 4Gbit (512 MB) on-chip SLC NAND flash , 256KB L2 cache, Vivante GC860 3D GPU, and GSM/GPRS/EDGE Modem
  • External Storage – micro SD slot
  • Display I/F – LCD connector up to qHD resolution
  • Video – Decoding up to 1080p30, encoding up to 1080p30 H.264
  • Audio I/F – 3.5mm audio +FM jack
  • Connectivity – WiFi 802.11 b/g/n + Bluetooth 2.1/EDR module (RDA5991), and 2G GSM/GPRS/EDGE module with SIM card slot
  • Camera – MIPI CSI-2 connector for camera sensor up to 2MP
  • USB – 1x USB host port, 1x micro USB OTG port
  • Expansion – 40-pin GPIO header with SPI, I2C, ADC, GPIOs, PWM, etc…
  • Debugging – 3x pin UART for serial console
  • Misc – 8 selection jumpers, power button, boot selection header
  • Power Supply – 5V via micro USB port; optional battery
  • Dimensions – 68 x 42 mm