サーボモーターSG90をラズパイで動かす方法は、
aspberry サーボSG90をpython で動かす にまとめました。

シンプルなリモコンプログラムはこちら。

  • ■実行環境
    • + Python2.7
    • + OpenCV3 (OpenCV2でも動くのではと思います)
      • – OpenCV2のinstall の方法はこちらが参考になりました。https://qiita.com/suppy193/items/91609e75789e9f458c39
      • – OpenCV3のinstall 方法はこちらが参考になりました。
        https://qiita.com/mt08/items/e8e8e728cf106ac83218
  • ■動かし方
    • + [u][j] で第一関節、[i][j]で第二関節、[o][l]で第三関節が動きます。
    # -*- coding: utf-8 -*-
    import RPi.GPIO as GPIO
    import time
    import numpy as np
    import cv2
    
    A1_GPIO = 23
    A2_GPIO = 24
    A3_GPIO = 25
    
    RNG_DIG = np.array([-90, 90])
    RNG_RATE = np.array([2.5, 12])
    
    def mapping(x, rx, ry):
        a = (ry[0] - ry[1]) / (rx[0] - rx[1])
        b = ry[0] - a * rx[0]
        y = a * x + b
        return y
    
    A1 = 0
    dA1 = 10
    A2 = 0
    dA2 = 10
    A3 = 0
    dA3 = 10
    
    GPIO.setmode(GPIO.BCM)
    
    GPIO.setup(A1_GPIO, GPIO.OUT)
    p1 = GPIO.PWM(A1_GPIO, 50)
    
    GPIO.setup(A2_GPIO, GPIO.OUT)
    p2 = GPIO.PWM(A2_GPIO, 50)
    
    GPIO.setup(A3_GPIO, GPIO.OUT)
    p3 = GPIO.PWM(A3_GPIO, 50)
    p1.start(0)
    p2.start(0)
    p3.start(0)
    
    img = np.zeros((100, 100, 3), dtype = np.uint8)
    
    while True:
        d1 = mapping(A1, RNG_DIG, RNG_RATE)
        d2 = mapping(A2, RNG_DIG, RNG_RATE)
        d3 = mapping(A3, RNG_DIG, RNG_RATE)
        cv2.imshow('img', img)
        p1.ChangeDutyCycle(d1)
        p2.ChangeDutyCycle(d2)
        p3.ChangeDutyCycle(d3)
        
        INPUT = cv2.waitKey(100) & 0xFF
        if INPUT == ord('q'):
            break
        if INPUT == ord('u'):
            A1 += dA1
            if A1 > RNG_DIG[1]:
                A1 = RNG_DIG[1]
            print('A1', A1)
        if INPUT == ord('j'):
            A1 -= dA1
            if A1 < RNG_DIG[0]:
                A1 = RNG_DIG[0]
            print('A1', A1)
            
        if INPUT == ord('i'):
            A2 += dA2
            if A2 > RNG_DIG[1]:
                A2 = RNG_DIG[1]
            print('A2', A2)
        if INPUT == ord('k'):
            A2 -= dA2
            if A2 < RNG_DIG[0]:
                A2 = RNG_DIG[0]
            print('A2', A2)
            
        if INPUT == ord('o'):
            A3 += dA3
            if A3 > RNG_DIG[1]:
                A3 = RNG_DIG[1]
            print('A3', A3)
        if INPUT == ord('l'):
            A3 -= dA3
            if A3 < RNG_DIG[0]:
                A3 = RNG_DIG[0]
            print('A3', A3)
    
    p1.stop()
    p2.stop()
    p3.stop()
    GPIO.cleanup()