RaspberryPI3で128GのマイクロSDカードを使うには
RaspberryPI3 でいろいろ実験的な事をして遊んできました。
これはRaspberryPI の本来の目的である学習用途なのですが、だんだん試してみたいこともなくなってきてます。(自分の想像力の欠如?)
このまま放置するのも可哀想なので なにか実用的な事に使えないかな、とNextcloudでファイルサーバとか、WordPressでホームページの作成とかを試してましたが、やはりスペック的に貧弱なとこがネックになってしまい、お試し程度で限界が見えます。(当然ですね)
サーバ系は諦めて、普段の動画、音楽、ネット閲覧用の端末として使おうとすると、ストレージが小さいのが微妙に困ります。
32GのマイクロSDカードを使っていたのですが、128GのマイクロSDカードを買って利用可能な容量を増やそうとしたのですが、うまくブートできなくなりました。
これはマイクロSDカードの初期化の方法に問題があるらしいです。
I-O DATA ハードディスクフォーマッタ | サポートライブラリ | IODATA アイ・オー・データ機器 | IODATA アイ・オー・データ機器
こちらから フォーマッター をダウンロードしてFAT32 MBR 形式でフォーマットすれば問題なく使えるようになりました。
RaspberryPI3へのNextcloudのインストール
しばらく RaspberryPI を触ってませんでした(*^^*)
Windowsパソコンのファイルサーバになってくれてもいいじゃん、と思っていたところ、日経Linux1月号に RaspberryPI3にNextcloudを入れてファイルサーバにする記事がありました。
これじゃん!
と、記事どおりにインストールして起動することができたのですが、写真をアップロードしすぎたのか、急に動作が遅くなってしまいファイルサーバとして使えなくなりました。
うーん、RaspberryPI3 の性能では実用的なサーバ運用は無理なのかなぁ
動作テストレベルなら十分動いてますけどね。
(後述)
RaspberryPI に Nextcloudを導入しファイルサーバとして動作させることはできましたが、当初思っていたものと違っていて、便利に使うことができませんでした。
・Nextcloudにファイルを複数登録していくと、どんどん画面操作が遅くなっていく。
・Nextcloudにファイルを登録すると、全クライアントにその全てのファイルが複写される。
つまりスマフォからアクセスすると、全ファイルがダウンロードされてきます。
こりゃいかんす。
RaspberryPI3でのWebサーバは情報が少ない
RaspberryPI3をWebサーバとして使うのは、消費電力とか、冷却装置とか、静音性とかの問題が少なく、先人が沢山いると思ったのですが、Webで探してみると、Apacheをインストールしてみました、標準サンプルの画面が表示されました、のような記事ばかりで運用やセキュリティについては、実際にRaspberryPIを使ってみての記事ではなく、一般的にLinuxならこうだからRaspberryPIもこうでしょうみたいな記事が多く、参考になっても実際にやるとなるとできない事ばかり。
RaspberryPI3を独自に調査してWebサーバとして使うのはちょっと困難かも。
あ、セキュリティも何も考えないで公開するならインストールするだけです。
Python 言語の理解 その9
GPIO接続したスイッチ入力とLED出力を組み合わせてみる
LED 6個を順に光らせ、スイッチが押されたら反転させる
GPIO_inout_LED6.py
#Raspberry Pi3 GPIO 入出力
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
SW_PIN = 4
LEDNO = [23,24,25,16,20,21]
#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)
#出力設定
try:
LED_PIN = 0
LED_ADD = 1
while True:
GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
sleep(0.3)
GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
LED_PIN = LED_PIN + LED_ADD
if (LED_PIN == 6):
LED_PIN = 0
if (LED_PIN == -1):
LED_PIN = 5
# スイッチが押されていたら反転
if (GPIO.input(SW_PIN) == GPIO.HIGH) :
print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
if (LED_ADD == 1) :
LED_ADD = -1
print ( 'LED_ADD = -1' )
else :
LED_ADD = 1
print ( 'LED_ADD = 1' )
else :
print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )
except KeyboardInterrupt:
print ( 'CTRL + C' )
pass
#GPIOリセット終了
GPIO.cleanup()
それなりに機能するのですが、スイッチの反応が悪くてなんかうまくいきません。
押されたトリガを捕まえられるとよいのですが、押された時に読み込まないと反応しないし、押されたままだと続けて反応してしまうので、ボタンを押したことがうまくLEDの光らせ順を変えるようには機能しない事が多いです。
で、押されたら話されるまで反転させないようにちょっとプログラムをいじってみました。
GPIO_inout-2_LED6.py
#Raspberry Pi3 GPIO 入出力
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
SW_PIN = 4
LEDNO = [23,24,25,16,20,21]
#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)
#出力設定
try:
SWC_CHK = 0
LED_PIN = 0
LED_ADD = 1
while True:
GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
sleep(0.3)
GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
LED_PIN = LED_PIN + LED_ADD
if (LED_PIN == 6):
LED_PIN = 0
if (LED_PIN == -1):
LED_PIN = 5
if (GPIO.input(SW_PIN) == GPIO.HIGH) :
print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
if (SWC_CHK == 0) :
SWC_CHK = 1
if (LED_ADD == 1) :
LED_ADD = -1
print ( 'LED_ADD = -1' )
else :
LED_ADD = 1
print ( 'LED_ADD = 1' )
else :
print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )
SWC_CHK = 0
except KeyboardInterrupt:
print ( 'CTRL + C' )
pass
#GPIOリセット終了
GPIO.cleanup()
バッチリです!
ボタンを押すとLEDの光順が反転するようになりました。
Python 言語の理解 その8
if 文の不思議
今まで見てきたプログラム言語の制御文で、字下げが必須な言語は知りません!
pythonは初めて知った字下げが必要なプログラム言語!
test = 0
if test == 0 :
print ("ifの中です")
もし、C言語ならこんな感じです。
test = 0
if ( test == 0) {
print ("ifの中です\n") ;
}
見慣れているからか、C言語の方が見やすいです。
条件文は()でくくるし、その条件に合致した時に実行する文は{ }で囲んでました。
それが常識のように思ってました。
それが字下げで表現するなんて驚きです。でも見やすいような見づらいような。。
if (test == 0) { :
print ("ifの中です")
}
SyntaxError: invalid syntax
if (test == 0) : {
print ("ifの中です")
}
SyntaxError: invalid syntax
if (test == 0) :
{
print ("ifの中です")
}
IndentationError: expected an indented block
いろいろ試してみましたが、駄目でした(>_<)
test = 0
if test == 0 :
print ("if の then の中です tab")
else
print ("if の else の中です tab*2")
これ else の後の字下げ幅が違うんですがエラーにならないし、ちゃんと機能しました。
うーん、慣れれば使いやすいのかもしれませんが、不思議な感じです。
Python 言語の理解 その7
すっきりしないプリント書式
画面に出力するときの print の書式の指定がなじめない。
c言語なら printf だけで様々なことが出来るのに、Pythonだとすっきりしない。
普通にプリントすると、ブランクで区切られて列挙されるだけ
>>> print (1,2,3)
1 2 3
オプションで区切り文字や行末文字を指定することはできる。
>>> print (1,2,3,sep=",")
1,2,3
>>> print (1,2,3,sep=",",end=" !\n")
1,2,3 !
文字列属性には、.formatメソッドで変数の展開が出来るらしい。変数名の指定順はどうでもいいらしい。変数がない場合も許される。
>>> print ("{name}の年齢は{age}歳です。".format(name="やまだ",age=15))
やまだの年齢は15歳です。
>>> print ("{name}の年齢は{age}歳です。".format(age=26,name="武田"))
武田の年齢は26歳です。
>>> print ("{}の年齢は{}歳です。".format("井上",30))
井上の年齢は30歳です。
既に設定済の変数を使う場合はこうすればいいらしい
>>> name="吉田"
>>> age=21
>>> print ("{}の年齢は{}歳です。".format(name,age))
吉田の年齢は21歳です。
書式文字列を変数に入れて共通で使うならは
>>> tfmt = "{}の年齢は{}歳です。"
>>> print (tfmt.format(name,age))
吉田の年齢は21歳です。
>>> print (tfmt.format("山田",19))
山田の年齢は19歳です。
python3.6 からは、f で書式設定ができるらしい
先に使ったこの一文を
>>> print ("{name}の年齢は{age}歳です。".format(name="田中",age=22))
こういう風に書くことが出来るらしい
>>> name="田中",age=22
>>> print (f"{name}の年齢は{age}歳です。")
ですが! ですが!
pi@raspberrypi:~/soc $ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
RaspberryPi の Raspbian に入っているのは Python 3.5.3でした(>_<)
駄目じゃん(笑)
Python 言語の理解 その6
モジュールを読み込む
>>> import random
使うときは モジュール名に .関数名 を付けて呼び出せます。
>>> random.randint(1,10)
9
>>> random.random()
0.5393296766294138
>>> random.random()
0.030883659185085177
モジュールの中の使う関数だけを限定で読み込むときは
>>> from random import randint
>>> randint(1,10)
2
読み込んでいない関数は使えません。
>>> random()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> from random import random
>>> random()
0.46652281624641545
読み込めば当然使えます。(笑)