Arduinoでサーボモータを制御した時にはまったこと

LINEで送る
Pocket

レーザー話が多かったので久々に別のことを書いてみようと思います。

ArduinoはLEDの制御システムなどで良く使ってはいるのですが先日サーボーモーターを扱うことがあり、簡単に動きそうでなかなかうまくいかずはまったことがあったので、そのことを残しておきます。

【動きをもっと滑らかに、細かく制御したい – 基礎】

通常サーボモーターを動かす場合、こう記述するかと思います。

#include <Servo.h>
Servo servo;

void setup(){
    servo.attach([サーボ制御で使うピン番号]);
    angle = 120; // 0から180の値
    servo.write(angle);
}
void loop(){}

通常はこの書き方がだと角度で指定できるしとても簡単で良いのですが、もっと細かい角度で制御したい場合には

writeMicroseconds();

を使うと可能です。
ただ、この場合角度指定と違い、どの値がどの角度になるかは試してみないとわからなくなってしまいます。
リファレンスにもあるように、通常は1000から2000の範囲をとるようですが、サーボモーターによっては700から2300の値をとるものもあり、使う際にはどの範囲をとるのか検証が必要です。
実際に私が使ったものも1000から2000の範囲に収まらないものがありました。

Arduino リファレンス:
https://www.arduino.cc/en/Reference/ServoWriteMicroseconds

このようにwriteMicroseconds()は検証が面倒ですが設定できる値が細かいので動きが滑らかになります。

【連続的に動かない】

深堀りできていないですが、loop関数内で連続的に動かす場合、delay()を挟まないと動きませんでした。delayでなければ動かないというわけではないと思いますが、値を指定してから実際にその値の位置まで動くには時間がかかるため、その差を delayで埋めてあげる必要があるのではないかと思います。
これはサーボの種類やほかの実装とも関連しあうと思うのですが、私の場合はdelay(15); が必要でした。

【動きがカクカクしてしまう – 外部からの制御】

シリアルから連続的に値を受け取り、パースして得た値をもとにサーボの制御を行うプログラムを書いていました。
これでうまく動くと思っていたのですが実際は処理が重いのか、シリアルをつなぐとサーボの動きがカクカクして、外すと滑らかに動くという現象がありました。

原因は、SoftwareSerialを使っていたことでした。本来はハードウェアシリアル(TX,RXピンを使うもの)を使って通信するべきなのですが、開発中はUSB経由で値を取得してデバッグするためにハードウェアシリアルはPCと接続するために使っていました。
ただ、ハードウェアシリアルに比べてソフトウェアシリアルは相当処理が重いようで、特に標準のSoftwareSerialは調べてみるとなるべく使わないように、と書かれている記事もありました。
( https://arduino.stackexchange.com/questions/34126/whats-the-difference-between-all-the-software-serial-libraries-which-one-is-ar )

標準のSoftwareSerialの代替として
AltSoftSerial
NeoSWSerial
推奨されていましたが、私の状況では問題が改善されなかったのでデバッグの手間はかかるしプログラムの書き込みも手間がかかってしまいますが、ハードウェアシリアルを使うことにして改善しました。

とはいえこれもArduinoのスペック(秋月のArduino Pro mini 5Vを使っていました)によると思うのでサーボの数が増えるとハードウェアシリアルでもカクカクするのではないか?と懸念しています。


さらに、私のケースではサーボを6つ使い、またシリアルは無線経由で取得していたので他の問題もあったのですが、、、、、それはまた別の機会に書こうと思います。

Touch Board試しています。

LINEで送る
Pocket

たまたま見かけて面白そうだったTouch Boardを購入。
早速試してみました。

Touch Boardとは

ロンドンにある、Bare Conductiveという会社が販売している、タッチセンサーと音楽関連に向いているArduinoベースのデバイスです。
昔はKickStarterで出資を募っていたようです。


簡単に書くと

赤枠がタッチセンサーになっていて、これを指だったり導電インクを塗ったところを触ったりすることでOnになって音を鳴らすことができます。
touchboard_touchsensor

入出力のピンがArduino Unoくらいあるのと、3.3V出力もできるのでさらなるセンサーや機器と連携することが簡単にできそうでとても楽しみです。

簡単に音を鳴らすことができる手軽さと、外部との連携の可能性という意味での拡張性が両立していて良いなと思っています。(お値段が高いけど・・・)


どんなことができるか?

どんなことができるか?はこの動画がわかりやすいと思います。
ぼくは単体で購入しました。


MIDIコントローラーにする

この動画のようにSDカードに入れた音を鳴らすこともできるので簡単な楽器はすぐに作ることができるのですが、個人的にはやはり拡張性、というところでMIDIコントローラーになる機能に魅力を感じました。

MIDIコントローラーにする方法はこちらを参照にしました。
http://www.bareconductive.com/make/touch-board-ableton-live/
(また後日もう少し詳しくかければと・・・)

で、簡単ではありますが試してみたのがこの感じです。見てみると音が変わると同時に画面上のつまみが動いているのもわかると思います。

なんかテルミンらしき文字も見えたのでもうちょっと探っていこうと思います。

いろいろと夢が膨らんできますね。
なんかデモ作れたらまた公開します。


購入先

ちなみに日本ではスイッチサイエンス様から購入できます。僕もここから買いました。


リンク

MacのArduino IDEが起動しない場合

LINEで送る
Pocket

最近Arduino関連でやる事がいろいろと出てきてすごくお世話になっているのですが、Arduinoのアイコンから起動しない事がよくありました。
ちなみに私の場合はSerial通信を使いだすと特に発生率が高かったです。
後処理が悪いのかな?

解決法が見つからなかったのですが、この方法でとりあえず起動できるようにはなったので残しておきます。

Finder上でArduino.appを右クリック→『パッケージの内容を表示』
すると中身がみえるのでその中の

Contents/MacOS/JavaApplicationStub

をダブルクリックするだけです。
ダブルクリックするとterminalが起動し、そのままArduinoのウィンドウとアイコンがDockに表示されて無事起動できました。

根本的な解決ではないですが、同じ問題で困っている方のお役に立てれば幸いです。

arduinoで”Serial port ‘/dev/tty.usbserialxxxxx’ already in use. Try quiting any programs that may be using it.” に近いエラーが出る場合

LINEで送る
Pocket

とうとうArduinoを始められて若干気分が高まっています。

が、自分のプログラムを実行しようとするとタイトルの様なエラーが出て困っていましたが、解決策が下記にありました。

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1211165807/6

I don’t read spanish, but the solution is clear enough: Check that you have a
/var/lock directory, and ensure it is chmod 777. Simple as that, and now I’m staring at a blinking LED!
と書いています。

要するに /varにlockフォルダを用意して、そのフォルダの権限を777にしなさい、という事でした。

簡単な事だし、自分で何かやった訳ではないですが、同じようなことでハマった人の力になれば幸いです。

※Mac OSX Lion 10.7.3で確認しています。