You are on page 1of 22

การพัฒนาหุ่นยนต์เพื'อ

การศึกษา

การเชื'อมต่อ ADC และ


I2 C

ดร.วิวฒั น์ ทวีทรัพย์
GPIO อินพุต/เอาต์พุต

• Outline
• สัญญาณ Analog
• การอ่านค่า Analog จากเซนเซอร์
• การแปลงสัญญาณ Analog เป็น Digital เพื่อนำข้อมูลไปประมวลผล
• การ map ค่าสัญญาณ เพื่อให้ได้ Output ตามต้องการ
• การเชื่อมต่อ รับ ส่งข้อมูล ด้วย interface แบบ I2C และ SPI
• การเชื่อมต่ออุปกรณ์กับบอร์ดด้วย interface I2C
อินพุตแบบแอนะล็อก (Analog Input)
• สัญญาณอินพุตส่วนใหญ่จะเป็นสัญญาณ Analog เช่น ความดังเสียง
ความชื้น ความดัน ความเข้าแสง การแปลสัญญาณเหล่านี้ไปเป็น
Digital จึงต้องใช้อุปกรณ์ที่เรียกว่า Analog-to-Digital Converter
หรือ ADC
• ค่าที่ได้เมื่อแรงดันอินพุต (Analog) ที่ 0 โวลท์ จะให้ค่าที่ได้จาก ADC
เท่ากับ 0 แบบ Digital
• ส่วนเมื่อแรงดันอินพุต (Analog) ที่ 3.3 โวลท์ จะได้ค่าที่ได้จาก ADC
เท่ากับ 1023 แบบ Digital
• สรุป “NodeMCU จะรับค่าอินพุตแบบ Analog แล้วแปลงสัญญาณ
เป็น Digital จะได้ค่าที่วัดออกมา 0 – 1023 ตามระดับความแรงของ
สัญญาณ Analog”
อินพุตแบบแอนะล็อก (Analog Input)
ตำแหน่งของพิน ADC บนบอร์ด NodeMCU หรือจะสังเกตุเห็น A0 ที่
บอร์ด
Workshop 6 อินพุตแบบแอนะล็อก
(Analog Input)
ทดสอบการรับค่าอินพุตแบบ Analog ต่อวงจรตามภาพ

150 Ω
Workshop 6 อินพุตแบบแอนะล็อก
(Analog Input)
ใช้ Serial monitor เพื่อตรวจสอบค่าที่อ่านได้
void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(500);
}
Workshop 7 ปรับความถี่การกะพริบของ
LED ด้วยค่าความเข้มแสง
เมื่อเราสามารถอ่านค่าความเข้มแสงได้แล้วใน workshop 6 และใน
workshop 7 นี้จะนำไปควบคุมการกะพริบของหลอด LED
Workshop 7 ปรับความถี่การกะพริบของ
LED ด้วยค่าความเข้มแสง
int ldr = A0;
int ldr_value = 0;
int led_pin = D1;
void setup()
{
Serial.begin(9600);
pinMode(led_pin, OUTPUT);
}
void loop()
{
ldr_value = analogRead(ldr);
Serial.println(ldr_value);

digitalWrite(led_pin, HIGH);
delay(ldr_value);
digitalWrite(led_pin, LOW);
delay(ldr_value);
}
Workshop 7 ปรับความถี่การกะพริบของ
LED ด้วยค่าความเข้มแสง
จากนั้นจงหา ค่าต่ำสุด และสูงสุดที่อ่านได้จาก
LDR ว่ามีค่าเป็นเท่าไร ด้วยการใช้ Serial
Monitor ?
จะพบว่า
ยิ่งค่าที่อ่านได้มาก การกะพริบของ LED ยิ่งช้าลง
ยิ่งค่าที่อ่านได้น้อย การกะพริบของ LED ยิ่งเร็วขึ้น

ถ้าหากต้องการให้การกะพริบของ LED ช้ากว่า


ค่าสูงสุดที่อ่านได้ต้องทำอย่างไร
Workshop 8 การปรับแต่งค่าช่วงเอาต์พุต
ด้วย map
จาก workshop ที่แล้วเมื่อเราได้ค่าต่ำสุด และสูงสุด ที่อ่านได้จาก LDR
ต่ำสุดประมาณ 10 สูงสุดประมาณ 754 เราจะนำมา map เป็น 100 –
1500 จากการใช้คำสั่ง
Workshop 8 การปรับแต่งค่าช่วงเอาต์พุต
ด้วย map int ldr = A0;
int ldr_value = 0;
int led_pin = D1;
int ldr_map;
void setup()
{
Serial.begin(9600);

pinMode(led_pin, OUTPUT);
}

void loop()
{
ldr_value = analogRead(ldr);
ldr_map = map(ldr_value, 10, 754, 100,
1500);
Serial.print(ldr_value);
Serial.print(" map to ");
Serial.println(ldr_map);

digitalWrite(led_pin, HIGH);
delay(ldr_map);
digitalWrite(led_pin, LOW);
delay(ldr_map);
}
Workshop 8 การปรับแต่งค่าช่วงเอาต์พุต
ด้วย map

สรุป การใช้คำสั่ง map เป็นการปรับแต่งค่าอินพุต


เพื่อให้ได้ย่านเอาต์พุตตามที่ต้องการ

10 => 100
.
.
100 => 1000
การสื่อสารระหว่างโมดูลด้วย I2C
I2C ย่อมาจาก Inter- Integrated Circuit ถูกพัฒนาโดย Philips ต่อมา
ได้ควบรวมกิจการกลายเป็น NXP Semiconductor ในปัจจุบัน
• I2C เป็นอินเทอร์เฟส (Interface) ที่สื่อสารอนุกรมแบบซิงโครนัส
(Synchronous Serial Communication) เหมาะสำหรับการส่ง
ข้อมูลที่ไม่ใหญ่มาก ความเร็วระดับปานกลาง นิยมใช้กับ เซนเซอร์
ต่างๆ เช่น LCD Display, RFID, NFC เป็นต้น
การสื่อสารระหว่างโมดูลด้วย I2C
การสื่อสารด้วย I2C จะใช้สายสัญญาณ 2 เส้นคือ
• SCL (Serial Clock Line) เป็นการส่งสัญญาณนาฬิกาเพื่อควบคุม
จังหวะการรับส่ง
• SDA (Serial Data Line) ใช้ในการรับส่งข้อมูล
การสื่อสารระหว่างโมดูลด้วย I2C
โดยหลักการทำงานของ I2C เป็นการสื่อสารแบบทางเดียว (half-
duplex Communication) จะมีการกำหนดฝั่ง Master เป็นฝั่งที่ส่ง
ข้อมูล และ Slave เป็นฝั่งรับข้อมูล มีขั้นตอนในการสื่อสารดังนี้
1. เมื่อ Master ต้องการส่งข้อมูลจะมีการดึงสัญญาณ หรือ Pull
Down SDA ลงเป็น LOW ในขณะที่ SCL ยังเป็น HIGH สถานะนี้
เรียกว่า Start Condition คล้ายกับการกดปุ่มที่วิทยุสื่อสารเพื่อ
เริ่มต้นพูดส่งข้อความ
2. Master ส่ง ID หรือ Address ของอุปกรณ์ที่ต้องการจะสื่อสารทาง
SDA
3. Master ส่งสัญญาณว่าจะ Read หรือ Write ทาง SDA และเริ่มส่ง
ข้อมูล
การสื่อสารระหว่างโมดูลด้วย I2C
ตัวอย่างเช่น NodeMCU ต้องการส่งข้อความเป็น Text ไปยัง LCD
ขั้นตอนมีดังนี้
1. Master จะส่ง Address 0x3F ไปที่ Slave ซึ่งเป็น LCD
2. Slave ที่เป็น LCD รับทราบแล้วตอบรับ
3. Master ส่งข้อมูลที่เป็น Text ไปแสดง

0x3F
0x25 0x26
LCD Display และชุด I2C LCD Controller
• จอแสดงผล LCD จะประกอบไปด้วย 2 โมดูลหลักคือ
1. โมดูล LCD1602 เป็นส่วนที่ใช้ในการแสดงผลขนาด 2 บรรทัด แต่
ละบรรทัดแสดงผลได้ 16 ตัวอักษร
2. โมดูล I2C LCD Controller ทำหน้าที่รับส่งข้อมูลจาก NodeMCU
ประกอบไปด้วยสาย 4 เส้น คือ SDA SCL VCC และGND
LCD Display และชุด I2C LCD Controller
• ถ้าหากไม่มีโมดูล I2C LCD Controller จะสามารถต่อ LCD ได้ดัง
ภาพ

• จะเห็นว่าจะต้องเชื่อมต่อสายหลายเส้นกว่าจะสั่งงาน LCD ได้


LCD Display และชุด I2C LCD Controller
• เมื่อมี I2C LCD Controller แล้วจะเหลือสายที่เชื่อมต่อกับ
NodeMCU เพียง 4 เส้น คือ SDA SCL VCC และGND
การติดตั้ง Library LiquidCrystal_I2C
1. ไปที่ Sketch => Include Library => Manager Libraries...
2. ค้นหาคำว่า LiquidCrystal_I2C
3. กดปุ่ม Install
Workshop 9 การเชื่อมต่อโมดูล LCD กับ
NodeMCU
Workshop 9 การเชื่อมต่อโมดูล LCD กับ
NodeMCU
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลอง
เปลี'ยนAddress 0x3F เป็ น 0x27 (Address ของ. LCD จะกําหนดโดยผูผ้ ลิต)

void setup()
{
Wire.begin(D2, D1); // กําหนดขา SDA = D2 และ SCL = D1
lcd.init();
lcd.backlight(); // เปิ ดไฟ backlight
lcd.setCursor(4, 0); // ไปที'ตวั อักษรที' 4 บรรทัดที' 0
lcd.print("LCD ESP8266");
lcd.setCursor(2, 1); // ไปที'ตวั อักษรที' 2 บรรทัดที' 1
lcd.print(”IoT");
}

void loop()
{
}

You might also like