ラズパイ研究室

GPIOの調査

GPIOはRaspiPiの特徴の一つで、シングルボードコンピュータの中では多くのデジタル入出力pinを持ち、SPIやi2cなどのインターフェースを持っていますのでIOTや機器制御など幅広い対応力を持っているといえます。

今回は、デジタル出力について、検証してみました。

1.Lチカの準備

フルカラーLEDをGPIOに接続します。

LEDの電流制限抵抗は、GPIOのHIの電圧が3.3Vなので、赤に220Ω、緑と青に100Ωとしました。

およそ9mA前後の電流が流れます。

fled fled

2.GPIOをコマンドで操作

  

GPIOの操作はroot権限が必要ですが、GPIOグループに所属しているとsudoしなくても実行できます。

ユーザーをグループGPIOに入れます。

$sudo gpasswd -a piadmin gpio

一旦ログオフして再ログイン

グループの確認

$groups

$piadmin audio bluetooth gpio

GPIOのピン番号は、wireringPiでの呼び方とプロセッサーSOC(BCM28××)での呼び方、ピン配置での呼び方の三種類があります。
BCMピン番号のほうが、一般的なようですが、pythonではpinmodeで指定できます。
1.wireringPi(wPi) GPIOコマンドでは、デフォルト
2.BCMGPIOコマンドでは -g をつける
3.物理番号 (pysical)

GPIOの一覧確認

$gpio readall

erro

コマンドでGPIOを操作。

LED(赤)GPIO6 をOUTに設定

$gpio mode 6 out

$gpio write 6 1

$gpio write 6 0

LED(赤)BCM GPIO25 をOUTに設定

$gpio -g mode 25 out

$gpio -g write 25 1

$gpio -g write 25 0

2.CでLチカ

特に指定しなければBCMの番号になる。

#include <wiringPi.h>

#define LED_Blue 24

int main(void) {

if(wiringPiSetupGpio() == -1) return 1;

// Set GPIO24 pin to output mode

pinMode(LED_Blue, OUTPUT);

//

for(int i=0; i<10; i++){

digitalWrite(LED_Blue, 1);

delay(500);

digitalWrite(LED_Blue, 0);

delay(500);

}

return 0;

}

コンパイルと実行

$cc -o ledtest ledtest.c -lwiringPi

$./ledtest

3.pythonでLチカ

ラズパイのパイはpythonのパイらしいので、pythonを使ってみます。

赤LEDを1秒間隔で5回点滅

$nano l_chika.py

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
            
GPIO.setup(25,GPIO.OUT)
            
i=0
  while(i<5):
    GPIO.output(25,True)
    time.sleep(1)
    GPIO.output(25,False)
    time.sleep(1)
    i=i+1

    GPIO.cleanup
                
           

フルカラーLEDなので8色Lチカ

$ nano col_led.py

import RPi.GPIO as GPIO
import time
              
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
              
R = 25
G = 23
B = 24
GPIO.setup(R,GPIO.OUT)
GPIO.setup(G,GPIO.OUT)
GPIO.setup(B,GPIO.OUT)
            
col =[[R,G,B],[0,G,B],[0,G,0],[0,0,B],[R,G,0],[R,0,B],[R,0,0]]
              
i=0
while(i<7):
              
  X1=col[i][0]
  X2=col[i][1]
  X3=col[i][2]
  if X1 != 0:
    GPIO.output(X1,True)
  if X2 != 0:
    GPIO.output(X2,True)
  if X3 !=0:
    GPIO.output(X3,True)
  time.sleep(1)
  if X1 != 0:
    GPIO.output(X1,False)
  if X2 != 0:
    GPIO.output(X2,False)
  if X3 != 0:
    GPIO.output(X3,False)
  print(X1,X2,X3)
  time.sleep(1)
  i=i+1
              
GPIO.cleanup            
            

3.node.jsでLチカ

node.jsnoのGPIOモジュールは、node-rpioを使ってみました。

$ npm install rpio

rpioのピン番号は、物理番号を使うようです。ややこしい・・・

緑LEDはBCMで23番、物理番号(コネクタのピン呼び)は16番になります。

緑LEDの点滅テスト。

var rpio = require('rpio');

rpio.open(16, rpio.OUTPUT,rpio.LOW); 

for (var i = 0; i < 5; i++) {

rpio.write(16, rpio.HIGH);//GPIO23 BCM

rpio.msleep(500);

rpio.write(16, rpio.LOW);//GPIO23 BCM

rpio.msleep(500);

}