สวัสดีครับเพื่อนๆทุกท่าน แม้ว่าจะมีไม่มาก :)
ต่อจาก
บทก่อนหน้านี้ ได้ศึกษากันไปแล้ว ในการใช้ python ควบคุมการทำงานของ LED หลอดเล็กๆ
ในตอนนี้ ผมได้ทำการต่อ raspberry pi เข้ากับ LED บอร์ดใหญ่ที่ใช้ไฟ 12 โวลต์(ซื้อจากฟิวเจอร์คิท)
รูปแผง LED 4 หลัก ใช้ไฟเลี้ยง 12 โวลต์
ซึ่ง Raspberry pi อย่างที่ทราบกันแล้วว่าใช้ไฟแค่ 5 โวลต์ และ gpio มีไฟแค่ 3.3 โวลต์ ก็เลยจำเป็นต้องหา buffer มาคั่นกลาง เพื่อให้สามารถขับ LED แผงนี้ได้
โดยผมใช้
IC เบอร์ 7407 เป็น buffer ดัง
ที่เคยเขียนไปในตอนก่อนหน้านี้แล้ว
และเพื่อให้สามารถใช้ gpio ที่มีอยู่ได้อย่างพอเพียง จึงได้ใช้ IC เบอร์
74hc595 ที่ทำให้เราใช้ gpio เพียง 5 ขาในการขับ LED ทั้ง 4 หลักนี้
โดยจากขา gpio ของ raspberry pi ต่อเข้ากับ 74hc595 ตรงๆก่อน แล้วต่อขา output ของ 74hc595(Q0-Q7) ต่อเข้ากับ input ของ 7407 (1A-6A)
แล้วนำ 1Y-6Y ต่อกับ LED ของเรา โดยที่มี r 4.7k pull up ไว้
เมื่อบัดกรีวงจรเสร็จเรียบร้อยแล้ว ก็เป็นอย่างที่เห็นคับ
แล้วผมก็ลองเขียน code โดยใช้ python ดู เพื่อลองขับ LED ก็สามารถใช้งานได้ครับ
โดยเราต้องนำ file ของเรา ไปวางไว้ที่ raspberry pi ก่อน
แล้วทำให้สามารถ run ได้โดยคำสั่ง chmod +x my_file.py
แล้วใช้คำสั่ง python my_file.py เพื่อ run โปรแกรม
ตัวอย่าง code ครับ
#! /usr/bin/python
import RPi.GPIO as GPIO
import time
#Data Pins needed on the RPi
DATAIN=11 #DS
LATCH=13 #STCP
CLOCK=15 #SHCP
CLEAR=22 #MR Low
OE=23 #Output Enable Low
#GPIO definition
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
GPIO.setup(DATAIN,GPIO.OUT)
GPIO.setup(CLOCK,GPIO.OUT)
GPIO.setup(LATCH,GPIO.OUT)
GPIO.setup(CLEAR,GPIO.OUT)
GPIO.setup(OE,GPIO.OUT)
GPIO.output(LATCH,False) #Latch is used to output the saved data
GPIO.output(CLEAR,True) #Clear must always be true. False clears registers
GPIO.output(OE,False) #Output Enable speaks for itself. Must be False to display
GPIO.output(CLOCK,False) #Used to shift the value of DATAIN to the register
GPIO.output(DATAIN,False)#Databit to be shifted into the register
def clean():
GPIO.output(CLEAR,False)
GPIO.output(CLEAR,True)
GPIO.output(LATCH,True)
GPIO.output(LATCH,False)
setup()
clean()
x=0
while 1:
if x > 32:
x=0
clean()
GPIO.output(DATAIN,True)
GPIO.output(CLOCK,True)
GPIO.output(CLOCK,False)
GPIO.output(LATCH,True)
GPIO.output(LATCH,False)
time.sleep(0.06)
x = x+1
ผมอาจจะอธิบายไม่ค่อยละเอียดนะครับ ถ้าหากมีข้อสงสัยก็ถามกันได้ ที่ niran@flowco.co.th ครับ
ที่มา
http://www.sysstem.at/2013/09/7-segment-display-with-74hc595-shift-register-and-raspberry-pi/
ตัวอย่างเพิ่มเติม
#! /usr/bin/python
import RPi.GPIO as GPIO
import time
#Data Pins needed on the RPi
DATAIN=11 #DS
LATCH=13 #STCP
CLOCK=15 #SHCP
CLEAR=22 #MR Low
OE=23 #Output Enable Low
#GPIO definition
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
GPIO.setup(DATAIN,GPIO.OUT)
GPIO.setup(CLOCK,GPIO.OUT)
GPIO.setup(LATCH,GPIO.OUT)
GPIO.setup(CLEAR,GPIO.OUT)
GPIO.setup(OE,GPIO.OUT)
GPIO.output(LATCH,False) #Latch is used to output the saved data
GPIO.output(CLEAR,True) #Clear must always be true. False clears registers
GPIO.output(OE,False) #Output Enable speaks for itself. Must be False to display
GPIO.output(CLOCK,False) #Used to shift the value of DATAIN to the register
GPIO.output(DATAIN,False)#Databit to be shifted into the register
#Clean up display
def clean():
GPIO.output(CLEAR,False)
GPIO.output(CLEAR,True)
GPIO.output(LATCH,True)
GPIO.output(LATCH,False)
#Shift data
def shift(BitOut):
if BitOut == 1:
BitOut=True
else:
BitOut=False
GPIO.output(DATAIN,BitOut)
GPIO.output(CLOCK,True)
GPIO.output(CLOCK,False)
#Push Data to display
def WriteOut():
GPIO.output(LATCH,True)
GPIO.output(LATCH,False)
#write number
def WriteNum(num):
for i in range(0,8):
shift((num>>i)%2)
from array import *
number_array = array('i',[0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6])
setup()
clean()
x=0
for i in range(0,9999):
x = i/1000
WriteNum(number_array[x])
x = (i%1000)/100
WriteNum(number_array[x])
x = (i%100)/10
WriteNum(number_array[x])
x = i%10
WriteNum(number_array[x])
WriteOut()
time.sleep(1)
clean()