之前已試用過Lubuntu_For_BananaPi_v2.0與Raspbian_For_BananaPi_v2.0,雖然一直想玩玩Android,可是開機後一按滑鼠就會當掉、螢幕沒訊號,原因不明。
這篇要試用Raspbian_For_BananaPi_v3.0,並且試著存取GPIO控制LED明滅與讀取開關狀態。
此版本的變動如下:
- 以Raspbian 2014-06-20為基礎修改而來。
- 分割區變正常了(兩個)、不再有NOOBS的分割區。
- Linux核心版本是3.4.90。
- 不僅可給Banana Pi使用,也可給Raspberry Pi使用。
- 預設帳號密碼是pi/bananapi。
- FEX組態有些更動。(嗯,這是什麼?)
- 修改GPIO驅動程式,使之與RPi.GPIO相容。
- 核心加入i2c-sunxi和i2cdev驅動程式。
- 增加模組spi-sun7i.ko和spi-dev.ko。
- 核心加入LED驅動程式,使用者定義的LED會像心跳一樣閃爍。
- 開啟CSI相機模組的支援,譬如ov5460。
- 預先安裝Arduino 1.5.4、S4A。
- 預先安裝RPi.GPIO。
- 預先安裝wiringPi,仍處於測試階段,但除了SPI有點問題,其餘大部分功能皆可使用。
- 預先安裝ScratchGPIO5,仍有點小問題。
- 修正關機問題,可完全切斷電源。
- 預先安裝eject,可安全移除儲存裝置。
- 預先安裝ntfs-3g,可存取NTFS檔案系統。
- 更新Banana Pi桌面環境的桌布。
- 開啟序列埠,可從ttyS0登入。
- 修正動態MAC位址的問題。
把映像檔燒錄到記憶卡後,插入Banana Pi開機,看到畫面囉!
然後更新套件,安裝相關套件,我也忘了安裝些什麼,大概就是python-setuptools、python-pip、python-dev、等等之類的。
然後連接好電路,如下,其中11與13代表實體針腳編號。
Banana Pi的GPIO腳位功能與Raspberry Pi相同,如下圖。
開始寫程式吧,先是Python(使用RPi.GPIO程式庫)、然後是C(使用wiringPi程式庫)。
讓LED閃爍的Python程式碼:
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
LED_PIN = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED_PIN, GPIO.OUT)
while True:
print("LED is on")
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
print("LED is off")
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(1)
GPIO.cleanup()
以PWM控制LED漸亮漸暗的Python程式碼:
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
LED_PIN = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED_PIN, GPIO.OUT)
pwm = GPIO.PWM(LED_PIN, 50)
pwm.start(0)
while True:
for dc in range(0, 101, 5):
pwm.ChangeDutyCycle(dc)
time.sleep(0.1)
for dc in range(100, -1, -5):
pwm.ChangeDutyCycle(dc)
time.sleep(0.1)
pwm.stop()
GPIO.cleanup()
以按壓式開關控制LED明滅的Python程式碼(並去除彈跳現象):
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
LED_PIN = 11
SWITCH_PIN = 13
TIME_LAPSE = 0.2
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(SWITCH_PIN, GPIO.IN)
status = GPIO.LOW
GPIO.output(LED_PIN, status)
timemark = time.time()
while True:
timemark2 = time.time()
if GPIO.input(SWITCH_PIN) == GPIO.HIGH and (timemark2 - timemark) > TIME_LAPSE:
timemark = timemark2
if status == GPIO.LOW:
status = GPIO.HIGH
else:
status = GPIO.LOW
GPIO.output(LED_PIN, status)
GPIO.cleanup()
讓LED閃爍的C程式碼:
#include <stdio.h>
#include <wiringPi.h>
#define LED_PIN 11
int main()
{
wiringPiSetupPhys();
pinMode(LED_PIN, OUTPUT);
while(1){
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
return 0;
}
以PWM控制LED漸亮漸暗的C程式碼:
#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>
#define LED_PIN 11
int main()
{
int i;
wiringPiSetupPhys();
softPwmCreate(LED_PIN, 0, 100);
while(1){
for(i = 0; i <= 100; i+=5){
softPwmWrite(LED_PIN, i);
delay(100);
}
for(i = 100; i >= 0; i-=5){
softPwmWrite(LED_PIN, i);
delay(100);
}
}
return 0;
}
以按壓式開關控制LED明滅的C程式碼(並去除彈跳現象):
#include <stdio.h>
#include <wiringPi.h>
#define LED_PIN 11
#define SWITCH_PIN 13
int main()
{
int ledStatus = LOW;
unsigned int t = 0;
wiringPiSetupPhys();
pinMode(LED_PIN, OUTPUT);
pinMode(SWITCH_PIN, INPUT);
digitalWrite(LED_PIN, ledStatus);
while(1){
int switchStatus = digitalRead(SWITCH_PIN);
if(switchStatus == HIGH){
unsigned int temp = millis();
if(temp - t > 300){
t = temp;
ledStatus = ledStatus == HIGH ? LOW : HIGH;
digitalWrite(LED_PIN, ledStatus);
}
}
}
return 0;
}
參考資料: