曲げセンサとArduinoで人形を躍らせる

曲げセンサを購入しました。先日は楽しさのあまり動画を貼っただけの雑なエントリをアップしてしまったので、改めてちゃんと紹介したいと思います。

f:id:slideglide:20171216214652j:plain

これが曲げセンサです。曲げると抵抗値が上がります。個体差があると思いますが、僕が入手したものは伸ばした状態で13kΩ、ぐるっと曲げて輪っかにすると60kΩくらいまでいきました。
スイッチサイエンスから購入できて、2.2インチと4.5インチの2種類があります。写真のものは4.5インチです。

曲げセンサ(2.2インチ)

曲げセンサ(2.2インチ)

曲げセンサ(4.5インチ)

曲げセンサ(4.5インチ)

f:id:slideglide:20171216214702j:plain
裏側です。spectra symbolというのがメーカー名でしょうか。スイッチサイエンスのサイトに「(曲げセンサは)どうやら他には存在しないみたいですね。」と書いてあり、確かにネットのどこを探してもこれ以外の曲げセンサが見当たらないので、本当に唯一の入手可能な曲げセンサのようです。

曲げは1方向のみに対応していて、表(メーカー名が書いてないほう)を外側にして曲げたときのみ抵抗値が変わります。
足はブレッドボードやユニバーサル基板の穴に入ります。

使用感ですが、「曲げる」という行為がとてもフィジカル/肉体的なので、それが機械の動作に反映されるのは違和感があって、体験としてすごく面白いです。
作例として、先日作ったこの動画を見てみてください。

www.youtube.com

面白さが伝わったでしょうか。

人形の躍らせ方

シンプルな製品なので紹介すべきことはこのくらいでした。
この先は実践編として、作例でお見せした踊る人形の作り方を説明します。
ちなみに記事の趣旨からは逸れますが、同じ手順で曲げセンサのかわりに、ボリュームや半固定抵抗、光センサ(CDSセル)等を使うこともできます。

用意するもの

  • 曲げセンサ
  • Arduino(なんでもいい)

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

  • ブレッドボード

普通のブレッドボード

普通のブレッドボード

  • ジャンパ線

デジタル・マイクロサーボ SG90 (1個)

デジタル・マイクロサーボ SG90 (1個)

  • 抵抗10kΩ(なかったら違うのでもOK)
  • つまようじ1本
  • 単三電池(空でいい)
  • セロハンテープかマスキングテープ
  • プリンタと紙

センサーとArduinoをつなぐ

ブレッドボードに曲げセンサーを刺して、Arduinoと接続していきましょう。
f:id:slideglide:20171216222011j:plain
f:id:slideglide:20171216231543p:plain
図のほうはレイアウトの都合で曲げセンサが逆向きになってしまいました。実際は四角がならんでいる面を左側にしてください。
これは抵抗値が変わるタイプのセンサを読み取るための一般的な回路です。光センサ(CDSセル)を読み取る作例などでもよく同じ回路が使われています。

曲げセンサの足は抜けやすいので、何らかのテープで補強しておくとよいです。
f:id:slideglide:20171216222101j:plain

プログラムの書き込み

次にソフト側です。
Arduinoをパソコンに繋いで、プログラムを書き込みます。

#include <Servo.h>
Servo servo;
#define SERVO_PIN 6
#define ANALOG_PIN 0

#define SERVO_POS_DEFAULT 135
#define SERVO_POS_MAX 45
#define CENSOR_VALUE_MIN 500
#define CENSOR_VALUE_MAX 800
int val;
int pos;

void setup() {
  Serial.begin(115200);
  servo.attach(SERVO_PIN);
  servo.write(SERVO_POS_DEFAULT);
}

void loop() {
  val = analogRead(ANALOG_PIN);
  Serial.println(val);

  pos = constrain(val, CENSOR_VALUE_MIN, CENSOR_VALUE_MAX);
  pos = map(pos, CENSOR_VALUE_MIN, CENSOR_VALUE_MAX, SERVO_POS_DEFAULT, SERVO_POS_MAX);
  servo.write(pos);
  delay(100);
}

アナログピン0の数字を読み取って、サーボモータを動かすためのスケッチです。
これをこのままArduinoの開発環境に貼って、書き込んでみてください。
そのあとツールメニューからシリアルモニタを開きましょう。
f:id:slideglide:20171216232228j:plain
こんな感じで数字がドバーっと出てくるでしょうか。表示がおかしい場合は、右下の数字が115200になっているか確認してください。
これがいまArduinoが読み取っている、曲げセンサーの値です。ためしに曲げセンサを曲げてみると、数字が増減すると思います。

ちなみに曲げセンサを曲げる時ですが、
f:id:slideglide:20171216222533j:plain
こういう感じで足元で倒してしまうと反応が薄いので(曲がってないから)
f:id:slideglide:20171216222551j:plain
こういうふうにちゃんとセンサー部分を曲げるようにしましょう。

キャリブレーション

次にお持ちのセンサーの値にあうように、プログラムを少し書き換えていきます。
まず曲げセンサをまっすぐに伸ばして、シリアルモニタの値を見ます。だいたいこの辺かな、という数字で、8行目の

#define CENSOR_VALUE_MIN 500

ここの500を書き換えてください。
つぎに、だいたい90度くらいまで曲げたときの値を見ます。このときの値で、その次の行

#define CENSOR_VALUE_MAX 800

ここの800を書き換えてください。

ここでプログラムの中身をちょっと説明すると、やっていることはアナログピンの数字を読み取ってサーボの角度に反映しているだけです。ポイントは

  pos = constrain(val, CENSOR_VALUE_MIN, CENSOR_VALUE_MAX);
  pos = map(pos, CENSOR_VALUE_MIN, CENSOR_VALUE_MAX, SERVO_POS_DEFAULT, SERVO_POS_MAX);

この2行です。
map関数は、範囲を変換してくれる関数で、とても便利です。map(A, A1, A2, B1, B2)とやると、最小値A1から最大値A2の範囲でいうところの値Aが、B1からB2の範囲ではいくつに相当するか、を返してくれます。
その前のconstrainは、範囲外の値を切り詰める関数です。constrain(A, A1, B1)とやると、AがA1より小さかったらA1、A2より大きかったらA2、そうでないときはそのままAを返してくれます。
つまりこの2行で、「アナログセンサの値を想定の範囲内に切り詰めて、それをサーボの角度に変換する」ということをやっています。
ここでいう「想定の範囲」をどこからどこまでにするかを決めるのが、このキャリブレーションの作業です。

以上でプログラムの書き換えは終了です。わすれずに、再度Arduinoにアップロードしておきましょう。

サーボモータをつなぐ

配線をするので、USBケーブルはいったん抜いておきましょう。
f:id:slideglide:20171216222715j:plain
f:id:slideglide:20171216222815j:plain
f:id:slideglide:20171216233910p:plain
こういう感じで接続します。サーボモータから出ている赤い線は電源で、黒はGND、青い線が角度を指示する信号線です。
本当はArduinoからモーターの電源を取るのはよくないのですが、紙の人形を躍らせるくらいの負荷なら大丈夫でしょう。(壊れたらすみません)
接続が終わったらふたたびUSBケーブルをつないでください。曲げセンサの曲がり具合にあわせてサーボがキュイキュイ動くようになりましたか?

このあと人形をつけていくので、必ず曲げセンサーを伸ばした状態にして、USBケーブルを抜いてください。

人形をつける

機構はここまでで完成です。あとは人形をつけていきます。
f:id:slideglide:20171216222958j:plain
サーボモーターをテープで単三電池に貼ります。たまたま手元にあったので電池を使いましたが、別に電池じゃなくてもいいです。
f:id:slideglide:20171216223037j:plain
サーボホーンはこの形のものがいいでしょう。ついてない場合は別の形でもいいですが、できるだけ小さいものを。
f:id:slideglide:20171216223214j:plain
セロハンテープでつまようじを貼りつけ、サーボモーターにネジで固定します。これで人形の骨組みができました。

次に、肖像画でもアニメキャラでも実在の人物でも、お好みの人物画像を用意しましょう。全身の入った立ち絵がいいと思います。
f:id:slideglide:20171216223321j:plain
だいたい14cmくらいの身長になるように印刷したのち…
f:id:slideglide:20171216223357j:plain
上半身と下半身を切断します…!
f:id:slideglide:20171216223613j:plain
テープで貼ります。固定する場所ですが、電池に貼るとサーボとの段差がありすぎるので、サーボモータにテープをつけて貼ったほうが良いです。
f:id:slideglide:20171216223629j:plain
上半身もつまようじにテープで貼ります。
f:id:slideglide:20171216223701j:plain
余ったつまようじをニッパー等で切断したら完成です。
f:id:slideglide:20171216223847j:plain
たぶん直立しないと思うので、テープで机に固定しましょう。

完成!

みたび、ArduinoにUSBケーブルをつなぎましょう。
f:id:slideglide:20171216235856g:plain
動きましたか?
いい人形ができたらぜひ教えてください。

本日の工作教室はここまでです。
来週は干し首の作り方です。おたのしみに!

曲げセンサ(2.2インチ)

曲げセンサ(2.2インチ)

曲げセンサ(4.5インチ)

曲げセンサ(4.5インチ)