L-chikaキットで遊ぼう(ターミナル操作編)

2018.03.21(sinse2018.03.03)
サイトマップ 、 トップ  <  ラズパイの部屋 < . > Lchika・pyton

5インチタッチパネルディスプレイをラズパイにつないでOS導入うまくいかず、トータルサポート期待で、CPUを追加購入した。ちなみに追加購入したCPUに添付された参考書類読みあっさり解決。ユーザサポートに力の入った販社での購入お勧めです。 そのときCPU単体購入ではあまりに愛想無いので、ヒートシンクキットと、Lチカ実験キットとセットのラズパイ3とする。 今回の参考書は販社提供の初心者マニュアルベースで、まず、1行命令ベースのターミナル操作編からまず紹介しましょう。

キットの内容(ラズパイ40ピンヘッダを使って、LEDをちかちかさせたり、スイッチでon/offしながら、端子の電圧H/Lを読み込む)

ブレッドボード
5*2*17列 :電源ライン無しなので、複数IC利用の実験には向かないが、単品部品ベースならコンパクトでいいかな
ブレッドボード用ジャンパー
オスーオスタイプ(一般的)と、オスーメス(ラズパイのコネクタに接続に向く)が、実験するには十分な数
小型LED
五色分
三色LED
RGBの三色LED(3色の電流制限値で調整すれば白色となるかもしれない)。アノードコモンとカソードコモンのひとつづつ
Cds(硫化カドミウム、Cadmium sulfide)光センサ
光で抵抗値が変わる素子という理解でいいかな? アナログで調べると照度に関連する情報を得られるかと。今回は、直流抵抗変化を電圧変化→入力閾値変化として、on/off判定する例
抵抗
電流制限の数百オーム(現物は330Ω)と、10kΩ(プルアップ、プルダウンとして)。
タクトスイッチ
押しボタン(押してon/話すとoff)

実験内容(販社オンライン資料に基づく手順)

ラズパイGPIO:コマンドライン制御版 実験
UNIXZ標準コマンド利用編
# --利用宣言(入出力共通)--
# GPIO#27を出力として実験する手順(コネクタの27ピンということではなく、汎用IOピンとしての27番目で、実コネクタの13ピン)を出力として実験する手順
# 実ピン番号を利用して設定するオプションもあるらしい(python編では設定コマンド紹介)。

sudo echo "27" > /sys/class/gpio/export

# --出力編--
# GPIO#27を出力ピンとして定義する

sudo echo "out" > /sys/class/gpio/gpio27/direction

# GPIO#27にH出力(3.3V)

echo "1" > /sys/class/gpio/gpio27/value

# GPIO#27にL出力(0V)

echo "0" > /sys/class/gpio/gpio27/value

# --入力編--GPIO#7を入力として実験する

sudo echo "7" > /sys/class/gpio/export
sudo echo in > /sys/class/gpio/gpio7/direction

# 念のため、入出力を確認する(in/outという文字が返ってくる)

cat /sys/class/gpio/gpio7/direction

# 実入力レベル確認(H/Lではなく、1/0という数値が返ってくる)

cat /sys/class/gpio/gpio7/value

# --利用終了(入出力共通)--今の感触だと電源オフで初期化されるようですが、念のため。と、連続試験したい場合の心得。
# GPIO#27の定義を取消(入力GPIO7利用の場合は"7"

sudo echo "27" > /sys/class/gpio/unexport
余談:
#(2018.03.11)初出はunix関連雑誌での紹介記事との未確認情報あるが、プルアップ抵抗/プルダウン抵抗を有効にする方法として紹介されたものが、実は
#Hレベル出力(&今入力モードでも出力モード切替兼任)

sudo echo high > /sys/class/gpio/gpio7/direction

#Lレベル出力(&今入力モードでも出力モード切替兼任)

sudo echo low > /sys/class/gpio/gpio7/direction

で、出力設定&出力値設定が同時にできる説(プルアップやダウンRも並行接続されているかどうかは、抵抗値と出力トランジスタのオン抵抗の差が大きいのでよくわからん:調べたいほど興味なし)。

(2018.03.19)出力トランジスタとプルアップ(ダウン)が並行してあるのは、あまり一般ではありませんが、電源側およびグランド側両方に引っ張るトランジスタを持った通称トーテンポール型出力と呼ばれるもの以外に、オープンドレイン(とかバイポーラトランジスタの場合オープンコレクタと呼ばれる)という、よくあるのはグランド方向引っ張り専用NchFETトランジスタ1本と、プルアップ抵抗だけの出力形態があるにはある。 元をただせばDTLとかTTLと呼ばれる回路方式が原型だったりするようですが、同じ信号線にこのタイプの出力トランジスタ複数と、プルアップ抵抗を一本(複数でも可だが消費電力から1本が望ましい)つないだ方式があります(Lレベル=0Vは、トランジスタが一生懸命0Vに近づける努力するが、Hレベル(電源電圧)は、プルアップ抵抗とか、あまり性能よくないトランジスタが引っ張るもので、次の回路の、H/Lレベル閾値がかなり下に偏っているという当時の論理回路を作る半導体の性能起因の旧仕様を引きづった考え方)。 

複数つながったもののうち、だれかがL出力(0V)すると、共用プルアップの定めるH論理電圧(この場合3.3V)だったのをLに反転できるので、少なくとも誰か一人(以上)が出力したというオア条件が検出できる。 実システムとしては、たとえば割り込み要求信号を共通にして、誰かが割り込みをかけて、CPUがどこから割り込みが来たかを最初に判断して処理をする手法があります。 もちろん割り込み要求と割り込みベクトルを同時に出して(割り込みを出したものの中の優先順位が一番高い物がアドレス出す権利を得る))、あるいは複数ある割り込み信号毎に別の割り込みアドレスを設定できて、自動で判断することなく処理が始まるのが今の主流でしょう(Z80の頃はmod2割り込みといって、Z80周辺ICが、割り込みベクトル(早い話割り込み処理開始アドレス)を出す機能があり憧れありましたが、価格的制約で全ICをザイログに統一できなくて、8251とか8255とかのインテル(平たくいうと非ザイログ・主流派)周辺ICを1つでも利用すると、これらに対しても割り込み処理を使う以上うまくいかない手法だったりしました。 H8マイコンのソフト書いていて、この割り込み別アドレス設定方法を利用。 どこかで破たんして、プログラム完成せず...残念!!(割り込み先で同時に関連割り込み来てないか?あるいは継続処理中か判断する処理したのがたぶん失敗の原因)
(2018.03.19)後、電圧系変換という用途でも、オープンドレイン+プルアップ抵抗という手法が利用されることがあります。 3V→5Vの通信の場合、出力Lは正しく伝わりますが、出力H=3.3Vは、5V系入力のNchFETをオンにすることができますが、5Vに対して、3.3Vでは、Pchトランジスタを完全オフにできません。従って5V系入力回路には、PNトランジスタ両方オン(少なくともオフではない)間に貫通電流が流れるのが道理です。これを防ぐために、3V系からはLレベルを出力するが、Hレベル出力は、出力off(Pchトランジスタが3.3Vに引っ張らない)で、プルアップ抵抗が5Vに引っ張り上げることで、5V系入力のPchトランジスタも正常オフにすることができます。 5V系→3V系の場合は、3V系入力回路に5Vが印加されると、3V系保護ダイオードが、5V入力を3V電源に逃がすことで保護しようとしますが、5V電源が勝てば、3V電源が昇圧されて3V系IC壊れます。3V系電源が勝つと5VICの電源が下がってしまって、何がおきるかわかりません。 よって、これも5V出力するのではなく、出力オフとし、3Vにプルアップ抵抗が引っ張ることで、3V系入力を正常電圧範囲とします。欠点としては、Pchトランジスタが懸命に引っ張ることにより高速変化できるはずの回路が、あまり負担の無い電流制限値(プルアップ抵抗が高抵抗値)を使うことで、遅くて使いにくいという問題があります。
-----------------------------------------------
専用コマンドgpio利用編
#前節標準ツール編とは異なり、利用宣言.・終了宣言は不要で、コマンド単体で、入出力、出力値指定、ポートリードが可能。
#何者か調べるのに、whichコマンドを利用してみる。/sr/bin/gpio にいることがわかる。
which gpio

gpio -h
#でオプション見てみると、よくわからんが、いろいろできそうなコマンドではある。pwm関連のオプションも3つほどあって、何かできそうなわくわく感。

gpioコマンド利用出力編
#27pin(コネクタ番号ではなく、汎用IOの27ピンを出力設定。echoコマンド編のようにexport命令による有効(および無効)設定不要
gpio -g mode 27 out

#H(3.3V)出力
gpio -g write 27 1

#L(0V)出力
gpio -g write 27 0

gpioコマンド利用入力編
#pin7を入力設定するコマンド
gpio -g mode 7 in

#pin7を読み出し(0/1が返ってくる)
gpio -g read 7

#全ピン同時リードコマンド
gpio readall
#ラズパイちゃんの目覚め。私は誰?の調査報告内容がほぼ確認できた(測定不明の8pinTXDに関しては入力ピン”L"入力と報告される)
#正確にいうと上記は入力ピンだというメッセージと、読んだ値が0/1の情報。入力ピンがオープンでなく抵抗による固定と考えると納得データ

#入力設定後、プルアップ設定追加
gpio -g mode 7 up


#入力設定後、プルダウン設定追加
gpio -g mode 7 down

#さて、ちょっと困った。 前回のechoコマンド等利用モードでは、電源オフ、リブートで端子設定デフォルトに戻ったきがするが、gpioコマンドは、最終状態保持のような感触。リセットコマンドオプションの中から探さないといかんなぁ。 なにかの理由で暴走した後もとに戻す方法考えんといかん

入力プルアップ→出力変更→H出力→入力設定の変化で、端子設定どうなるのかいまいち不明(最初にみたパワーオンの状況に戻らないきがする。
要調査でんなぁ(え?リブートだとよくわからんが、電源オフだともとに戻る?)。 
そもそも入力にすると、必ずプルアップかプルダウンになる気もする(シリアル出力機能ピンのみHizかも)

では、CdSによるオンオフ検出器試験
(2018.03.15)
室内灯で普通に照らして2kΩ。 手でかざして陰にして20kΩオーダ(炬燵の中に隠せば確かにMΩ以上になるのは間違いない)。ダイナミックレンジ狭くて、さらに内蔵抵抗50kΩでは、パッシプ回路で手をかざすの有無によるオンオフ制御するのはちと難しい。外付け10kΩプルアップ+内蔵50kΩプルアップ並列≒合成8k: 明るいとき2k:8k=1:4、暗いとき20k:8k=5:2 一応これで手をかざして遮る場合とスルーの場合の差が、gpio -g read 7 で、0/1判定できることが確認できた。(単発現象で見ただけで)偶然の可能性あるので、もっとセンサレンジと周辺回路のマッチング考えなくてはならんねぇ。中間電位でふらふらするのは精神上よくないので、本実験は、気持ち悪すぎ。
そのうち照度センサつないで、CdSの特性測定して、ADCで状況を判断するか、なにかの基準のスイッチ回路で、どの明るさでon/offするかトランジスタ一石Tr回路でも作るのが無難みたいです。
もっとも、手をかざす程度ではなく、夜暗くなったら、LEDをつけるとか、本格的にダイナミックレンジが広い場合(=かなり暗くなる状況)を想定するなら、on/off制御可能でしょうね。

さて、雑談。gpioコマンドは、一般コマンドpathにあるので、通常コマンドに見えなくもないが、unix標準コマンドではあるわけがない。すると今確認できたラズパイ3はいいとしても、ラズパイ1,2とか、H等、どれが対応できるのか? あるいはいつまで使えるのか不安が少し。 ラズパイにはコバンザメ商品として、互換CPUボードが、高性能版とか、廉価版とか、何種類かあるらしいが、それらのものでの対応も不明。

互換機といえば、今から40年ほど前、8ビットマイコンというのが世間をにぎわす。 世界的にいえば、アップル社の、アップルⅡがベストセラー。日本では輸入品敷居が高い(値段も英語障壁も)ので、NECやシャープのものでした(自分はNECのPC8001)。 やっぱりアップル欲しいという需要にこたえるため、IO誌の広告を細かく読むと、グレープと、オレンジとかいうまがい物が堂々と宣伝されていました(実際に実物見たことないし、買ったとか使ったという情報無いけど)。 案外ラズパイ用開発コマンドなのに、しらーっと、/sr/bin/gpio をコピーすると、互換CPUでも動くという可能性もある。 . (2018.03.14)いやオープンソースというのは知的財産を共有しようという発想だったっけか?でも専用コマンド流用のコバンザメCPUというのはなんか納得できんぁな

Cdsを使った実験プログラム書いて遊びました。(2018.03.18)
********** lchika.sh *****************
#!/bin/bash
# Perform L-chika
gpio -g mode 27 out
gpio -g mode 7 in
gpio -g mode 7 up

while [ 1 ] ; do
data=`gpio -g read 7`

if [ "$data" -eq "1" ] ; then
gpio -g write 27 1
else
gpio -g write 27 0
fi
done
************ end *******************
このようなシェルプログラムをエディタで作ります。ホームディレクトリでもよいし、今回は./lchika/を作って格納。GPIO27にLED(電流制限抵抗220~330Ω)をつないで目視確認でも可(反転電圧を測定したかったのと、閾値あたりで、ばたばた反転続けるのを心配しています(いやLEDがそばで光るとCdSへの影響が...)。 このプログラム、data変数に、端子情報を入力して、if文条件判断で、出力値を、変えているのですが、本来deta変数に入力したものが数値だろうから、そのまま、"gpio -g write 27 data"のような書式でそのまま出力すれば、if分条件判断無しで、動くく気がするが、なぜだか動かない。もっというと "gpio -g read 7 | gpio write 27"のような一行コマンドで済みそうなきもするが、うまくいかない。 おせーて > 偉い人。<(_ _)>

上記シェルコマンド実行許可するために、プログラム置いたディレクトリ(フォールダー?)に移動して
$ chmod +x lchika.sh
コマンドの実行
$ sudo ./lchika.sh
プログラム終了は^C です、

明るい環境から、GPIO27のオシロの立ち上がりトリガで、CdSに紙をかざして徐々に抵抗値を大きくしプルアップ方向に徐々にGPIO7ピンの電圧を上げていきます。次に立下りエッジトリガで最初に”L"が確定する電圧を測定した。


黄色ch1:GPIO27 GPIO7のリード値を出力したもの
空色ch2:合成プルアップ8kのGPIO7とGND間にCdSを接続したときのGPIO7端子電圧(複数応答重ね)(2018.03.19)

最初にGPIO27が反転して”H"になった時のGPIO7電圧は、1.3V位。最初に”L"になるのは、1.1V程度。出力反転の20msec前のデータで確定のように見える。もっと、変化点ばたばたするかと思ったが、すっきり反転している。もしかすると0.2V程度のシュミットトリガ入力の可能性もあるかな?シュミットなら貫通電流あまり心配しなくてよいかな?

(2018.03.11)入力の状態にこだわる(プルアップ抵抗とかプルダウン抵抗とか)の話は、別ページに統合します。

------------------------------------
サイトマップ トップ  <  ラズパイの部屋 < . > Lchika・pyton