LEDのパルス制御で成長促進と消費電力節約の一石二鳥で光合成の特性を考えて光の当て方を工夫すれば少ない照射 = 少ない消費電力 で栽培できることを紹介しました。”時は金なり”ですので早速導入してみたいと思いますっ!
パルス制御のおさらい
パルス制御は別名PWM(Pulse Width Modulation)と呼ばれ、任意の周期Tに対し、信号のon / offの繰り返し制御を行うものです。光合成反応では200 us(10^-6秒)周期で明るい期間が30%以上であれば成長を損なうことはないというものでした。
水耕栽培においては蛇足ですが、LED照明の明るさ調整はPWMで行うことができます。onの時間を短くしていけば暗い期間が増えていくので暗く感じます。
on/offを切り替えてちらつきがあるんじゃない?という疑問があるかもしれませんが、人間の目には限界があって、ある速度以上であればまったくon/offに気づきません。この性質を利用して明るさを調整するのです。
人間の目の限界の例ですが、よく聞くテレビのスペックの30fpsとか、ゲーム用のモニターの60fpsとかが参考になると思います。動画は静止画の集まりですが、そのスピードで静止画が切り替わっても区別できないのでカクカクせずに動画が見えるのです。
Raspberry PiでPWM制御
Raspberry Piってなに?
Raspberry Piってご存知でしょうか。小型のパソコンでGPIO(General Purpose I/O ) portがついています。I/O portがあるので電子工作と非常に相性がいいです。またパソコンですのでOSを入れれば簡単にプログラムを動かすことができます。
Raspberry Piで使用するPort
Raspberry PiのGPIOはPWM出力に対応したportがひとつ用意されています。Port 18です。このPortのPWMはハードウェア制御なので誤差が少ないです。ソフトウェアでのPWMではパソコンと同じで動いているソフトの影響を受け、制御が不安定になります。このportで最適なPWM制御を実現しましょう!
PythonでのPWM制御が実はソフトウェア制御でした
お手軽装置ように作ったProgramがありました。こちらです。こちらを変更します。
PythonではRPi.GPIOというライブラリを使うので公式サイトを見てみました。公式サイト
Note that this module is unsuitable for real-time or timing critical applications. This is because you can not predict when Python will be busy garbage collecting. It also runs under the Linux kernel which is not suitable for real time applications – it is multitasking O/S and another process may be given priority over the CPU, causing jitter in your program. If you are after true real-time performance and predictability, buy yourself an Arduino http://www.arduino.cc !
Note that the current release does not support SPI, I2C, hardware PWM or serial functionality on the RPi yet. This is planned for the near future – watch this space! One-wire functionality is also planned.
Although hardware PWM is not available yet, software PWM is available to use on all channels.
むむむっ!という状態でした。前半はいいよ、多少はね、、と思いながら読むと後半になるとなんとソフトウェア制御しかサポートしていないと書いてあります(!)。これは困りましたね、、。ソフトウェアのPWMは全部のportでサポートしてますよー、と当たり前のこと書かれても、、、。
とりあえず実装してみて実害ないか確認する感じですかね。
サンプルプログラムを見てみる
公式サイトを見てみました。こちらです。結構簡単にできるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//ライブラリの取り込み import RPi.GPIO as GPIO # BOARD / BCMモードがあります。BOARDはPIN配置といっしょなのでBOARDにしましょう。 GPIO.setmode(GPIO.BOARD) # channelに使うGPIOを指定します。今回結局ソフトウェア制御なのでどこでもOKです。。。 GPIO.setup(channel, GPIO.OUT) # frequencyが周波数です。Hzです。 p = GPIO.PWM(channel, frequency) # dcがduty cycleで0.0-100.0が指定できるとのことです。 p.start(dc) |
これらを事前準備としてプログラムを変更しましょう。
ソフトウェアへの実装
周波数 200usec = 5,000Hz ですね、1/(200 * 10^-6)
私のプログラムは時間になったら赤色と青色のLEDを切り替えるようになっています。ですので不要な部分もありますが、、ちゃんと、PWMの設定もしていますよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/usr/bin/python # config: UTF-8 from datetime import datetime import threading import time import RPi.GPIO as GPIO BLUE_PORT = 24 RED_PORT = 23 SW_PORT = 18 DAYTIME_START = 600 DAYTIME_END = 1800 print "start led management" def init(): GPIO.setmode(GPIO.BCM) GPIO.cleanup() GPIO.setup(BLUE_PORT, GPIO.OUT) GPIO.setup(RED_PORT, GPIO.OUT) def checkDayTime(): curTime = datetime.now().hour * 100 + datetime.now().minute if (curTime < DAYTIME_START) or (curTime > DAYTIME_END): print "current Time is {0} so Blue is on".format(curTime) GPIO.output(BLUE_PORT, True) GPIO.output(RED_PORT, False) else: print "current Time is {0} so Red is on".format(curTime) GPIO.output(BLUE_PORT, False) GPIO.output(RED_PORT, True) t = threading.Timer(60, checkDayTime) t.start() init() # 5000Hz & 40% duty GPIO.setup(SW_PORT, GPIO.OUT) p = GPIO.PWM(SW_PORT, 5000) p.start(40) t= threading.Thread(target=checkDayTime) t.start() |
実験結果
ん、、?周波数もあっていないし、パルス幅もバラバラ。。。 これはちょっと使えないなー。あと、ソフトウェア制御のためか、処理が少し入るとちょっとちらつきます。。。
まとめ。Pythonの標準ライブラリはPWMに向いていない
PythonのRaspberry Pi用のライブラリ:RPi.GPIOでのPWM制御は、私にはうまく使い込めませんでした。誤差が大きいですし、周波数の設定もうまくできません。Port 18でハードウェア制御できるWiringPiを検討します。
記事を読んでいただいてありがとうございます。この記事がいいなと思ったら下記のSNSボタンのクリックをお願いします。励みになります😁