วันอังคารที่ 6 พฤษภาคม พ.ศ. 2557

raspberry pi 7-segment with 74hc595

สวัสดีครับเพื่อนๆทุกท่าน แม้ว่าจะมีไม่มาก :)

ต่อจากบทก่อนหน้านี้  ได้ศึกษากันไปแล้ว ในการใช้ 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()