SSブログ
自動運転 ブログトップ
前の10件 | -

TwayDCCさんからOLEDもらったのでDSシールドにくっつけて自動運転 [自動運転]

 さて、ちょっと遅れましたが、鉄道模型市にお越しいただきありがとうございました。いろんな方から貴重なご意見をいただき、やることが増えてしまったような気もします。
・S88_Magをつくる。
・疑似音VVVFのクオリティーを上げる。
・キハ58のホーンが違う(いまのは機関車のホーン)ので、ちゃんとする。
・計器付きコントローラ作る。
など。前向きに検討しようと思います。が、最初から上記に上げたもの以外からスタートです。
 まずは、DSシールドにせっかくもらったOLEDを付けます。そして、DSMainR5のソースから、OLED部分(OLED.cpp.OLED.h)を取ってきて、スケッチ(inoファイル)にそれっぽく書いて繋いだら動いたので、デバッグに使用することにしました。
re_DSC02303.jpg

 0.96インチのOLEDのアップです。15文字*7行ぐらいでしたっけ?
re_DSC02307.jpg

 1,2,3行目がソフトのバージョンで、4行目が自動運転のステート、5行目がS88の状態です。
 結構、デバッグは便利です。
 でも、これだけだと、「表示はできているが、ちゃんと電車にまで指示が飛んでいるのかが分かりません」ということで、見るだけ君を付けました。今までは、QIコネクタでフィーダーから分岐していましたが、Yaasanさんの鉄道模型市の見るだけ君のつなぎをみて、線路からワニ口で取る方法をマネすることにしました。少しだけ通っぽい感じがするし。
re_DSC02306.jpg

 そして、S88も付けますが、今回は作り途中のS88 8chです。まあ、今までの6ch用との違いは、「ケース作って、省電力にして、8chにした」です。まあ、でもマイナーバージョンアップみたいなものです。
 そして、字度運転のレイアウトはこれです。単純往復ですが、今回は4ch使用します。
re_DSC02304.jpg

 動きは
(1)センサ①を踏んで停止、方向転換、エンジン起動、警笛、出発、速度50%
(2)センサ②を踏んで、速度100%に加速
(3)センサ③を踏んで、速度25%に減速
(4)センサ④を踏んで、停止、方向転換、警笛、出発、速度50%
(5)センサ③を踏んで、速度100%に加速、
(6)センサ②を踏んで、速度25%に減速
そして(1)にもどるという自動運転をDSシールドのAutoR1を改造して、作っています。
動画は以下です。
何が言いたいかというと、加速や減速を途中に入れることによって、とても人間らしい?本物っぽい?運転になるということです。減速の所で言うと、今日、山手線見たら、減速の所に白いセンサ(ATC地上子?)が止まる手前に5個ぐらい置いてあり、模型でも、今後の運転ではもっと細かく制御してしまおうかとも思いました。


スケッチはこちらです。OLEDと自動運転の参考にどうぞ。


コメント(2) 

鉄道模型市用のデモ検討 [自動運転]

 さて、来週の鉄道模型市用にキハ58のデモでも考えようかと思って、DSshieldを使ったデモを作りました。MECYさんがC59用のデモを作っており、それで、デモができる事を思い出しました。
 作ろうとしているデモは、キハ58が前後進しながら、汽笛を鳴らすものです。一応起動音も入れていたので、一往復ごとにエンジンも入れなおすことにします。DSshieldはS88の入力もありますので、自分のS88(光入力)で検知することにします。
 全体の感じは以下の写真です。
re_DSC02281.jpg

 DSShieldの自動運転はDSshieldAutoのページで説明されています。
・最初、電車のDCCアドレスを入れても動かず、見るだけ君で見ながら悩んでいました。結局、MECYさんのBlogや、Wikiの説明を見ながら、DCCのアドレス3にアクセスするには「ADDR_DCC + 3」とするということが分かるまで、ちょっとかかりました。
・CMD_Waitが時間を待つ命令だと思われるのですが、CMD_Wait内に「//なんか時間が合わない。Timer0のプリスケーラがおかしい?」と書いてあり、確かに時間が変な気がします。よくわからないけど代わりにDelay(ms)を使いました。まあ動いているからいいのか?

 と、引っかかった後に自動運転できました。DesktopStationのソフトと違い、普通にCの変数はフラグを使いたい放題なので、かなり自分好みに作れます。

で、できたもののユーザープログラムの説明は以下です。
有志のスケッチからダウンロードできます。dsshieldauto_f180422_1.zip)

void user_init(void)
void user_program(void)
内の話です。

・タスク1で200msごとにS88の状態を読み取ります。
・タスク2で200msごとにS88の0chと1chのうち指定された方のセンサ値だけ内部変数に入れます。
 その後のループは
・0chを見張っているとき(event_a)、0chが反応したら、0chも1chも反応しないように変更して、列車を止め、エンジンを止め、方向転換をし、エンジンを点け、汽笛を鳴らし、発車し、今度はセンサの1chだけ反応するようにします。
・1chを見張っているとき(event_b)、1chが反応したら、0chも1chも反応しないように変更して、列車を止め、方向転換をし、汽笛を鳴らし、発車し、今度はセンサの0chだけ反応するようにします。
の繰り返しです。

 あとは、この列車デモも入れた鉄道模型市用のレイアウトを実寸で作ってみました。
re_DSC02283.jpg

 今回は自動運転用周回コースがあり(中央の盛り上がったところ600mm*900mm)、その外側にN用(C280)の周回コースを作るとのことで、一番後ろにHOを置くと、かなり、窮屈になりそうです。
 なお、左上に置いたスペンサーはC59のつもりです。
 せっかくだから、キハ58の自動運転の模様です。右側にときどきこそこそ走っているのは昔作ったスマイルデコーダーのSoundOptionのSLスケッチです。


 他の物も手に取れるように陳列すると思われますし、一番手前のNへのお子様アタックの可能性も高いので、手前の安全を考えて奥のキハ85のHO削除もありかなあとも思います。
 関係者の方ご意見ください。

コメント(2) 

自動運転士による自動運転計画(続くのか?) [自動運転]

 先週は「さよならの朝に約束の花をかざろう」を公開初日に見に行って、Yahooの映画評はかなりよいですが、映画に単純な楽しさを求める私としては、この映画どうかなあと思いました。で、今週も公開初日に「映画ドラえもん のび太の宝島」を子どもと見に行って、こっちは面白かったです。個人的には去年の南極モノよりも面白かったです。
 そして、ブレードランナー2049のブルーレイが出たので、買って見ました。映画館は3Dかつ字幕でかなり辛かったのですが、2Dで吹き替えだと目に負担がかからなくてよいです。

 さて、本題です。「自動運転士による自動運転計画(続くのか?)」です。
 RasPiにカメラが付き、もしかしたら画像処理も出来そうということで、将来的に画像処理も載せようと思い、今回は信号機の色を確認する処理をしてみます。もちろん、車載などという難しいことはまた今度考えるとして、WindowsPCとこのごろ流行りのPython+OpenCVでやろうと思います。
 まずは交通信号の画像処理について下調べです。ネットを探すと、
以下のものが上のほうに出てきました。
形状及び色特徴を用いた安全運転支援システムのための信号機検出処理
夜間動画像からの道路交通信号認識技術の研究
家庭用ビデオカメラ動画像からの道路交通信号認識


 で、調べるまでは、赤、黄、青の光っている信号機の画像を登録して、パターンマッチングして信号機を検出して、というのが一般的かなと考えていたのですが、どうも、こっちの業界はRGBをHSV変換してやるのが一般的らしいです。
・H:色相 赤から青
・S:彩度 色が淡い~濃い
・V:明度 明るさが暗い~明るい
 まあ、現在はもう一歩進んで機械学習なんでしょうが、私は今までグレースケールの画像処理しか扱っていなかったため、かなりお勉強になりました。
 そして、Python+OpenCVです。バージョン違いやC++の情報がごっちゃになっているなど、どうもネットで情報を探しにくかったですが、まあ、数日にらめっこしたらどうにか実験できるレベルにはなってきました。
 処理の流れは、(1)画像所得、(2)HSV変換、(3)赤信号、黄信号、青信号で二値化する(4)領域面積の一番大きい所の信号の色とする。です。LEDが明るすぎて、信号機の中心部分の色が白く飛ぶなど、どうも、カメラというのは人間の目に比べてダイナミックレンジの低さが気になります。
 実験環境は以下。DS BlueBoxNuckyさんの日本型信号機を使っています。
re_DSC02232.jpg

 画面はこんな感じです。
無題.png

 左上がUSBカメラ像。上真ん中が(使っていないが)Gray変換した二値化画像、左下が青信号二値化、下真ん中が黄色信号二値化、右下が赤信号二値化で、Pythonの環境はアナコンダとスパイダーとかいう環境でやっていますが、よくわかっていません。追加でOpenCVとNumpyとかいうライブラリ?を入れています。デバッグ中はエラーが出て途中で止まると、USBカメラのドライバごと落ちていきます。
 で、動画です。


 まあ、このままだととても外乱光に弱いので、LEDの強力な光を利用して、カメラにND
フィルターを付けてしまって、信号以外の風景や光は見えないようにしてしまおうかと思っていますが、そうすると、点灯する信号以外は全部無視の自動運転士が出来上がる・・・。なにかかなりショボく終わりそうな気がする・・・。

pythonのソースですが、以下です。(書きなぐりです。)
-----
#-*- coding:utf-8 -*-
import cv2
# import numpy as np
import numpy as np


def disp_text(frame,text = "",width = 0,height = 0,size = 1):
    cv2.putText(frame, text, (width, height), cv2.FONT_HERSHEY_PLAIN, size, (255, 255, 255), size, cv2.LINE_AA)

def disp_blue(hsv_frame,rgb_frame):
    # 色相、彩度、明度
    #lower_blue = np.array([70,50,100])
    #upper_blue = np.array([90,100,255])
    lower = np.array([70,50,200])
    upper = np.array([90,255,255])
    # HSV イメージから青い物体だけを取り出すための閾値
    mask = cv2.inRange(hsv_frame, lower, upper)
    # ビットごとのAND演算で元画像をマスク
    res = cv2.bitwise_and(rgb_frame,rgb_frame, mask= mask)
    cv2.imshow('blue',res)
    return np.sum(res)

def disp_yellow(hsv_frame,rgb_frame):
    # 色相、彩度、明度
    lower = np.array([15,50,200])
    upper = np.array([35,255,255])
    # HSV イメージから黄色い物体だけを取り出すための閾値
    mask = cv2.inRange(hsv_frame, lower, upper)
    # ビットごとのAND演算で元画像をマスク
    res = cv2.bitwise_and(rgb_frame,rgb_frame, mask= mask)
    cv2.imshow('yellow',res)
    return np.sum(res)

def disp_red(hsv_frame,rgb_frame):
    # 色相、彩度、明度
    #lower_blue = np.array([170,100,100])
    #upper_blue = np.array([190,255,255])
    lower = np.array([00,50,200])
    upper = np.array([10,255,255])
    # HSV イメージから赤い物体だけを取り出すための閾値
    mask1 = cv2.inRange(hsv_frame, lower, upper)

    lower = np.array([170,50,200])
    upper = np.array([180,255,255])
    mask2 = cv2.inRange(hsv_frame, lower, upper)
    
    mask = mask1 | mask2
    # ビットごとのAND演算で元画像をマスク
    res = cv2.bitwise_and(rgb_frame,rgb_frame, mask= mask)
    cv2.imshow('red',res)
    return np.sum(res)

def disp_gray(rgb_frame):
    gray = cv2.cvtColor(rgb_frame, cv2.COLOR_BGR2GRAY)
    # 二値変換
    thresh = 200
    max_pixel = 255
    ret, img_dst = cv2.threshold(gray,
                                 thresh,
                                 max_pixel,
                                 cv2.THRESH_BINARY)
    cv2.imshow('gray',img_dst)
    return np.sum(img_dst)

#def main():

# 動画の読み込み
cap = cv2.VideoCapture(1)

# 動画終了まで繰り返し
#while(cap.isOpened()):
while(1):
    # フレームを取得
    ret, img = cap.read()
    org_height, org_width = img.shape[:2]
    
    #画面表示を考えて大きさを小さくする
    size = (org_width//3*2, org_height//3*2)
    frame = cv2.resize(img, size)

    #HSV変換
        # BGR空間から HSV空間に変換
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    gray_s = disp_gray(frame)
    blue_s = disp_blue(hsv,frame)
    yellow_s = disp_yellow(hsv,frame)
    red_s = disp_red(hsv,frame)
    temp_str = "b,y,r"+str(blue_s)+","+str(yellow_s)+","+str(red_s)
    #どの色が強いか
    sig = np.array([blue_s, yellow_s,red_s])
    sig_name = np.array(["blue", "yellow","red"])
    sig_max = np.argmax(sig)

    _h, _s, _v = cv2.split(hsv)
    max_h = np.amax(_v)
  
    # フレームを表示
    # 左上から中央まで、太さ50の赤い四角形を描く
    # 画像の高さ、幅を取得
    height, width = frame.shape[:2]
    #cv2.rectangle(frame, (0, 0), (width/2, height/2), (0, 0, 255), 50)

    cv2.rectangle(frame, (0, 0), (width//2,height//3), (64, 64, 64), -1)
    temp_height = 20
    disp_text(frame,"v:"+str(max_h),0,temp_height)
    temp_height += 20
    disp_text(frame,temp_str,0,temp_height)
    temp_height += 40
    disp_text(frame,sig_name[sig_max],0,temp_height,2)
    cv2.imshow("raw", frame)
    
    #esc key
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()


コメント(0) 

NucleoでDSBasicをしたい(主にメモリを増やしたいだけ) [自動運転]

 かなり、願望が入っている題名ですが、
Yaasan様から
----------
Nucleoに使われているSTMのマイコンは、全ピンが5Vトレラント対応です。つまり、5Vの信号を突っ込んでも平気です。

課題なのは、3.3Vで出力するピンです。ロジックICのVIHminは、たいていは70%なのでおおよそ3.5V以上でHIGHと認識する動作を保証します。つまり入力HIGH電圧閾値の動作保証外。まあ、実際のところはかろうじて動くんですけどね・・・。ということで、秋月でも売っている74XX125なレベルシフトに使えるスリーステートバッファを3.3V->5Vで使うことになるかと思います。

挙げられているソフトは、EEPROMやファイルシステムは実装されてないと書いてあるので、そこを実装しないと、保存できないシロモノになります。あと、テレビとかキーボードの処理も別途実装が必要そうです。STM用のライブラリってありますかね???
----------
とコメントされましたので、一応いくつか調べてみました。

まずEEPROMですが、なんか、一日中探して、下記のものを探せました。mbedのLPC・・・だと、localFileSystemが使えて楽なんですが、なんで、Nucleoは使えないんでしょう?

https://developer.mbed.org/teams/mbed_controller/code/storage_on_flash_demo/

一応、上記のもので、STM32F411では動きました。ファームを最新に上げるとか、#IfdefをF401用からちょっとだけ変えるとかやりましたが。

キーボードですが、(試してませんが)
https://developer.mbed.org/cookbook/PS2
があるようです。

TV outは探せませんでした。
(やっている人はいるようなのですが)

なかなか道は長そうです。

メイカーフェアの準備(大体終わり) [自動運転]

 電気屋の毎日様で詳しい案内をされていますが、土曜日、日曜日で鉄道模型コンテストをやっている東京ビッグサイトの別の展示場で(メイカーフェア)で展示をするものが大体出来上がりました。
 今日は、外回りの方の電車(誰かに壊されてもあまりいたくない)を作っていました。
 まず、10年ぶりぐらいに再生産された鉄コレの動力TM-10Rです。鉄コレの第8弾を箱買いしていたのですが、気づいたら動力車が無くて、DCCにしたいのに、・・・でしたが、やっと発売されたので、4つも買ってしまいました。
re_DSC00872.jpg
 なので今日は強気に作っていきます。(壊してもまだ3つあると思いながら)
 5月の連休明けぐらいに作ったDSDecR3用のヘッドライトテールライト基板です。これをくっつけて、光ファイバで導光して、作ります。叡山電鉄という京都の電車らしいです。関東なのでよく知りませんが、両側に運転台があるので、いい感じです。
re_DSC00871.jpg
 動力車はほぼ全部分解して、集電、モーター配線共にはんだ付けします。なおこの写真のはんだ付け後、干渉することが分かったので、集電側はほかの場所にはんだ付けしなおしています。
re_DSC00875.jpg
 屋根裏を削ります。なお、写真の削りでは足りなくて、その後もっと削っていたりしますので、参考にしないほうがいいと思います。穴あけはホットナイフで行い、その後、カッターで整えています。
re_DSC00874.jpg
 で、ヘッドライト、テールライトの光ファイバの導光です。テールはΦ0.5mm、ヘッドライトはΦ0.75mmにしましたが、後で、取りまわすことを考えるとすべて0.5mmにすればよかったと思いました。径の問題は置いておいて。
re_DSC00877.jpg
 そして、光ファイバーを側方出射LEDの前に瞬間接着剤で付けて、・・・、瞬間で固まらず結構数分持ち続けました。、で、本当は全部を熱収縮チューブで覆って、遮光と固定をしたかったのですが、適当な径のものがありませんでした。3mmでは小さすぎ、10mmは大きすぎ、6mmのチューブ買っておけばよかったと後悔しました。
 なので、スーパーXブラックで固定&遮光しました。結構良いです。一部接着剤が入らずに車内が赤く輝いていましたが。
re_DSC00878.jpg
 で、完成です。
re_DSC00880.jpg
 テールライトは4つ中、1個穴あけ場所をしくじりましたが、まあ、雰囲気的には問題ありません。
 そして、ジオラマ化(とか言って、一部に人工芝貼り付けただけ)したメイカーフェア向けレイアウトで、ウェアラブルカメラを乗っけて、信号機&渋滞運転を楽しんでいました。
re_DSC00879.jpg
 後は信号機の支柱を白く塗ろうかと思っています。
 駅にメロディーをとか思っていましたが、そろそろ時間切れかなあと思います。

複線8信号レイアウト信号管理+内側自動運転 [自動運転]

 日曜、月曜は家族旅行に行っていました。どっかの都知事が会議に使ったというホテル三日月もいいなあと思いながら、今回は伊東のサンハトヤに行きました。
 箱根小涌園と比べるとかなりプール温泉関連のスケールは小さいですが、まあちょうどよいサイズです。お昼ぐらいに行って夕方まで遊んでました。で、目玉の海底温泉。一日目は微妙な海底温泉で、アジやヒラメしか泳いでいませんでした・・・。(二日目は大きなカメが二匹泳いでいました。)
 で、夕食は昭和の香りが漂うマジックショー付きのブッフェです。普通においしかったです。段差が多くて、かなり食事を持ったままつまづきそうになっていましたが。ショー見ながら食べるなんて嫌だとぶつぶつ言っていた子供も、台が宙に浮いたりするマジックを見ながら喜んでいました。ラインダンスをちょっと期待していたのですがそんなものはありませんでした。で、伊東市がやっている観光花火もホテルの部屋から見えてよかったです。
 子供のころから「伊東に行くならハトヤ」とさんざんCMを聞かされて一度は行ってみたかったところに行けてよかったです。朝は展望露天風呂に入りましたが、初島が良く見えてきれいでした。
 あとは、ホテルの隣に伊東線の単線が走っており、スーパービュー踊り子、普通の踊り子、マリンエクスプレス踊り子、リゾート21(多分)、普通の東海道線、普通の伊豆急など、かなりバラエティー豊かな電車がはしっており、山、線路、国道、ホテル、海というレイアウトでジオラマにするにも良い感じかと思いました。
 で、(前置きが長かったですが、短い)本題です。
 「複線8信号レイアウト信号管理+内側自動運転」を作りました。外回りの電車は本当は手動で操作するんですが、手が足りないので、定速周回しており、信号無視しています。

 内回り、外回り共に信号機制御を行い、かつ、内回りは電車の停止、発車制御も行っております。ただし。S88&制御ループをそれなりに速く回したいので、ArduinoのスケッチでAccのDelayは200→100に変更しております。また、外側も停止してほしい時は次の信号を赤にして、止まってほしい旨伝えるようにしています。
 次にSPX命令は徐々に加速、減速をする命令ですが、これもS88&制御ループを止めるので、SDP命令で一気に停止、出発に変えています。DCCデコーダの加速、減速を使ってなだらかな運転にしたいと思っております。
 また。列車の停止から出発までDelayで待ち続けるとこちらもS88&制御ループを止めてしまい、もう一つの線側の信号機制御を滞らせてしますので、フラグを追加してS88&制御ループを回しながら列車の停止、出発を制御しております。内回りがI、外回りがJです。
また、いろいろと追加したら、プログラム領域がEEP ROM領域に入らなくなってしまったので、涙ぐましい努力をいくつかしています。
・行番号を減らして1行に記述する。
・読みやすくしている「スペース」を削る。
・Print命令は?(短縮形)に変更。
で、ぎりぎり入りました。
以下にプログラムを書いておきます。
67 I=0:J=0:F=0:T=5:L=3:S=35:D=50
68 W=20
100 A=GS8(0)
105 ? "S88(",A,")"
110 IF A&128 GOSUB 200
120 IF A&64 GOSUB 300
130 IF A&32 GOSUB 400
140 IF A&16 GOSUB 500
150 IF A&1 GOSUB 600
160 IF A&2 GOSUB 700
170 IF A&4 GOSUB 800
180 IF A&8 GOSUB 900
185 IF I>0 GOSUB 1000
186 IF J>0 GOSUB 1100
197 IF F=0 DELAY 200
198 F=0:CLS
199 GOTO 100
200 ACC42,0:ACC43,0:ACC54,1:ACC51,1
210 ACC46,0:ACC47,0:SPD L,0:F=1:I=1:RETURN
300 ACC46,0:ACC47,0:ACC42,1:ACC55,1
310 F=1:RETURN
400 ACC50,0:ACC51,0:ACC46,1:ACC43,1
410 F=1:RETURN
500 ACC54,0:ACC55,0:ACC50,1:ACC47,1
510 F=1:RETURN
600 ACC62,0:ACC63,0:ACC70,1:ACC67,1
610 ACC58,0:ACC59,0:F=1:J=1:RETURN
700 ACC58,0:ACC59,0:ACC62,1:ACC71,1
710 F=1:RETURN
800 ACC66,0:ACC67,0:ACC58,1:ACC63,1
810 F=1:RETURN
900 ACC70,0:ACC71,0:ACC66,1:ACC59,1
910 F=1:RETURN
1000 I=I+1:IF I<W RETURN
1010 ACC46,1:ACC47,1:SPD L,S:I=0:RETURN
1100 J=J+1:IF J<W RETURN
1110 ACC58,1:ACC59,1:J=0:RETURN

今回、主に、1000行目以降が追加で、1000、1010が内回りの列車、信号の停止、出発制御で、Iが1以上でカウントアップして、W以上(W=20としている)で出発して、フラグ(I)を下げています。
1100、1110は外回りの制御で、列車の制御はせず、信号機の制御のみをしております。
 外側は別系統のDSMainR5で体験運転にでもしようかと思っております。
 で、今日の夜はシン・ゴジラを見に行きました。モノレールや京急や江ノ電やその他たくさんの電車が出ており面白かったです。ストーリーはあまり憶えていませんが。
 明日から、沿線をデコレーションしていこうかと思います。ただし、バラストなど、粉系は撒きません。あとが面倒なので。

複線8信号レイアウト信号管理 [自動運転]

 すごい勢いでYaasan様が開発するので、レビューです。
 R4bです。Delayを入れる必要がなくなったので、ソースは短くなりました。
 ただし、信号機のアクセサリ部分は今までDelay50msだったのが200msになったので、全体のループのDelayなども見直しました。Delayの希望としては50~100msです。
 また、今回は「複線8信号レイアウト信号管理」なので、S88は8ポート(内回り4ch、外回り4ch)使っています。前回、駅に電車を止めて出発させていましたが、この部分は電車を止めて出発するまでDelayを入れてS88の検出を止めてしまっていますので、これをやると電車が止まっている間信号機管理が止まってしまうため、取りあえず電車制御はやめています。また変数Fを加えています。これは、S88検出をしてAcc制御した場合はループのDelayを抜くためのフラグです。(あまりにもS88の検出ループが長くなってしまうので)。また、8Chのため分岐用のIf文が倍になっています。
 で、今回のソースです。(ちょっと前回とS88のchなど変更しています)
------------
70 F=0
75 T=5
80 L=3
85 S=35
90 D=50
100 A=GS8(0)
105 PRINT "S88(",A,")"
110 IF A&128 GOSUB 200
120 IF A&64 GOSUB 300
130 IF A&32 GOSUB 400
140 IF A&16 GOSUB 500
150 IF A&1 GOSUB 600
160 IF A&2 GOSUB 700
170 IF A&4 GOSUB 800
180 IF A&8 GOSUB 900
190 IF F=0 DELAY 200
192 F=0:CLS
195 GOTO 100
200 ACC 42,0:ACC 43,0:ACC 54,1:ACC 51,1
210 F=1:RETURN
300 ACC 46,0:ACC 47,0:ACC 42,1:ACC 55,1
310 F=1:RETURN
400 ACC 50,0:ACC 51,0:ACC 46,1:ACC 43,1
410 F=1:RETURN
500 ACC 54,0:ACC 55,0:ACC 50,1:ACC 47,1
510 F=1:RETURN
600 ACC 62,0:ACC 63,0:ACC 70,1:ACC 67,1
610 F=1:RETURN
700 ACC 58,0:ACC 59,0:ACC 62,1:ACC 71,1
710 F=1:RETURN
800 ACC 66,0:ACC 67,0:ACC 58,1:ACC 63,1
810 F=1:RETURN
900 ACC 70,0:ACC 71,0:ACC 66,1:ACC 59,1
910 F=1:RETURN
------------
 Export、Importするソースはbasという拡張子ですが、中身はテキストです。
 バグかどうかわかりませんが、Exportすると、ファイル内に以前のソースごと入ってしまうようです。(何回かSaveとLoadをしているせいでしょうか)ファイル内の一番下が最新のソースのようです。?
 あとは、Serialの通信速度を落としたとのことで、当たり前ですが、旧スケッチとDSBasicEditor0.1を組み合わせると文字化けしてちゃんと通信できません。
 ただ、格段に操作性は上がりました。プログラムを入れるだけならDSBasic側のモニタは要らないぐらいです。一つ要望を言うと、プログラムをPC側から止めたいです。(ESCキーはSerialを通らないので)
 で、今回の動画です。内回り、外回りを定速で電車が動いていて、信号機がたんたんと変わっていくだけですが、信号機関連はDSBasicで動作しています。

 明日、明後日は家族旅行のためおりません。

DSBasicによる自動運転デバッグその2 [自動運転]

 やっと明日は休みなので、鉄道模型ショウに行くつもりですが、子供を誘ったのに誰も行かないらしいです。残念?ながら一人で羽をのばすことにします。
 さて、DSBasicがR0.3になって、バグがなくなり、プログラム領域も広がったとのことで、試してみました。特にバグのようなものは見つかりませんでした。ArduinoのCOMのコンソールからプログラムをかけるので、かなりデバッグ効率が上がります。でも、Arduinoのコンソールからは実行中のソフトは止められないようです。(ESCキーのコンソールでの送り方が分からない。エスケープシーケンスで送れるのか?)
 レイアウトは前回と同じで、メイカーフェア用のレイアウトの内回りです。
 レイアウトのセンサとアクセサリアドレスは以下のようになっています。
説明.png
 今回の自動運転は、まず信号機については、1,2,3,4共に閉塞区間?を持っていることにしてあり、信号機1を電車が通過すると、信号機4が黄色、信号機3が青色という風に変わります。信号機2だけちょっと変わっており、信号機1を電車が通過したら赤になり、電車を駅に止めます。(なんかこういう信号は変かもだかよくわからん)
実際のレイアウトは以下です。
re_DSC00823.jpg
動画は以下です。信号機1が手前、信号機2が奥に写っています。

そして、プログラムですが、以下です。
--------
75 T = 10
80 L= 3
85 S=25
90 D=50
100 A=GS8(0)
105 PRINT "S88(",A,")"
110 IF A&1 GOSUB 200
120 IF A&2 GOSUB 300
130 IF A&4 GOSUB 400
140 IF A&8 GOSUB 500
150 DELAY 300
155 CLS
160 GOTO 100
200 ACC 42,0:DELAY D:ACC 43,0:DELAY D:ACC 54,1:DELAY D:ACC 51,1:DELAY D
205 ACC 46,0:DELAY D:ACC 47,0:DELAY D:SPX L,S,0,T
206 DELAY 2000:ACC 46,1:DELAY D:ACC 47,1:DELAY D:SPX L,0,S,10
207 A = GS8(0)
210 RETURN
300 ACC 46,0:DELAY D:ACC 47,0:DELAY D:ACC 42,1:DELAY D:ACC 55,1
310 RETURN
400 ACC 50,0:DELAY D:ACC 51,0:DELAY D:ACC 46,1:DELAY D:ACC 43,1
410 RETURN
500 ACC 54,0:DELAY D:ACC 55,0:DELAY D:ACC 50,1:DELAY D:ACC 47,1
510 RETURN
--------

 プログラムの説明ですが、まず変数です。
a:S88のビットを保持します
d:Acc命令を立て続けに出すと切り替わらないことが多々あるので、そのためのWait[ms]を可変にしています。
10msではときどきしくじるので、50msにしました。
L:電車番号です。
S:自動運転時の最高スピードです。
T:電車停止までの時間です。
 次にプログラムの中身の説明です。
~90:初期値を設定しています。
100~160:いわゆるメインループでS88の値をとってきて、その値によって分岐させています。何もない場合は300ms待って、最初に戻ります。
200~210:信号機1の所の処理です。踏んだら、各信号機の色を変えた後、信号機2を赤にして、数秒後に電車が駅に止まるようにします。数秒後、信号機2を青にして、出発します。なお207行目でS88を一度読みだしていますが、これは、S88のバッファを最新にするためのゴミデータの掃き出し動作になります。(これをいれないと、センサを通過した後なのに、もう一回信号機1を通ったことになり電車が止まります)
300~310、400~410、500~510:各信号機の色を変更します。通過した信号機を赤にして、一つ前の信号機を黄色にして、二つ前の信号機を青にしています。
200~210も300以降と同様にすることで、単なる信号機制御だけするモジュールにも出来ます。この場合は電車は線路側にDCCを繋がらなければアナログでの制御などでも可能です。

まだ、DSBasicは少し領域が残っているので、外回りの信号機も制御しようかなあと思っております。
あと、駅にメロディーをいれようかなあと思っていたりしますが、まあ、明日から会社の夏休みなので、ゆるゆるとやって行こうと思います。(いや、メイカーフェアは来週の土日じゃないのか?という気もする)

あと、子供にこのレイアウトの木の質感よくない?と言ったら、ちゃんとニセ芝生(少し前にダイソーで買った)とかつけてちゃんとしたジオラマにしてほしいという要望があった。どうしようかなあ。

DSBasicによる自動運転デバッグ [自動運転]

(追記 現在DSBasic R0.3になっており、下記不具合(2)、(3)は解消しております)

 やっぱり、F-modelsに行こうかどうか悩みましたが、半額セールで買うものが見つからないような気がしたので、今日は、昨日作ったレイアウトのデバッグをしていました。
 使ったスケッチはDSBasic_20160714で、やっているうちにいくつか不具合があり、今日は自動運転は完成しませんでした。
 不具合ですが、
(1)Arudino1.6.6でコンパイルできない。→1.6.9でOK
 前は他のPCでAruino1.6.7でコンパイルしていたような気がするので、気がつきませんでしたが、1.6.6ではコンパイルできませんでした。static void ignore_blanks(void)がExternだかStaticだか。とでます。Arudino1.6.9にIDEを上げて無事コンパイルできるようになりました。
(2)SPD命令がおかしい→以前のもののようにすればOK。
 中身を確認したら、前のVerではSetLocoSpeedExが呼ばれてて、これは0~1023のスピードを引数にするのですが、今回のS88用VerではSetLocoSpeedが呼ばれており、スピードの引数は0~100%のようです。ただし、内部の計算がArduinoのInt型なのに、計算内で32768を超えているため(Inspeed*1024)/100)、どうも動作がおかしいです。まあ、以前のものに戻しつつ、値チェックもする形になればよいかと思います。
 
 ここまでやって、S88の動作を確認しました。
DSBasicのプログラムは以下です。
10 print gs8(0)
20 print gs8(1)
30 print gs8(2)
40 print gs8(3)
50 delay 300
60 cls
70 goto 10

で、OKでした。
re_DSC00820.jpg
 DSCoreに直結しているためか、Delayをちゃんと入れてやらないと、S88自体の動きが速すぎて怪しいです。
 次は要望ですが、S88は8ビットごとに取ってくるのですが、ビットAndやビットOr命令がないので、If文が扱いにくいです。弘前大のスケッチ tinybasic20160327vk.inoには、Not、And、Orが拡張されていたので、できたら付け加えてほしいです。(適当に付け加えたら、まあ動きました)
 で、次ですが、これがちょっと私のプログラムを作るうえでは今のところ致命的な問題です。
(3)プログラムが256Byteしかロードできない?
 4信号機で、各信号機のアクセサリアドレスが2つずつで計8つのビットをいじるのですが、(Nucky様のもともとのコンセプトは多分、閉塞区間で、アドレスを重複させるやり方なのでBit数は4に減らせると思いますが)、
1.S88の値を取ってきて
2.If文でどの信号かを判断し
3.各信号のビットを立てたり下したりする(4ビット分)
のですが、プログラムの動作が不安定で、セーブ、ロードすると暴動します。
 もともと自由な領域が968Byteありますが、713Byteまでは普通にセーブ、ロードが可能ですが(多分ここら辺が256Byteの区切り)、711Byte(MEM命令で確認)ではプログラムをSave後、Loadし、Listでみると、DSBasic自体が暴走します。List命令で、プログラムと文字化けしたような文字列が流れ続けます・・・。
re_DSC00821.jpg
 もうちょっと長いプログラムを書いてセーブ、ロードしたいです。

複線8信号機レイアウトの製作開始 [自動運転]

 さて、「メイカーフェア用レイアウト」の製作を開始しました。メイカーフェアにはDCC電子工作連合の一員として出展しますが、8/6~8/7で鉄道模型コンテストと同日程なのですが、ビッグサイトのイベント情報検索でメイカーフェアが出てこないのが少々気になります。
 きょうは、F-modelsが7周年記念で半額セールをやっているらしいので、かなり行きたかったのですが、冷静に考えると、今、どうしても欲しい電車があるわけでもないので、ぐっとこらえました。
 で、作りはじめました。今回のコンセプトは、持っていくです。前回鉄道模型市では現場で組み立てましたが、かなりパニクリましたので、今回は車で行けることもあり、荷物をコンパクトにまとめる必要もありませんから、レイアウトでもっていくことにします。
 で、もう、先週にレイアウトは決めてしまいましたので、今回は、配線関連をどうにかして、固定化するために、木材を買ってきました。
re_DSC00808.jpg
 これがレイアウトのベースになります。910*450(厚さ5.5mm)のベニヤです。1000円ぐらいしました。加工しやすいMDFだと600円ぐらいでしたが、強度が弱い(ベニヤよりもしなる)のと、重いのでやめました。
 一緒に、曲線も切れるらしい自在のこぎり(1800円)とベニヤの下用のスペーサにヒノキのブロック(100円)も買いました。こういうスペーサーは自分で切り出すと、大きさが揃わなくて、ろくなことがないので。
re_DSC00810.jpg
スペーサはこんな感じになるかなあと仮置きして横からの写真です。
re_DSC00811.jpg
 で、加工前に、前回のレイアウトを載せて、枠を鉛筆で取ります。相当適当にやっています。
re_DSC00809.jpg
 鉄橋の所だけ、切るつもりです。ただし、今回は回路を見せびらかす展示会で、ジオラマを見せる展示会ではないので、自然な感じにやるつもりは毛頭ありません。
 家の中でやると、のこぎりのカスがすごそうなので、外に行って自在のこぎりを初めて使いました。
re_DSC00812.jpg
 斜めにやるのは結構難しく、結局インパクトドライバで穴を開けて、のこぎりで切ってとまあ、いつもの方法をとっています。のこぎりが細いため、少し穴を開けるだけでそこから切ることができて、楽です。
 鉄橋の他の高架との接合部分もくりぬいておきます。貧乏性で、鉄橋の接合部分をニッパで切るという選択肢はありません。で、適当にやすりで削って、形を整えます。あまり時間がないので、適当仕上げです。写真に写っている得体のしれないストローとかは、元子供が作った何かの様なのですが、よく知りません。
re_DSC00813.jpg
 外は蚊が多いです。今日はちょっと涼しいので、蚊にとっても良い感じなのかもしれません。
 で、部屋に戻って、線路を載せました。なんか、よさそうなので、そのまま進めます。
re_DSC00814.jpg
 で、裏側にスペーサーを付けます。私は、接着剤が乾くのを待つのが嫌いなので、木ネジで留めてしまいました。
re_DSC00816.jpg
 そして、こんな感じかなあと、いろいろとDSBasic関連を載せます。
re_DSC00817.jpg
 そして、突然、写真が飛びますが、基板や、線路を固定して、配線もすべて裏に逃がして、美しいまま、とりあえず完成したのが以下の写真です。もちろん、ベニヤの下は配線がスパゲティーになっています。
re_DSC00818.jpg
 DSBasicで実際に前作ったソフトは動きました。
re_DSC00819.jpg
 明日に、S88が動くバージョンに変更して、ソフトを作っていこうかと思います。
 ちょっと、悩んでいることが2つあって、
(1)DSBasicにどこまでまかせるかです。内側を自動運転にする予定で、外側はお客様に触ってもらおうかと思っていますが、内側のすべて+外側の信号機ぐらいまでをDSBasicに任せることが可能な気がします。でも、そういうことすると、説明が面倒だったりするんですよね。
(2)ジオラマ風にするかどうか。今はベニヤとかでほぼ木の感じだけでやっていますが、一部、草とか、建物とかを置くかどうか。どっちが良いのか。建物を置いて、灯りを付けるのもいいかもですが。
 まあ、まだ日はあるので、悩もうかなあと思います。

前の10件 | - 自動運転 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。