ブラウザのスライダーでRaspberryPiのサーボモータを動かす(もっと簡単に!)

ブラウザのスライダーでRaspberryPiのサーボモータを動かす(もっと簡単に!)

前回の記事でRaspberryPiのサーボモータを無事動かすことができました。でもどうせなら計算式などを理解して自分でパラメータを変えたい!とか思ってかなり試行錯誤してみたのですが、内容を理解するのには苦労しました。

そこで、もっと簡単に表現できないかと悩んだ結果、PWMの計算結果を配列に格納しておいて、そこから値を取得するようにしました!

ずるい!w とは思いますが、結果思い通りに動かせればそれで今のところはOKとします。

スクリプトファイルは以下のようにしました。

import webiopi
import time
import wiringpi as GPIO

SV_PAN = 26

# SV_PAN  (Left)90 ... 0 ... -90(Right)

#val1 = [28,25,20,16,12,6,0]
val2 = [28,27,26,25,24,23,22,21,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]

def getServoPanPWMvalue(val):
 return val2[val]
 
webiopi.setDebug()

def setup():
 webiopi.debug("Script with macros - Setup")
 GPIO.wiringPiSetupGpio()
 GPIO.pinMode(SV_PAN,GPIO.OUTPUT)
 GPIO.softPwmCreate(SV_PAN,0,50)

def loop():
 webiopi.sleep(5)

def destroy():
 webiopi.debug("Script with macros - Destroy")

@webiopi.macro
def setHwPWMforPan(duty):
 GPIO.softPwmWrite(SV_PAN, getServoPanPWMvalue(int(duty)))

簡単に解説します。ブラウザのスライダーが操作されるとマクロが呼ばれて「setHwPWMforPan(duty)」に渡されます。

スライダーの値は配列「val2」の中身に変換されてリターンされてきます。はい、これだけです。

なんなら、スライダーの値を直接「GPIO.softPwmWrite」に渡してあげても動くかもしれません。

なぜこの28~0になるのか?というところは前回の記事の計算を行ってみるとそうなります。範囲を調整したい場合は配列に格納する値を「26~2」にしてみるとか、そのように変更してみるとよいと思います。

上記のスクリプトに対応したHTMLファイルがこちらです。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="viewport" content="width=device-width">
 <title>Controller</title>
 <script type="text/javascript" src="/webiopi.js"></script>
 <script type="text/javascript">
 </script>

 <style type="text/css">
 </style>
</head>

<body>
<div align="center">
<table>
<tr>
<td>
<table>
<tbody>
<tr>
<td>
<div class="slidecontainer">
  <input type="range" min="0" max="28" value="14" class="slider" id="myRange">
</div>
</td>
</tr>
<tr>
<td>slider value:<p id="out"></p></td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</div>

<script>
 var commandID = 0;

 var slider = document.getElementById("myRange");
 var output = document.getElementById("out");
 output.innerHTML = slider.value; // Display the default slider value

// Update the current slider value (each time you drag the slider handle)
 slider.oninput = function(){
 output.innerHTML = slider.value;
 var slidervalue = slider.value;
 webiopi().callMacro("setHwPWMforPan", slidervalue);
 };
</script>

</div>
</body>
</html>

前回の記事と比較してもらえるとわかりますが、今回はスライダーの値(0~28)をそのまま引数として渡しています。こっちのほうが計算が少なくて分かりやすいと思います。

今回はソフトウェアPWMを使用しており、実行するとサーボがガタガタと振動していまいました。ですので、次回はハードウェアPWMを使用してサーボの振動をなくしてみたいと思います。

ブラウザのスライダーでRaspberryPiのサーボモータを動かす(ハードウェアPWM)

ご参考になればと思います。

IoTカテゴリの最新記事