LinkIt Smart 7688を使ってみる

GPIOとPWM

こ ちらのページの中ほどに、LinkIt Smart 7688 Developer’s Guide へのリンクが有ります。
LinkIt Smart 7688 Developer’s Guide の5.1章に、MRAAを使って周辺機器を制御する詳しい説明が有ります。
MRAAはこちらで公開され ているライブラリです。

Linux Library for low speed IO Communication in C with bindings for C++, Python, Node.js & Java.
Supports generic io platforms, as well as Intel Edison, Intel Joule, Raspberry Pi and many more.

C++、Python、Node.js&Javaのためのバインディングを持つCの低速IO通信のためのLinuxライブラリ。
Intel Edison, Intel Joule, Raspberry Pi などの一般的なplatformをサポートする

「low speed IO Communication」というのが少し気になりますが、
LinkItにはデフォルトでPythonから使えるMRAAライブラリ(libmraa)が含まれています。
こ ちらにライブラリの概要が有りますが、SPIのSlaveとi2sはサポートしていません。

libmraaのバージョンを確認してみました。
mraaのページでは 2.0.0になっているのでかなり古いバージョンかもしれません。
mraaのPython-APIはこ ちらで確認することができます。
root@mylinkit:~# python ./version.py
mraa version = v0.8.0



まずはお約束のLチカです。
引数無しで起動するとオンボードのWiFi-LED(オレンジ)を、引数を指定して起動すると、指定した番号に繋がっているLEDをLチカしま す。
GPIOのピン番号はこ ちらに公開されています。
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import mraa
import time
import sys
# Refer to the pinout digram for the GPIO number to silk print mapping
argv = sys.argv
argc = len(argv)
print "argc =",argc
print "argv =",argv
gpio = 44 # the number 44 maps to Wi-Fi LED
if (argc == 2):
  gpio = int(argv[1])

print "gpio =",
print gpio
led = mraa.Gpio(gpio)
led.dir(mraa.DIR_OUT) # set direction to output
for i in range(5):
  led.write(1) # turn on LED
  time.sleep(1)
  led.write(0) # turn off LED
  time.sleep(1)



次にSG90のサーボモータを使ってPWMを試してみました。
サーボモータ(SG90) LinkIt Smart
オレンジ GPIO18(*)
5V
茶色 GND

(*)GPIO18/19/20/21をPWMとして使うことができます。

SG90のデータ シートによると、SG90はPWM Periodが20mSecとなっています。
また、デー タシートにポジションごと のパルス幅が記載されています。
データシートの値を使って、実際に動作させましたが、少し誤差があるようなので、動きを見ながら微調整しました。
ポジション データシートのパルス幅 実際に動作させてみたパルス幅 Duty cycle(計算値)
1.45mSec 1.45mSec 1.45/20=0.0725
+90° 2.4mSec 2.35mSec 2.35/20=0.1175
-90° 0.5mSec 0.625mSec 0.625/20=0.03125

これらをもとに以下のスクリプトを作りました。
引数無しで起動するとGPIO18に接続したSG90が0°→ +90° → -90° → 0° に動きます。
引数を指定して起動すると、指定した番号のGPIOに接続したSG90が動きます。
指定できるGPIO番号は18/19/20/21だけです。
pin.write()で指定するのはPWM Periodに対する割合です。
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import mraa
import time
import sys
# Refer to the pinout digram for the GPIO number to silk print mapping
argv = sys.argv
argc = len(argv)
print "argc =",argc
print "argv =",argv
gpio = 18
if (argc == 2):
  gpio = int(argv[1])

print "gpio =",
print gpio
wait = 3
pin = mraa.Pwm(gpio) # initialize on GPIO for PWM
pin.period_ms(20)    # set PWM frequency to 20ms period
pin.enable(True)     # enable PWM output
#move to center
pin.write(0.0725)    # set duty cycle to 1.45ms
time.sleep(wait)
#move to +90
pin.write(0.1175)    # set duty cycle to 2.35ms
time.sleep(wait)
#move to -90
pin.write(0.03125)   # set duty cycle to 0.625ms
time.sleep(wait)
#move to center
pin.write(0.0725)    # set duty cycle to 1.45ms
time.sleep(wait)

続く....