บทความประกอบการเรียนรู้ => IOT : Internet of Thing (ESP32) => ข้อความที่เริ่มโดย: admin ที่ มกราคม 07, 2019, 10:08:57 PM

หัวข้อ: การเรียนรู้ครั้งที่ 2 [Basic ESP32] การใช้งานพอร์ตในโหมดดิจิทัลเอาท์พุท
เริ่มหัวข้อโดย: admin ที่ มกราคม 07, 2019, 10:08:57 PM
การใช้งานพอร์ตในโหมดดิจิทัลเอาต์พุทเบื้องต้น
ศึกษาการใช้งานพอร์ตในแต่ละขาให้ทำงานในโหมดดิจิทัลเอาต์พุต โดยให้ ESP32 ส่งสัญญาณออกมาทางของพอร์ตที่ต้องการที่เป็นลอจิก 0,1 และใช้ LED ต่อไว้ที่ขาพอร์ตเพื่อแสดงผลของลอจิกที่ส่งออกมา

วงจรที่ใช้ทดลอง
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/1.png)
หน้าตาของชิพ ESP32 เป็นดังรูป
(https://66.media.tumblr.com/ba9fa70a00421cccfb51ae3a8ee48965/tumblr_oacpyvZxj01s5t695o1_1280.png)

และถูกทำขึ้นเป็นผลิตภัณฑ์ที่ใช้ชื่อว่า ESP32-WROOM-32 module
(http://esp32.net/images/Espressif/ESP-WROOM-32/Espressif_ESP-WROOM-32_DiagramPinout.png)

(http://esp32.net/images/Espressif/ESP-WROOM-32/Espressif_ESP-WROOM-32_PhotoTopBottomUnshielded.png)

(http://esp32.net/images/Espressif/ESP-WROOM-32/Espressif_ESP-WROOM-32_PhotoBottom.jpg)

(http://esp32.net/images/Espressif/ESP-WROOM-32/Espressif_ESP-WROOM-32_PhotoTopBottomPerspective2.jpg)

(http://esp32.net/images/Espressif/ESP-WROOM-32/Espressif_ESP-WROOM-32_PhotoOnBreakoutBoard2.jpg)

เพื่อให้ง่ายต่อการนำไปใช้งานเนื่องจากโมดูลต้องการไฟเลี้ยง 3.3V ดังนั้นจึงมีหลายเจ้าที่นำโมดูลนี้ไปสร้างเป็นโมดูล ESP32 ซึ่งภายในจะประกอบด้วย
-ESP32-WROOM-32 module
-ไอซีเรกกูเลต 3.3V โดยรับแรงดันมาจากพอร์ต USB
-ชิพแปลง USB เป็น UART เพื่อใช้ในการอัพโหลดโปรแกรมและการติดต่อสื่อสารแบบอนุกรม
-ชุดควบคุมการเข้าโหมดโปรแกรมตัวเองอัตโนมัติ

สำหรับในการเรียนรู้ชุดนี้เลือกใช้ ESP32 ของ DOIT ซึ่งเป็นโมดูลขนาด 30 ขา (เนื่องจากเป็นที่นิยมมากสุดและราคาต่ำสุด)
ข้อสังเกต Vin,GND และ 3.3V,GND จะอยู่คู่กันและตรงข้ามกันโดยจะอยู่ด้านคอนเน็คเตอร์ USB ดังรูป
(https://user-images.githubusercontent.com/9260214/28747595-19a41090-7471-11e7-826c-42c28ea7ae6e.jpeg)

รายละเอียด(บางส่วนเฉพาะที่ใช้งานบ่อย) ของ ESP32 DOIT
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/pin.png)

การต่อวงจรทดลอง
ในกรณีที่ใช้ BreadBoard ในการต่อวงรทดลอง เมื่อวาง ESP32 DOIT ลง BreadBoard จะเหลือช่องใช้งานเพียงด้านเดียวดังรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/2.jpg)

การแก้ไขทำได้โดยใช้ BreadBoard จำนวน 2 ตัว
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/3.jpg)

กีดตัดกระดาษกาวสองหน้าด้านหลังแยกส่วนแถวไฟเลี้ยงออกดังรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/4.jpg)

นำไปต่อด้านข้างแทน(หรือเอาออกไม่ใช้ก็ได้)
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/5.jpg)

นำเข้ามาประกบเข้าด้วยกัน
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/6.jpg)

วางโมดูล ESP32 ลงจะมีช่องให้ใช้งานทั้งสองด้านดังรูป
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/7.jpg)
หัวข้อ: Re: การเรียนรู้ครั้งที่ 2 [Basic ESP32] การใช้งานพอร์ตในโหมดดิจิทัลเอาท์พุท
เริ่มหัวข้อโดย: admin ที่ มกราคม 07, 2019, 10:26:05 PM

ฟังก์ชั่นที่ใช้งานในการทดลองนี้

รูปแบบ คำอธิบาย
pinMode(pin, mode); pin: หมายเลขขาที่ต้องการเซตโหมด
mode: INPUT, OUTPUT, INPUT_PULLUP
digitalWrite(pin,value); pin: หมายเลข ขาที่ต้องการเขียนลอจิกออกพอร์ต
value: ค่าลอจิกที่ต้องการส่งออก HIGH or LOW
delay(ms); ms: ตัวเลขที่หยุดค้างของเวลาหน่วยมิลลิวินาที (unsigned long)
หมายเหตุ
   1. หมายเลข pin สามารถใช้ตัวเลข GPIO ได้โดยตรง
   2. ขาพอร์ต GPIO34, GPIO35, GPIO36, GPIO39 ใช้งานได้เฉพาะอินพุทเท่านั้น
หัวข้อ: Re: การเรียนรู้ครั้งที่ 2 [Basic ESP32] การใช้งานพอร์ตในโหมดดิจิทัลเอาท์พุท
เริ่มหัวข้อโดย: admin ที่ มกราคม 07, 2019, 10:27:01 PM
การใช้งานพอร์ตในโหมดดิจิทัลเอาต์พุตเบื้องต้น
การใช้งานนี้เป็นการส่งลอจิก 0,1 ออกทางขาพอร์ตการเขียนโค้ดจะเหมือนกับการเขียนใน Arduino นั่นก็หมายถึงต้องใช้ฟังก์ชั่น pinMode ใน setup เพื่อกำหนดให้ขาทำงานในโหมดเอาต์พุต และใช้ digitalWrite เพื่อส่งลอจิกออกทางขาพอร์ตที่ต้องการ

หมายเหตุ
ขาพอร์ต GPIO34, GPIO35, GPIO36, GPIO39 ใช้งานได้เฉพาะอินพุทเท่านั้น

โจทย์การทดลอง
-เชื่อมต่อ LED 4 digit เข้ากับพอร์ตดิจิตอลตามวงจร
-เขียนโปรแกรมไฟวิ่งที่มีรูปแบบและเป็นระเบียบ (ไม่ใช่การติดดับแบบสุ่ม)


วงจรที่ใช้ทดลอง
ผังวงจร
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/1.png)
เมื่อต่อวงจรบน BreadBoard
(https://www.praphas.com/PhotoForum/ESP32/Lab-02-LED/8.jpg)

ตัวอย่างโค้ดโปรแกรม [1]
โค๊ด: [Select]
#define LED1 21
#define LED2 19
#define LED3 18
#define LED4 5
void send2port(char data);
void setup()
{
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
}
void loop()
{
send2port(0b0000);
delay(200);
send2port(0b1111);
delay(200);     
}
void send2port(char data)
{
    digitalWrite(LED1,data & 1 ? 1:0);
    digitalWrite(LED2,data & 2 ? 1:0);
    digitalWrite(LED3,data & 4 ? 1:0);
    digitalWrite(LED4,data & 8 ? 1:0);
}
งานที่มอบหมาย
-เชื่อมต่อ LED 8 digit เข้ากับพอร์ตดิจิตอลโดยให้นักศึกษาออกแบบการเชื่อมต่อเพิ่มเติมจากตัวอย่าง
-เขียนโปรแกรมไฟวิ่งที่มีรูปแบบและเป็นระเบียบ (ไม่ใช่การติดดับแบบสุ่ม)


ตัวอย่างโค้ดโปรแกรม [2]
โค๊ด: [Select]
#define LED1 32
#define LED2 33
#define LED3 25
#define LED4 26
#define LED5 27
#define LED6 14
#define LED7 12
#define LED8 13   
void send2port(char data);
char pattern[]={0b00000000,
                0b00000001,
                0b00000011,
                0b00000111,
                0b00001111,
                0b00011110,
                0b00111100,
                0b01111000,
                0b11110000,
                0b11100000,
                0b11000000,               
                0b10000000,               
                0b00000000,
                0b11111111,
                0b00000000,
                0b11111111,
                0b00000000,
                0b11111111,
                0b10000001,
                0b01000010,
                0b00100100,
                0b00011000,               
                0b00111100,
                0b01111110,
                0b11111111,
                0b01111110,               
                0b00111100,
                0b00011000};
void setup()
{
  Serial.begin(115200);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);
  pinMode(LED6,OUTPUT);
  pinMode(LED7,OUTPUT);
  pinMode(LED8,OUTPUT);
  delay(50); 
}
void loop()
{
  char i;
  for(i=0;i<(sizeof(pattern)/sizeof(char));i++)
  {
  send2port(pattern[i]);
      Serial.println(pattern[i],DEC);
      delay(500);
  }
  for(i=0;i<(sizeof(pattern)/sizeof(char));i++)
  {
      send2port(pattern[i]);
      Serial.println(pattern[i],DEC);
      delay(200);
  }
  for(i=0;i<(sizeof(pattern)/sizeof(char));i++)
  {
      send2port(pattern[i]);
      Serial.println(pattern[i],DEC);
      delay(100);
  }
  for(i=0;i<(sizeof(pattern)/sizeof(char));i++)
  {
      send2port(pattern[i]);
      Serial.println(pattern[i],DEC);
      delay(50);
  }
}
void send2port(char data)
{
    digitalWrite(LED1,data & 1 ? 1:0);
    digitalWrite(LED2,data & 2 ? 1:0);
    digitalWrite(LED3,data & 4 ? 1:0);
    digitalWrite(LED4,data & 8 ? 1:0);
    digitalWrite(LED5,data & 16 ? 1:0);
    digitalWrite(LED6,data & 32 ? 1:0);
    digitalWrite(LED7,data & 64 ? 1:0);
    digitalWrite(LED8,data & 128 ? 1:0);       
}
ผลการรันจากโค้ดตัวอย่าง [1]
https://www.youtube.com/v/zHeLCRcQios
หัวข้อ: Re: การเรียนรู้ครั้งที่ 2 [Basic ESP32] การใช้งานพอร์ตในโหมดดิจิทัลเอาท์พุท
เริ่มหัวข้อโดย: admin ที่ มกราคม 08, 2019, 09:42:45 PM
...
หัวข้อ: Re: การเรียนรู้ครั้งที่ 2 [Basic ESP32] การใช้งานพอร์ตในโหมดดิจิทัลเอาท์พุท
เริ่มหัวข้อโดย: admin ที่ มกราคม 08, 2019, 09:42:57 PM
...