ATtiny85 PWM หรี่ความสว่างหลอดไฟ LED
พื้นฐาน ATtiny85 PWM
ATtiny85 ช่วยให้เราสามารถสร้างเอาท์พุทแบบอะนาล็อกโดยใช้ PWM (Pulse Width Modulation) ATtiny85 มีตัวจับเวลา 2 ตัว ที่สามารถใช้เพื่อสร้างสัญญาณ PWM
คือ ตัวจับเวลา 0 ซึ่งเป็นตัวจับเวลา 8 บิตที่สามารถแก้ไขเฟสและ PWM ที่รวดเร็วที่ใช้สำหรับฟังก์ชั่นเช่น delay () และ millis () และ ตัวจับเวลา 1 ซึ่งเป็นตัวจับเวลา 8 บิตอีกตัวสามารถรับ PWM สองตัวได้อย่างรวดเร็วพร้อมกับเอาต์พุตเสริม
ATtiny85 ใช้ออสซิลเลเตอร์ภายในที่ทำงานที่ 8 MHz ซึ่งปรับขนาดเป็น 1 MHz ตามค่าเริ่มต้น ดังนั้น ATtiny85 มีตัวนับสองตัว / ตัวนับแต่ละตัวมีตัวเปรียบเทียบ PWM สองตัว (OCR0A, OCR0B, OCR1A และ OCR1B) ดังนั้นในทางทฤษฎีเราควรจะได้รับเอาต์พุต PWM ได้ถึงสี่ตัว แต่ดูที่ตารางด้านล่างมันชัดเจนว่าเราไม่สามารถลองทั้ง OC0B และ OC1A
PWM ที่มีความละเอียด 8 bit หรือ ปรับได้ 255 ระดับ ดังนั้นค่าสัญญาณ 0 โวลต์ถึง 5 โวลต์ จะถูกแสดงเป็นสัญญาณแบบดิจิตอล จะได้ 0 ถึง 255 ซึ่งเราสามารถเทียบสัดส่วนคำนวนจากเลขจริง เป็น เลขทางดิจิตอลได้ดังนี้
เมื่อพิจารณาถึงพื้นฐานการใช้งานขาต่างๆของ ATtiny85 แล้ว การใช้งานเอาต์พุต PWM สามารถใช้งานได้ที่ขา PB0 และ PB1 โดยใช้ฟังก์ชั่น “analogWrite” ในการควบคุมระดับความสว่างของ LED ด้วยการเชื่อมต่อกับขาใดขาหนึ่งของช่องสัญญาณ PWM และใช้คำสั่ง “analogWrite” เพื่อควบคุมรอบการทำงาน และสามารถใช้งานอินพุตได้ที่ขา PB2, PB3 , PB4 (A1 ถึง A3)
ทดสอบ หรี่ความสว่างหลอดไฟ LED ด้วย ATtiny85 PWM
ขั้นตอนการทํางาน
1 : ทำเครื่องโปรแกรม AVR เพื่อใช้อัพโหลดโปรแกรม
ขั้นตอนการใช้บอร์ด Arduino UNO เป็น เครื่องเขียนโปรแกรม ตามลิงค์ด้านล่าง
2 : อัพโหลดโปรแกรมให้กับ ATtiny85
เปิดโปรแกรม Arduino IDE เขียนโปรแกรมและอัพโหลดโค้ดด้านล่างนี้ ไปที่ ATtiny85
const int ledPin = 1;
const int potPin = 3;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(potPin, INPUT);
}
void loop() {
int potReading = analogRead(potPin); // 0 to 1023
int val = map(potReading, 0, 1023, 0, 255); // 0 to 255
analogWrite(ledPin, val);
}
ตั้งค่าในการ Upload
อัพโหลดโค้ด ลงโปรแกรมให้บอร์ด ATtiny85 โดย คลิกที่ Upload
รอจนกระทั่งขึ้น Done uploading. ที่แถบด้านล่าง แสดงว่าเราอัพโหลดโปรแกรมลงบอร์ด ATtiny85 ได้สำเร็จแล้ว
3 : เชื่อมต่ออุปกรณ์เข้ากับ ATtiny85 ตามวงจรด้านล่าง
4 : ผลลัพธ์การทำงาน
ผลของการทำงาน โดยสามารถปรับความสว่างหลอดไฟ LED ได้โดยการหมุนปรับค่า ตัวต้านทานปรับค่าได้ Potentiometer (VR 10KR)
ทดสอบโดย หมุน โพเทนซิโอมิเตอร์ (Potentiometer) ตัวต้านทานปรับค่าได้ 10K Ohm หรืออาจจะเรียกสั้นๆว่า “pot” ซึ่งเป็นอุปกรณ์ที่มีสามขา ปรับค่าได้ ที่ต่ออยู่ที่ขา PB3 ของ ATtiny85 เมื่ออ่านค่าอินพุท แบบ อนาล็อก (Analog) แล้วเก็บค่าไว้ในตัวแปร potReading
แต่เนื่องจาก การแปลงค่าจาก อนาล็อก เป็น ดิจิตอล (Analog to Digital Converter) หรือเรียกสั้นๆว่า ADC ของ ATtiny85 นั้นเป็น ADC ขนาด 8 bit จึงอ่านค่า Analog ได้ตั้งแต่ 0 – 1023 แต่ค่า PWM (Pulse Width Modulation) ที่ต้องการ มีค่าระหว่าง 0 – 255 จึงต้องแปลงค่า เพื่อทำการสเกลค่าลงจาก 0 – 1023 ให้เป็น 0 – 255 แล้วนำไปเก็บไว้ในตัวแปร val
ส่วนที่ขา PB1 เป็นเอาท์พุท ที่ส่งค่า PWM ตามค่าแปร val ซึ่งมีค่าระหว่าง 0 – 255 ให้กับ LED เพื่อให้ LED สว่างตามการปรับค่าตัวต้านทานปรับค่าได้ Potentiometer (VR 10KR)
5 : อธิบายโค้ด
ส่วนประกอปของโปรแกรม หรือ ที่เรียกว่า Sketch มี 2 ส่วน คือ ฟังก์ชั่น setup และ ฟังก์ชั่น loop สามารถอธิบายรูปแบบการทำงานของโปรแกรมได้ดังนี้
เมื่อเริ่มต้นทำงาน ATtiny85 จะทำตามคำสั่งต่างๆที่อยู่ในฟังก์ชัน “setup” เป็นจำนวน 1 รอบ โดยคำสั่งต่างๆที่จะเขียนในฟังก์ชันนี้ ส่วนมากจะเป็นการกำหนดค่าเริ่มต้น การกำหนดหน้าที่ของแต่ละขา หรือคำสั่งต่างๆที่ต้องการเรียกใช้เพียงแค่ครั้งแรกครั้งเดียว หลังจากที่จบฟังก์ชัน “setup” จะไม่มีการย้อนกลับมาทำคำสั่งในนี้อีก ส่วนฟังก์ชัน loop จะทำงานต่อจาก setup โดยใน loop นี้จะเป็นการทำตามคำสั่งแบบวนซ้ำ คือ ทำงานตามคำสั่งบรรทัดแรกไปเรื่อยๆจนถึงบรรทัดสุดท้าย แล้ว วน กลับมาเริ่มทำที่บรรทัดแรกใหม่อีกครั้ง เป็นเช่นนี้ไปเรื่อยๆ
อธิบายการทำงานของโปรแกรม
ประกาศตัวแปร ขาที่เชื่อมต่อกับ LED โดย const คือค่าคงที่ int คือชนิดของข้อมูลเป็น เลขจำนวนเต็ม ชื่อของตัวแปรคือ ledPin และกำหนดให้เป็น 1 คือ ขา PB1 ของ ATtiny85
const int ledPin = 1;
ประกาศตัวแปร ขาที่เชื่อมต่อกับตัวต้านทานปรับค่าได้ Potentiometer (VR 10KR) โดย const คือค่าคงที่ int คือชนิดของข้อมูลเป็น เลขจำนวนเต็ม ชื่อของตัวแปรคือ potPin และกำหนดให้เป็น 3 คือ ขา PB3 ของ ATtiny85
const int potPin = 3;
จุดเริ่มต้นทำงานของ ฟังก์ชัน setup โดย void หมายความว่าไม่มีการคืนค่าใดๆ กลับออกไปจากฟังก์ชั่น และไม่มีการรับค่าใดๆ เข้ามาในฟังก์ชัน ซึ่งส่วนนี้จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น เป็นส่วนคำสั่งหรือสเตตเมนต์ (Statement) จะเป็นส่วนที่เก็บคำสั่งต่างๆ ที่จะให้โปรแกรมเรื่มต้นในการทำงาน ในการตั้งค่า กำหนดค่า ต่างๆ โดยเริ่มต้นด้วยเครื่องหมายปีกกาเปิด {
void setup() {
กำหนดให้โหมดทำงานของ ledPin หรือ ขา PB1 ของ ATtiny85 เป็นการทำงานแบบเอาท์พุท คือ ส่งออกข้อมูล
pinMode(ledPin, OUTPUT);
กำหนดให้โหมดทำงานของ potPin หรือ ขา PB3 ของ ATtiny85 เป็นการทำงานแบบอินพุท คือ รับข้อมูลเข้า
pinMode(potPin, INPUT);
จบด้วยเครื่องหมายปีกกาปิด } ของฟังก์ชั่น setup
}
จุดเริ่มต้นทำงานของ ฟังก์ชัน loop โดยเริ่มต้นด้วยเครื่องหมายปีกกาเปิด {
void loop() {
ประกาศตัวแปร potReading ชนิดของข้อมูลเป็น int คือเลขจำนวนเต็ม รับข้อมูลการอ่านค่าจากตัวแปร potPin คือ อ่านค่าอนาล็อก จากขา PB3 ของ ATtiny85 ซึ่งมีค่าระหว่าง 0 – 1023 มาเก็บไว้ที่ตัวแปร potReading
int potReading = analogRead(potPin);
ประกาศตัวแปร val ชนิดของข้อมูลเป็น int คือเลขจำนวนเต็ม รับข้อมูลจากการแปลงค่าจาก potReading โดยใช้ map ซึ่งเป็นคำสั่งที่ใช่ในการแปลงค่าในช่วงต่างๆ ให้อยู่ในช่วงตามที่เราต้องการ รูปแบบคือ map(ค่าที่ต้องการแปลง , ค่าต่ำสุดของตัวตั้งต้น , ค่าสูงสุดของตัวตั้งต้น , ค่าต่ำสุดของตัวที่ต้องการแปลง , ค่าต่ำสุดของตัวที่ต้องการแปลง ); เพื่อทำการสเกลค่าลงจาก 0 – 1023 ให้เป็น 0 – 255 แล้วนำไปเก็บไว้ในตัวแปร val
int val = map(potReading, 0, 1023, 0, 255);
analogWrite คือการเขียนค่า แบบอนาล็อก โดยให้ ledPin หรือ ขา PB1 เป็นเอาท์พุท PWM ส่งข้อมูลออก ตามค่าตัวแปร val ซึ่งมีค่าระหว่าง 0 – 255 ไปให้กับ LED เพื่อให้ LED สว่างตามการปรับค่าของตัวต้านทานปรับค่าได้ Potentiometer (VR 10KR) นั่นเอง
analogWrite(ledPin, val);
จบด้วยเครื่องหมายปีกกาปิด } ของฟังก์ชั่น loop
}
6 : อุปกรณ์ที่ใช้ในโปรเจค
- 1. ATtiny85 ATTINY85-20PU 8-bit AVR
- 2. Jumper (M2M) 20cm Male to Male
- 3. หลอดไฟ LED 5mm สีแดง
- 4. รีซิสเตอร์ 220 OHM 1/4W 5%
- 5. Breadboard 830 Point MB-102
- 6. ตัวต้านทานปรับค่าได้ 10K Ohm
- 7. รีซิสเตอร์ 1K Ohm 1/4W 5%
- 8. 100NF 0.1UF Film Capacitor
- 9. CR2025 CR2032 3V Battery Socket Holder
- 10. CR2025 3V Lithium Button Coin Battery