ผู้เขียน หัวข้อ: การเรียนรู้ครั้งที่ 3 [Basic ESP32] การใช้งานพอร์ตอนุกรม  (อ่าน 9087 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
   การสื่อสารผ่านทางพอร์ตอนุกรมเป็นการส่งข้อมูลไปทีล่ะบิตโดยใช้เทคนิคการเลื่อนข้อมูลบนสายสัญญาณเส้นเดียว การส่งข้อมูลแบบอนุกรมนี้จะไม่มีการส่งสัญญาณนาฬิกาจากตัวส่งไปยังตัวรับ แต่จะอาศัยวิธีตั้งค่าความเร็วในการรับส่งสัญญาณให้เท่ากัน ซึ่งเรียกว่า “อัตราบอด” โดยเรียกทับศัพท์ว่า “บอดเรต” (baud rate) ค่าความเร็วมาตรฐานที่พอร์ตอนุกรมส่วนใหญ่สามารถใช้งานได้คือ 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 ค่าความเร็วนี้มีหน่วยเป็นบิตต่อวินาที (bit per second: bps) การส่งข้อมูลจะส่งบิตเริ่มต้น (Start bit) เพื่อส่งสัญญาณบอกให้ภาครับรับรู้ว่าจะมีการส่งข้อมูลไปแล้วในเวลาอันใกล้นี้และเมื่อส่งข้อมูลเสร็จจะส่งบิตหยุด (Stop bit) เป็นบิตปิดท้ายขบวนข้อมูลในไบต์นั้น ๆ


ตำแหน่งขาที่ทำหน้าที่เป็นพอร์ตอนุกรมแบบ UART ของชิพ ESP32 จะเห็นว่ามีพอร์ตอนุกรมอยู่ด้วยกัน 3 พอร์ต


การจัดขาของโมดูล ESP32 รุ่น DevKitC จะมีขาทั้งหมด 38 ขาด้วยกัน และมีพอร์ตอนุกรมครบทั้ง 3 พอร์ตคือ
   1. พอร์ต U0 ขา TXD จะเป็นขา GPIO1 และขา RXD จะเป็นขา GPIO3
   2. พอร์ต U1 ขา TXD จะเป็นขา GPIO10 และขา RXD จะเป็นขา GPIO9
   3. พอร์ต U2 ขา TXD จะเป็นขา GPIO17 และขา RXD จะเป็นขา GPIO16


การจัดขาของโมดูล ESP32 รุ่น DOIT จะมีขาทั้งหมด 30 ขาด้วยกัน และมีพอร์ตอนุกรมเพียง 2 พอร์ตเท่านั้นคือ
   1. พอร์ต U0 ขา TXD จะเป็นขา GPIO1 และขา RXD จะเป็นขา GPIO3
   2. พอร์ต U2 ขา TXD จะเป็นขา GPIO17 และขา RXD จะเป็นขา GPIO16

« แก้ไขครั้งสุดท้าย: มกราคม 15, 2019, 09:34:47 AM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์

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

รูปแบบ คำอธิบาย
pinMode(pin, mode); pin: หมายเลขขาที่ต้องการเซตโหมด
mode: INPUT, OUTPUT, INPUT_PULLUP
digitalWrite(pin,value); pin: หมายเลข ขาที่ต้องการเขียนลอจิกออกพอร์ต
value: ค่าลอจิกที่ต้องการส่งออก HIGH or LOW
delay(ms); ms: ตัวเลขที่หยุดค้างของเวลาหน่วยมิลลิวินาที (unsigned long)

รูปแบบ คำอธิบาย
Serial.begin(speed); ฟังก์ชั่นกำหนดอัตราเร็วของการสื่อสารทางพอร์ตอนุกรม
ค่าความเร็วได้แก่ 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, หรือ 115200
Serial.available(); ฟังก์ชั่นตรวจสอบว่ามีข้อมูลเข้ามายังพอร์ตอนุกรมหรือไม่
Serial.read(); ฟังก์ชั่นอ่านข้อมูลที่เข้ามายังพอร์ตอนุกรม
Serial.write(); ฟังก์ชั่นส่งข้อมูลขนาด 8 bit ต่อการส่ง 1 ครั้ง
โดยข้อมูลที่ส่งจะเป็นข้อมูลที่อยู่ในตัวแปรที่เป็นชนิด char หรือ byte
Serial.print(); ฟังก์ชั่นส่งข้อมูลที่รองรับข้อมูลทุกชนิด เมื่อส่งเสร็จเคอร์เซอร์จะรออยู่ท้ายข้อมูลที่ส่งออกไป
Serial.prinln(); ฟังก์ชั่นส่งข้อมูลที่รองรับข้อมูลทุกชนิด เช่นเดียวกับ .print ต่างกันตรงที่ เมื่อส่งเสร็จเคอร์เซอร์จะขึ้นบรรทัดใหม่
หมายเหตุ
   1. หมายเลข pin สามารถใช้ตัวเลข GPIO ได้โดยตรง
   2. ขาพอร์ต GPIO34, GPIO35, GPIO36, GPIO39 ใช้งานได้เฉพาะอินพุทเท่านั้น
« แก้ไขครั้งสุดท้าย: มกราคม 08, 2019, 10:20:33 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
วงจรที่ใช้ในการทดลอง
   การเรียนรู้ในครั้งนี้เป็นการเรียนรู้การเขี้ยนโปรแกรมเพื่อใช้งานการสื่อสารผ่านพอร์ตอนุกรม ทั้งที่มีการส่งและรับข้อมูลเข้ามายังบอร์ดเพื่อควบคุมการทำงานต่าง ๆ วงจรที่ใช้งานเป็นดังรูป โดยใช้พอร์ตอนุกรม U0 เนื่องจากเป็นพอร์ตที่มีวงจรแปลงสัญญาณจาก UART เป็น USB ไว้อยู่แล้ว ซึ่งปกติจะใช้พอร์ตนี้ในการโปรแกรมตัวเองเมื่อผู้ใช้กด Upload ในโปรแกรม Arduino IDE


ตัวอย่างโปรแกรมที่ 1
   ส่งค่าสถานะของ LED ที่เชื่อมต่อใช้งานจำนวน 4 ตัว ออกทางพอร์ตอนุกรมเพื่อแสดงผลหน้าจอคอมพิวเตอร์ด้วยโปรแกรม Serial monitor ของ Arduino IDE
โค๊ด: [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);
  Serial.begin(9600);
}
void loop() {
  for(byte i=0;i<15;i++){
    send2port(i);
    Serial.print("Status of LED is :");
    Serial.println(i,BIN);
    delay(500);
  }
}
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);
}

ตัวอย่างโปรแกรมที่ 2
   รับค่าเข้ามาทางพอร์ตอนุกรมเพื่อควบคุมการทำงานของ LED โดยค่าที่รับมาควบคุมเป็นข้อมูลตัวเลข 1, 2, 3, 4 ที่ส่งจากโปรแกรม Serial monitor ของ Arduino IDE (ให้ตั้งค่าเป็น No Line Ending)
โค๊ด: [Select]
#define LED1 21
#define LED2 19
#define LED3 18
#define LED4 5
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  for (byte i = 0; i < 100; i++) {
    Serial.print(".");
    delay(200);
    if (Serial.available()) {
      char inChar = Serial.read();
      digitalWrite(LED1, inChar == '1' ? 1 : 0);
      digitalWrite(LED2, inChar == '2' ? 1 : 0);
      digitalWrite(LED3, inChar == '3' ? 1 : 0);
      digitalWrite(LED4, inChar == '4' ? 1 : 0);
      Serial.println();
      Serial.print("Data received is: ");
      Serial.println(inChar);
    }
  }
  Serial.println();
}
<a href="https://www.youtube.com/v/QXu1JbhzonE" target="_blank" class="new_win">https://www.youtube.com/v/QXu1JbhzonE</a>
« แก้ไขครั้งสุดท้าย: มกราคม 15, 2019, 10:52:34 AM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
...

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
...

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
...