星期四, 1月 30, 2014

Raspberry Pi 筆記(五):2x16 LCD顯示字元

[2014/01/29]
去年三月份正在學習Arduino時,也曾參考範例練習使用2x16 LCD顯示字元,現在要改用Raspberry Pi, 除了使用語言上的不同外,接線的方式則是大同小異。本實作參考Matt Hawkins發表於Raspberry Pi Spy的文章,不同的是LCD顯示器的亮度因為電壓的關係,無法呈現對比的字元,需要加裝一個可變電阻,將LCD Pin3接到電阻,調整電阻就可以呈現LCD的字元。以下是
執行結果的照片:

材料
•麵包板 x 1
•Raspberry Pi Model B主板 x 1 (使用無線網卡)
•2x16 LCD x 1
•可變電阻 x 1
•連接線 x N條

線路連接與電路圖
• 將 LCD 的 RS(4), Enable(6), D4(11), D5(12), D6(13), D7(14) 依序接到 26, 24, 22, 18, 16, 12 腳位
• 將 LCD 的 VSS(1) 及 R/W(5) 接到 GND(6),VDD(2)接到 +5V(Pin 2)
• 可變電阻中間腳位接到 LCD 的 VO(3),其中一支接到 5V,另外一支接 GND (註:或是在VO 上串接一顆 1k ohm 電阻連到 GND)




1602顯示器接腳說明
LCD顯示器若無背光則會有14個Pin,若有背光則會有16個,而接腳位置大多如下:

LCD pin 功能 Pi功能 Pi Pin
1 VSS(接地) GND Pin 6
2 VDD(5V電源輸入) +5V Pin 2
3 VO 或稱 Vee:
調整對比,需接一個1k的可變電阻
GND Pin 6
4 Register Select(RS):
1: D0 – D7 當作資料解釋,0: D0 – D7 當作指令解釋
GPIO7 Pin 26
5 READ/WRITE(RW):
1: 從 LCD 讀取資料,0: 寫資料到 LCD
GND Pin 6
6 Enable GPIO8 Pin 24
7 Data Bit 0
8 Data Bit 1
9 Data Bit 2
10 Data Bit 3
11 Data Bit 4 GPIO25 Pin 22
12 Data Bit 5 GPIO24 Pin 18
13 Data Bit 6 GPIO23 Pin 16
14 Data Bit 7 GPIO18 Pin 12
15 A(+) 背光:可接330 Ohm電阻到電源
16 K(-) 背光:接地 GND Pin 6

程式
# 在2x16 LCD顯示幕印出字元
#
# 原作者 : Matt Hawkins

#import
import RPi.GPIO as GPIO
import time

# 定義GPIO 對 LCD 的接腳
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25 
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

# 定義變數
LCD_WIDTH = 16    # 每行最多字元
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80 # 第一行的 LCD RAM address
LCD_LINE_2 = 0xC0 # 第二行的 LCD RAM address 

# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005

def main():
  # Main program block

  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7

  # 初始設定LCD顯示器
  lcd_init()

  # 送出第一次顯示字元
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Rasbperry Pi")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string("Model B")

  # 暫停 3秒鐘
  time.sleep(3)   

  # 送出第二次顯示字元
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Raspberrypi-spy")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string(".co.uk")

  time.sleep(20)

def lcd_init():
  # 初始設定LCD顯示器
  lcd_byte(0x33,LCD_CMD)
  lcd_byte(0x32,LCD_CMD)
  lcd_byte(0x28,LCD_CMD)
  lcd_byte(0x0C,LCD_CMD)  
  lcd_byte(0x06,LCD_CMD)
  lcd_byte(0x01,LCD_CMD)  

def lcd_string(message):
  # 送出字串到顯示器
  message = message.ljust(LCD_WIDTH," ")  

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command

  GPIO.output(LCD_RS, mode) # RS

  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  time.sleep(E_DELAY)    
  GPIO.output(LCD_E, True)  
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)  
  time.sleep(E_DELAY)      

  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  time.sleep(E_DELAY)    
  GPIO.output(LCD_E, True)  
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)  
  time.sleep(E_DELAY)   

if __name__ == '__main__':
  main()

參考資料:
• Raspberry Pi Spy
• Raspberry Pi Cookbook by Simon Monk
Share:

星期一, 1月 27, 2014

Raspberry Pi 筆記(四):WebIOPi讓瀏覽器控制樹莓派

[2014/01/26]
要用瀏覽器或APP對Raspberry pi進行控制,需先在Raspberry Pi安裝WebIOPi。這套程式可讓使用者在瀏覽器上控制遠端的Raspberry Pi,讓連接的LED亮或滅,透過PWM也可控制步進馬的轉速及讀取感應器的值呈現在網頁上等功能。

WebIOPi是用 Python寫成的,可完整支援Unified Serial/SPI/I2C 控制超過30種以上的設備,包括類比轉換、IO擴充及感應器等,同時也可撰寫Javascript/HTML使用者介面,呈現控制所需呈現的使用者介面。

先看一段影片,透過瀏覽器控制Raspberry Pi的GPIO,讓Pin7及Pin11分別為開跟關,表示LED的亮與滅。


[安裝程序]

安裝WebIOPi之前,要在Respberry pi安裝 Python 2.7或3.2版,也需手動先安裝GCC及 Python development headers,如果使用 Raspbian 2014-01-07版本,Python(2.7.3)及GCC(4.6.3)都已安裝在Image裡了。

安裝Python development headers的方法:
$ sudo apt-get install python-dev python3-dev

以下是webiopi的安裝步驟:
$ wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
$ tar xvzf WebIOPi-0.6.0.tar.gz
$ cd WebIOPi-0.6.0
$ sudo ./setup.sh

截至2016.1.16為止,Webiopi最新版本為0.7.1,由於Raspberry Pi 2 Model B 的GPIO Pin有40個,因此安裝的步驟有點不一樣,安裝之前要先安裝python-rpi.gpio :

$ sudo apt-get update
$ sudo apt-get install python-rpi.gpio python3-rpi.gpio
下載Webiopi的位置如下:
$ wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
$ tar xvzf WebIOPi-0.7.1.tar.gz
$ cd WebIOPi-0.7.1
如果用的是Raspberry Pi 2 或 B+,要先進行Patch,程序如下:
$ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
$ patch -p1 -i webiopi-pi2bplus.patch
$ sudo ./setup.sh
設定為Daemon
安裝成功後,可將WebIOPi 設定成Daemon形式,以下指令可啟動或停止WebIOPi ,設定檔放在 /etc/webiopi/config : 
$ sudo /etc/init.d/webiopi start 或  $ service webiopi start
$ sudo /etc/init.d/webiopi stop  或  $ service webiopi stop

重新啟動
$ sudo /etc/init.d/webiopi restart 或  $ service webiopi restart

於boot時自動啟動與停止
如果在boot時要啟動WebIOPi,可執行:
$ sudo update-rc.d webiopi defaults

如果在boot時要停止WebIOPi,可執行:
$ sudo update-rc.d webiopi remove

遠端連線WebIOPi
要用瀏覽器連線至Raspberry Pi的WebIOPi,以我的Pi為例,設定的IP是192.168.1.104,可用8000進行連線:http://192.168.1.104:8000,成功後會出現需輸入帳號密碼的畫面,預設帳號是webiopi,密碼是raspberry。


GPIO Header畫面:

變更密碼
如果要變更Webiopi密碼,可執行webiopi-passwd
$ sudo webiopi-passwd
WebIOPi passwd file generator
Enter Login: webiopi
Enter Password:
Confirm password:

修改密碼後,需重新啟動WebIOPi
$ sudo /etc/init.d/webiopi restart

移除密碼保護
要移除登入時的帳號密碼保護,可刪除 /etc/webiopi/passwd 檔案或清成空白,重新啟動WebIOPi即可

[2014/04/05]
2014/03推出0.7版,這個版本增加支援一些晶片功能,如MCP3002 ADC 和 MCP4802 DAC 晶片,也增加PiFace Digital 擴充卡的驅動程式,也支援IPV6功能,有興趣可連線至:WEBIOPI Change Log 看一下增加哪些支援功能。
圖片來源:webiopi

[參考資料]

• webiopi
WebIOPi-0.7.1 Patch for Raspberry B+ and Pi 2

另外有個Project 稱做PiUi,是用行動電話來控制Raspberry Pi,作法也類似,您可至以下網站取得相關資訊:http://www.raspberrypi.org/archives/3583
Share:

星期日, 1月 26, 2014

Raspberry Pi 筆記(三):Python控制LED

[2014/01/26]
這個讓LED閃亮的Python程式已經完成兩個多星期,為了測試WebIOPi的功能,一直保留這個接線,直到WebIOPi測試完成後,才開始畫線路圖,放到 Blog來跟各位分享。


[材料]

• Raspberry Pi Model B x 1
• 麵包版 x 1
• LED 綠色 x 1
• LED紅色 x 1
• 連接線 x 3條

[接線]

將Raspberry Pi的第7pin (GPIO4)接到綠色 LED的一支腳,第11pin (GPIO17)接到紅色 LED的一支腳,LED的另一支腳則接到第6pin (Ground)。

[程式一]

#讓紅色及綠色LED各閃10次,每次間隔0.5秒
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

#設定LED pin變數
LED0    = 7   
LED1    = 11
counter = 0

#設定為輸出
GPIO.setup(LED0,GPIO.OUT)
GPIO.setup(LED1,GPIO.OUT)

#迴圈10次
while(counter < 10):
        GPIO.output(LED0,GPIO.HIGH)
        GPIO.output(LED1,GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(LED0,GPIO.LOW)
        GPIO.output(LED1,GPIO.HIGH)
        time.sleep(0.5)
        counter = counter + 1
GPIO.output(LED0,GPIO.LOW)
GPIO.output(LED1,GPIO.LOW)

[實驗結果]

在Terminal視窗執行程式:
$ sudo python led.py


[程式二]

#讓紅色LED燈分成0-100等級亮度
import RPi.GPIO as GPIO
led_pin = 17

GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT)

pwm_led = GPIO.PWM(led_pin, 500)
pwm_led.start(100)

while True:
   duty_s = raw_input("輸入亮度值(0~100):")
   duty = int(duty_s)
   pwm_led.ChangeDutyCycle(duty)

Share:

Raspberry Pi 筆記(二):GPIO接腳與 I2C 及 SPI 安裝

[2014/01/25]
Raspberry Pi支援輸入和輸出的控制,想學Raspberry Pi控制LED、步進馬達及繼電器等元件,就跟Arduino一樣,做一些自動控制的東西,於是動手收集Raspberry Pi控制輸入和輸出有關的資訊以及如何在Raspberry Pi安裝工具程式。
Raspberry Pi提供GPIO (General Purpose Input/Output)通用介面,可以透過程式做輸入或輸出的行為控制。Raspberry Pi的版子有2.54 mm 26-pin 的擴充頭,共有2排13個存取點,除了5V、3.3V及接地等pin外,還有其他17個可作為控制的pin腳,包括:

• 8個 GPIO pin
• 2個 UART pin
• 2個 I2C pin
• 5個 SPI pin




[UART通用非同步收發傳輸器]

UART (Universal Asynchronous Receiver/Transmitter)是一種非同步收發傳輸器,是電腦硬體的一部分,將資料由串列通信與並行通信間作傳輸轉換,最常見的是 RS232。UART訊框包括起始位元、資料位元、同位檢查位元、停止位元。UART包括RS232、RS449、RS423、RS422和RS485等介面和匯流排標準規範。

[I2C] 

I2C (Inter-Integrated Circuit)是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主機板、嵌入式系統或手機用以連接低速週邊裝置而發展。I2C的正確讀法為"I-squared-C"。I2C被應用在簡單的週邊,一些常見的應用如下:

• 為了保存使用者的設定而存取NVRAM晶片。
• 存取低速的數字模擬轉換器(DAC)。
• 存取低速的模擬數字轉換器(ADC)。
• 改變監視器的對比度、色調及色彩平衡設定(視訊資料通道)。
• 改變音量大小。
• 取得硬體監視及診斷資料,例如中央處理器的溫度及風扇轉速。
• 讀取實時時鐘(Real-time clock)。
• 在系統設備中用來開啟或關閉電源供應。

I2C的另一個強大用途在於微控制器的應用,利用兩根通用的輸入輸出接腳及軟體的規劃,可以讓微控制器控制一個小型網路。

週邊可以在系統仍然在運作的同時加入或移出匯流排,這代表對於有熱插拔需求的裝置而言是個理想的匯流排。

像I2C這樣的匯流排之所以流行起來,是因為電腦工程師發現到對於整合電路設計而言,許多的製造成本源自於封裝尺寸及接腳數量。更小的包裝通常能夠減少重量及電源的消耗,這對於行動電話及手持式電腦而言格外重要。

常見使用I2C進行通訊的模組有:
• 1602- 6 x 2- LCD液晶模組
• DS1302 Real Time Clock Board
• 1.24吋 4位7段顯示器
• OLED顯示螢幕 128*64
• BME280 溫濕度及壓力感測器
• 三軸加速度計- ADXL345 (I2C/SPI)

[SPI序列周邊介面匯流排]

SPI (Serial Peripheral Interface Bus),類似I²C,是一種4線同步序列資料協定,適用於可攜式裝置平臺系統,但使用率較 I²C少。SPI匯流排定義四組 logic signals:
‧ SCLK—Serial Clock(自master輸出)
‧ MOSI/SIMO—Master Output, Slave Input(自master輸出)
‧ MISO/SOMI—Master Input, Slave Output(自slave輸出)
‧ SS—Slave Select(active low;自master輸出)


要讓Raspberry Pi執行這三種控制,必須分別安裝對應的函數庫:GPIO可安裝RPi.GPIO或WiringPi,I²C需安裝 i2c-tools。
RPi.GPIO套件用來提供Raspberry Pi的GPIO控制,這個套件模組不適用於Real-time或要求比較高的應用程式,因為無法預測Python何時要忙碌,也由於需要Linux核心才能運作,較不適合即時或要求較高的程式。假使要求這些,可以改用 Arduino 。RPi.GPIO目前不支援SPI、I²C、PWM及串列通訊。您可參考:https://pypi.python.org/pypi/RPi.GPIO
WiringPi是一個存取GPIO的函數庫,以C語言寫成,讓Raspberry Pi的BCM2835晶片使用。WiringPi的語法跟Arduino很類似,同時可使用命令列的gpio指令,用來控制GPIO Pin腳,可以將命令列指令寫成shell scripts來控制Pin腳。相關資料可參考:http://wiringpi.com


[安裝RPi.GPIO]

RPi.GPIO各版本程式放在Python Package網站,下載位置:https://pypi.python.org/pypi/RPi.GPIO ,安裝方法如下:
$sudo apt-get install python-dev
$wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.4.tar.gz
$tar xvzf RPi.GPIO-0.5.4.tar.gz
$cd RPi.GPIO-0.5.4
$sudo python setup.py install

安裝完成的畫面如下:

或輸入以下指令自動安裝:
$sudo apt-get install python-rpi.gpio

[安裝 I2C]

• 編輯文字檔 /etc/modules
$ sudo nano /etc/modules
加入以下兩行:
 i2c-bcm2708
 i2c-dev

• 再執行以下安裝程式指令:
$sudo apt-get install python-smbus
$sudo apt-get install i2c-tools

• 修改 raspi-blacklist.conf 檔案:
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf

• 將以下兩行加上註解符號:
# blacklist spi-bcm2708
# blacklist i2c-bcm2708

• 當連接上I2C設備後,新的 Pi B版本可用下列指令察看:
$sudo i2cdetect -y -a 1

• 舊的版本可用下列指令察看
$sudo i2cdetect -y -a 0

如果出現以下的畫面,表示已經安裝成功。

一般用在控制Raspberry Pi 上的GPIO語言,常見使用有 Python 、Java以及 C語言,也有人直接使用Shell script來寫GPIO控制程式。

[安裝 SPI]

$ sudo vi /etc/modules
在最後一行加入 spidev

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
在blacklist spi-bcm2708 前加上#,變成
#blacklist spi-bcm2708

安裝SPI程式
$ sudo apt-get install python-dev
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev/
$ sudo python setup.py install

重新開機即可啟用SPI。

[參考資料]

•  SK Pang electronics
• 智慧生活科技專業社群
    Raspberry Pi 硬體控制-- Python 語言篇
    Raspberry Pi 硬體控制-- C 語言篇
• Raspberry Pi Cookbook
• Wikipedia-UART
• Wikipedia-I2C
• Wikipedia -序列周邊介面
•  Openmicros.org: Getting Started with Raspberry Pi GPIO and Python
• WiringPi-GPIO Interface library for the Raspberry Pi
Share:

星期六, 1月 25, 2014

Raspberry Pi 筆記(一):螢幕無法呈現及HDMI轉接線忽黑忽亮問題

[2014/01/25]
去年年中買了一個 Raspberry Pi  Model B,後來因為工作忙,擱置了好一段時間,新年度開始想繼續學習Raspberry Pi,除了一些Linux基本服務的安裝外,還希望能學習自動控制電子元件。為了不要一直拆接電視的HDMI線,於是買了一條HDMI轉VGA 的轉接線,直接用電腦螢幕作為Raspberry Pi的顯示器。

試過這條轉接線只有安裝Pidora時,電腦螢幕會正常呈現,其他的Image如Raspbian、RaspBMC或Arch螢幕都是黑的,完全沒有映象。

[沒有影像]

找一下網路上設定開機畫面輸出及解析度的設定檔在 /boot 目錄下的config.txt 檔,我修改了三個地方,讓Raspbian開機就可正常呈現X-Window的畫面。

hdmi_force_hotplug=1 (強制從hdmi輸出)
hdmi_drive=2 (使用HDMI to DVI 要選擇 1 [沒有聲音輸出] )
hdmi_group=2 (1是 CEA,2是 DMT,要輸出到HDMV to DVI,這個是標準的選擇,差距在於兩個標準的輸出方式不同,CEA接近電視,DMT比較接近monitor,所以選擇2。)
hdmi_mode=35  1280x1024 60Hz

修改完成後存檔,重新開機即可顯示畫面。


[螢幕忽黑忽亮問題]

HDMI轉接線接上Pidora後啟動X-Windows。幾分鐘後,只要一按鍵盤或移動滑鼠,螢幕就會變黑,幾秒鐘後又會再亮起來,再移動滑鼠或按鍵盤,螢幕又會變黑,一下子又會恢復,有時沒有移動滑鼠,螢幕也會變黑,真的很困擾。

在Google找一下解決的方法,可能發生的原是Raspberry Pi的電力不夠造成的,改用2A的USB電源供應器,結果還是一樣。有一位網友自己動手給HDMI轉VGA線加上電源就解決這個問題,想說自己也動手接看看,看看是否能解決這個問題。


拆開HDMI轉接盒,線路板好像跟這位網友的一樣,於是找了一個沒有用的滑鼠將線剪斷,只留約30公分長的USB頭。拆開HDMI的盒子,線路接點用熱熔膠固定,於是小心地拆開熱熔膠,將USB紅色的線焊接到pin18,黑色線接到電路版背面的pin17,其他綠白兩條線不需要用到。那位網友加了一個開關,我覺得可以不需要,如果要外接電源時,只要插上USB即可,不插USB時就沒外接電源。焊接完成後,再用熱熔膠固定外接排線與接點。測試一下,果然會忽黑忽亮的問題解決了。


最後在黑色塑膠外盒外接線的旁邊切開一小缺口,讓USB線可以固定,扣上塑膠外盒就完成了。


[參考資料]


● elinux.org -> RPiconfig
● RaspberryPI : HDMI to VGA 加裝 USB 外接電源
Share: