Top image

Perl Monk

主にPerlとRaspberryPiの個人的技術研鑽

RaspberryPi + HiPi + PCA9685 でサーボを動かしてみよう

2019/06/16 22:46
category:RaspberryPi

センサー類はだいたいいじれる様になってきたので、サーボに手を出してみました。

ラズパイ用のセンサー類をだいたい網羅したモジュールを作ってる人がおったんですね。ありがたいこっちゃ。

HiPi Perl Modules for Raspberry Pi

こちらを使って調理したいと思います。

ラズパイでサーボを動かす

モジュールインストール

そのままcpanなりcpanmすると、依存関係で失敗しました。

Installation手順にあるapt-getを使って依存関係にあるパッケージをインストールするのが良いでしょう。

sudo apt-get update
sudo apt-get install libmodule-build-perl \
	libdevice-serialport-perl \
	libfile-copy-recursive-perl \
	libfile-slurp-perl \
	libjson-perl \
	libtry-tiny-perl \
	libuniversal-require-perl \
	libio-epoll-perl \
	libimage-imlib2-perl \
	libbit-vector-perl  \
	libxml-libxml-perl  \
	libwww-perl

後、

sudo apt-get install cpanminus
sudo cpanm HiPi

にて無事インストールできました。cpanの方は試してないけど多分問題ないでしょう。

稼働テスト

サンプルに記載されているものは、コマンドラインからオプションを付けて実行するものでした。

なので、まずはシンプルに稼働させてみます。

use strict;
use warnings;
use HiPi qw( :pca9685 );
use HiPi::Interface::PCA9685;
my $pwm = HiPi::Interface::PCA9685->new(
	address => 0x40,
	external_clock => 0,
	backend => 'smbus',
);
my $servotype = $pwm->register_servotype( #ここの値は、サーボによって変えます。以下はSG-90の例です。
	pulse_min      => 500,
	pulse_max      => 2400,
	degree_range   => 180,
	degree_min     => 0,
	degree_max     => 180,
);
 
$pwm->set_servo_degrees(0,$servotype,0,0);
sleep 1;
$pwm->set_servo_degrees(0,$servotype,90,0);
sleep 1;
$pwm->set_servo_degrees(0,$servotype,180,0);
exit
# set_servo_degrees(サーボの番号,サーボのタイプ,角度,ディレイ値)

ディレイ値を使うとカクカクしますが、値分ゆっくり動きます。

ただ、ディレイ値を使って複数のサーボを同時に動かすと

0番目のサーボを動かす⇒止まる⇒1番目のサーボを動かす⇒止まる

となり、並行して稼働してくれません。。

その為、値を0にし、ちょっとづつ並列で動かしながらTime::HiResをかまさないといけない感じがしました。

あれ、めんどくさいぞ?

とりあえず、何かしら歩行させてみたいですね。