ありぎりす の徒然日記

アクセスカウンタ

zoom RSS RaspberryPiで鉄道模型を動かしてみる その7

<<   作成日時 : 2017/02/01 10:16   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 0

前回はポイントを動かしました。

今回はNゲージの車両を特定の位置(駅)で停車させることに挑戦。

駅で停める:

車両を特定の位置で停車させるためには、
車両が停車位置に来たことをコンピュータ(ラズパイ)が
認識できないといけません。

市販のNゲージ自動運転システムでは、カメラを使った
画像認識で停止位置を認識するようですが・・・
ありぎりす にはそんな高度なことは出来ませんので、
別の方法を考えることにします。

単純に考えたら小型のリミットスイッチを使えばよさそうですが、
接触型のスイッチだと車両が脱線する恐れがあります。

非接触のスイッチ・・・・
 『小型で手頃なの無いかなぁ?
  手持ちのフォトレジスタが使えないかなぁ?』

そんなことを考えていたとき、書店で電子工作関連の雑誌を
パラパラと立ち読みしてたら、フォトレジスタを使って、
鉄道模型を停車させるとゆう記事が載っていた。
 『そっかぁ、電圧降下を使えばフォトレジスタを
  スイッチとして使うことが出来るんだぁ』
(本屋さん、出版社さん、本買わなくてごめんなさい。m(_ _)m )

ちなみにフォトレジスタとゆうのはこれ
画像


明るさに応じて抵抗値が変わる電子部品です。
(明るいと抵抗値は小さく、暗いと抵抗値は大きくなります)

で、電圧降下(電位降下)・・・
何か聞いたことがありますよぉ。
確か高校の物理で習ったような・・・

画像

 V = V1 + V2
 R1 : R2 = V1 : V2

こうゆうことでしたっけね。

そしてR2にフォトレジスタを使うと、
周囲の明るさに応じてV2の値も変化する。

ここにラズパイのGPIOを接続すれば、
フォトレジスタをスイッチのように使うことができるとゆう寸法です。
画像


で、Nゲージの線路に直径5mmの穴をあけて、
フォトレジスタを接着し、リード線を付けます。
画像


この状態で抵抗値を測定してみると・・・
 蛍光灯を点けた室内で、約5kΩほど、
 指で隠した状態で、約100kΩほど
でした。

とゆうことは、フォトレジスタの抵抗値が10kΩあたり
よりも大きくなるくらいで、on/offが切り替わるように
すれば良さそうですね。

GPIOのスレッショルド(しきい値:on/offの境目)V2は、
おそらく、1.5V〜2Vくらいでしょうか?

これらからR1の抵抗値を計算してみると、
 R1=(3.3 - V2)✕R2/V2

7kΩ〜12kΩくらいとゆうことになりそうです。

で、実際に実験してみると・・・
10kΩでいい感じに機能することが確認できました。

それでは、動作確認用のテストプログラム(train05.c)を作って
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

#define GPIO24 24
#define GPIO19 19

#define GPIO17 17

int dac_out(int value)
{
char str_data[40];
char low[10];
char high[10];

value = value << 4;

sprintf(low,"0x%.2x ",(value & 0xf0));
sprintf(high,"0x%.2x ",((value >> 8) & 0xff));
strcpy(str_data,"i2cset -y 1 0x60 0x40 ");
strcat(str_data,high);
strcat(str_data,low);
strcat(str_data,"i &\n");
system(str_data);

return 0;
}


int main(void) {
int i;
int speed;

if(wiringPiSetupGpio() == -1)
{
printf(" SetUp error \n");
return 1;
}

pinMode(GPIO24, OUTPUT);
pinMode(GPIO19, OUTPUT);

digitalWrite(GPIO19, 0);
digitalWrite(GPIO24, 1);

pinMode(GPIO17, INPUT);

for (speed = 1600; speed < 2400; speed = speed + 400)
{
dac_out(speed);
sleep(5);
}
speed = 2400;
dac_out(speed);

sleep(30);

for (speed = 2400; speed >= 1600; speed = speed - 400)
{
dac_out(speed);
sleep(5);
}

while (digitalRead(GPIO17) != 1)
{
usleep(100000);
}

digitalWrite(GPIO24, 0);
digitalWrite(GPIO19, 0);

return 0;
}


コンパイル&リンクして
 $ gcc -o train05 train05.c -I/usr/local/include -L/usr/local/lib -lwiringPi

実行
 $ sudo ./train05

すると・・・
 車両が徐々に加速して
 一定速度(最高速の約60%)で30秒間走行
 その後40%まで徐々に減速
 最後にフォトレジスタの位置(駅)で停車
画像

 
バッチリです。 d(^-^)

今回は その5 からの流れでDACを使って車両を動かしましたが、
その3 のPWM方式でも同様に動かすことが出来るでしょう。
でも その2 のやり方の場合だと減速しないので停止せずに
通りすぎてしまうかもです。
その場合はモータ電源の電圧を加減するとか、
フォトレジスタの状態を確認する周期を短くするとか
調整が必要かもしれません。
上記プログラムで周期(0.1秒)を決めているのはこの一行です。
 
usleep(100000);



追記:2017.03.08
上記のプログラムを何度か実行していると、
たまに停車位置を大きく外れて停まることがあります。f(^-^;

おそらくこれは、列車がちょうどフォトレジスタの上を
通過しているタイミングで減速が終了してしまい、
その場で停車してしまうからでしょう。

対策としては、減速完了後、列車がフォトレジスタの上にいない
ことを確認してから、改めてGPIO17が「1」になるのを
監視するようにすれば良いと思います。

次回は、効果音を鳴らします。

関連ブログ一覧:

 『RaspberryPiで鉄道模型を動かしてみる その1
   まずは下準備 』


 『RaspberryPiで鉄道模型を動かしてみる その2
   車両を動かす(ON/OFF制御) 』


 『RaspberryPiで鉄道模型を動かしてみる その3
   PWMで速度制御 』


 『RaspberryPiで鉄道模型を動かしてみる その4
   DACで速度制御その1 』


 『RaspberryPiで鉄道模型を動かしてみる その5 追記あり
   DACで速度制御その2 』


 『RaspberryPiで鉄道模型を動かしてみる その6
   ポイントを動かす 』


 『RaspberryPiで鉄道模型を動かしてみる その7
   駅で停める 』


 『RaspberryPiで鉄道模型を動かしてみる その8
   効果音を鳴らす 』


 『RaspberryPiで鉄道模型を動かしてみる その9
   制御プログラムの話』

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 2
なるほど(納得、参考になった、ヘー)
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
RaspberryPiで鉄道模型を動かしてみる その7 ありぎりす の徒然日記/BIGLOBEウェブリブログ
文字サイズ:       閉じる