マイコンボードを中継器にして PC に電子部品を接続し、Ruby で制御してみた(サーボモータ編)


この記事は、富士通ソーシアルサイエンスラボラトリ Advent Calendar 2018の 5 日目の記事です。

はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

PC に電子部品を接続したい & PC 上の Ruby で制御したい

と言うわけで Firmata と言う技術を使って、発光ダイオード温度センサを、PC 上に用意した Ruby スクリプトで制御する方法を紹介してまいりました。

図に乗って第 3 段!
今度は、サーボモータを制御してみようと思います。

Arduino Uno を Firmata 対応にする

やり方はこちらの記事で説明しましたので割愛。

Arduino IDE を使って StandardFirmata アプリケーションをビルドして、 Arduino Uno に書き込んでおく。ただこれだけです。

サーボモータをつないでみる。

秋葉原の電子パーツ屋やネットショップで簡単に購入可能という理由から、サーボモータとして SG90 を、Arduino Uno 経由で PC に接続します。

SG90 と Arduino Uno の結線方法に関しては、以下の図を参照ください。

[回路図]

制御スクリプトについて

SG90 制御用に、以下のスクリプトを作成します。

[制御スクリプト]

firmata-test-003.rb
# Author       : Yoshihiko Hara <[email protected]>
# last updated : 2018/12/3
# Overview     : Control the servomotor with Ruby on the PC.
# License      : MIT License

require "arduino_firmata"

# Minimum value and maximum value of data that each device can return
PIN_NUMBER_OF_A0               = 9
DELAY_TIME                     = 1

# Prepare to control Arduino from PC.
arduino = ArduinoFirmata.connect "/dev/tty.usb-device-name"

while true

  # Generate rotation angle randomly
  angle = rand 180
  puts "servo angle #{angle}"

  # Rotate the servomotor by the generated rotation angle.
  arduino.servo_write PIN_NUMBER_OF_A0, angle

  # Stop operation for 1 S.
  sleep DELAY_TIME

end

約 1 秒間隔で、サーボモータがカクカクと動くはずです。

モータの軸にサーボホーンを取り付けた上で実行することを推奨致します。

そうしとかないと、モータがなんか動いたことはわかっても、ランダムに生成された角度に従ってモータが動いてるんだかなんだか、多分見ただけじゃよくわからないと思います。

サーボモータをいくつか組み合わせてマジックハンドのようなものを作り、PC から制御してやったら面白いんじゃないかな。そんな風に思っています。

では、また。