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

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

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

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

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

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

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

 

 

pigpioでPWM制御する

PWMによる速度制御は「WiringPiでPWM制御する」で実験しましたが、致命的な問題により実用とはなりませんでした。 他に良い方法はないものかと探していると、pigpioというライブラリを発見! 実験してみました。

wave

pigpioは、サーボの制御やPWM信号の出力、またパルスの計測などの機能を提供するライブラリで、C言語やPython、コマンドラインなどから使用することができ、デーモンとしての動作も可能な為、非常に幅広く利用可能です。

インストール

wget abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
make
make install

デーモンの起動

sudo pigpiod -a 1        #DMAメモリアロケーションモードをPMAPに指定

コマンドラインからの利用

pigs s 17 500          #GPIO17へ接続したサーボへ500ms幅のパルス出力 (500-2500)
pigs p 22 128         #GPIO22へデューティー比50%のPWM信号出力 (0-255)

C言語からの利用

ヘッダファイルとして pigpiod_if.h をインクルード
set_PWM_range(22, 255)                #GPIO22へ最大値を設定
set_PWM_dutycycle(22,128)          #GPIO22へデューティー比50%のPWM信号出力
gcc example.c -o example -lpigpiod_if -lpthread -lrt          #-lpigpiod_if を指定してコンパイル
コマンド一覧はこちらです

ダウンロードアーカイブにはサンプルプログラムも含まれていますので参考になります。

ServoBlasterとの共用は不具合を生じましたので、サーボ制御とPWM制御はpigpioに置き換えました。

今のところ問題なく動作していますので、このまま利用を継続し、他の機能についても検証してみたいと思います。

※2016.1.28追記

pigpioの使用方法についてコメントを頂きましたので、モーターの速度制御に使用しているコードを掲載いたします。

例えば、コンパイルしたmotor_pigpioを使用し、 sudo ./motor_pigpio f 128 と、実行することにより、50%の速度(デューティー比)で前進します。 この時、GPIO23,25に信号が出力されていますので、LEDを接続すると50%の明るさで点灯します。 128の数値を変えることでデューティー比が変化します。

[csharp title=”motor_pigpio.c”]
//motor pigpio.c v1.00 20150810
//コンパイルは以下のコマンドを実行
//gcc motor_pigpio.c -o motor_pigpio -lpigpiod_if -lpthread -lrt

#include <stdio.h>
#include <pigpiod_if.h>

#define MOTOR1 22 // GPIO22
#define MOTOR2 23 // GPIO23
#define MOTOR3 24 // GPIO24
#define MOTOR4 25 // GPIO25
#define RANGE 255 //PWM最大値
#define LEFT_STR "l"
#define RIGHT_STR "r"
#define FWRD_STR "f"
#define BACK_STR "b"
#define STOP_STR "s"

int main(int argc, char **argv)
{
int pwm,status;

// 速度を設定
if ( argc < 3 ){ pwm = 0; } else { pwm = atoi(argv[2]); } if ( pwm > RANGE ){ pwm = RANGE; }

// pigpiod接続
status = pigpio_start(0, 0);
//if (status < 0){ return 1; }

// softPWM設定
set_PWM_range(MOTOR1, RANGE);
set_PWM_range(MOTOR2, RANGE);
set_PWM_range(MOTOR3, RANGE);
set_PWM_range(MOTOR4, RANGE);

//停止
set_PWM_dutycycle(MOTOR1, 0);
set_PWM_dutycycle(MOTOR4, 0);
set_PWM_dutycycle(MOTOR2, 0);
set_PWM_dutycycle(MOTOR3, 0);

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

//ブレーキ
set_PWM_dutycycle(MOTOR1, RANGE);
set_PWM_dutycycle(MOTOR4, RANGE);
set_PWM_dutycycle(MOTOR2, RANGE);
set_PWM_dutycycle(MOTOR3, RANGE);
time_sleep(0.5);
//停止
set_PWM_dutycycle(MOTOR1, 0);
set_PWM_dutycycle(MOTOR4, 0);
set_PWM_dutycycle(MOTOR2, 0);
set_PWM_dutycycle(MOTOR3, 0);

return 0;
}
[/csharp]

 

 

Raspbian最新カーネルでRTCの不具合が解消

RasPi2でリアルタイムクロック RTC-8564NB を使用する」で発生していたhwclockコマンドの不具合は、最新カーネル(4.0) へのアップデートにより、あっさり解消しました。 ハードウェアも、ショットキーバリアダイオードを介しバックアップ用ボタン電池を接続。 本来の使い方ができるようになると思っていましたが…。

clock

NTPサーバへのネットワークを切断した状態で起動すると、システムクロック・ハードウェアクロック共に初期化される現象に悩まされました。 アラームを設定しシャットダウンしてみると、指定した時間にアラーム出力は出ているので、どうやら、起動時に初期化されているようです。

hさんのサイトを参考にhwclock.shを修正してみましたが改善されず、さまざまなサービスや起動コマンドを停止しながら現象を確認しました。

結局、時刻合わせの為に有効となっているNTPデーモンが、上位サーバと通信できない時にシステムクロック・ハードウェアクロックを初期化していたことがわかりました。

NTPデーモンを停止し、代わりにNTPクライアントのntpdateをインストール。 1時間毎に実行する様cronへ設定し、システムクロック・ハードウェアクロックの問題は全面解決となりました。

OSインストール直後からのRTC設定手順です。

  1. /boot/config.txtへ
    dtoverlay=i2c-rtc,pcf8563 を追加
  2. /etc/modulesへ
    i2c-dev
    rtc-pcf8563 を追加
  3. /etc/rc.localへ
    hwclock -s を追加
  4. fake-hwclock
    ntp を無効化
  5. ntpdate をインストール
  6. cronへ
    ntpdate -v ntp.nict.jp を設定し定期実行

 

参考にさせていただいたサイト

Raspberry Piにリアルタイムクロックをインストールする

ntpdate – 日付と時刻をNTPサーバーと同期 – Linuxコマンド