夢色☆あんどろいど

中華パッド&スティック、Raspberry Pi、Arduinoなど、怪しいデジタルガジェット探偵団!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RingoAme(Arduino用タイニーBASIC)で鉄道模型をお気軽自動運転!

私が勝手に「RingoAme(リンゴあめ)」と名付けている拡張版HalfByte TinyBaicを使って、鉄道模型の自動運転をしてみました。そもそも、このシステムを初めて見た時の第一印象がこういう自動制御モノのガジェット向けかな?というものでしたので、まさに適材適所な使い途! 実際、本当にお気軽に出来てしまいました~!

まあ、いくらお気軽と言っても自動運転なんて生まれて初めてやることですので、最初は最も基本的な小判形エンドレスを使って、自動加減速、自動停止、方向転換の基本ワザを確実にモノにすることからはじめることにしました。

まずは動画から...


撮り方がまずくて、あんまりよく判らない動画になってしまいましたが、奥(画面上)の直線部分に駅がある想定で、ここから発車して約2周かけてゆっくり加速し、2周を定速走行した後で、2周で減速~停車、数秒間停車のあと、方向を変えて発車…同じシーケンスを繰り返すというものです。

回路はUNO用テストシールド上に作りました。AliExpressで1.1ドルで買ったものですが、突き当たり部分に5VとGNDのソケットが5Hずつ追加されていて、これが予想以上に便利で、配線の単純化に役立ってくれています。

A2018051401.jpg

車両の位置検出は光センサ(cds)を使っています。これはその場の明るさで振る舞いが変わるのが難点ですが、車両側に仕掛けが不要で、センサ自体が小さいことが利点で、環境が特定できる状況なら十分使いものになると思います。枕木の間に取り付けてあります。実物のATSの地上子に見えなくもないか?と思っています。

A2018051402.jpg

モータドライバはL293Dを使っています。DRV8830のようなI2C対応モータドライバを使えば専用命令が使えるので2台分の速度と前後進が1文で済みますが、まあ、そうでなくても基本的に易しいです。
参考までに回路図とプログラムを示します。

A2018051501.jpg

モータドライバの電源周りのコンデンサはテスト回路に付き省略してあります。また、モニタLEDはセンサが正しく作動しているかを確認するためのもので動作自体にはなくても影響はありません。

***********************************
10 P=9:C=0
20 AWRITE 9,0:AWRITE 10,0
30 FOR I = 10 TO 150 STEP 10
40 AWRITE P,I
50 DELAY 1000
60 NEXT I
100 IF AREAD(0)<20 GOTO 500
110 IF C > 2 GOTO 200
120 DWRITE 8,1
130 GOTO 100
200 DWRITE 8,0
210 FOR I = 150 TO 80 STEP -10
220 AWRITE P,I
230 DELAY 1200
240 NEXT I
300 IF AREAD(0)<20 GOTO 330
310 DWRITE 13,1
320 GOTO 300
330 DELAY 200:AWRITE P,0
340 DELAY 6000:DWRITE 13,0
350 IF P = 10 GOTO 10
360 P=10:C=0
370 GOTO 20
500 C=C+1
510 DELAY 500
520 GOTO 110
***********************************


あんまり上手いプログラムでないのでお恥ずかしい限りですが、よ~く見ると10語も使わずに、しかもわずかな行数でプログラムが出来ている点がコイツの凄いところです。
ちなみにこれでユーザエリアの4割ちょっとを消費... 行番号を2桁にしてスペースを詰め、最大限複文化すれば3割台は軽いと思いますので、位置検出地点の追加やポイント操作など、まだまだ機能追加出来そうです。
なお、光センサやPWMの値は環境や状況によって変更が必要になるかも知れません。特に車両に供給する電圧はかなり低めに設定してありますが、これは使用した動力ユニット(KATO製小型電車用動力ユニット)が6V位を適正電圧としているためで、他の車両だと低すぎて動かない場合もありますのでご注意ください。

[追記 2018/5/15] 回路図のLEDの向きが反対でしたので訂正しました。

スポンサーサイト

そろそろPICに手を出そうかと...

今までPICにはずっと手を出してきませんでした。Arduino IDEのような無料の定番的な開発環境がないこと、チップの種類が多すぎること、何となく難しそうで取っつきが悪かったせいです。その点、マイコンボード1枚あればとりあえず始められるArduinoの世界は気軽だな~と思います。

それが、このところ、Great Cow BASICをさわりはじめて、PIC向けのサンプルコードをAVR向けに置き直したりしていると、「これやったらPICのプログラムも書けるやん!」ということに気が付いて、俄然興味が湧いてきました。
時を同じくして、たまたま鉄道模型のDCCについて知る機会があったのですが、ここではPICの方が主流です。車載型だとArduinoの既製品は大きすぎて使えないし、小ロットでは流通量の多いPICの方が入手性が良い上に調達コストも安いからでしょう。実際、基板の小型化が容易なSOP8の4KBクラスで考えてみると、AVRではATTiny45しか選択肢がありませんが、PICなら12F683等複数の候補があります。これが2KBクラスだとさらに差が広がって、層の厚さを思い知らされることになります。

ということで、目下、PICの開発環境を検討中です。まあ、検討と言っても、ターゲットチップはとりあえずATTiny45相当(8ピン、2Kword級)の12F683か12F1822辺りと決めていますので、プログラムライタをPicKitの2にするか3にするかに迷う程度... 今のところは3かな…と考えていますが、内心どっちでも良いやと思っているので、何かのはずみで2にするかも知れません。

A2018050602.jpg

A2018050601.jpg
※画像はいずれも秋月電子さんの販売ページから拝借したものです。

余談になりますが、Great Cow BASICを使っていて、コンパイル時にバイト単位で表示されるメモリ消費量と、コンパイルレポートでのワード単位のそれが微妙に違うことがずっと気になっていたのですが、ようやくナゾが解けました。私は勝手に1ワード=2バイトと決めつけていましたが、PICは1命令長をワードで表していて、多くの場合それは14ビット。つまり1ワード=1.75バイトで換算すればよいことになります。
この差は例えばソフトウェアシリアルとかをやるとモノを言うことになります。コンパイル効率が結構良いGreat Cow BASICでも送受信の設定だけでほぼ1KBを食い尽くしてしまいますので、ATTiny13Aでは何か簡単な計測データを一方的に送りつけるぐらいの用途にしか使えませんが、1Kword級のPICなら残り数百バイトで結構色々なことがやれそうです。


DigiSpark互換機を買ってみた!

ATTiny13Aの活用事例がないかな~とネットで調べていて偶然見つけました。既に「今さら感?」が漂うネタですが、丁度、マイコン遊び活動休止期間中にちょっとしたブームになり、その後沈静化して露出が減って気付きにくくなっていたのだと思います。
システムとしてはUSBシリアル変換チップを使わずに、ソフト的にUSB接続を行うことで低コストなArduino互換機を実現したものです。USBaspなんかのプログラムライタでは同じ仕組みを使っている製品がありますが、これで普通のArduinoと同じようにプログラム書き込みが出来るのか? 聞けばリセットピンをつぶしてあるそうで、本当にそんな状態で可能なのか半信半疑で、それを体感したい一心で買ってしまいました~!

買ったのは、マイクロUSBタイプの互換機(コピー品?)で価格は送料込みで1個1.5ドル。世間では激安!という評判ですが、入出力ポートは少ないしUARTもないことを考えると、1.2ドルのUSBaspを使っていたり、2ドル少しで168版のNANO互換機が手に入ることを知っている身としては、正直なところ、たいした格安感は感じません。以前だったら大感動だったんでしょうが、人間、慣れとは恐ろしいもので、こんな物ばかり使っていると金銭感覚が次第にズレていくみたいです。

A2018042401.jpg

A2018042402.jpg

早速テストをしてみました。Aeduino IDEでプログラム開発~書き込みの手順はここでは詳しくふれませんが、大雑把なワークフローは、ドライバの入手/インストール<=どちらを先にしてもいい=>Arduino IDEの設定=>プログラム作成=>コンパイル/書き込みの順となります。ここでもこの手のマイコン情報によくある... ある解説では専用IDEが必要とか、ある記事では既存のArduino IDEにボードデータを追加設定して使用する…とか色々な説明が錯綜した状態になっていますが、これは執筆時期の違いによるもので記事が間違っているわけではありません。今のところはArduino IDEを追加設定して使うのが一般的になっています。なるべく新しめの解説記事を参考にすることをお薦めします。

A2018042403.jpg

おさらく一番の難関はドライバのインストールだと思います。本来はArduino IDEのボードマネージャでボードデータを追加する際にドライバのインストールもするようになっているようですが、私は先に"micronucleus-2.0a4-win.xip"をDLしてきて中の"install.exe"を実行することでインストールしてしまいました。ひとつ前のバージョンのドライバですが特に問題なく動いているようです。

Arduino IDEでボードタイプを「Digispark(Default-16MHz)」に合わせて、お約束?のLチカをやってみました。
どう考えても水晶が載ってる気配はないので内蔵RC8MHzだ思いますが、その辺はまずは気にせず... シリアルボードも書込装置もノータッチでOKです。
まだヘッダピンを付けていないので基板上のテストLEDでLチカです。ボードによって接続が0番ピンと1番ピンの2種類が存在するそうで、それ故Lチカプログラムは両方点滅させるものが出回っています。ちなみにうちのは1番ピンに繋がっていました。

A2018042405.jpg

コンパイル~書き込みは、書込ボタンをクリックしてからボードを挿す以外、特に変わったことはありません。挿すタイミングも60秒以内と結構長めなので難しさは感じません。まあ、基本的には初心者向けの製品とはとても言えませんけどね...

ATMega8を使ったUSBaspの方が安いのに、リセットピンをつぶしてまで8本足のATTiny85に拘る意味があるのかな?と当初は考えていましたが、実物を見ると、この大きさこそが様々な犠牲を払ってでも手に入れたいものだったんだな…ということがよく判ります。たしかに小さい! それでいてArduino互換でUSB直結可能というのが本製品のウリなのですね。

A2018042404.jpg

↑左からNANO、ProMini、DigiSpark(いずれも互換機)、右端はSTM8Sを積んだマイコンボード。


Great Cow BASICを使ってATTiny13Aでサーボモータを回す

前回のエントリでご紹介したGreat Cow BASIC(以下GCBASICと略す)のチュートリアルにサーボモータを使うものがありましたので試してみました。

このチュートリアルでは、Arduino IDEのと同様に可変抵抗器で制御するようになっていますが、コトを単純にするためにまずはプログラムたけで回してみることに...

サーボモータには「PulseOut」と言う命令を使います。「任意の単位、長さのパルスを任意のポートに出力する」というものですが、GCBASICにはハードウェア/ソフトウェアPWM命令が別にありますので、事実上サーボモータ専用命令のような感じです。ライフラリの呼び出しも事前のコンフィグレーションも不要で、いきなり使えるので扱いやすいです。
試してはいませんが、出力先ポートの条件が特にないのでソフトウェア的にやってるのではないか?と勘ぐっています。

最初はRingoAme(拡張版HalfByte TinyBASIC)で稼働実績のあるUNO互換機を使ってみましたが、90度→90度→180度反転のプログラムで200バイト足らずと至ってコンパクトなので、途中からATTiny13Aで実験を続けることにしました。

鉄道模型のターンテーブルをイメージして、ボタンを押すたびに180度回転するプログラムを作ってみました。転回中はランプが点灯して警告するようにしてあります。



回転の単位が角度ではなくパルス長なのがちょっとややこしいところです。純正SG90の動作範囲が0.5~2.4msということなのでそれに合わせてありますが、コピー品らしいのでかなり怪しいです。個体差もけっこうありますし、何か180度に達していないような・・・? そもそもラジコンのステアリングや方向舵の操作用ですからきっちり180度回す必要はありませんし、正確さもそれほど要求されていないでしょうからね~ 現物合わせが前提のようです。

参考までにプログラム↓をあげておきます。

**********************************************
'サーボモータテスト for ATTiny13A
'スイッチON/OFFで180度回転

'Chip model
#chip tiny13a, 9.6

#define D1 portB.0 'サーボ信号
#define D3 portB.2 '押ボタン
#define D4 portB.3 'LED

dir D3 in
D3 = 1 'スイッチ入力ポートをプルアップ
dim count as Byte '省略可
count = 50

main:

if D3 = 0 then
D4 = on
if count = 50 then
goto Kaiten1
end if
if count = 240 then
goto Kaiten2
end if

end if

if D3 = 1 then
D4 = off
end if

goto main

Kaiten1:
For count = 50 to 240
pulseout D1,count 10us
wait 20 ms
Next count
wait 500 ms
goto main

Kaiten2:
For count = 240 to 50
pulseout D1,count 10us
wait 20 ms
Next count
wait 500 ms
goto main

**********************************************

これでバイナリのサイズは200バイトちょっと。RAMについては僅か1バイトのみ。あの小さなATTiny13Aでも余裕!です。
ネットを見る限り、特に日本国内ではATTiny13Aでサーボモータを回してる事例は非常に少ないですが、何でもArduinoとArduino IDEでやろうとすることがかえって難易度を高めているのではないかと思います。本来、安くてシンプルなATTiny13Aは入門用に相応しいマイコンチップだと思いますが、現状は完全に上級者向けですからね~ まあ、あんまり人気が出すぎてLPC1114みたいにバカ上がりされると困りますが。
なお、上記プログラムをヒューズビットを変更していない工場出荷状態のATTiny13Aで使う際は#chipのところのクロックを9.6から1.2に変更すると正常に動作します。


Great Cow BASICのチュートリアル

ここ半月ほど、ずっとGreat Cow BASICをさわっていて、何~んとなく少し慣れてきた感じです。実際に使ってみると「これホンマにタダなん?」と感動することしきりで、当初の想像以上に使い勝手が良く、また実際使える開発環境だな~と実感しています。例えば、ピンモードや変数定義を省略出来たり、ライブラリが使えたり、エディタでは日本語表示に加えて、スニペットやズーム機能、フォント、カラーの設定など、まだまだ出てくるとは思いますが、感心させられることが多いです。当面はこれをメインに使っていこうかな~と考えています。なお、ピンモードや変数は調子に乗っていると時々意図に反した結果をもたらすこともあるようですので、大きなプログラムではちゃんと定義した方が結果的に楽?!だとは思いますが...

当初、PIC中心のサンプルプログラムでどこまで理解できるか心配でしたが、PIC用ながら目的の電子部品だけに絞り込んだ超シンプルなプログラムを集めたチュートリアル↓を見つけました。
http://www.greatcowbasic.com/sample-projects.html

「Chioino」という、名前からも容易に想像出来る、PIC使用のArduino風マイコンボードのためのものですが、お約束のLチカからはじまってスイッチ、可変抵抗、PWM、光センサ、LCD、キーボード、7セグ、シリアル通信など、基本的なことがサクっと学べるようになっていて、すべて試したわけではありませんが、LCDを使ったもの以外はAVRでも気軽に対応出来ると思います。

このChipinoと言うマイコンボードに搭載されているPIC(16F886)は、AVRで言うとATMega8辺りに相当するようですので、ATMega328pや168Pを積んだArduinoであれば余裕で対応出来ると思います。
一部、"chipino.h"と言うライブラリを使用するプログラムがありますが、これは入出力ポート名を「D1」とか判りやすく定義するものですのでこの部分を削除して、プログラム中に出てくるD8とかAN0と言ったポート名をportB.3とか、AVRで使用可能なポートに変更してやれば原則使えます。
なお、Arduino用には"duemilanove.h"や"UNO_mega328p.h"というポート名定義ライブラリが用意されていますので、それを利用するのもアリです。私はDegital_1とかAnalog_1とか長ったらしいポート名は面倒なのでD1~D13、AN0~AN5にLED(B.5)とRESET(C.6)、Rx(D.0/IN)、Tx(D.1/OUT)を加えた自作ライブラリを使っています。ポートの少ないATTiny13Aとかはわざわざライブラリにするのもなんですし、プログラム中にあっても邪魔にもならないので、スニペットに登録して使い回すと便利です。

このチュートリアルで唯一事態をややこしくしているのは配線図が存在しないこと! これは、Demo-Shieldと言うこのマイコンボード専用のシールドの利用を前提としているためですが、ある程度はプログラム内のREM文を見れば想像が付くものの、抵抗値なんかの具体的な数値が判らないのが困りものです。まあ、勝手に流用している身としては、Arduino IDEなどを対象にした他のチュートリアルの配線図を参考にして、ありがたく使わせていただきましょう。

当面の研究対象を鉄道模型の制御に置いている関係で、そちら方面に関連する分野に行きがちですが、PWM関連は非常に扱いやすいように思います。サーボモータの制御もRingoAme(拡張版HalfByte TinyBASIC)ほどてはないにせよ、コンパイラとしては画期的にシンプルで、しかも生成されたバイナリはコンパクト! これならATTiny13A辺りでも十分に「意味のある物」が作れそうに思います。


 | ホーム |  古い記に行く »

文字サイズの変更

プロフィール

よっしい

Author:よっしい
FC2ブログへようこそ!

最新記事

カテゴリ

未分類 (0)
ニュース (10)
スマートフォン (34)
中華パッド/タブレットPC (104)
ミニPC (25)
マイコン (80)
CNC機器 (16)
アクセサリ (14)
アプリ (9)
実験 (7)
工作 (13)
その他 (12)

月別アーカイブ

最新コメント

リンク

このブログをリンクに追加する

検索フォーム

RSSリンクの表示

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

FC2Ad

Template by たけやん

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。