投稿者「spacelab」のアーカイブ

Webコントロールをバージョンアップ

試作版のまま使用してきたコントロール用Webページですが、機能や表示すべき項目が決まってきましたので、この辺りできちんと(?)作りこんでみました。

webコントロール画面

webコントロール画面

2カラムの構成で、メインにカメラ画像と操作ボタン、サイドには情報表示と設定ボタンを配置しました。 情報表示にはアナログメーターのようなデザインを採用しています。 これは JustGage というJavaScript用ライブラリを使用しています。 複数のメーターを表示していますが、動作も軽快でカスタマイズの為のオプションも充実しています。

表示しているデータは、wifi電波強度、超音波距離測定値、CPU負荷、CPU温度、バッテリー電圧、バッテリー電流です。 また、稼働時間は数値で示しています。 情報の取得はjQueryプラグインのPeriodicalUpdaterを使い、2秒毎にリクエストを送信しjson形式で受けています。

カメラ画像の中心にある、照準のようなものは超音波距離計の測定エリアの目安となっており、測定値も表示しています。 この表示は、情報表示ボタンで非表示に出来ます。

今後は、コントロールボタンのキーボード割り当てや特殊コマンドを実行可能なインターフェースを盛り込んでいきたいと思います。

自分なりには納得の見栄えではあるのですが、webデザインの素質はありませんね。 やっぱり。

 

 

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

加速度センサーによる距離の推定結果が思わしくなかったため、オーソドックスなフォトインタラプタ(フォトリフレクタ)を使用し、距離を測定することとしました。 使用したのは、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センチ程度でした。 停止直前に減速させるなどの処理を行うことにより、バッテリー容量などによる誤差を小さくできると思いますが、現在は行っていません。

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

 

RasPi2でリアルタイムクロック RTC-8564NB を使用する

RasPi2に切り替えてから特に大きな問題はなく安定して動作していますが、ある時、hwclockコマンドが使えないことが発覚しました。 現在、RTCに役割はありませんが、電源制御の予定もあり、なにより気持ちがよくありません。

RTC-8564NB

どうやら、デバイスの設定方法がデバイスツリーというものに変わった為の様でした。

例によって、フォーラムに情報がありました。 「PI2でRTC PCF8563が動作しない

この情報によると、hwclockの最新バージョンをコンパイルしてインストールするというものです。 実際の手順は…

  1. /boot/config.txt に dtoverlay=i2c-rtc,pcf8563 を追加
  2. hwclockの最新バージョンをダウンロード・コンパイル
    wget https://www.kernel.org/pub/linux/utils/util-linux/v2.26/util-linux-2.26.1.tar.gz
    tar zxvf util-linux-2.26.1.tar.gz
    cd util-linux-2.26.1
    (apt-get install gcc)  ※gcc導入済みであれば不要
    ./configure –without-python –without-systemd –without-ncurses
    make hwclock
  3. hwclock-rtc.cファイルを編集(debugオプション使用時の修正)

必要に応じ、util-linux-2.26.1の下に生成されたhwclockコマンドファイルを /sbin へコピーします。

手順3.の修正ですがこちらを参考にhwclock-rtc.cファイルを編集後、コンパイルを実行しましたが、debugオプション使用時のエラーは修正されませんでした。

若干の問題はあるものの、hwclockコマンドやアラームの操作が可能となりました。 RasPi2はシャットダウン状態からの起動に必要なリセット端子が外部に引き出されていない為、その辺りが今後の課題です。

 

※displayコネクタの横にリセット端子がありました。  2015.5.6追記

※hwclockコマンドは完全と言える状態ではありませんが、アラームについては、シェルスクリプト(alarm.sh) を使用して設定することにより実用上問題ない状態にはなりました。 2015.5.17追記

参考:http://d.hatena.ne.jp/payapara/20090626/1246029897

※カーネルの更新で不具合は解消しました。 「Raspbian最新カーネルでRTCの不具合が解消」 2015.7.19追記

 

RTC関連コマンド

ハードウェアクロックを表示
hwclock -r
ハードウェアクロックをシステムクロックと同期
hwclock -w
RTCの状態表示
cat /proc/driver/rtc
RTCアラームのリセット
echo 0 > /sys/class/rtc/rtc0/wakealarm
RTCアラームを60秒後に設定
echo +60 > /sys/class/rtc/rtc0/wakealarm
UNIXエポックからの経過時間を表示
cat /sys/class/rtc/rtc0/since_epoch