「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:⑦各種機能編 ~植物の高さを計測する~

ギアとモーターは男のロマン

第七回目ともなると冒頭に書くことが思い浮かばなくなってくる。「HAGUKUMU」の設計解説ブログはもうちょっと続くことになるだろうが。いきなり本題に入った場合は何も思い浮かばなかったんだろうなと考えてほしい。

さて、今回はギアとモーターとセンサーを駆使しながら物体の高さを図る機能を実装していくよ。

 

どうやって高さを図るの?

お答えします。

f:id:udonnamerou:20200813210913j:plain

仕組みは上図のとおりである。ギアとモーターによって上下運動することでセンサーを動かす。光センサーによって、センサーは物体が存在するかどうかを識別することができるので、物体が識別されている状態が続く間はモーターが上に移動し、最終的に物体が識別されなくなるまで稼働させる。モーターが動いた時間を距離に換算することで高さが図れるといった次第である。

 

材料を用意しよう

高さを図るために必要な部材は以下のとおりである。

 

作る前に注意しておくこと

サーボモーターとギヤを取り付けることは口径が合わない関係ため、取り付けることはできない。しかし、ハンドドリルのような工具を使ってあげれば穴のサイズを合わせることができるので取り付けが可能になる。

 

1枚目:ドリルで穴のサイズを調節してあげれば...。

f:id:udonnamerou:20200813214241j:plain

 

2枚目:サイズの合わない者同士を合わせることができる。

f:id:udonnamerou:20200813214237j:plain

作ってみよう

サーボモーターとギヤとベルトの取り付け

 とりあえず無理やり、板にサーボモーターとギヤ、ベルトを取り付け、稼働テストをしてみる。

精度は悪そうだが、その辺はギアとか調節すればなんとかなりそうだ。

 

改良版のテスト

調整の結果精度が上がったぞい。

光センサーのテスト

こんな感じの配線をする。この辺の記事を読んでいけば実装できると思う。

ちなみに黒いジャンパワイヤがGNDです。

f:id:udonnamerou:20200813214852j:plain


んでもって、テストをしてみる。

どうやらうまくいったようなので、次はギヤとモーターとセンサーを組み合わせて高さを計測してみる。

 

高さを計測する

以下が実装に際して使用したソースコードである。

言い訳するわけではないが、時間がなかったのでリファクタリングなどは一切行っていないのでお見苦しいコードである。許して。

 

main.py

import servo    as SERV
import distance as DIST
import RPi.GPIO as GPIO
import time

import math
digit = 4
count = 0.0

while (DIST.distance() == True):
    count = SERV.servoup(count)
    time.sleep(0.5)

SERV.servoreverse(count)
f_count = math.floor(count * digit)/digit
print("this is " + str(f_count) + "cm.")
GPIO.cleanup()

distance.py

import RPi.GPIO as GPIO
import time

GPIO_Nbr = 24

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_Nbr, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def distance():
    if GPIO.input(GPIO_Nbr) == GPIO.LOW:
        print("no")
        return 0
    if GPIO.input(GPIO_Nbr) == GPIO.HIGH:
        print("touch")
        return 1
    time.sleep(0.3)

servo.py

def servoup(count):
    GPIO.setmode(GPIO.BCM)
    gp_out = 4
    GPIO.setup(gp_out, GPIO.OUT)
    servo = GPIO.PWM(gp_out, 50)
    servo.start(0)
    servo.ChangeDutyCycle(7.5)
    time.sleep(0.5)
    servo.stop()

    return count + 1

def servoreverse(recount):
    GPIO.setmode(GPIO.BCM)
    gp_out = 4
    GPIO.setup(gp_out, GPIO.OUT)
    servo = GPIO.PWM(gp_out, 50)
    
    while (recount > 0) :
        servo.start(0)        
        servo.ChangeDutyCycle(6.9)
        time.sleep(0.5)
        recount -= 0.8

    servo.stop()

 稼働テスト

動いたのでよかった('ω')

 

次回はラズパイから画像をアップロードする方法について話していく。

それではごきげんよう

 

前回:⑥各種機能編 ~ポンプを制御する~ 

次回:⑧各種機能編 ~写真をGoogleドライブにアップロードする~