Подскажите по настройки webiopi (ШИМ
-
Добрый день делаю робота с поворотной камерой. Камера стоит на кронштейне с двумя сервоприводами вот на таком Your text to link...
Делаю управление сервоприводами вот по такому примеру на webiopi(своего сейчас нет но слайдеры беру отсюда ) документ index.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 http-equiv = "cache-control" content = "max-age=0">
<meta http-equiv = "cache-control" content = "no-cache">
<meta http-equiv = "expires" content = "0">
<meta http-equiv = "expires" content = "Tue, 01 Jan 1970 1:00:00 GMT">
<meta http-equiv = "pragma" content = "no-cache">
<meta name="viewport" content = "height = device-height, width = 420, user-scalable = no" />
<title>WebIOPi camera</title>
<script type="text/javascript" src="/webiopi.js"></script>
<script type="text/javascript">
function init() {
var button;button = webiopi().createButton("photo", "big photo", photo); $("#cam").append(button); button = webiopi().createAngleSlider(23, 30); $("#updown").append(button); button = webiopi().createAngleSlider(24, 0); $("#leftright").append(button); } function photo() { $("#ph").html(''); $("#ph").html('<img src="pic.jpg">'); } function get_img() { document.getElementById("img1").src="http://192.168.0.101:8080/pic.jpg"; } webiopi().ready(init); </script> <style type="text/css"> button { margin: 5px 5px 5px 5px; width: 150px; height: 50px; font-size: 12pt; font-weight: bold; color: black; } </style>
</head>
<body onload='setInterval("get_img();",1000);'>
<div style="float:left">
<div id="content" align="center">
<div id="cam"></div>
<div id="vid"><img id="img1" width="320" height="240" src="http://192.168.0.101:8080/pic.jpg"></div>
<div>down<span id="updown"></span>up</div><div>left<span id="leftright"></span>right</div> </div> </div> <div style="float:right" id="ph"></div>
</body>
</html>и скрипт на питоне:
Imports
import webiopi
import sys
import time
from subprocess import callEnable debug output
webiopi.setDebug()
Retrieve GPIO lib
GPIO = webiopi.GPIO
SERVO1 = 23
SERVO2 = 24
LED1 = 25def camera_start():
return_code = call("/usr/share/webiopi/htdocs/app/Raspirobot/stream.sh", shell=True)Called by WebIOPi at script loading
def setup():
webiopi.debug("Blink script - Setup")
# Setup GPIOs
GPIO.setFunction(SERVO1, GPIO.PWM)
GPIO.setFunction(SERVO1, GPIO.PWM)
GPIO.setFunction(LED1, GPIO.OUT)GPIO.pwmWriteAngle(SERVO1, 0) # set to 0 (neutral) GPIO.pwmWriteAngle(SERVO2, 0) # set to 0 (neutral) GPIO.digitalWrite(LED1, GPIO.HIGH) camera_start()
Looped by WebIOPi
def loop():
# Toggle LED each 5 seconds
value = not GPIO.digitalRead(LED1)
GPIO.digitalWrite(LED1, value)
webiopi.sleep(5)Called by WebIOPi at server shutdown
def destroy():
webiopi.debug("Blink script - Destroy")
# Reset GPIO functions
GPIO.setFunction(SWITCH, GPIO.IN)
GPIO.setFunction(SERVO, GPIO.IN)
GPIO.setFunction(LED0, GPIO.IN)
GPIO.setFunction(LED1, GPIO.IN)В результате получается что сервы поворачиваются но в покое дергаются я так понимаю нужно поменять частоту сигнала но где это сделать не знаю, и один поворачивается не на полный ход. Насколько я понимаю слайдеры тоже берутся из webiopi? Подскажите как настроить частоту ШИМ и слайдеры
-
Понял что мотором управляет слайдер, WebIOPi.createAngleSlider(gpio, angle), Делал слайдер с подошью WebIOPi.createRatioSlider(gpio, ratio), тогда серва работает только в начале слайдера и так же трясется устанавливал ratio в разные значения. Также делал установки и в скрипте с помощью ratio но эффект один и тот же… Понимаю что нужно у поменять скорость передачи импульса но где её установить? Или можно только свой цикл создать в скрипте?
-
Для полноты картины расскажите как подключен сервопривод к Raspberry и откуда брали пример, по которому сделаны скрипты.
Я бы сначала отладил работу сервоприводов без Web-интерфейса, запуская скрипт управления в консольном режиме. -
Сейчас питание подключено к малине к 5v управляющие к GPIO-24, GPIO-23 пробовал питание подключать к 6v от 4 батареек тоже самое. мой код index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" «www.w3.org/TR/html4/loose.dtd»>
/>
RaspiRobot CamBotdownup
leftright
-
Не влез в ответ мой код сделал новую тему «описание» там весь мой код почти в скрипте вырезал кусок
-
<!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 = "height = device-height, width = 420, user-scalable = no" />
<title>RaspiRobot CamBot</title>
<script type="text/javascript" src="/webiopi.js"></script>
<script type="text/javascript">
function init() {
var button;button = webiopi().createButton("bt_up", "/\\", go_forward, stop); $("#up").append(button); button = webiopi().createButton("bt_left", "<", turn_left, stop); $("#middle").append(button); button = webiopi().createButton("bt_stop", "X", stop); $("#middle").append(button); button = webiopi().createButton("bt_right", ">", turn_right, stop); $("#middle").append(button); button = webiopi().createButton("bt_down", "\\/", go_backward, stop); $("#down").append(button); button = webiopi().createButton("bt_camera", "cam", camera,stop); $("#cam").append(button); button = webiopi().createButton("bt_photo", "photo", photo,stop); $("#cam").append(button); button = webiopi().createAngleSlider(23, 30); $("#updown").append(button); button = webiopi().createAngleSlider(24, 0); $("#leftright").append(button); $(document).keydown(function(e) { switch(e.which) { case 37:turn_left(); break; case 38:go_forward(); break; case 39:turn_right(); break; case 40:go_backward(); break; case 32:stop(); break; case 75:camera(); break; case 80:photo(); break } }); } function camera() { $("#vid").html(''); webiopi().callMacro("camera"); $("#vid").html('<img width="320" height="240" src="http://raspi:8080/?action=stream">'); } function photo() { $("#ph").html(''); webiopi().callMacro("photo"); $("#ph").html('<img src="/home/pi/robot/photo/ph.jpg">'); } function go_forward() { webiopi().callMacro("go_forward"); } function go_backward() { webiopi().callMacro("go_backward"); } function turn_right() { webiopi().callMacro("turn_right"); } function turn_left() { webiopi().callMacro("turn_left"); } function stop() { webiopi().callMacro("stop"); } webiopi().ready(init); </script> <style type="text/css"> button { margin: 5px 5px 5px 5px; width: 50px; height: 50px; font-size: 24pt; font-weight: bold; color: black; } #bt_camera, #bt_photo { width: 150px;} </style>
</head>
<body>
<div style="float:left">
<div id="content" align="center">
<div id="cam"></div>
<div id="vid"><img width="320" height="240" src="http://raspi:8080/?action=stream"></div>
<div id="up"></div>
<div id="middle"></div>
<div id="down"></div>
<div>down<span id="updown"></span>up</div><div>left<span id="leftright"></span>right</div> </div> </div> <div style="float:right" id="ph"></div>
</body>
</html> -
#!/usr/bin/python
This version uses new-style automatic setup/destroy/mapping
Need to change /etc/webiopi
Imports
import webiopi
import sys
import time
from subprocess import callEnable debug output
webiopi.setDebug()
Retrieve GPIO lib
GPIO = webiopi.GPIO
SERVO1 = 23
SERVO2 = 24
#LED3 = 25—
Constants definition
—
Left motor GPIOs
#LEFT_GO_PIN = 17 #PWM
LEFT_DIR_PIN = 2
LEFT_DIR_PIN2 = 3Right motor GPIOs
#RIGHT_GO_PIN = 10 #PWM
RIGHT_DIR_PIN = 4
RIGHT_DIR_PIN2 = 27#others
LED1=7
LED2=8
cam_active=0
speed_n=0.5
speed_r=0.3—
Convenient PWM Function
—
Set the speed of two motors
#def set_speed(speed):
GPIO.pulseRatio(LS, speed)
GPIO.pulseRatio(RS, speed)
—
Left Motor Functions
—
def left_stop():
#GPIO.output(LEFT_GO_PIN, GPIO.LOW)
#GPIO.pulseRatio(LEFT_GO_PIN, 0)
GPIO.output(LEFT_DIR_PIN, GPIO.LOW)
GPIO.output(LEFT_DIR_PIN2, GPIO.LOW)
#GPIO.output(LED1, GPIO.LOW)def left_forward():
#GPIO.output(LEFT_GO_PIN, GPIO.HIGH)
#GPIO.pulseRatio(LEFT_GO_PIN, speed_n)
GPIO.output(LEFT_DIR_PIN, GPIO.HIGH)
GPIO.output(LEFT_DIR_PIN2, GPIO.LOW)
#GPIO.output(LED1, GPIO.HIGH)def left_backward():
#GPIO.output(LEFT_GO_PIN, GPIO.HIGH)
#GPIO.pulseRatio(LEFT_GO_PIN, speed_r)
GPIO.output(LEFT_DIR_PIN2, GPIO.HIGH)
GPIO.output(LEFT_DIR_PIN, GPIO.LOW)#GPIO.output(LED1, GPIO.HIGH)
—
Right Motor Functions
—
def right_stop():
#GPIO.output(RIGHT_GO_PIN, GPIO.LOW)
#GPIO.pulseRatio(RIGHT_GO_PIN, 0)
GPIO.output(RIGHT_DIR_PIN, GPIO.LOW)
GPIO.output(RIGHT_DIR_PIN2, GPIO.LOW)
#GPIO.output(LED2, GPIO.LOW)def right_forward():
#GPIO.output(RIGHT_GO_PIN, GPIO.HIGH)
#GPIO.pulseRatio(RIGHT_GO_PIN, speed_n)
GPIO.output(RIGHT_DIR_PIN, GPIO.HIGH)
GPIO.output(RIGHT_DIR_PIN2, GPIO.LOW)
#GPIO.output(LED2, GPIO.HIGH)def right_backward():
#GPIO.output(RIGHT_GO_PIN, GPIO.HIGH)
#GPIO.pulseRatio(RIGHT_GO_PIN, speed_r)
GPIO.output(RIGHT_DIR_PIN, GPIO.LOW)
GPIO.output(RIGHT_DIR_PIN2, GPIO.HIGH)
#GPIO.output(LED2, GPIO.HIGH)
def camera_start():
return_code = call("/home/pi/robot/stream002.sh", shell=True)def camera_stop():
return_code = call("/home/pi/robot/stopcam.sh", shell=True)def make_photo():
return_code = call("/home/pi/robot/photo001.sh", shell=True)@webiopi.macro
def stop():
left_stop()
right_stop()Called by WebIOPi at script loading
def setup():
Setup GPIOs
#GPIO.setFunction(RIGHT_GO_PIN, GPIO.PWM)
#GPIO.setFunction(LEFT_GO_PIN, GPIO.PWM)
webiopi.debug(«Blink script — Setup»)GPIO.setFunction(RIGHT_DIR_PIN, GPIO.OUT)
GPIO.setFunction(RIGHT_DIR_PIN2, GPIO.OUT)
GPIO.setFunction(LEFT_DIR_PIN, GPIO.OUT)
GPIO.setFunction(LEFT_DIR_PIN2, GPIO.OUT)
GPIO.setFunction(SERVO1, GPIO.PWM)
GPIO.setFunction(SERVO2, GPIO.PWM)SERVO1.ChangeFrequency(50)
GPIO.setFunction(LED3, GPIO.OUT)
GPIO.pwmWriteAngle(SERVO1, 0) # set to 0 (neutral)
GPIO.pwmWriteAngle(SERVO2, 0) # set to 0 (neutral)GPIO.digitalWrite(LED3, GPIO.HIGH)
#GPIO.setFunction(LED1, GPIO.OUT)
#GPIO.setFunction(LED2, GPIO.OUT)
cam_active=0
#set_speed(0.5)
stop()Looped by WebIOPi
#def loop():
Toggle LED each 5 seconds
value = not GPIO.digitalRead(LED3)
GPIO.digitalWrite(LED3, value)
webiopi.sleep(5)
Called by WebIOPi at server shutdown
def destroy():
Reset GPIO functions
#GPIO.setFunction(RIGHT_GO_PIN, GPIO.IN)
#GPIO.setFunction(LEFT_GO_PIN, GPIO.IN)
GPIO.setFunction(RIGHT_DIR_PIN, GPIO.IN)
GPIO.setFunction(RIGHT_DIR_PIN2, GPIO.IN)
GPIO.setFunction(LEFT_DIR_PIN, GPIO.IN)
GPIO.setFunction(LEFT_DIR_PIN2, GPIO.IN)GPIO.setFunction(SWITCH, GPIO.IN)
GPIO.setFunction(SERVO, GPIO.IN)
GPIO.setFunction(SERVO2, GPIO.IN)
GPIO.setFunction(LED3, GPIO.IN)
#GPIO.setFunction(LED1, GPIO.IN)
#GPIO.setFunction(LED2, GPIO.IN)
camera_stop() -
Для тех, кто в танке, повторяю вопрос: «Откуда взят пример кода, который вы используете ?»
Чтобы разобраться где Ваш «косяк» нужен первоисточник. Анализировать весь Ваш код нет никакого желания и времени, тем более, что играют важную роль ещё и настроечные файлы WebIOPi, которые Вы не приводите.
А выводы GPIO напрямую, значит, подключены к сервоприводам? И не важно, что уровни сигналов GPIO могут не соответствовать, или всё-таки соответствуют допустимым для Ваших сервоприводов?