Python 言語の理解 その2

Python 言語では 行末に ; を書いたりする必要はないようです。

改行までが 行です。見たまんま。

逆に2行にまたがるような時は、物理的に改行する手前に \ を入れるようです。

例えば

 

abc = 1 + 2 + 3 \

+ 4 + 5

 

この逆で、1行に複数のステートメントを書くときは ; で区切るらしいです。

 

abc = 1 + 2 + 3 ; cba = 4 + 5

 

左から解釈されていくようなので次のようにも書けます。

 

abc = 1 + 2 + 3 ; cba = abc + 4 + 5

 

普通かな(笑)

 

Python 言語の理解 その1

不思議なコメント

 

#で始める文章は行末までコメント扱い。

これは一般的な他の言語と似ているような気がします。

ですが、面白いのはコレ

""" で始める文章は """ が出てくるまでコメント扱い。

ダブルコーテーションを三つ続けて書くと、再びダブルコーテーションが三つ続けて現れるまでが 複数行の文字列として扱われ、意味のない文字列は無視される為、コメントとして利用できるようです。なんか変(笑) /* ~ */ みたいな使い方なんですね。

 

 

Python 言語の理解

LEDのチカチカや、スイッチのパチパチは、書籍通りにやれば制御できたので(笑)、今度は言語そのもの Python3についていろいろ勉強して理解しようと思います。

今までの書籍にも Python3については触れてはいいるものの、あくまで制御のためのサンプルプログラムなので、Python3について全般的な事は置きざりになっているはずです。これから長い付き合いをしていく為に本格的に Python3で遊ぶ気になってきたので専門書を買ってみました。

「詳細!Python3入門ノート」大重美幸著 初版 第3刷

f:id:osadamao:20180213224203j:plain

 この本の中で、Python3のコーディングをタイプするならAtomというエディタが便利、と書かれており、linux版もあるようなのですが、Raspbian で使えるようにカスタマイズされたものは見つけられませんでした。(>_<)

 なので、気にせず今まで通りのスタイルで入力していく事にしました。

言語についてはココに要約を書き出していく事は止めて、古いC言語などを知っている僕が、「おや?」っと思ったことだけを書き出していこうと思っています。

 

 

Iceweaselのインストール

標準のブラウザ「Chromium」よりも使い慣れたFirefox互換の「iceweasel」を入れてみました。

 

pi@raspberrypi:~ $ sudo apt-get install iceweasel iceweasel-l10n-ja
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
firefox-esr firefox-esr-l10n-ja libjsoncpp1
提案パッケージ:
fonts-stix | otf-stix fonts-lmodern mozplugger
以下のパッケージが新たにインストールされます:
firefox-esr firefox-esr-l10n-ja iceweasel iceweasel-l10n-ja libjsoncpp1
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
42.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 94.7 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf libjsoncpp1 armhf 1.7.4-3 [66.2 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf firefox-esr armhf 52.6.0esr-1~deb9u1 [41.7 MB]
取得:3 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf firefox-esr-l10n-ja all 52.6.0esr-1~deb9u1 [564 kB]
取得:4 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf iceweasel all 52.6.0esr-1~deb9u1 [122 kB]
取得:5 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf iceweasel-l10n-ja all 1:52.6.0esr-1~deb9u1 [120 kB]
42.6 MB を 1分 51秒 で取得しました (383 kB/s)
以前に未選択のパッケージ libjsoncpp1:armhf を選択しています。
(データベースを読み込んでいます ... 現在 126542 個のファイルとディレクトリがインストールされています。)
.../libjsoncpp1_1.7.4-3_armhf.deb を展開する準備をしています ...
libjsoncpp1:armhf (1.7.4-3) を展開しています...
以前に未選択のパッケージ firefox-esr を選択しています。
.../firefox-esr_52.6.0esr-1~deb9u1_armhf.deb を展開する準備をしています ...
'firefox-esr による /usr/bin/firefox から /usr/bin/firefox.real への退避 (divert)' を追加しています
firefox-esr (52.6.0esr-1~deb9u1) を展開しています...
以前に未選択のパッケージ firefox-esr-l10n-ja を選択しています。
.../firefox-esr-l10n-ja_52.6.0esr-1~deb9u1_all.deb を展開する準備をしています ...
firefox-esr-l10n-ja (52.6.0esr-1~deb9u1) を展開しています...
以前に未選択のパッケージ iceweasel を選択しています。
.../iceweasel_52.6.0esr-1~deb9u1_all.deb を展開する準備をしています ...
iceweasel (52.6.0esr-1~deb9u1) を展開しています...
以前に未選択のパッケージ iceweasel-l10n-ja を選択しています。
.../iceweasel-l10n-ja_1%3a52.6.0esr-1~deb9u1_all.deb を展開する準備をしています ...
iceweasel-l10n-ja (1:52.6.0esr-1~deb9u1) を展開しています...
mime-support (3.60) のトリガを処理しています ...
desktop-file-utils (0.23-1) のトリガを処理しています ...
libc-bin (2.24-11+deb9u1) のトリガを処理しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
gnome-menus (3.13.3-9) のトリガを処理しています ...
hicolor-icon-theme (0.15-1) のトリガを処理しています ...
libjsoncpp1:armhf (1.7.4-3) を設定しています ...
firefox-esr (52.6.0esr-1~deb9u1) を設定しています ...
firefox-esr-l10n-ja (52.6.0esr-1~deb9u1) を設定しています ...
iceweasel (52.6.0esr-1~deb9u1) を設定しています ...
iceweasel-l10n-ja (1:52.6.0esr-1~deb9u1) を設定しています ...
libc-bin (2.24-11+deb9u1) のトリガを処理しています ...
pi@raspberrypi:~ $

 

これでインストールは完了です。

 

f:id:osadamao:20180212223408p:plain


メニューに追加されたFirefoxESRを起動するとFirefox初回起動時の設定インポート確認が表示されました。

 

f:id:osadamao:20180212215044p:plain

とりあえずインポートしておく。

f:id:osadamao:20180212215106p:plain

 これまた初回起動時に確認されるGoogleアカウント

 

f:id:osadamao:20180212215157p:plain

 無事画面が出ました。 

f:id:osadamao:20180212215220p:plain

 操作は慣れ親しんだものなので使いやすいですが、遅いです。

Raspbianに標準でインストールされているChromiumは、RaspberryPiのリソースに合わせてチューニングされているのでしょうか。

どちらをメインに使うかは、これから使いながら考えていくことにしたいです。

 

 

Raspberry Pi3 GPIO 制御2

先のブログにも書いたように参考にする書籍によって使用しているGPIO制御モジュールが2種類あります。

"RPi.GPIO" と "wiringpi" 

その2つの違いは何なんでしょうか。

以前に買った書籍「電子部品ごとの制御を学べる!RaspberryPi電子工作」だと "wiringpi" が使用されており、Raspberry Pi に Raspbian をインストールすればwiringpi も含まれており何もしなくても使える、という旨の事が書いてありますが、書籍の中に紹介されているサンプルプログラムをそのまま入力して実行させてみると、この様なエラーになりました。

 

>>> %Run Raspberry_Pi3_GPIO_wiringpi.py

Traceback (most recent call last):
File "/home/pi/soc/Raspberry_Pi3_GPIO_wiringpi.py", line 4, in <module>
import wiringpi as GPIO
ImportError: No module named 'wiringpi'

 

'wiringpi'が見つからない旨のエラーメッセージなので、 綴り誤りだと思って何度も確認しましたがあっているようです(笑)
ならば、という事で'wiringpi'をインストールしてみました。

 

pi@raspberrypi:~ $ pip3 search wiringpi
ledDriver (1.0) - Python LED light strip and PWM drivers using the
WiringPi2 library.
wiringpi (2.44.4) - A python interface to WiringPi 2.0 library which allows
for easily interfacing with the GPIO pins of the
Raspberry Pi. Also supports i2c and SPI.
wiringpi2 (2.32.3) - A python interface to WiringPi 2.0 library which allows
for easily interfacing with the GPIO pins of the
Raspberry Pi. Also supports i2c and SPI

 

wiringpiとwiringpi2の違いは何?全く同じ説明が書かれてます。
違いが判りませんが版数の新しいほう wiringpi を入れてみることにしました。


pi@raspberrypi:~ $ pip3 install wiringpi
Collecting wiringpi
Downloading wiringpi-2.44.4-cp35-cp35m-linux_armv7l.whl (256kB)
100% |████████████| 266kB 803kB/s Installing collected packages: wiringpi
Successfully installed wiringpi-2.44.4
pi@raspberrypi:~ $

 

インストールは難なく成功したようなので、LEDを点灯させてみます。
5秒点灯して消灯させます。

★まずはRPi.GPIOを使う例

#Raspberry Pi3 GPIO 出力1RPi.GPIOを使う実験
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
LED_PIN = 23

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#出力モード設定
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

#出力設定
GPIO.output (LED_PIN,GPIO.HIGH)
sleep(5)
GPIO.output (LED_PIN,GPIO.LOW)

#GPIOリセット終了
GPIO.cleanup()

 

★つぎはwiringpiを使う例

#Raspberry Pi3 GPIO 出力1wiringpiを使う実験
#ライブラリの読み込み
import wiringpi as GPIO
from time import sleep
LED_PIN = 23

#初期化
GPIO.wiringPiSetupGpio()


#出力モード設定
GPIO.pinMode (LED_PIN,GPIO.OUTPUT)

#出力設定
GPIO.digitalWrite (LED_PIN,GPIO.HIGH)
sleep(5)
GPIO.digitalWrite (LED_PIN,GPIO.LOW)

 

どちらも、ほぼ同じなのですが初期化の部分で wiringpi には、GPIO番号指定なのか物理位置番号指定なのかを宣言することや、.setwarnings のようなワーニングメッセージを抑止するようなものがありません。また、wiringpi では終るときに明確にGPIOを開放する指定が無いような気がします。それらを考えると、初心者なら wiringpi を使うよりRPi.GPIOを使った方が安全なような気がします。

 

PWMで疑似アナログ出力する場合での RPi.GPIOを使う場合とwiringpiを使う場合の違いを確認してみました。

★まずはRPi.GPIOを使う例

#Raspberry Pi3 GPIO PWM 出力 RPi.GPIOを使う実験

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

LED_PIN = 23

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#出力モード設定
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

#出力設定
p2 = GPIO.PWM(LED_PIN,200)
p2.start(0)

try:
    while True:
        for dc2 in range(0,101,10):
            p2.ChangeDutyCycle(dc2)
            print(dc2)
            sleep(0.3)

#例外処理
except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

p2.stop()

#GPIOリセット終了
GPIO.cleanup()

 

★続いてwiringpiを使う例

#Raspberry Pi3 GPIO PWM 出力 wiringpiを使う実験

#ライブラリの読み込み
import wiringpi as GPIO
from time import sleep

LED_PIN = 23

#初期化
GPIO.wiringPiSetupGpio()


#出力モード設定
GPIO.pinMode (LED_PIN,GPIO.OUTPUT)

#出力設定
GPIO.softPwmCreate (LED_PIN,0,100)

try:
    while True:
        for dc2 in range(0,101,10):
            GPIO.softPwmWrite(LED_PIN,dc2)
            print(dc2)
            sleep(0.3)

#例外処理
except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass 

 

疑似アナログ出力をするケースでも RPi.GPIOを使う場合とwiringpiを使う場合の違いは、デジタル出力のケースと同じでした。

つまり あえて"wiringpi"を使った方がいい理由は僕にはわかりませんでした。

 

という事で定番のRPi.GPIOを使ってLEDを順番につけてみるスクリプトを作ってみました。

#Raspberry Pi3 GPIO 出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

 

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

 

#出力モード設定
for LED_PIN in [23,24,25,16,20,21]:
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

 

#出力設定
try:
    while True:
        for LED_PIN in [23,24,25,16,20,21]:
            GPIO.output (LED_PIN,GPIO.HIGH)
            sleep(0.1)
            GPIO.output (LED_PIN,GPIO.LOW)

        sleep(0.1)

        for lp in range(3):
            for LED_PIN in [23,24,25,16,20,21]:
                GPIO.output (LED_PIN,GPIO.HIGH)

            sleep(0.1)

            for LED_PIN in [23,24,25,16,20,21]:
                GPIO.output (LED_PIN,GPIO.LOW)

            sleep(0.1)

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

 

#GPIOリセット終了
GPIO.cleanup()

 

f:id:osadamao:20180211142818j:plain

 

 

 

LEDの点灯制御についてはうまくできるようになったので、今度はスイッチのON、OFFを読み出すようなプログラムも整理しました。

 

#Raspberry Pi3 GPIO 入力1
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#GPIO4を入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)

#コントロールCが押されるまでループ

try:
    while True:
        if GPIO.input(SW_PIN) == GPIO.HIGH : #GPIO.LOW または GPIO.HIGHを得る
            print ( 'SW on:GPIO' + str(SW_PIN) + ' HIGH' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )

        sleep (1)

#例外
except KeyboardInterrupt :
    print ( 'CTRL + C' )
    pass


#GPIOのリセット終了
GPIO.cleanup()

 

 

 

 

参考にさせていただいたサイト

ag.hatenablog.com

Raspberry Pi3 GPIO 制御

RaspberryPi3で遊んでみるために今まで本を4冊購入してます。

f:id:osadamao:20180114140921j:plain

 

f:id:osadamao:20180114140927j:plain

この本で紹介されていたGPIO制御をテストするための汎用GPIOボードを購入したので、この本で紹介されていた python のプログラムで初めてLチカやスイッチ確認の実験をしました。

 

 

f:id:osadamao:20180114140934j:plain

 

プログラムに多少の違いはあるけれど、Lチカやスイッチの状態読み取りテストプログラムはどれも同じようなもの。なのですが、ふと使っているモジュールが違うことに気が付きました。

これらの書籍では RPi.GPIO を使っており、プログラムの冒頭に

import RPi.GPIO as GPIO

を記述していました。

 

ですが下の書籍では、wiringpi を使っており、冒頭に

import wiringpi as pi

を記述しています。

f:id:osadamao:20180114134907j:plain

なんか気になります。どっちが使いやすいのか考察してみたいと思います。

 

キャラクタディスプレイに文字を表示させたいだけなのに・・・

#!/usr/bin/env python
#coding:utf-8
import serial
import datetime
from time import sleep

##
# str = con.readline();
# if str != "" :
# print (str)
# sleep(0.5)
#
#
#if __name__ == '__main__' :
#    main()


con=serial.Serial('/dev/ttyAMA0',115200,timeout=0)
print (con.portstr)


while True:
    dt=datetime.datetime.now()
    print(dt)
#    print(dt.strftime("%H %M %S"))
#    con.write(dt).encode('utf-8')
#    con.write('AT'+'\r\n')

    str = con.readline();
    if str != "" :
        print (str)
    sleep(1)