ハードウェア」カテゴリーアーカイブ

新型シャーシの製作

今年も残すところ2週間となりましたが、ついに新型シャーシの製作に着手しました。 素材はアルミ、自力での加工を選択しました。 タイヤやサーボも新調し、細部もバージョンアップです。

IMG_0361 IMG_0362

事前に作成した段ボールでの試作により、基本構造部分は比較的スムーズに進みましたが、まともな曲げ工具が無い為、細かな隙間などができ、精度は最悪です。 元々、所有していた工具は、電気ドリルとミニバイス。 曲げ幅が10センチ以上となる箇所の工作には苦労しました。 今回新たに購入した工具がハンドニブラです。 大きな穴あけが必要だったので準備したのですが、切り込みを入れる際などにも利用でき、予想を上回る使いやすさにびっくり。 作業時間も大幅に短縮できました。

ベースユニット

ベースユニット

八角ユニットとの接続

八角ユニットとの接続

基本構造

基本構造

コーナー部分には、LEDを埋め込みます。 フロントには前照灯用の白色LEDとアラート表示用の赤色LEDを、リヤは赤色LEDのみです。 赤色LEDは個別に制御できるようにし、点滅や順次点灯などで異常を表現するものにする予定です。

フロントの白色LED

フロントの白色LED

パン・チルト機構のサーボをSG90の新型となるSG92Rへ交換しました。 スペックではトルクがアップしていますが、実際に使用してみると駆動速度も向上しているように感じました。

新型サーボSG92R

新型サーボSG92R

ところが、パン側で特定箇所に停止させる場合、振動が止まらない現象が発生しました。 高速で回転し、急激に停止する制御の為、ユニット自体の慣性が働き、それを戻そうとするサーボの動きが振動を生み出しているようです。 ユニットの重量や重心の修正で改善可能かもしれませんが、今回はパン側のみ従来のSG90にもどすことにしました。 残念ですが、このパン・チルト機構自体の変更も行いたいと思っているので、その時に考えるとしましょう。

現在の検討事項はシャーシの塗装です。 このままでも良いのですが、何らかの塗装をするか、或いはアルマイト処理にも挑戦してみたいとも思っているのです。 パン・チルト機構も新しくしたいし・・・。 しばらく、シャーシ工作から抜け出せそうもありません。

 

 

新型シャーシのモックアップを製作

制御回路やソフトウェアが一段落してきましたので、そろそろ試作感満載の仮シャーシをやめ、専用シャーシの製作に入りたいと思っています。 まずは、イメージを段ボールで試作してみました。

新型シャーシのモックアップ

新型シャーシのモックアップ

人工衛星などをイメージさせる(?)多角形を基本にした構成で、素材の加工なども簡単になるようにしました。 立方体の上に薄い八角柱が乗っている感じです。 下部のユニットにバッテリーを収め、八角ユニットに制御部を配置します。 実際にはこの上にカメラユニットやアンテナを装着することになるでしょう。 正面から見て斜めの面になる部分は透明なアクリル板などにし、照明用LEDを内蔵したいと考えています。

大雑把ではありますが、サイズが決定しましたので製作に入れる状態になりましたが、現在の検討事項は「自分で作るか、板金を依頼するか」です。 自力加工が可能な様に設計しましたが、切断や曲げの工具が殆ど無い状態ですので、ここは奮発して加工を依頼しようかとも考えているのです。

既製のケースなど利用できるものがないかを物色していますが、八角形なんてあまりないですね。 年内には形にしたいと思っていますが、どうなることやら。

 

 

フォトインタラプタで距離を測定する

加速度センサーによる距離の推定結果が思わしくなかったため、オーソドックスなフォトインタラプタ(フォトリフレクタ)を使用し、距離を測定することとしました。 使用したのは、TPR-105という反射型の素子です。 透過型の方が扱いが楽なのですが、スペースの問題により、この素子を選択しました。

TPR-105

TPR-105

反射型の場合、対象との距離や反射率、外乱光などの影響を受け易いため、受光部の調整ができるようにすべきなのでしょうが、実験を繰り返し最適値を導きました。

実験の様子

実験の様子

反射板のパターン作成にはVegaさんのロータリ・エンコーダ用パターン作成ソフトを利用させていただきました。 winXP用に作成されたソフトのようですが、win7でも問題なく動作しました。

IMG_0321

回路は丸型ユニバーサル基板 (32mm)に作成し、モーターへ両面テープで取付ます。 センサーと反射板のギャップは2~3ミリです。 当初、発光部のダイオードは5Vを供給していましたが、黒パターンの認識が不安定であった為、3.3Vへ変更しました。 また、実機に搭載した際にモーターノイズの影響と思われる誤カウントが見られましたので、出力部分へコンデンサを追加しました。

センサー基板

センサー基板

センサー基板 回路図

※2016.4.3 出力部の抵抗を10KΩへ変更しました。

ソフトウェアは一定時間毎にセンサー値を読み込み、その変化をカウントしていきます。 パルス幅を計測する速度測定などは、処理速度の面で無理がありますので、単純にカウントのみとしています。

//motor_enc1.c v1.0 201505016
#include <stdio.h>

#define MOTOR1 22           // GPIO22
#define MOTOR2 23           // GPIO23
#define MOTOR3 24           // GPIO24
#define MOTOR4 25           // GPIO25
#define LEFT_STR  "l"
#define RIGHT_STR "r"
#define FWRD_STR  "f"
#define BACK_STR  "b"

int main(int argc, char **argv)
{

	int inp,bak,enc=0,tout=0,i=0;

	//引数の取得
	int con = atoi(argv[2]);

	// WiringPi イニシャライズ
	if(wiringPiSetupGpio() == -1) return;

	// モーター停止
	digitalWrite(MOTOR1, 0);
	digitalWrite(MOTOR2, 0);
	digitalWrite(MOTOR3, 0);
	digitalWrite(MOTOR4, 0);

	if ( strcmp( argv[1], FWRD_STR ) == 0 ){
		//前進
		digitalWrite(MOTOR2, 1);
		digitalWrite(MOTOR4, 1);
	} else if ( strcmp( argv[1], BACK_STR ) == 0 ){
		//後退
		digitalWrite(MOTOR1, 1);
		digitalWrite(MOTOR3, 1);
	} else if ( strcmp( argv[1], LEFT_STR ) == 0 ){
		//左ターン
		digitalWrite(MOTOR1, 1);
		digitalWrite(MOTOR4, 1);
	} else if ( strcmp( argv[1], RIGHT_STR ) == 0 ){
		//右ターン
		digitalWrite(MOTOR2, 1);
		digitalWrite(MOTOR3, 1);
	}

	usleep(10000);			//10ms
	bak = digitalRead(27);	//センサー値をバックアップ

	while(1){
		inp = digitalRead(27);	//センサー値を読み込み
		if(inp != bak){			//センサー値が変化しているか
			i++;
			if(i >= 2){			//同一の判定結果が2回連続しているか
				enc++;			//カウントアップ
				bak = inp;		//センサー値をバックアップ
				i = 0;
				tout = 0;
			}
		}else{
			i =0;
			tout++;				//タイムアウト値をカウント
		}
		//カウント数をチェックし、指定値に達していたら停止
		if(enc >= con || tout > 100){
			//ブレーキ
			digitalWrite(MOTOR1, 1);
			digitalWrite(MOTOR4, 1);
			digitalWrite(MOTOR2, 1);
			digitalWrite(MOTOR3, 1);
			usleep(500000);
			//停止
			digitalWrite(MOTOR1, 0);
			digitalWrite(MOTOR4, 0);
			digitalWrite(MOTOR2, 0);
			digitalWrite(MOTOR3, 0);
			return;
		}
		usleep(1500);			//1.5ms
	}
	return;
}

 

実行は、第1引数に方向を、第2引数にカウント値を指定します。

./motor_enc1 f 24         (24パルス 前進)

距離の測定誤差は、1メートルで1センチ程度でした。 停止直前に減速させるなどの処理を行うことにより、バッテリー容量などによる誤差を小さくできると思いますが、現在は行っていません。

今後、自動走行パターンを簡単にプログラムできるインターフェースを作成したいと思います。