ATtiny85/45 ทำไฟวิ้ง 12 ดวง

แนวความคิดของบทความนี้เกิดมาจากในกลุ่ม Arduino Thailand มีสมาชิกโพสว่าใช้ MCU ตัวเล็ก มี I/O เพียง 5 ขา แต่สามารถควบคุม LED ได้ถึง 20 ดวง จากแนวความคิดนั้นจึงได้นำมาย่อให้วงจรเล็กลง และควบคุมหลอด LED ได้น้อยจำนวนลง เพื่อลดความยุ่งยากของวงจร และการเขียนโค้ดที่่งายมากยิ่งขึ้น

สมาชิกที่โพสนั้น ใช้ภาษา C# ในอัดโปรแกรมลง IC แต่ในบทความนี้จะใช้ภาษา C# แบบ Arduino ควบคุมได้ดีแบบเดียวกัน แต่โค้ดยุ่งยากกว่าเล็กน้อย

เริ่มต่อวงจร

วงจร LED

วงจร LED

ATtiny45-85

ขาต่อใช้งานไอซี ATtiny45 / 85

จากวงจรจะเห็นได้ว่า เราจะใช้การควบคุมสถานะ Output ของ MCU มาควบคุมให้ LED ดวงที่ต้องการสว่างขึ้นมา ด้วยการกำหนด Pin ใดๆเป็น High และ Pin ใดๆ เป็น LOW ตัวอย่าง หากต้องการให้ D4 ติดสว่าง ต้องใช้การควบคุมให้ Pin P1 LOW และ Pin P2 HIGH และ Pin อื่นๆให้ตั้ง Pin mode INPUT & LOW

ตัวอย่างการควบคุมให้ D4 ติดสว่าง โดยกำหนด P1 เป็นลอจิก 1 และ P2 ลอจิก 2

ซอฟแวร์

เมื่อจะต้องการให้หลอด LED ใดๆติดสว่าง จำเป็นต้องตั้งพินโหมด และสถานะใหม่ให้กับทุกๆพิน และจากหลักการด้านบนทำให้พอตออกมาเป็นตารางได้ดังนี้

โดย

  • H แทนด้วยโหมด Output และสถานะ High
  • L แทนด้วยโหมด Output และสถานะ Low
  • Z แทนด้วยโหมด Input และสถานะ Low

ทำให้หากต้องการให้ LED D1 ติดสว่าง ต้องใช้โค้ดเพื่อตั้งโหมดและสถานะดังนี้

 pinMode(0, OUTPUT);
 digitalWrite(0, HIGH);
 pinMode(1, INPUT);
 digitalWrite(1, LOW);
 pinMode(2, OUTPUT);
 digitalWrite(2, LOW);
 pinMode(3, INPUT);
 digitalWrite(3, LOW);
 pinMode(4, INPUT);
 digitalWrite(4, LOW);

รวมแล้ว ต้องใช้โค้ดดังนี้ เพื่อให้ LED ทุกดวงวิ้งไปจนสุดและเริ่มใหม่ วนไปเรื่อยๆ

/* 12 LED */

int delaytime = 10;

void setup() {                
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  pinMode(0, OUTPUT);
  digitalWrite(0, HIGH);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, OUTPUT);
  digitalWrite(0, HIGH);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, INPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, OUTPUT);
  digitalWrite(0, HIGH);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
  pinMode(1, INPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  
  delay(delaytime);
  
  pinMode(0, INPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  pinMode(2, INPUT);
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  digitalWrite(3, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  
  delay(delaytime);
}

จะได้ผลออกมาแบบนี้ครับ

ขอบคุณบทความ Charlieplexing the Arduino ที่เป็นข้อมูลให้ผู้เขียนนำมาประยุกต์ใช้งานกับไอซีขนาดเล็กๆนี้ได้ครับ

https://www.youtube.com/watch?v=b_k7wpoPqLQ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *