2014/07/25

Banana Pi:試用映像檔Raspbian_For_BananaPi_v3.0並存取GPIO(連接LED與按壓式開關)

之前已試用過Lubuntu_For_BananaPi_v2.0Raspbian_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;
}


參考資料:

5 comments:

  1. 向葉大報告下....

    安裝 RetroPie 2.3 img (最新版) 在香蕉派開機,連畫面都沒有出現 (HDMI/ HDMO to VGA 都試過);但使用您介紹的這個 Raspbian for Banana Pi 3.0 卻是完全正常。

    我開始有些擔心,若是底層也要像此提出修正版本,那麼改用 Banana Pi 可能意義就不大了。

    ReplyDelete
    Replies
    1. 據我所知,RetroPie是以Raspbian(Raspberry Pi用的)為基礎,裝上一大堆模擬器與有的沒的,然後製作出來的映像檔,所以,Banana Pi並不能使用。

      Raspbian for Banana Pi 3.0是以Raspbian(Raspberry Pi用的)為基礎,換掉、修改掉底層的一些東西,然後就能在Banana Pi上運行。

      目前如果你想在Banana Pi上跑RetroPie,恐怕要自己先裝Raspbian for Banana Pi 3.0,然後照著RetroPie網站上的步驟,自己一個東西一個東西慢慢裝,自己設定組態自己搞,詳情請查詢RetroPie網站http://blog.petrockblock.com/,別問我,我也沒用過,哈哈。

      拜過孤狗大神後,我沒看到有人在Banana Pi上成功執行RetroPie,所以...,你算是先鋒,加油。

      Delete
    2. 順便問一句,我的Banana Pi無法跑Android_For_BananaPi_v2.0(http://www.lemaker.org/index.php?m=content&c=index&a=show&catid=9&id=38),第一次開機後,可看到主選單,但點按一下滑鼠就會當掉,螢幕就黑掉了,請問你可以嗎?

      Delete
    3. 1. >Raspbian for Banana Pi 3.0是以Raspbian(Raspberry Pi用的)為基礎,換掉、修改掉底層的一些東西,然後就能在Banana Pi上運行。

      這就是我擔心的問題;老實說,要能長期持續維護 OS distribution,這並不容易的 (除非組織規模夠大)。

      2. 我倒沒有使用其它 Banana Pi 的 Image 勒。

      反想請教葉大,好像 Banana 無法直接使用 Raspberry Pi 的攝影模組嗎?

      Delete
    4. 1. 他們既然推出這塊板子,自然應該要移植並維護底層的系統核心與驅動程式。

      目前Banana Pi不能使用Raspberry Pi 的攝影模組,將來不知道。

      Delete