DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

可変抵抗でサーボモーターを動かすということは

ロボットの操作に「遠隔操作」 というものがあります。

人間が離れた場所から信号を送ってロボットに伝えるアレですね。

そうです、身近なところではラジコンがあります。

f:id:DreamerDream:20190412135544p:plain

 

仕組みは、

人がボリューム(可変抵抗)やスイッチで操作した信号を機械が読み取って電波や電圧で信号として伝えてロボットのモーターを動かす。

という仕組みです。

 

一見難しそうですが、現在電子工作で主流のArdionoを使うとこの遠隔操作の体験が簡単なプログラムで実現出来ます。

 

試しに1つのボリュームとサーボモーターで実験してみましょう。

Arduino Unoでのプログラム例はこんな感じ 

例)ボリュームを読むピンをA0、サーボモーター制御用ピンを9とします。

#include <Servo.h>

Servo servo1;//サーボモータ定義

byte sensorPin = A0; //可変抵抗入力ピン
float d = 180.0/1024.0;//回転角180°をセンサー値0~1023に分ける

void setup()
{
servo1.attach(9); //サーボモーター制御用のピンを指定
Serial.begin(9600);//シリアル通信速度を指定
}

void loop()
{
float sensorValue = analogRead(sensorPin); //0〜5Vの値を0〜1023の値で取得 
Serial.print( sensorValue * d);//センサー値を180°までの回転角に直してシリアル出力
Serial.print('\n');//シリアル通信改行
servo1.write(sensorValue * d);//サーボモーターに回転角を指定して出力
}

 

なんと20行足らずで組めてしまいます。 (シリアル通信しなければもっと短い)

サーボモーターの制御部分は僅か1行だけ!

servo1.write(sensorValue * d);

これだけです。これで指定通りの角度になるようArduinoがPWM波という信号を作ってくれるのです!すごいぞArduino!

 

ちなみに、他のマイコンではこう単純にはいきません。

まずボリューム値の読み込みのためにタイマーの設定、サーボコントローラーはPWM波の周波数、DUTY等の制御コードをゴリゴリ書くことになります。

 

 

そしてこのプログラムで実際に動いている映像がコチラ↓


サーボモーターをボリュームで制御

 

ちゃんボリュームとモーターがシンクロして動いていますね。

途中ガクガクなっているのはノイズが入っているから。

これはボリュームの値をダイレクトに読んでいるのでたまに接触不良を起こしているせいです。「ローパスフィルター」というプログラムコードを組む事で回避出来ます。

ローパスフィルターとは、例えばボリュームを10回読んで、その平均を出すというようなプログラムですが、今回は割愛します。 

 

この信号を電波で飛ばせばもうラジコンですね!

 

Arduinoではこういったプログラムでサーボモーターの制御が簡単に行なえるようになっています。

 

 

 

そしてこれは単純なことのようですが、もっともっと精度を上げてそして細かく、モーターも多く制御出来るような機構を作れば本格的な遠隔制御ロボットが実現します。(当然Arduino単発では無理な話なのですが・・・)


Toyota T-HR3 Humanoid Robot

 

遠隔制御が出来ると、なんと地球に居ながらにして宇宙旅行まで体験できちゃうかも!という未来が見えて来ます。


Telexistence Model H unveil

 

すごいですよねー

こんなことが出来る時代なんですよね。

もし電子工作に興味が湧いてきましたら怖がらずに是非Arduinoで遊んでみてくださいね。

dreamerdream.hateblo.jp

 

 

各安サーボモーターも意外に使えます

dreamerdream.hateblo.jp

 

LEDテープの操作も面白いですよ↓

dreamerdream.hateblo.jp

 

kampa.me