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

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

前回前々回までは「wiringpi」のソフトウェアPWMを使用していましたが、こちらの方法だとサーボモータがガタガタと振動してしまいました。それでは少し実用性に欠けるので、今回はハードウェアPWMを使用してサーボが振動しないようにしていきたいと思います。

参考にさせていただいたサイトはこちらです。

ただいまシステムの中身③ GPIOを使ったサーボモータ制御

「wiringpi」のハードウェアPWMを使用するためにPythonファイルを以下のように変更しています。

import webiopi
import time
import wiringpi as GPIO

SV_PAN = 13

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

def getServoPanPWMvalue(val):
 move_deg = int((9.5*val/180 + 2.5)*(1024/100))
 return move_deg
 
webiopi.setDebug()

def setup():
 webiopi.debug("Script with macros - Setup")
 GPIO.wiringPiSetupGpio()
 GPIO.pinMode(SV_PAN, 2)  # 出力ピンとして指定
 GPIO.pwmSetMode(0)          # 0Vに指定
 GPIO.pwmSetRange(1024)      # レンジを0~1024に指定
 GPIO.pwmSetClock(375)       # クロック

def loop():
 webiopi.sleep(5)

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

@webiopi.macro
def setHwPWMforPan(servovalue):
 GPIO.pwmWrite(SV_PAN, getServoPanPWMvalue(int(servovalue)))

また、HTMLファイルも同時に変更します。前回まではブラウザのスライダーの値を0~28段階で変更していました。

それを今回は0~180段階で制御できるようになっています。こちらのほうが細かく角度を指定することができますし、分かりやすいと思います。

デメリットとしてましては、今回はハードウェアPWMを使用していますので、使えるピン番号が限られているということです。

ハードウェアPWMはGPIO12、18もしくは、GPIO13、19のどれかに接続してやらないと動かすことができません。

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="180" value="90" 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>

上記のスライダーを2個にして動かしてみた様子がこちらです↓

少し揺れているのはハード側の慣性で揺れてるだけなので、サーボはピタッと止まっています。ソフトウェアPWMに比べると雲泥の差です。これからはなるべくハードウェアPWMを使っていこうと思います。

 

IoTカテゴリの最新記事