กระทู้เมื่อเร็วๆ นี้

หน้า: 1 ... 7 8 [9] 10
81
IOT : Internet of Thing (ESP32) / Re: การเรียนรู้ครั้งที่ 4 [Basic ESP32] การใช้งาน PWM
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 27, 2019, 03:18:36 PM »
...
83
IOT : Internet of Thing (ESP32) / Re: ....
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 20, 2019, 08:50:31 PM »
วงจรที่ใช้ทดลอง


ตัวอย่างโปรแกรม [1] วนตรวจสอบสถานะที่ขาพอร์ต
   โปรแกรมอ่านค่าสถานะของขาพอร์ตที่เชื่อมต่อกับสวิตช์กดติดปล่อยดับ แล้วแสดงสถานะที่อ่านได้แสดงผลที่ LED
โค๊ด: [Select]
#define LED1 21
#define LED2 19
#define LED3 18
#define LED4 5
#define SW1 27
#define SW2 14
#define SW3 12
#define SW4 13
void setup(){
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SW3, INPUT_PULLUP);
  pinMode(SW4, INPUT_PULLUP);
}
void loop(){
  digitalWrite(LED1, digitalRead(SW1));
  digitalWrite(LED2, digitalRead(SW2));
  digitalWrite(LED3, digitalRead(SW3));
  digitalWrite(LED4, digitalRead(SW4));
  delay(50);
}
ตัวอย่างโปรแกรม [2] ใช้การอินเตอร์รัพท์
   โปรแกรมทดสอบการใช้งานการอินเตอร์รัพท์ภายนอก โดยรับจากสวิตช์ที่ต่อไว้ที่ขา GPIO27
โค๊ด: [Select]
struct Button {
  const uint8_t PIN;
  uint32_t numberKeyPresses;
  volatile bool pressed;
};
Button SW = {27, 0, false};
void IRAM_ATTR isr() {
  SW.pressed = true;
}
void setup() {
  pinMode(SW.PIN, INPUT_PULLUP);
  attachInterrupt(SW.PIN, isr, FALLING);
  Serial.begin(9600);
}
void loop() {
  for (byte i = 0; i < 20; i++) {
    Serial.print(".");
    delay(100);
    if (SW.pressed) {
      SW.numberKeyPresses += 1;
      Serial.printf("\nSwitch has been pressed %u times\n", SW.numberKeyPresses);
      SW.pressed  = false;
      return;
    }
  }
  Serial.println();
}
84
IOT : Internet of Thing (ESP32) / Re: ....
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 20, 2019, 08:22:31 PM »

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

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

รูปแบบ คำอธิบาย
attachInterrupt(pin, ISR, mode); ฟังก์ชั่นเปิดการใช้งานอินเตอร์รัพท์ภายนอก
pin: หมายเลขขาพอร์ตที่ต้องการรับสัญญาณอินเตอรรัพท์
ISR: ชื่อฟังก์ชั่นรองที่ใช้ตอบสนองการอินเตอร์รัพท์
mode: เป็นการกำหนดลักษณะของสัญญาณที่ใช้กระตุ้นการอินเตอร์รัพท์
->LOW เมื่อขาเป็นลอจิกศูนย์
->CHANGE เมื่อขามีการเปลี่ยนระดับลอจิก 1->0, 0->1
->RISING เมื่อขามีการเปลี่ยนระดับลอจิกจาก 0 ไปเป็น 1
->FALLING เมื่อขามีการเปลี่ยนระดับลอจิกจาก 1 ไปเป็น 0
หมายเหตุ
   1. หมายเลข pin สามารถใช้ตัวเลข GPIO ได้โดยตรง
   2. ขาพอร์ต GPIO34, GPIO35, GPIO36, GPIO39 ใช้งานได้เฉพาะอินพุทเท่านั้น
85
การใช้งานพอร์ตในโหมดดิจิทัลอินพุทและการใช้งานอินเตอร์รัพท์บื้องต้น
   ขาพอร์ตของ ESP32 ทุกขาสามารถใช้งานเป็นอินพุทพอร์ตได้และทุกขาก็สามารถใช้งานในส่วนอินเตอร์รัพท์แบบภายนอกได้ การเขียนโปรแกรมรับค่าเข้ามาเพื่อประมวลผลสามารถทำได้ 2 แนวทางคือ
   1. แบบ Polling เป็นการเขียนโปรแกรมแบบวนตรวจสอบลอจิกที่ขาพอร์ต การเขียนโปรแกรมลักษณะนี้จะอ่านค่าจากขาพอร์ตด้วยฟังก์ชั่น digitalRead
   2. แบบ Interrupt เป็นการเขียนโปรแกรมที่เปิดให้ยอมรับการรับสัญญาณการขัดจังหวะจากภายนอกได้

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

(a) การใช้งานตัวต้านทานพูลอัพภายนอก ใช้ฟังก์ชั่น pinMode(pin,INPUT);
(b) การใช้งานตัวต้านทานพูลอัพภายใน ใช้ฟังก์ชั่น pinMode(pin,INPUT_PULLUP);
หมายเหตุ ขาพอร์ต GPIO34,35,36,39 ต้องใช้ตัวต้านทานพูลอัพภายนอกเท่านั้น

วิธีการใช้งานพอร์ตดิจิทัลอินพุท
  เป็นการใช้งานพอร์ตที่ต้องวนอ่านสถานะลอจิกที่ขาพอร์ต การใช้งานพอร์ตให้ทำงานเป็นอินพุทพอร์ตมี 2 ฟังก์ชั่นที่เกี่ยวข้องคือ
1. ฟังก์ชั่นกำหนดโหมดให้เป็นอินพุทพอร์ต โดยจะวางฟังก์ชั่นนี้ไว้ใน void setup() ตัวอย่างฟังก์ชั่นใช้งานได้แก่
     pinMode(pin,INPUT)   ;     // กำหนดขาพอร์ตให้ทำงานเป็นอินพุทพอร์ตแบบไม่ใช้ตัวต้านทานพูลอัพภายใน
     pinMode(pin,INPUT_PULLUP)   ;   // กำหนดขาพอร์ตให้ทำงานเป็นอินพุทพอร์ตแบบใช้ตัวต้านทานพูลอัพภายใน
2. ฟังก์ชั่นอ่านค่าสถานะลอจิกที่ขาพอร์ต ซึ่งฟังชั่นนี้จะส่งค่ากลับมา 2 ค่าคือ HIGH,LOW  การจะใช้งานฟังก์ชั่นนี้ได้จะต้องใช้ฟังก์ชั่นกำหนดโหมดขาให้เป็นอินพุทก่อน ตัวอย่างฟังก์ชั่นใช้งานได้แก่
     bool status=digitalRead(pin)   ;     // เป็นฟังก์ชั่นการอ่านสถานะที่ขา pin มาไว้ในตัวแปลชื่อว่า status ซึ่งประกาศเป็นตัวแปรชนิด boolean ไว้

ธรรมชาติของสัญญาณที่ได้จากสวิตช์และวิธีแก้ไข
   วงจรสวิตช์ที่ใช้งานทั่วไปเป็นสวิตช์แบบที่ใช้แรงกดจากปลายนิ้วของผู้ใช้งาน โครงสร้างภายในเป็นหน้าสัมผัสซึ่งการกดการปล่อยในแต่ละครั้งจะก่อให้เกิดสัญญาณกระเด้งกระดอน(ฺBounce) ดังรูป


หากไมโครคอนโทรลเลอร์ทำงานด้วยความเร็วสูงมากจะเข้าใจว่ามีการกดหลายครั้ง การแก้ไขสามารถทำได้ 2 วิธีการคือ
1. แก้ด้วยซอฟต์แวร์ โดยหน่วงเวลาให้พ้นช่วงสัญญาณเบาส์แล้วอ่านใหม่หากยังเป็นลอจิกเดิมแสดงว่าเป็นการกดสวิตช์
2. แก้ด้วยฮาร์ดแวร์ โดยใช้ตัวเก็บประจุคร่อมสวิตช์เพื่อให้สัญญาณเบาส์หายไปดังรูป


วิธีการใช้งานการอินเตอร์รัพท์ภายนอก
   เป็นวิธีการรู้สถานะของขาพอร์ตโดยไม่ต้องวนอ่านสถานะ เพียงแต่ต้องกำหนดให้ไมโครคอนโทรลเลอร์เปิดระบบให้ยอมรับการอินเตอร์รัพท์ได้ โดยฟังก์ชั่นการเปิดการยอมรับการอินเตอร์รัพท์นี้จะวางไว้ใน void setup() ฟังก์ชั่นนี้คือ
attachInterrupt(pin, ISR, mode);
    pin: หมายเลขขาพอร์ตที่ต้องการรับสัญญาณอินเตอรรัพท์
    ISR: ชื่อฟังก์ชั่นรองที่ใช้ตอบสนองการอินเตอร์รัพท์
    mode: เป็นการกำหนดลักษณะของสัญญาณที่ใช้กระตุ้นการอินเตอร์รัพท์
        ->LOW เมื่อขาเป็นลอจิกศูนย์
        ->CHANGE เมื่อขามีการเปลี่ยนระดับลอจิก 1->0, 0->1
        ->RISING เมื่อขามีการเปลี่ยนระดับลอจิกจาก 0 ไปเป็น 1
        ->FALLING เมื่อขามีการเปลี่ยนระดับลอจิกจาก 1 ไปเป็น 0
รูปแบบของสัญญาณอินเตอร์รัพท์ที่ตอบสนองเป็นดังรูป


ขาพอร์ตที่มีให้ใช้งาน
86
IOT : Internet of Thing (ESP32) / Re: ....
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 16, 2019, 10:10:07 PM »
ตัวอย่างโปรแกรม [1]
   เป็นโปรแกรมที่ควบคุมความสว่างของ LED จำนวน 1 ตัวที่ต่ออยู่ที่ขา GPIO21 โดยให้ LED ค่อย ๆ สว่างขึ้นจนสว่างสูงสุดแล้วค่อย ๆ หรี่ลงจนดับสนิท
โค๊ด: [Select]
#define LED1 21
/* setting PWM properties */
const int freq = 5000;
const byte ledChannel = 0;
const byte resolution = 8;
void setup(){
  ledcSetup(ledChannel, freq, resolution);
  ledcAttachPin(LED1, ledChannel);
}
void loop(){
  for(int duty = 0; duty <= 255; duty++){   
    ledcWrite(ledChannel, duty);
    delay(15);
  }
  for(int duty = 255; duty >=0; duty--){   
    ledcWrite(ledChannel, duty);
    delay(15);
  } 
}
ตัวอย่างโปรแกรม [2]
   โปรแกรมไฟวิ่งลักษณะฝนดาวตก โดยเป็นไฟวิ่งที่มีความสว่างต่างกัน การกำหนดความสว่างในโปรแกรมนี้ใช้ resolution ขนาด 8 บิตดังนั้นค่าที่กำหนดความสว่าง (Duty cycle) จะมีค่าระหว่าง 0-255 จะทำให้ LED ดับสนิทจนถึงสว่างสูงสุด การกำหนดความสว่างใช้วิธีสร้างเก็บไว้ในตัวแปรอาเรย์ที่ชื่อว่า fade ดังรูป


เมื่อส่งค่าออกไปยังขาพอร์ตให้ส่งไปที่ละจังหวะเรียงกันไปดังรูป


โค๊ด: [Select]
#define LED1 21
#define LED2 19
#define LED3 18
#define LED4 5
byte fade[] = {0,0,0,0,200,255, 200, 150, 100, 50, 10, 0, 0, 0,0};
void setup() {
  ledcSetup(0, 5000, 8);          /*ledcSetup(Channel,Freq,Resolution)  */
  ledcSetup(1, 5000, 8);
  ledcSetup(2, 5000, 8);
  ledcSetup(3, 5000, 8);
  ledcAttachPin(LED1, 0);         /*ledcAttachPin(Pin,Channel)          */
  ledcAttachPin(LED2, 1);
  ledcAttachPin(LED3, 2);
  ledcAttachPin(LED4, 3);
}
void loop() {
  for (int i = 0; i < 11; i++) {
    ledcWrite(0, fade[i]);
    ledcWrite(1, fade[i + 1]);
    ledcWrite(2, fade[i + 2]);
    ledcWrite(3, fade[i + 3]);
    delay(75);
  }
}
<a href="https://www.youtube.com/v/wXS1C54mV4k" target="_blank" class="new_win">https://www.youtube.com/v/wXS1C54mV4k</a>
87
IOT : Internet of Thing (ESP32) / Re: ....
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 16, 2019, 09:51:02 PM »

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

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

รูปแบบ คำอธิบาย
ledcSetup(channel,freq,resolution); ฟังก์ชั่นกำหนดค่าใน Timer
-channel หมายเลขช่องของ Timer ใช้งานได้ 16 ช่องค่า 0-15
-freq ค่าความถี่ที่ใช้สร้างสัญญาณ PWM
-resolution ค่าความละเอียดของ Duty cycle 1-16 bit
เช่นถ้าใช้ 8 bit ค่า Duty cycle ที่กำหนดจะมีค่า 0-255 หมายถึง 0-100%
ledcAttachPin(GPIO, channel); ฟังก์ชั่นกำหนดขาพอร์ตที่ใช้งานกับช่องของ Timer
-GPIO หมายเลขขาพอร์ตที่ใช้งาน
-channel หมายเลขช่องของ Timer ที่เลือกใช้งานกับขาพอร์ตที่ระบุ
ledcWrite(channel, dutycycle) ฟังก์ชั่นสั่งการให้ Timer สร้างสัญญาณ PWM
-channel หมายเลขช่องของ Timer ที่ต้องการสั่งการ
-dutycycle ค่า Duty cycle ที่ต้องการให้ Timer สร้างขึ้น
หมายเหตุ
   1. หมายเลข pin สามารถใช้ตัวเลข GPIO ได้โดยตรง
   2. ขาพอร์ต GPIO34, GPIO35, GPIO36, GPIO39 ใช้งานได้เฉพาะอินพุทเท่านั้น
88
IOT : Internet of Thing (ESP32) / การเรียนรู้ครั้งที่ 4 [Basic ESP32] การใช้งาน PWM
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 16, 2019, 09:50:32 PM »
   การควบคุมพลังงานที่จ่ายให้กับโหลดให้ลดการทำงานลงจากการทำงานปกติ เช่น การลดความสว่างของ LED การลดความเร็วของมอเตอร์ไฟฟ้ากระแสตรง หากใช้วิธีการลดค่าแรงดันที่จ่ายให้ก็สามารถทำได้แต่ผลที่เกิดขึ้นคือจะเกิดกำลังงานสูญเสียไปที่วงจรลดค่าแรงดันนั้น ๆ ซึ่งถ้าหากโหลดใช้กระแสสูงวงจรจะเกิดความเสียหายได้งาน วิธีการแก้ไขคือการเปลี่ยนแปลงจังหวะการส่งกำลังงานให้กับโหลดแทนซึ่งตามจินนาการตามทฤษฎีแล้วจะไม่มีกำลังงานสูญเสียที่วงจรควบคุมเลย การควบคุมลักษณะนี้เป็นการผสมคลื่นทางความกว้างที่เรียกว่า PWM (Pulse Width Modulation) โดยความกว้างของคลื่นจะเปลี่ยนแปลงแต่ความถี่ยังคงเดิม อัตราส่วนระหว่างช่วงคลื่นที่มีแรงดันต่อคาบเวลาคลื่นเรียกว่า Duty cycle ดังรูป


   แต่เนื่องจาก ESP32 ขาพอร์ตไม่มีวงจร PWM โดยตรงมาให้ดังนั้นคำสั่ง analogWrite(); จึงใช้ไม่ได้กับ ESP32 ณ ปัจจุบันนี้ (มกราคม 2019)
  การใช้งานจึงต้องใช้วงจร Timer มาช่วยการทำงานแทนการใช้งาน PWM ใช้การทำงานของ Timer มีฟังก์ชั่นการใช้งานอยู่ 3 ฟังก์ชั่นคือ
   1. ledcSetup(Channel, freq, resolution);   กำหนดค่าการทำงานของวงจรไทเมอร์
   2. ledcAttachPin(GPIO, Channel);            กำหนดขาพอร์ตที่ใช้เชื่อมต่อกับวงจรไทเมอร์
   3. ledcWrite(Channel, dutyCycle);           กำหนดค่า Duty cycle กับวงจรไทเมอร์

วงจรที่ใช้ในการทดลอง
   การเรียนรู้ครั้งนี้เป็นตัวอย่างการใช้งาน PWM ส่งออกขาพอร์ตซึ่งต่อใช้งานให้เป็นตัวอย่างเพียง 4 ขาเท่านั้น การเชื่อมต่อเป็นดังรูป

89
IOT : Internet of Thing (ESP32) / Re: ลายปริ้นวงจรบอร์ดทดลอง IOT รุ่น ESP32 [V.2019.1]
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 11, 2019, 01:35:31 PM »
ตัวอย่างการประกอบลงแผ่น PCB (แผ่นวงจรสั่งโรงงานผลิต)






90
IOT : Internet of Thing (ESP32) / Re: ลายปริ้นวงจรบอร์ดทดลอง IOT รุ่น ESP32 [V.2019.1]
« กระทู้ล่าสุด โดย admin เมื่อ มกราคม 11, 2019, 01:35:18 PM »
ESP32 DOIT DevKit สั่งจากต่างประเทศ
จะได้ราคาถูกกว่าในไทย แต่จะใช้เวลานานกว่าค่อนข้างมากโดยปกติไม่เกิน 15 วัน สามารถสั่งผ่าน Shopee ได้ที่
https://shopee.co.th/Official-DOIT-ESP32-Development-Board-WiFi-Bluetooth-Ultra-Low-Power-Consumption-Dual-Core-ESP-32-ESP-32S-ESP-32-Similar-i.59553004.1486438240
หน้า: 1 ... 7 8 [9] 10