電子工作61 – 簡易太陽光追跡システムの製作 「DCモータ回転制御にホールセンサ使用」

 

概要

小型のソーラーバッテリーチャージャーが日中(朝から夕方まで)自動的に太陽光を追いかけることが出来るシステムを製作した、プログラムで一定の間隔でモータを回してソーラーパネルを少しずつ東から西方向に回転させ太陽を追いかける。モータの回転をいかにPICマイクロコントローラで制御するか、それとモータの回転をパネルの回転に変えるメカニズムの作成がポイントであった。今回の試みで実用的な大きいソーラーパネルへの基礎データが得られたと思っている。

 

今回製作にあたって考えていたこと

1)     DCモータに直結したネジ山を刻んだ長いシャフトの回転をプログラムで正確にコントロールするにはどうすればよいのか。

2)     ホールセンサを使ってシャフトの回転を計測する方法を実験する。

3)     回転するシャフトにはめたネジの移動を板状のソーラーパネルの回転に変えるメカニズムをどうするか。

4)     ダイアル式の24時間タイマで太陽が出る朝7時頃にシステムをONにして時間の経過とともにパネルを回転させ、日没前のの6時頃OFFにする。

5)     パネル回転のスタート位置の東端と終了位置の西端にはマイクロスイッチを設置する。

6)     何らかの理由でモータが暴走する場合を想定し、シャフトを上下するネジの移動上限と下限にそれぞれスイッチを設置しモータへの通電を遮断する。

 

回路図

使用した主な部品

1)    ソーラーバッテリーチャージャー(ソーラーパネル):: 3,6,9 and 12 Volt Solar Panel No.ES885、パネル面11x7.5cm、 秋月で¥1000で購入

2)    ギヤードモータ: RA250100−58Y12,DC3−6V,ギア比100:1,7000rpm ダイセン電子製 ¥1500

3)    モータドライバ: TA7267BP 東芝製 ¥150

4)    16F819 ¥170

5)    ホールセンサ: DN6851 パナソニック製 ¥60

6)    ダイアル式24時間タイマ: 例えば HS−AT01 ¥1000

7)    ACアダブタ: DC5V 1A ¥600

8)    その他の部品は秋葉原のネジ販売店、東急ハンズで入手

 

回路図や写真の説明

    下に回路図や写真を示す。木製の角材の表側にソーラーパネルがアルミ製パイプ(外径8mm、長さ28cm)の中間部に固定されモータによって約95°回転出来る。パイプの最下部にはり東端、西端のマイクロスイッチに接触するアルミ片が装着されている。裏側には真鍮製のネジ山を刻んだ長いシャフト(外径3.8mm、長さ25cm)は上記のアルミ製パイプと並行して上下方向に設置してある。シャフトの最上部にはプラスチック片(長さ3cm、幅1cm)がネジ止めしてありその上には2個の穴の空いた円形ファライト磁石(外径6mm、厚さ2.5mm)が接着してある。これらの磁石はN極が上を向くように取り付けてある。ホールセンサは磁石から約2mmほど離れてセンサの印字面が磁石に面して角材の上部に固定されている。磁石の数が2個なのでシャフトが1回転する毎に2個のHigh信号が出力される。シャフトの最下部はモータと接続してある。シャフトとモータ軸の間は緩衝目的で2重のゴムチューブでつないでいる(内側は飴色の自転車チューブ用虫ゴム外径4mm、外側は外径10mm 内径4mmの黒色チューブ 日本エラスター製)。シャフトの中間部には真鍮製の長さ12mmのナットが挿入してありモータの回転と共にガイドレールに沿って上下に約7cm動く。ナットには上方向と下方向にタコ糸が接続してあり、角材に取り付けてある支点になっているフックを経由してパネルを固定してある水平アルミ支柱の左右の先端にそれぞれ接続してある。これでナットの上下動がパネルの回転に変わる。また、角材にはナットが東端や西端のマイクロスイッチを超えて異常に移動した場合にモータへの電源を遮断するスイッチを上下に2個設置してある。回路図でP−SWを設けてあるが、これはパネルを任意の方向に迅速に回転させるためのものである。パネルが東端から西端までの約95°回転するためにはシャフトが約100回転する必要がある。今回はシャフトを1回に4.5回転させて30分停止して太陽に当てるルーチンを20回(4.5X20=90回転)繰り返させてほぼ西端近くまで近づける。ただし、原則西端のマイクロスイッチは作動させない。なお、東端のマイクロスイッチはスタートポイントとしてプログラム上で重要な働きをする。 VR1Kでモータの回転速度をコントロールする。

 

                                          Photo 1 ソーラパネル側全体図     Photo 2 シャフト側全体図

 

                                 Photo 3 モータとシャフトの接続部     Photo 4 駆動基板の上にResetSWとP−SWが見える

 

                   Photo 5 回転検知部:2個の磁石とホールセンサ       Photo 6 東端、西端マイクロスイッチ        Photo 7 ナット、安全スイッチ

 

ホールセンサからの出力

 下図は簡易太陽光追跡システムのモータが実際に回転してパネルを動かしている時のホールセンサ(Photo 5 参照)からの出力をオシロでとらえたものである。HighとLowがハッキリしていて大変きれいなパルスパターンである。これが16F819のPORTA1よりデジタルデータとして読込まれる。このパターンの個々のH−peakを検知するのが下記プログラムの中のOneHpeakcont サブルーチンである。

 

操作法

1)     24時間タイマにACアダプタをつなぎ基板に電源を供給する。

2)     24時間タイマの動作時間を朝7時から夕方6時までに設定する。

3)     次の朝7時になるとパネルは前の停止時にどこいても自動的に東端に戻り、そしてシャフトが4.5回転して停止し30分間太陽をあびるルーチンを夕方まで20回繰り返す。

4)     夕方6時にタイマが切れる。その時パネルは西端近くにいるか、または、東端に戻ってルーチンをこなしているかもしれない。

5)     もし、パネルを任意の方向に向けたい場合は、Reset SWを押した後、直ぐにP−SWを押し続けて求めている方向に来たら離す。

 

結果&コメント

1)     前回の電子工作60の場合のように毎回太陽の方向を検知するのではなく、太陽の動きが分かっているのでパネルをその動きをとらえるように動かせばよいのではというのが今回の作動原理。

2)     ホールセンサでモータの回転をソフト的に計測する方法を見出したのが最大の収穫だった。

3)     ナットの上下動をいかにパネルの回転に変えるかが難問だった。糸で引っ張る。やってみないと分からない。まさにその通り。

4)     プログラムでセンサから出る1個のHパルスを計測する部分をサブルーチン化できて、全体がコンパクトになった。

5)     システムが動作することが分かったので、雨対策などを考慮に入れ次作は簡単でより本格的なものが出来そう!

6)     プログラムのアルゴリズムの構想に苦労した。OneHpeakcontの作成、パネルを任意の位置に迅速に動かす方法など、ジジイにはヤサシクナイ!

7)     フローチャートを後で(2012.3.3)作成したがアルゴリズムを思い出すのが結構大変だった。直ぐ作成するのがよい。

 

プログラム 

 プログラムの要旨は以下の様なものである:

1)     PICに電源が入ったらモータを回してパネルを東端のマイクロスイッチまで移動させ、そこをスタート地点としてシャフトを4.5回転させ停止させる。

2)     その位置で30分パネルを太陽に当てる。

3)     上記のシャフトを4.5回転させて30分パネルを止めるルーチンを20回繰り返す。終了時パネルはほぼ東端に達している。接触はしていない。

4)     そして、電源が入っている限り、また上記1)以下を繰り返す。

5)     その外、20回繰り返すうち、もし西端のマイクロスイッチに接触したら直ぐ東端に戻す。パネルを任意の位置に迅速に移動させるなどの機能を組込んである。

6)     フローチャートを描いてみたらプログラムの流れが良く分かる(2012.3.3追加)。

フローチャート

*******************************************************************************************

'SolarPanAkiHallsD1.bas - a new simplified prog (using OneHpeakCount subroutine) on 2012.2.8 works OK!

'Circuit Diagram "SolarPanAkiHallsD1"

'Using Hall sensor and shaft counting

'P-SW added for random positioning of the panel

'16F819, PICBasic Pro 250A 

'******* Pin connection ********

'Pin 14 - Vdd (+5V)

'Pin 5 - Vss (GND)

'Pin 4 - /MCLR for reset

'Pin 18 - RA1/AN1 - Counting input from Hall sensor

'Pin 12 - RB6 - H/L input from limit SW (West), pulled up with 10K

'Pin 13 - RB7 - H/L input from limit SW (East), pulled up with 10K

'Pin 7 - RB1 - H/L output to Pin 1 of motor driver (Toshiba's TA7267BP)

'Pin 8 - RB2 - H/L output to Pin 2 of motor driver

'Pin 2 - RA3 - Open/L input from P-SW

'****** Main program ****

TRISA=%00101010   'RA1, RA3 and RA5=inputs

TRISB=%11000000   'RB6-7=inputs

ADCON1=7          'All pins digital "essential"

OSCCON=%01100100  '4MHz internal clock "essential"

 

HallsIN var PORTA.1    'Hall sensor input

Motorp1 var PORTB.1    'Motor driver pin1

Motorp2 var PORTB.2    'Motor driver pin2

LimSWw Var PORTB.6     'West-end Limit Switch

LimSWe Var PORTB.7     'East-end Limit Switch

PositSelSW var PORTA.3 'Position-Select SW

HpC var byte           'H-peak counter

t var word             'Counter for timer

n var byte             'Counter for go-and-stop routine

m var word             'Coefficient for timer

 

Motorp1=0

Motorp2=0

 

'---- Moving Motor to LSWe then toward West ----

LSWeLoop:         'LSWe contact check  以下の12行でパネルを東端のマクロスイッチまで戻し、接触したらJump1に飛ぶ

n=0

Gosub ToEast      'Move motor toward East

If LimSWe=0 then  'Contacted to LimSWe?

Gosub Motorstop

Gosub ToWest

Pause 100         'Return a little bit  0.1 sec

Gosub Motorstop

Goto Jump1        'If contacted, go to Jump1

Else

Goto LSWeLoop

Endif

 

'---- Moving the panel by revolving the drive shaft ----

Jump1:     ‘以下でモータを回してパネルを西方向に動かしながらH-peakを9個(シャフトの4.5回転に相当)を数える

HpC=0

t=0

HpeakCountR:  'H-peak counting routine 

Gosub ToWest  'Move the panel Westward  パネルを西方向に動かす

If LimSWw=0 Then LSWeLoop  'If LimSWw is hit, return to LSWeLoop パネルが西端のマクロスイッチに接触しているかどうか検知する。もし接触していればLSWeLoopに飛ぶ

Gosub OneHpeakcont         'One H-peak counting subroutine "key point" このサブルーチンに飛ぶと1個のH-peakを検知する

HpeakCount:

HpC=HpC+1     'Totalizing the number of Hall sensor counts (two counts per shaft revolution) 回転数を蓄積する

If HpC=9 Then ShaftRevStop 'Equivalent to 4.5 shaft revolutions 9個に達したらShaftRevStopに飛ぶ。そうでなければHpeakCountRに飛ぶ

If LimSWw=0 Then LSWeLoop  'If LimSWw is hit, return to LSWeLoop ここでもまたパネルが西端のマクロスイッチに接触しているかどうか検知する

Goto HpeakCountR

 

ShaftRevStop:  ‘モータを止めパネルを太陽に30分当てる

Gosub Motorstop  'Stop the shaft movement

'Timer for Sun exposure

If PositSelSW=0 Then  'Move a random position by pressing P-SW これでパネルの位置をP−SWを押すことによって希望する位置に移動するが出来る。押されていると1秒だけ止まって次に進む

m=2   'Correspond to 1 sec

Else

m=3600  'Correspond to 30 min P−SWが押されていないと30分止まってから次に進む

Endif

For t=1 to m  '(in practice, 30 min timer) mの値によって時間が変わるタイマ(1秒 or 30分)

Pause 500     '0.5 sec

Next t

n=n+1  ‘シャフトを4.5回まわして30分(または1秒)止まるルーチンの回数を蓄積する

If n=20 Then LSWeLoop  '20 divisions over the entire covering angle ルーチンの回数が20に達したら東端に戻りJump1に飛ぶ

Goto Jump1

 

'****** Subroutines ******

OneHpeakcont:  'Key subroutine to count one H-peak from Hall sensor この21行のH-peakを数えるサブルーチンがプログラム全体をコンパクトにした

SeekHpeak:

Gosub ToWest

If HallsIN=1 Then  'H-peak is detected?

Pauseus 500        'Wait 500 us

Else

Goto SeekHpeak

Endif

If HallsIN=1 Then SeekDownEdge 'H-peak is detected again?

Goto SeekHpeak

SeekDownEdge:

If HallsIN=0 Then  'L-section after H-peak is detected?

Pauseus 500        'Wait 500 us

Else

Goto SeekDownEdge

Endif

If HallsIN=0 Then JumpToReturn  'L-section is detected again?

Goto SeekDownEdge

JumpToReturn:

Gosub Motorstop

Return

 

ToEast: ‘モータを回してパネルを東方向に回す

Motorp1=0

Motorp2=1

Return

 

ToWest:  ‘モータを回してパネルを西方向に回す

Motorp1=1

Motorp2=0

Return

 

Motorstop:  ‘モータを停止させる

Motorp1=0

Motorp2=0

Return

 

'****** End of program -------

 

'Note:

  'melabs U2 Programmer's configurations for 16F819

  'Oscillator - INTOSC; WDTE - Enable; Power-up Timer - Enable!

  'MCLRpin - Reset; BODEN - Enable; L.V.Programming - Disable,

  'CCP Mult. with - RB2, F.P.M. Wrire Enable - all, CD - Not Protected; Data EPPROM - Not Protected

 

Simple Sun-Tracking type Solar Panel using Hall Sensor (English version of the above Electronics Project 61 in Japanese)

  As shown in the circuit diagram and photos below, this unit is composed of a small solar panel (3,6,9 & 12V Solar Panel No.ES885, panel area 11x7.5cm) connected to an aluminum shaft (outer diameter 8mm, length 28cm) and a long motor-driven threaded brass shaft  (outer diameter 3.8mm, length 25cm) onto which a long-size nut (length 12mm) is screwed so that the nut can move upward and downward when the motor-driven shaft revolves. The shaft of the solar panel is connected to the nut with a cotton string, so that when the motor-driven shaft revolves and lifts up or down the nut, the solar panel can change its direction. A pair of small ferrite magnets (outer diameter 6mm, thickness 2.5mm) is connected to a small rectangular plastic bar fixed on the top of the motor-driven shaft. These two magnets (their North pole facing the marking side of Hall sensor) are detected by a Hall sensor (Panasonic DN6851) installed in the head section of the support wood bar and positioned 2 - 3 mm above the magnets. The working principle of this unit is simple. That is, to track the sun’s movement from morning to evening over about 10 hours, the solar panel is designed to change its sun-facing angle from the east to the west at a fixed interval of time. The overall angle the solar panel changes is about 95 degrees. If the motor-driven shaft revolves 90 times, the solar panel can change its angle by approximately 95 degrees. In the morning around 7:30 am, for example, a 24-hour programmable timer begins to supply power to the AC adapter and DC5V is supplied to 16F819 in the circuit, executing the program. Wherever the solar panel was lastly positioned as a result of timer’s power-supply stoppage, it first returns to the East-end (or limit SW (EAST)) and then the motor-driven shaft revolves 4.5 times which changes the angle of the solar panel by 95 degrees/20 times=4.75 degrees. After that the solar panel stays there for 30-minutes exposure to the sun. This combined operation of the panel angle change by 4.75 degrees and a 30-minutes solar exposure is repeated 20 times over approximately 30 x 20 =600min=10 hours. The 24-hour programmable timer is normally set up to stop supplying power to the AC adapter before the sunset (5 to 6 pm). When the timer stops power supplying in the evening, the solar panel stops at a location where it was. It may be near the West-end or East-end. But it does not matter because when the timer begins to work again in the following morning, the solar panel returns to its starting point or the East-end and restarts again. In the circuit, two safety switches are also installed at both upper- and lower-most sections of the motor-driven shaft on the wood support bar. The individual switch is physically pushed by an accidental and excessive movement of the running nut, halting the power supply to the motor and therefore stopping the movement of the motor-driven shaft.

 

                                       Photo 1 Solar panel         Photo 2 Drive shaft             Photo 3 Motor and joint section                              Photo 4 Control circuit

 

                                                      Photo 5 Hall sensor and 2 magnets                  Photo 6 Limit SWe and Limit SWw (microswitches)             Photo 7 Panel pulling string

 

Photo 8 24-hour timer and AC adapter

 

The following Fig 1 shows a waveform pattern from Hall sensor when the motor-driven shaft is revolving in the actual unit. The shaft revolves slowly, approximately at a rate of one turn per second, generating two H-peaks per turn. The waveform pattern is very sharp and each H-peak can be easily read by subroutine “OneHpeakcont”.

Fig 1

 

Result & comment

1)       The working principle of this sun-tracking system is different from that of the previous mentioned Electronics Project 60. The program is shorter and simpler, but was not that easy to make. Especially it took time to come up with an algorithm prepared this time.

2)       The development of subroutine “OneHpeakcont” which enables counting the individual H-peak and controlling the revolution of the motor-driven shaft accurately is the most important part of this program.

3)       By using cotton string the upward and downward movements of the nut were changed to the angular movement of solar panel. This mechanism may be very useful in an application for a larger practical sun-tracking type solar panel.

 

Program

 The program flowchart and list are shown below. The most important part in the program is the routine to count H-peaks in the waveform pattern (See the above F1) generated from Hall sensor for controlling the revolution of the motor-driven shaft. Namely, it is the subroutine "OneHpeakcont.” which counts each H-peak. When the program counts 9 H-peaks, equivalent to 4.5 revolutions of the shaft, the solar panel stops for 30-minutes exposure to the sun. The operation is repeated 20 times.

 

'SolarPanAkiHallsD1.bas - a new simplified prog (using OneHpeakCont subroutine) on 2012.2.8 works OK!

'Circuit Diagram "SolarPanAkiHallsD1"  List 99 changed to list 100  on 2012.2.29

'Using Hall sensor and shaft counting

'P-SW added for random positioning of the panel

'16F819, PICBasic Pro 250A 

'******* Pin connection ********

'Pin 14 - Vdd (+5V)

'Pin 5 - Vss (GND)

'Pin 4 - /MCLR for reset

'Pin 18 - RA1/AN1 - Counting input from Hall sensor

'Pin 12 - RB6 - H/L input from limit SW (West), pulled up with 10K

'Pin 13 - RB7 - H/L input from limit SW (East), pulled up with 10K

'Pin 7 - RB1 - H/L output to Pin 1 of motor driver (Toshiba's TA7267BP)

'Pin 8 - RB2 - H/L output to Pin 2 of motor driver

'Pin 2 - RA3 - Open/L input from P-SW

'****** Main program ****

TRISA=%00101010   'RA1, RA3 and RA5=inputs

TRISB=%11000000   'RB6-7=inputs

ADCON1=7          'All pins digital "essential"

OSCCON=%01100100  '4MHz internal clock "essential"

 

HallsIN var PORTA.1    'Hall sensor input

Motorp1 var PORTB.1    'Motor driver pin1

Motorp2 var PORTB.2    'Motor driver pin2

LimSWw Var PORTB.6     'West-end Limit Switch

LimSWe Var PORTB.7     'East-end Limit Switch

PositSelSW var PORTA.3 'Position-Select SW

HpC var byte           'H-peak counter

t var word             'Counter for timer

n var byte             'Counter for go-and-stop routine

m var word             'Coefficient for timer

 

Motorp1=0

Motorp2=0

 

'---- Moving Motor to LSWe then toward West ----

LSWeLoop:         'LSWe contact check

n=0

Gosub ToEast      'Move motor toward East

If LimSWe=0 then  'Contacted to LimSWe?

Gosub Motorstop

Gosub ToWest

Pause 100         'Return a little bit  0.1 sec

Gosub Motorstop

Goto Jump1        'If contacted, go to Jump1

Else

Goto LSWeLoop

Endif

 

'---- Moving the panel by revolving the drive shaft ----

Jump1:

HpC=0

t=0

HpeakCountR:  'H-peak counting routine

Gosub ToWest  'Move the panel Westward

If LimSWw=0 Then LSWeLoop  'If LimSWw is hit, return to LSWeLoop

Gosub OneHpeakcont         'One H-peak counting subroutine "key point"

HpeakCount:

HpC=HpC+1     'Totalizing the number of Hall sensor counts (two counts per shaft revolution)

If HpC=9 Then ShaftRevStop 'Equivalent to 4.5 shaft revolutions

If LimSWw=0 Then LSWeLoop  'If LimSWw is hit, return to LSWeLoop

Goto HpeakCountR

 

ShaftRevStop:

Gosub Motorstop  'Stop the shaft movement

'Timer for Sun exposure

If PositSelSW=0 Then  'Move a random position by pressing P-SW

m=2   'Correspond to 1 sec

else

m=3600  'Correspond to 30 min

Endif

For t=1 to m  '(in practice, 30 min timer)

Pause 500     '0.5 sec

Next t

n=n+1

If N=20 Then LSWeLoop  '20 divisions over the entire covering angle

Goto Jump1

 

'****** Subroutines ******

OneHpeakcont:  'Key subroutine to count one H-peak from Hall sensor

SeekHpeak:

Gosub ToWest

If HallsIN=1 Then  'H-peak is detected?

Pauseus 500        'Wait 500 us

Else

Goto SeekHpeak

Endif

If HallsIN=1 Then SeekDownEdge 'H-peak is detected again?

Goto SeekHpeak

SeekDownEdge:

If HallsIN=0 Then  'L-section after H-peak is detected?

Pauseus 500        'Wait 500 us

Else

Goto SeekDownEdge

Endif

If HallsIN=0 Then JumpToReturn  'L-section is detected again?

Goto SeekDownEdge

JumpToReturn:

'Goto Motorstop

Gosub Motorstop  'Changed on 2012.2.29

Return

 

ToEast:

Motorp1=0

Motorp2=1

Return

 

ToWest:

Motorp1=1

Motorp2=0

Return

 

Motorstop:

Motorp1=0

Motorp2=0

Return

 

'****** End of program -------

 

'Note:

  'melabs U2 Programmer's configurations for 16F819

  'Oscillator - INTOSC; WDTE - Enable; Power-up Timer - Enable!

  'MCLRpin - Reset; BODEN - Enable; L.V.Programming - Disable,

  'CCP Mult. with - RB2, F.P.M. Wrire Enable - all, CD - Not Protected; Data EPPROM - Not Protected

 

 

Menu Pageへ戻る

Topへ戻る