J'ai écrit un programme pour contrôler 3 servos avec Python de Raspeye pour un petit kit de développement de robot appelé Bezelie, mais je pense qu'il peut être appliqué à des applications autres que Bezelie. Nous le publierons ici.
――Je voulais exécuter 3 servos ou plus en utilisant Python avec Raspeye.
--Raspai contrôle 3 servos RC.
bezelie.py
# -*- coding: utf-8 -*-
# Bezelie Python Module for Raspberry Pi
import RPi.GPIO as GPIO
from time import sleep
import smbus
import math
bus = smbus.SMBus(1)
address_pca9685 = 0x40 # If you connect other I2C devices, you might change thi$
# Constants
dutyMax = 490 #
dutyMin = 110 #
dutyCenter = 300 #
steps = 1 #
# Global Valiables
headNow = backNow = stageNow = dutyCenter
# Definitions
def initPCA9685():
bus.write_byte_data(address_pca9685, 0x00, 0x00)
freq = 0.9*50
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
prescaleval /= float(freq)
prescaleval -= 1.0
prescale = int(math.floor(prescaleval + 0.5))
oldmode = bus.read_byte_data(address_pca9685, 0x00)
newmode = (oldmode & 0x7F) | 0x10
bus.write_byte_data(address_pca9685, 0x00, newmode)
bus.write_byte_data(address_pca9685, 0xFE, prescale)
bus.write_byte_data(address_pca9685, 0x00, oldmode)
sleep(0.005)
bus.write_byte_data(address_pca9685, 0x00, oldmode | 0xa1)
def setPCA9685Duty(channel, on, off):
channelpos = 0x6 + 4*channel
try:
bus.write_i2c_block_data(address_pca9685, channelpos, [on&0xFF, on>>8, off&$
except IOError:
pass
def moveServo (id, degree, adj, max, min, speed, now):
dst = (dutyMin-dutyMax)*(degree+adj+90)/180 + dutyMax
if speed == 0:
setPCA9685Duty(id, 0, dst)
sleep(0.001 * math.fabs(dst-now))
now = dst
if dst > max: dst = max
if dst < min: dst = min
while (now != dst):
if now < dst:
now += steps
if now > dst: now = dst
else:
now -= steps
if now < dst: now = dst
setPCA9685Duty(id, 0, now)
sleep(0.004 * steps *(speed))
return (now)
def moveHead (degree, speed=1):
adj = 0 # Head servo adjustment
max = 490 # Downward limit
min = 110 # Upward limit
global headNow
headNow = moveServo (2, degree, adj, max, min, speed, headNow)
def moveBack (degree, speed=1):
adj = 0 # Back servo adjustment
max = 490 # AntiClockwise limit
min = 110 # Clockwise limit
global backNow
backNow = moveServo (1, degree, adj, max, min, speed, backNow)
def moveStage (degree, speed=1):
adj = 0 # Stage servo adjustment
max = 490 # AntiClockWise limit
min = 110 # Clocwise limit
global stageNow
stageNow = moveServo (0, degree, adj, max, min, speed,stageNow)
-Pour plus de commodité, les trois servos sont nommés Head, Back et Stage, et moveHead (), moveBack () et moveStage () sont les commandes pour déplacer chacun. -Entrez un angle dans la plage de plus ou moins 90 degrés dans le degré d'argument. 0 est la position centrale. Si vous entrez une valeur positive, elle tournera dans le sens des aiguilles d'une montre. -Si l'argument vitesse est omis, il sera 1, et plus la valeur est élevée, plus le mouvement est lent. Si vous entrez 0, il fonctionnera à la vitesse la plus rapide, mais si vous n'entrez pas time.sleep () d'une longueur appropriée après l'exécution, le processus s'accumulera et le comportement sera étrange. -Le Servo SG90 peut tourner à 180 degrés, mais en raison de la structure du robot, etc., vous voudrez peut-être limiter l'angle de rotation. Dans un tel cas, ajustez max et min pour chaque servo. -Si vous souhaitez affiner la position de centrage du servo, essayez de changer la valeur de adj.
En créant le programme, j'ai fait référence au livre de Takashi Kanamaru «Travail électronique appris avec Raspberry Pi» et à la bibliothèque d'Adafruit. Je voudrais te remercier.
Recommended Posts