Подскажите по настройки 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 call # Enable debug output webiopi.setDebug() # Retrieve GPIO lib GPIO = webiopi.GPIO SERVO1 = 23 SERVO2 = 24 LED1 = 25 def 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" "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 call # Enable 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 = 3 # Right 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 могут не соответствовать, или всё-таки соответствуют допустимым для Ваших сервоприводов?