ここから細かい制御が出来るようになる。マオです。
今まではコマンドで個別に部品を制御してたけど、プログラムで制御する事により複雑な事が出来るようになる。
使える言語は様々で推奨はPythonらしい。
ここでは既に開発環境が整っているJavaを使用していく。
GPIOを使うには、Pi4Jというライブラリが必要になる。
もし、RaspberryPiが直接ネットワークに繋がっているなら、インストールは簡単に終わる。
curl -s get.pi4j.com | sudo bash
これをsudoが出来るユーザで実行するだけだ。
JDKなんかはデフォルトで入ってるようなので、問題無いっぽい。
ライブラリは「/opt/pi4j/lib」にインストールされる。
今回の回路は前回のタクタイルスイッチと前々回のフルカラーLEDを使って、スイッチを押すごとに色が変わっていく物を作る。
注意点はコマンドの時とGPIOの番号が違う所だ。
コマンドではGPIO16だった所が、Pi4JではGPIO27となる。
詳細は公式のPin Numbering(Raspberry Pi 2 Model Bはここ)にあるので、確認しよう。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalInput; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; public class ButtonDeLedTikatika { public static void main(String[] args) { // #1 final GpioController gpio = GpioFactory.getInstance(); // #2 final GpioPinDigitalOutput led_red = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_29, PinState.HIGH); led_red.setShutdownOptions(true); final GpioPinDigitalOutput led_green = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_25, PinState.HIGH); led_green.setShutdownOptions(true); final GpioPinDigitalOutput led_blue = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, PinState.HIGH); led_blue.setShutdownOptions(true); // #3 final GpioPinDigitalInput button = gpio.provisionDigitalInputPin(RaspiPin.GPIO_27, PinPullResistance.PULL_UP); button.setShutdownOptions(true); // #4 button.addListener(new GpioPinListenerDigital() { private byte flag; @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent pin_event) { if(pin_event.getState().isLow()) { flag += flag < 7 ? 1 : -flag; led_red.setState((flag & 1) != 0 ? PinState.LOW : PinState.HIGH); led_green.setState((flag & 2) != 0 ? PinState.LOW : PinState.HIGH); led_blue.setState((flag & 4) != 0 ? PinState.LOW : PinState.HIGH); } } }); // #5 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { while(!in.ready()) { Thread.sleep(1000); } in.readLine(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } // #6 gpio.shutdown(); } }
以上が制御するプログラム。
#1でGPIOをなんやかんやするインスタンスを貰う。
なんやかんやするインスタンスを使って、#2でLED部分の設定をしている。
赤をGPIO29、緑をGPIO25、青をGPIO28に繋いである。
二つ目の引数にあるPinState.HIGHはデフォルトの出力状態を指定している。
このLEDは電圧がかかっていると消えるので、実行されると消えた状態になる。
setShutdownOptionsは終了時に関わる設定なので、そっちで説明するので飛ばす。
#3はタクタイルスイッチ部分の設定だ。
GPIO27に接続してあり、二つ目の引数PinPullResistance.PULL_UPはプルアップ抵抗の設定をしている。
#4はタクタイルスイッチの状態が変化された時の処理を登録している。
各色の状態は3ビット(0~7)で記録して、ビットが立っている部分が光る。
スイッチが押されると処理がされ、電圧がLowになるのでif分の中が実行される。
フラグ管理をしているflagに1を加算するか、7から溢れる場合は0に戻している。
setStateでPinState.LOWかPinState.HIGHを指定する事で、電圧を変更する事が出来る。
これによりスイッチを押すたびに、消えた状態からレッド→グリーン→イエロー→ブルー→マゼンタ→シアン→ホワイトとなり、次でまた消える。
#5はエンターキーを押すまで、プログラムを抜けないようにループさせている。
GPIOの制御部分は別スレッドで動く為に、この部分が無いと処理が終了してしまう。
#6の部分でGPIOを開放(コマンドにおけるunexport)したりする。
しかし、#2や#3でやっているsetShutdownOptions(true)を指定していないと開放してくれない。
setShutdownOptionsでは色々と開放後のピンの状態も指定出来たりする。
実行は一般ユーザからクラスファイルが置いてあるディレクトリで以下のコマンドで出来る。
sudo java -cp .:"/opt/pi4j/lib/*" ButtonDeLedTikatika
意外とサクサクとここまで出来てしまった。
基礎は終わったので、ここから難易度がドンドン上がって大変な事になりそうだ・・・(遠い目)
基本その2。マオです。
前回の終わりに次はプログラムでーなんて書いてあったけど、もう一つの基本をコマンドでやる事にする。
今回はタクタイルスイッチを使う。
タクタイルスイッチとは簡単に言えば押す事によって回路が繋がるボタンだ。
ボタンが押されたかをRaspberryPiで検出する。
一般ではタクトスイッチと呼ばれているけど、これは商標らしい(キャタピラーと同じような感じ、正式名称はクローラーである)。
足が4本あるけど、2本ずつで回路が繋がっていて、ボタンを押すと全部が繋がる。
なので接続する時には注意が必要だ。
タクタイルスイッチで分断するように、GPIOとGroundに繋ぐ。
本来ならば今回の回路にはプルアップ抵抗という物を入れなければならない。
入れないとノイズやら静電気やらで電圧が安定せずに、正常に状態の検知が出来ない。
RaspberryPiには内部に抵抗が付いていて、設定でそこら辺を制御して安定させる事が出来るのだ。
接続が終わったらコマンドで制御する。
例としてGPIO16を使用する。
rootで作業をする。
echo 16 > /sys/class/gpio/export
GPIO16を確保する。
次は設定。
echo "in" > /sys/class/gpio/gpio16/direction
前回はoutを指定していたけど、今回は入力なのでinを指定する。
echo "high" > /sys/class/gpio/gpio16/direction
highの部分がプルアップ抵抗の設定になる。
これで準備は完了だ。
cat /sys/class/gpio/gpio16/value
このコマンドで0か1が表示される。
ボタンを押さない状態だと1が表示され、ボタンを押すと0が表示される。
echo 16 > /sys/class/gpio/unexport
最後にピンを開放して終了だ。
今回はGroundと接続したが、電源と接続するパターンもある。
その場合は抵抗設定をhighではなくlowを指定する(プルダウン抵抗という)。
結果は逆転してボタンを押さない状態だと0が表示される。
注意するべき点は、電圧は3.3vまでしか許容されていない所だ。
RaspberryPiには5v電源があるが、これを入力してしまうと壊れるので気を付けよう。
以上で、入力も出来るようになった。
次回こそはプログラムを使ってみたいなぁ。
記念すべき第一歩。マオです。
Raspberry Piのセットアップがある程度終わったので、今度は電子回路の練習を始めたいと思う。
正直な所、私は電子回路に関する知識がゼロである!
ゼロである!
大事な事なので2度書いた。
ま、勉強しながら作業するのは好きなので、ゆっくりとやって行くとしよう。
書かれている記事の知識は間違っている可能性もあるので、真似する人は自己責任で。
今回は電子回路の基本的なヤツで、Lチカをやってみる。
Lチカとは「LEDをチカチカ」の略らしい。
つまりLEDを光らせる事だ。
LEDは「OptoSupply製 フルカラーLED OSTA71A1D-A」を使用します。
ブレッドボード(実験用の基板、部品を挿すだけなので便利)に、各種ジャンパワイヤーや抵抗、LEDを挿していく。
このLEDは4本足なのだが、ブレッドボードは行で繋がっている。
ブレッドボードに数字と英字が書いてある。
1つの行(画像ではブレッドボードを横にして使っているので、画像では行と列が逆なので注意)でa-e列とf-j列がそれぞれで繋がっている。
それ以降の行も同じだ。
ちなみに+と-の部分もそれぞれの列で全部繋がっている。
話を戻して、この手の複数の足が付いている部品はブレッドボードの真ん中を跨いで付ける事によって、a-e列とf-j列で全てのピンを分離できるのだが、今回のLEDはサイズが小さいので中央を跨ぐ事が出来ない。
解決方法としては、ワイヤーを使ってそれぞれの足を接続すれば良い。
ただ、今回は簡単に斜めに挿してしまった。
少し硬いがちゃんと行を分けて挿す事が可能だ。
LEDを見ると、一角が欠けた部分があり目印となっている。
欠けた部分から反時計回りで赤・緑・青・コモンアノードとなっている。
Raspberry Piから色の部分はGPIOのピンを、コモンアノードには3.3Vの電源ピンを挿す。
各色のピンとGPIOのピンの間には抵抗を入れる。
データシートによると、VFは標準値で赤は2.0Vで緑と青は3.2V、IFは標準で20mAを使っている。
GPIOは3.3Vを出力する。
必要な抵抗は(電圧-Vf)/電流で計算出来るので、赤は65Ωで緑と青は5Ωとなるが、それにピッタリな抵抗は無いのでその値の近い上の抵抗を使用する。
とりあえず、回路はこれでおっけー。
Raspberry Piの電源を入れると、この時点でLEDの赤青緑が微妙に光って見える。
今回はコマンドを使って制御してみる。
まず、GPIOの設定をする。
例としてGPIO20を使う。
rootで作業をする。
echo 20 > /sys/class/gpio/export
この作業で/sys/class/gpioにgpio20というディレクトリが生成される。
gpio20内にあるファイルを書き換えて作業をする。
echo out > /sys/class/gpio/gpio20/direction
この作業はgpioを出力モードにしている(逆にoutの部分をinにすると、入力モードになる)。
これにて準備完了だ。
実際のLEDを使用するには3つのピンの設定が必要なので、数字を変えて3回作業する事になる。
それぞれのピンを出力モードにする度にLEDの各色が点灯しているはずだ。
このLEDは赤青緑のピンに電流を流していない時に点灯する。
デフォルトでは電流は流れていないので、出力モードになった時点で光るのだ。
カメラの問題もあるのだが、物凄い明るさである。
目の前に置いておくのはキツイので、紙を四角くして載せたがそれでもキツイ。
echo 1 > /sys/class/gpio/gpio20/value
この作業でピンに電流を流す事が出来る。
0を指定すると電流を止める。
それぞれのピンに1を指定していくと、完全に明かりが消えるはずだ。
紙を載せても明る過ぎて撮影が難しいので、カメラの設定を変えて頑張って撮影してみた。
光の三原色を使って組み合わせで色を出したりも出来る。
残念ながらデジタル出力なので、この時点では点灯か消灯しか出来ない。
手段は色々あるらしいが、それは次回以降の課題だな。
echo 20 > /sys/class/gpio/unexport
最後に、これでピンが開放されてgpio20ディレクトリが消える。
初めての電子回路作りは成功に終わった。
次回は多分プログラムを使って、同じような事をする予定だ。
いつになるかは不明だがな・・・。
細かい作業。マオです。
Raspberry Pi 2を買ったわけですが、私の最終的な目的の為に小型のタッチパネル液晶を付ける必要がある。
ってな訳で、こんな液晶を買ってみた。
「Raspberry Pi用2.8インチTFT特別セット-Physical Computing Lab」です。
抵抗膜方式のタッチパネルで、大きさはRaspberry Piの基板と同じくらいです。
接続は26ピンの部分まで使って、こんな感じでGPIOに直接挿して使うのが普通の使い方ですね。
ただ、これだと色々と問題がある。
ジャンパワイヤーが基板にぶつかって挿す事が出来ないのだ。
そこで、この液晶基板には直接挿す部分以外にリボンケーブルを挿す事が出来るソケットも付いている。
これを使う事によってリボンケーブルの分だけ液晶と本体を離す事が出来るのだ。
・・・リボンケーブルがあればな・・・。
このソケットは26ピン。
26ピンなんてリボンケーブルは持ってないんだよ!
ちなみに昔の自作PCではHDDとかCDドライブとかはリボンケーブルで接続してたけど、あれは40ピン。
FDDは34ピンなんで、26ピンとか言う謎なケーブルは特殊な機器か古い方のモデルのRaspberry Piでしか使わないと思われる。
で、手に入れる方法はあるにはある。
ただ、ケーブル1本買うのに送料のが高いのよねぇ。
Amazonが販売してくれると良いんだけどマーケットプレースしかなくて、割高になるor半月待たされるの2択状態。
そこで今ある手持ちの資材を使って、気合で解決してみた。
ジャンパワイヤを挿しまくった。
線で繋がれば良いわけだから、見た目はアレだけど問題無し。
ワイヤは26本使っていない。
リボンケーブルは26ピンまで埋めてしまうけど、実はこの液晶は26ピン全てを使っているわけではない。
未使用部分はデイジーチェーンな感じで、液晶の方のコネクタから別の機器に繋ぐ事が出来たりする。
なので液晶に必要なピンは「5V(2pin or 4pin)」「Ground(いくつかあるけど、20pinは沢山のケーブルでまとめる事が出来そう。5Vを4pinで取るなら6pinを使うのもありかも)」「SPI_MOSI(19pin)」「SPI_MISO(21pin)」「SPI_CLK(23pin)」「SPI_CE0_N(24pin)」「SPI_CE1_N(26pin)」そして「GPIO24(18pin)」「GPIO25(22pin)」である。
これで液晶表示とタッチパネルは問題無く動かせる事が出来る。
もし液晶に付いているボタンを使う場合は、更に4つほどGPIOが必要となる(詳しくは書かないので説明書を見てくれ)。
これで物理的な接続は終わったので、後は設定だ。
うちの上のリンクから買った場合にパッケージ内にインルトール方法が書いてあるページのURLが付いているが、情報が古いようでインストール出来ない。
参考英語サイトの方を見てインストールしよう。
簡易インストールが楽ですが、piユーザ以外の場合はエラーで落ちるので、エラーメッセージに書いてあるオプションでホームディレクトリを入力しよう。
X-Window関係の設定も手動でやる必要がありそうなので、Detailed Installationの一部を確認すればいけるはずだ(途中途中は自動でやってくれているようだが・・・)。
こんな感じで、液晶付けるだけで一苦労だ。
実際に使ってみた感じ、静電容量式に慣れた現代人だと抵抗膜方式は微妙に感じる。
強めに押さないと反応が悪いんだよね。
UIを大きめに作らないと、正確にクリックが出来ない為に苦労しそうだ。
画面が小さいからそこもネックになりそうな予感。
もしかしたら、5インチくらいのタッチパネルを更に買ってしまう可能性が(略)
いや、頑張れば食べれるかも?(無理) マオです。
ラズベリーパイを買ってみました。
食べ物ではなく、コンピュータです。
こんな感じの基板丸出しの、ノーガード戦法。
写真では分かりにくいですが名刺サイズぐらいで、今回買った「Raspberry Pi 2 Model B」はCPUが900MHzの4コアでメモリが1GB積まれています。
GPUも内蔵されて、MP4とかもハードでエンコード/デコードできます。
これでお値段が大体5千円後半くらい。
付属品がかなり省かれているので、動くようにするにはもう少しかかったりしますが・・・。
必要な物は大体以下の通り。
1.microUSBで電源を取るのでケーブルとそれに繋ぐUSB電源アダプタ。
2.OSを入れたり記憶領域として使うmicroSDカード、公式では8GB推奨で相性問題があるので注意。
3.USBで接続できるキーボード&マウス。
4.HDMIで接続出来るディスプレイとケーブル。
5.OSイメージをmicroSDに書き込む為のPC。
1は結構使ってるけど、空きが無かったので発注。
2が意外と余ってそうだったけど、普通のSDカードはあるけど小さいのは全部使用してるようだったので発注。
3はほぼ無線環境の中でメインPCで使っているキーボードが何とかUSBで、マウスはボール型を発掘して使用。
4と5はぶっちゃけ、家の中で使われているmicroSDカードの枚数より多いくらい存在している(笑)
さて、microSDカードに相性問題があると書いたが、見事に問題のある製品にぶち当たったorz
eLinux.org:Rpi SD cards
これが酷い話でAmazonのRaspberry Piの販売ページの買い合わせに入ってたもんだから、注文しちゃったのよね。
しかも、ここのメーカーのSDカードは買うのが初めてだったり。
適当に買わないで、いつも通りにSanDiskか東芝で買っておけば最初に選ぶであろう商品は動作報告で問題なかったヤツっぽかった。
チクショー、もうTranscendは買わない。
まあ、そもそも最近のコンピュータ事情で相性という問題は久しぶりな気がする。
昔は各種パーツが相性の戦いだったからなー(遠い目)
ってな訳で、買ったヤツは携帯の方に使って、携帯に付いてたのをストレージとして使う事にした。
もう5年前の携帯に付属してたソニー製品なので、信頼性は微妙にあるけど確認出来た部分では書き込み速度が遅いようだ。
新しく東芝のを発注したので、届くまでこれで実験だ。
書く事は山のようにあるし、やる事も山のようにある。
しばらくはRaspberry Piのセットアップ的な記事が増えると思われる。
そして遊ぶとお金が飛ぶ(白目)