วันเสาร์ที่ 25 พฤษภาคม พ.ศ. 2556

ทำ LED ไฟวิ่งด้วย Raspberry Pi

Standard
   

     เห็นไฟดาวตกที่เป็นแถวๆ แล้ววิ่งแบบมีการหรี่ขณะวิ่งผมว่ามันสวยดีเลยลองสั่ง LED แบบแถว กะว่าเอามาลองทำเล่นดูบ้าง แต่อันนี้มีแค่ 10 ดวงเองดูสั้นๆ ยังไงก็ไม่รู้ 555+

เริ่มกันเลย แนวคิดการปรับความสว่างของหลอด LED คือการควบคุมปริมาณกระแสไฟที่ไหลเข้า LED คล้ายๆ การสั่งให้ LED กระพริบ แต่กระพริบในความเร็วที่ตามนุษย์จะมองเห็นว่าไฟกระพริบ ถ้าต้องการให้สว่างที่สุดก็จ่ายกระแสให้ LED ตลอด ผมเลยสร้าง รูปแบบความสว่างให้ LED 11 รูปแบบคือ สว่างที่ 0%, 10%, 20%,  30%,  40%,   50%,  60%,  70%, 80%,  90% และ 100% โดยถูกกำหนดไว้ที่ Array ชื่อ LED_BRIGTH (ดูตาม source code : main_led.c)

uint8_t LED_BRIGTH[11][10] = {
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,1,1},
    {0,0,0,0,0,0,0,1,1,1},
    {0,0,0,0,0,0,1,1,1,1},
    {0,0,0,0,0,1,1,1,1,1},
    {0,0,0,0,1,1,1,1,1,1},
    {0,0,0,1,1,1,1,1,1,1},
    {0,0,1,1,1,1,1,1,1,1},
    {0,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1}
};

จาก code จะเห็นว่าในแต่ละ row ของ array จะมีช่วง off และ on ไม่เท่ากัน ที่ on  มากกว่าก็จะสว่างกว่า

array LED_PATTERN ใช้เก็บรูปแบบของการแสดงผล ใน 1 แถวจะประกอบไปด้วยข้อมูล 11 ตัว ตัวที่ 1 ถึงตัวที่ 10 คือค่าความสว่างของ LED ดวงที่ 1 ถึง 10 ตัวที่ 11 คือเวลาในการหน่วงก่อนที่จะไปที่ รูปแบบการแสดงผลถัดไป โดนสามารถปรับเปลี่ยน หรือเพิ่มลด รูปแบบได้ใน Array ตัวนี้เลยครับ

การกำหนด Pin สำหรับ output ในที่นี้ผมใช้ lib BCM 2835 จาก http://www.open.com.au/mikem/bcm2835/ หรือสามารถอ่านทบความที่เคยเขียนเรื่อง Raspberry Pi i/o ภาษาซี ด้วย lib BCM2835  ผมกำหนด pin io เป็น Array เพื่อการเรียกใช้งานที่ง่ายและสะดวก
RPiGPIOPin LED[_NO_OF_LED_];
โดยที่  _NO_OF_LED_ คือจำนวน LED ที่ใช้แสดงผล ตอนนี้ประกาศไว้ 10
#define _NO_OF_LED_ 10
การกำหนด pin ให้กับตัวแปร LED สามารถทำได้โดย
   LED[0] = RPI_GPIO_P1_11;
    LED[1] = RPI_GPIO_P1_15;
    LED[2] = RPI_GPIO_P1_16;
    LED[3] = RPI_GPIO_P1_18;
    LED[4] = RPI_GPIO_P1_19;
    LED[5] = RPI_GPIO_P1_21;
    LED[6] = RPI_GPIO_P1_22;
    LED[7] = RPI_GPIO_P1_23;
    LED[8] = RPI_GPIO_P1_24;
    LED[9] = RPI_GPIO_P1_26;

 จากนั้นกำหนด pin เป็น output แล้วกำหนดค่าเริ่มต้นเป็น High (LED เป็นแบบ Active Low)
for(i = 0; i < _NO_OF_LED_; i++)
{
        bcm2835_gpio_fsel(LED[i], BCM2835_GPIO_FSEL_OUTP);
        bcm2835_gpio_write(LED[i], HIGH);
}


จากนั้นเรียก Function led_play();


ลองนำไปใช้ดูนะครับ เขียนเล่นเอาสนุกๆ มีอะไรสงสัย สอบถามได้นะครับ ^^

หมายเหตุ 1.ความสว่่างจาก youtube ที่เห็นจะไม่เท่ากับตาคนมอง
2.สว่างและการกระพริบของหลอด LED ขึ้ออยู่กับ characteristics ของ LED ดวงนั้นๆ ด้วย







0 ความคิดเห็น:

แสดงความคิดเห็น