Microcontroller C Code Sample

Arduino ไฟวิ่งฝนดาวตก

หลังจากได้ซื้อบอร์ด Freeduino V1.16 จากป๋าช้างมา ผมว่า Arduino มันเล่นง่ายจริงๆ นะ สไตล์การเขียนโค๊ดเหมือนพวก processing ผมไม่แน่ใจว่าเค้าเรียกการเขียนโค๊ดแบบนี้ เค้าเรียกว่าอะไร รู้แค่ว่า Arduino มันมีฟังก์ชั่นหลักอยู่ 2 ฟังก์ชั่น คือ void setup() และ void loop() แค่สองฟังก์ชั่นที่เค้าบังคับ เท่านั้่น ก็สามารถสั่งให้ Arduino ทำงานได้แหละ

แบบนี้ ก็ลองกันสักหน่อย แน่นอนครับ โค๊ดแรกเลย ต้องทำไฟกระพริบให้ได้ก่อน เพราะจะได้เป็นการเช็คว่า เราสามารถโปรแกรมลงบนบอร์ดได้จริง แต่วันนี้ พิเศษสักหน่อย เราจะมาทำไฟวิ่งฝนดาวตกกันครับ

Arduino มีโค๊ดที่เป็นตัวอย่างค่อนข้างเยอะ แล้วก็ค่อนข้างจะครบถ้วนให้เราศึกษางานทางด้าน Embedded System เราก็จะนำตัวอย่างโค๊ดของ Arduino ที่ชื่อว่า Fading มาทำการประยุกต์ในการทำไฟวิ่งฝนดาวตก กัน

หลักการคร่าวๆ ก็คือ ในการทำให้หลอด LED สว่างมาก-น้อย เราจะทำการเปลี่ยนแปลงแรงดันขาออก ให้อยู่ในรูบ Analog output ซึ่งที่ขาของ digital output แล้วไม่สามารถทำได้ตรงๆ แต่เราสามารถเปลี่ยนแปลงแรงดันค่าเฉลี่ยได้ ด้วยหลักการของ PWM ซึ่งเมื่อเราเปลี่ยนแปลงค่า %duty cycle แล้วจะทำให้เสมือนว่า แรงดันเฉลี่ยที่ออกมาดูเหมือนเปลี่ยนแปลงตามไปด้วย ด้วยผลลัพธ์นี้ เมื่อเรานำมาขับหลอด LED เราจะเห็นว่า หลอด LED ดูเหมือน สว่างมาก สว่างน้อย ตามการเปลี่ยนเปลงของ %duty cycle

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

ชมตัวอย่างงานที่เค้าทำขายกันจริงๆ จากคลิปวีดีโอครับ

วิดีโอ YouTube


มาเริ่มกันเลยดีกว่า ที่บอร์ด Arduino จะมีขา digital out ที่เป็น PWM ให้เรา 6 pin ครับ ไ้ด้แก่ PIN 11,10,9,6,5,3 ดูจากรูปด้านล่าง เราก็เอาหลอด LED ต่อที่ขาดังกล่าวเลยครับ โดยเรียนลำดับขาตาม ลำดับหมายเลข PIN นะครับ เพื่อเวลาที่โปรแกรมทำงาน ไฟจะได้ติดดับตามลำดับ ที่เราออกแบบไว้ที่โค๊ด หน่ะครับ

ในส่วนของโค๊ด ผมได้ศึกษาจากโค๊ดตัวอย่างเรื่อง Fading แล้วก็มาประยุกต๋เอาครับ ในที่นี้ ผมได้ต่อที่หลอด LED เข้าที่ขา PIN PWM ทั้ง 6 PIN
โดยกำหนดให้ ลำดับการต่อหลอด LED เรียงตามลำดับ PIN PWM ของ Arduino

ต่อมา ผมก็มานั่งคิดตารางการเรียงลำดับการไหลของ ไฟวิ่งฝนดาวตก ก่อนครับ แต่ถ้าใครคิดในหัวออกได้ ก็ตามใจครับ ค่าที่กำหนดได้สูงสุด ไม่เกิน 255 นะครับ เพราะที่ขา PWM นี้ มีความละเอียดแค่ 8 บิต ครับ ( 2^8 = 256 ไม่คิดเครื่องหมาย)



โค๊ด Arduino ไฟวิ่งฝนดาวตก (พอดี เขียนตอนดึก คิดได้ประมาณนี้ เพื่อนๆ อาจจะคิดได้ไม่เหมือนผมนะครับ อย่าซีเรียส)

int ledArr[] = {11,10,9,6,5,3}; // Led0 ..... Led5
void setup(){ }

void loop()
{
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr[k],fadeArr[i-k]); //update previous
      }
    }else{
      for(int j=0;j<6;j++){
        analogWrite(ledArr[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(100);   
  } 
}



Arduino ไฟวิ่งฝนดาวตก


 
 
พอดีผมแก้โค๊ดให้วิ่งกลับไปกลับมา ในวีดีโอจึงแสดงแบบนั้น

int fadeArr[] = {255, 200, 150, 100, 50, 10, 0, 0, 0, 0, 0, 0, 0};
int ledArr_fwd[] = {11,10,9,6,5,3}; // Led0 ..... Led5
int ledArr_rwd[] = {3,5,6,9,10,11}; // Led5 ..... Led0
int dl = 100;
void setup(){ }

void loop()
{
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr_fwd[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr_fwd[k],fadeArr[i-k]); //update previous
      }
    }else{
      //analogWrite(ledArr[i-1],fadeArr[i-k]);// forward
      for(int j=0;j<6;j++){
        analogWrite(ledArr_fwd[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(dl);   
  }
  delay(300);
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr_rwd[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr_rwd[k],fadeArr[i-k]); //update previous
      }
    }else{
      for(int j=0;j<6;j++){
        analogWrite(ledArr_rwd[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(dl);   
  } 
}
Comments