Vol.753 31.Aug.2018

IE9で証明書エラーが頻発 Pythonのおさらい(1)〜ラムダ式〜 ラズパイ(17)〜ステッピングモーター制御

I IE9で証明書エラーが頻発

by fjk

最近、急に、インターネットエクスプローラ9(Vistaマシン)で「このWebサイトのセキュリティ証明書には問題があります」とエラーが出るようになった。強制的に継続実行しても、次のページで同じエラーが頻発する。セキュリティソフトも「有効期限切れ」と表示され動作していない。ブラウザソフトのサポート期限が切れているためかと思いつつ、ネットで症状を検索してみると、この症状は、httpsで始まるURLで、以下の場合に発生するとある。

@ SSLサーバ証明書の有効期限が切れている場合
A クライアントPCの日付が適切で無い

エラーが出る証明書の期限を確認してみると、チャンと有効期限内である。しかし、クライアントPCの日付をみると、「月日は正しい」が・・、「年が2028年」となっている。何と10年も先の日付である。これでは有効期限が切れるのも納得。
 そこで、日付を現在の正しい年月日に修正し、パソコンを再起動させると、「証明書エラー」もなくなり、「セキュリティソフト」も動作し、正常に使える状態になった。
 プリンタ切替機の不調で、パソコンがフリーズし、強制再起動を何度も行ったことが、思い当たるが・・
 インターネット経由で時刻を取得する「インターネット時刻」の設定も”time.windows.com”と自動的に同期するようになっていたのですが、たまには日付のチェックが必要(年にも注意)。
(時刻はtime.nist.gov 、time-nw.nist.gov 、time-a.nist.gov 、time-b.nist.gov などから取得可)


P Pythonのおさらい(1) 〜ラムダ式〜

by fjk

「ラムダ式(lambda expressions)は、簡易的な関数オブジェクトをその場で定義するための機能」とある。また、「ラムダ式はメソッドを変数の様に扱える」ので、ラムダ式を関数の引数としてインラインで引き渡せる。ただし、ラムダ式は単一行の式しか持つことができず、文のように複数行のブロックを持つことはできないので、ラムダ式で複雑な処理を行うことは困難である。
 ラムダ式は、関数で書くと冗長になりがちな、ちょっとした処理をインラインで書くことができるため、よりシンプルに記述できる。また、ラムダ式は名前が無い「無名関数」の一つだが、変数に代入することで疑似的に名前を付けることができる。
 ラムダ式はPythonの他C++やJavaなど、いろいろなプログラム言語でも利用できるが、言語によって表記法が異なるので注意。

<Pythonラムダ式の基本書式>
lambda [引数] [返り値]  又は  疑似変数 = lambda [引数] [返り値]

(関数で表現した例) (ラムダ式で表現した例)
def func(a, b):
return a+b
  lambda a, b : a + b

前述の様に、ラムダ式では複数行にまたがる文を記述できないが、以下の様にif文に相当する三項演算子は使用可能。

get_odd_even = lambda x : 'even' if x % 2 == 0 else 'odd'
print(get_odd_even(3))       ・・・・「odd」と表示
print(get_odd_even(4))       ・・・・「even」と表示

※3項演算子:
(条件式が真のときに返す値) if (条件式) else (条件式が偽のときに返す値)

<ラムダ関数の利用例>
「関数に無名関数を渡し、そこで使ってもらう」という利用方法が取られているコードとして、pythonで標準関数のmap関数がある。
map関数は引数としてラムダ式とイテレータを受け取り、イテレータの全ての要素に対しラムダ式を適用し結果を返す関数である。
例えば、
f = lambda x: 2*x         ・・・引数を1つ受け取り、2倍にして返すラムダ関数
itr = [1, 5, 2, 3,20, 2]       ・・・イテレータとして、適当な整数が格納されたリスト
map(f, itr)              ・・・map関数に渡すと
[2, 10, 4, 6, 40, 4]          ・・・返ってくるイテレータ


※【データをシーケンス(順に並ぶ)にまとめて管理できる主なオブジェクト】

1.リスト(複数のオブジェクトを格納し、順に管理できるシーケンス型オブジェクト)
[1,2,3」 ・・・・要素を’,’(カンマ)で区切り、全体を’[ ]’(ブラケット)で包む。
・文字列やタブルからリスト作成するにはlist()関数を用いる。
・リストサイズの取得はlen()関数、要素を削除するにはdel文を用いる(popメソッドでも可能)。
2.タプル(一度セットしたら、要素を書き換えられないimutableリスト)
(1,2,3) ・・・・要素を’,’(カンマ)で区切り、全体を’( )’(パーレン)で包む。
・リストからタプルを作成するにはtuple()関数を用いる。タプルのソートには、
 タプル−≪list()≫−>リスト−≪sort()≫−>リスト−≪tuple()≫−>タプル
3.辞書型(dict型)
{1:'a', 2:'b', 3:'c'} ・・・・キーとデータを’:’(コロン)でセットとして記述し、各要素を ’,’(カンマ)で区切り、全体を’{ }’(ブレース)で包む。
イテレータ(iterator)
イテレータは「反復子」と呼ばれ、要素を順番に取り出す方法を提供するもので、次の要素に進むにはnext関数を使う(イテレータは前回呼ばれた要素の位置を覚えているので、next関数で呼ばれる毎に次の要素が読み出される)。for文でもイテレータが使える場合は要素が順に呼び出される。また、リストなどをイテレータに変換するにはiter関数を使う
ジェネレータ (genarator)
各要素の値などを次々に生成(ジェネレート)し他の手続きに渡す。
返す関数はreturnではなくyieldを用いる。yieldを使うと、呼ばれるたびに記述された順にyield文を実行し、イテレータを返す(呼ばれる毎に返すイテレータが異なる)。


R ラズベリーパイ(17) 〜ステップピングモータ制御〜

by fjk

安価なドライバー(ULN2003AGP)付きステッピングモーターセット(28BYJ-48、5個入、\1040)をラズパイから制御した。28BYJ-48は4相ユニポーラタイプで、図のような回路になっている。このモーターに減速ギヤが組み合わさっており、減速比は1/64である。
 ドライバーICはULN2003Aで、7つのトランジスタアレーでを内蔵している。28BYJ-48は5V(最低4.8V)で動作する。1.2V充電電池×4本(約5V))など、別途電源を準備する方が良いが、ラズパイの5V電源(USB直なのでUSB電源の電流供給量に注意)でも駆動できる。
 モーターの動作は、IN1〜4の4つの極それぞれに以下の信号を順に送ると回る(1-1相励磁)。
 ただ、これではトルクが小さいため、トルクが欲しい時は、消費電量が増えるが、次の8ステップの信号を順に与える(2-2相励磁)。

28BYJ-48ステッピングモーター
 
IN1、IN2、IN3、IN4
  1、 0、 0、 0
  0、 1、 0、 0
  0、 0、 1、 0
  0、 0、 0、 1
  
 (1がON、0がオフ)

1-1相励磁の波形
IN1、IN2、IN3、IN4
  1、 0、 0、 1
  1、 0、 0、 0
  1、 1、 0、 0
  0、 1、 0、 0
  0、 1、 1、 0
  0、 0、 1、 0
  0、 0、 1、 1
  0、 0、 0、 1
  
 (1がON、0がオフ)

2-2相励磁の波形

モーターの回転を逆にするには、前記のステップを下から順に与えれば良い(reversed関数が使える)。

28BYJ-48は64stepで5.625度回転する。2-2相励磁の場合は1パターン8stepあるので、このパターンを8回繰り返す(8x8=64step)と5.625度回転する。すなわち、2048step回すと180度回転する。テストスケッチではパターンに合わせて8の倍数単位で回転させているので、256ステップで180度、512ステップで1回転する。
 delayは待ち時間で小さいほどモータは早く回り、delayを1より小さくするとスケッチが終了する。また、ステップ数に負の数を指定するとモータは逆回転する。

配線図 28BYJ-48の動作例

stepmotor.py 
#-*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
mPin = [17, 27, 22, 23 ]   # 桃, 橙, 青, 黄
StepCount = 8
Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0],
      [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]]
for pin in range(0,4):
    GPIO.setup(mPin[pin], GPIO.OUT)

def setStep(st, delay):     #シーケンスを出力
    for k in range(0,4):
        GPIO.output(mPin[k], Seq[st][k])
    time.sleep(delay)

def forward(delay, steps):   #CW方向に回転
    for i in range(steps):
        for j in range(StepCount):
            setStep(j, delay)

def backwards(delay, steps): #CCW方向に回転
    for i in range(steps):
        for j in reversed(range(StepCount)):
            setStep(j, delay)

try:
    while True:
        delay = int(input("Time Delay (ms)?"))
        if(delay  < 1)
            break
        steps = int(input("How many steps? "))
        if (steps > 0):
            forward(delay , steps)
        else:
            backwards(delay , steps)
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()


IE9で証明書エラーが頻発 Pythonのおさらい(1)〜ラムダ式〜 ラズパイ(17)〜ステッピングモーター制御