PIC18F14K50+HIDブートローダ~その2~

前回ArduinoUNOを使った書き込み機で、PIC18F14K50のコンフィグビット0x30002番地に0x01を書いたのに読出したら0x21になってしまう件を書きました。
違いはbit5が0か1かで、このbitはデバイス上で何にも割り当てられず、データーシートによると割り当てが無いbitは0として読み出される筈なのに1が出てきているという謎でした。

因みにHID版ブートローダーをビルドするとこの番地は0x01ですがMCHPUSB版ブートローダーでは0x21になっています。この違いがなぜあるのか、特にMCHPUSB版をビルドすると割り当てのないbitがなぜ立つのかは気になりますが、これについてはその内調べたいと思います。で、その前に今回はArduinoに載せたスケッチがバグっているのか、またはPICKit3が何か細工をしているのかを確かめたくて波形を見てみました。

といってもわが家のオシロスコープは古くてこの出力をピンポイントで見るのは困難です。そこであるところからAnalogDiscovery2を借りてきました。

AnalogDiscovery2

そしてまずArduinoUNOで0x30002番地を読み出す瞬間の波形がこれ。
上段の波形がクロックでこの下りエッジで下段のデータを読み取ります。データはLSB側から出てくるので左右反転すると00100001=0x21と読めます。やっぱりデバイスから0x21が出ているんですね。

Arduinoで読み取る瞬間(0x21と出ている)

次にPICKit3で読み出す瞬間も見てみます。こちらはクロックがだいぶ早いですがやはり同じ様に0x21が出ています。

PICKit3で読み取る瞬間(こちらも0x21と出ている)

・・・という事でArduinoに書いたスケッチでもPICKit3でも波形的には’0x21’が出ています。なのにPICKit3の画面には’0x01’と表示されているのは恐らく使用していないbitを無条件に0として表示しているのだと思います。

Arduino用スケッチはどういう対策するのが正しいのでしょう?
使っていないbitなので書き込んだのと違う値が読めるのは当然と考えれば「ベリファイからこのbitは除外」が正解なのかな。でも単に読み出して表示する時には「読んだ通りに表示」しないと紛らわしい気がします。
表示する値とベリファイする値が異なるのは気持ち悪いけど「ベリファイ時は未使用bitを除外し、表示の際は読んだ通りに表示」かな。

というか、そもそも未使用bitなのであまり深く考える必要もないか・・・。

ArduinoでPICマイコンに書込む~AE-PIC18F14K50編~

先日HOI-Linkを製作した時、秋月電子のPIC18F14K50基板「AE-PIC18F14K50」Arduiono UNOを使ってブートローダーを書き込みました。その際以前書いた「ArduinoでPICマイコンに書込む~OpenStickLite(PIC18F14K50)編~」とは若干変更する必要がありました。
またブートローダーだけでなくHOI-Linkのファーム全体を書いてみました。
なおArduinoに入れる書込み用スケッチにミスっていた箇所があったので修正版を掲載しています。

AE-PIC18F14K50基板は秋月電子で¥800 (現時点) で売られています。DIPパッケージ単体では¥220ですが発振子やUSBコネクタも買う事を考えると基板もそんなに割高ではありません。
以前DIP版のPIC18F14K50にArduinoからブートローダーを書き込んだのと同様にこの基板にも書込んでみました。

前回DIPパッケージ版と今回のAE-PIC18F14K50とで異なるところ

前回の回路図はこれ。この時マイコンのVDDにはArduinoから3.3Vを供給し、VUSB端子もVDDに直結していました。

PIC14K50WriteByUNOsch
ArduinoUNOでPIC18F14K50に書き込んでみた回路図。

一方AE_PIC18F14K50基板はVUSB端子が外部に出ていません。VUSBはチップ内にレギュレータを持っていて3.3Vが出力されるのでVDDに少し高い電圧(まあ5Vですよね)を入れてやればVUSBには外から印加する必要はありません。PICkit3でもそうなっていますしね。

という事で次の様な回路で上手くいきました。
上と違うのは電源を5Vに変えたのとVUSBには接続していない事。
なおVUSB端子はGNDとの間にコンデンサを接続する必要がありますがAE-PIC18F14K50は基板内に0.22μFを内蔵しています。

AE-PIC18F14K50基板に書き込む配線

ブートローダーだけでなくファームウェア本体も書いてみる。

といつもはブートローダーだけを書き込み、そのブートローダーから本体のファームウェアを書き込んでいました。今回ちょっと試しにブートローダー+HOI-Linkのファーム全体を書き込んでみます。

まずその前に書き込みデータを作ります。PICkit3を接続してファーム書込み済のマイコンからプログラムを読み出し、HEXファイルに書きだしました。このファイルにはフラッシュに書かれたプログラムとコンフィグデータ以外にEEPROMの内容も含んでいます。しかしArduino上の書込みスケッチをEEPROMには対応させていないのでテキストエディタでEEPROMに関する行を消しておきます。

そして出来たのがこのファイル→HOI-LinkAndBootloader.zip
解凍すると次のHEXファイルが出てきます。
HOI-LinkAndBootloader.hex
これをメモ帳で開いてTeratermにコピペする事でAE-PIC18F14K50に書き込みます。このあたりの手順は前回の記事に書いています。

そしてファーム全体を書き込むと1分程度で何事もなく終わりました。
因みにブートローダーだけだと約10秒です。Teratermの設定で速度を下げているので専用PICライタに比べると時間が掛かりますが、これは 書き込みデータ全てを Arduinoのメモリーに保存できないのでシリアル通信でPCから順次送りながら書き込んでいる為です。この時PCとArduinoの間でフロー制御できればよいのですが、Arduinoの素の状態ではこれが出来ないので送り込み速度の方を落としているのです。

続いてベリファイをしてみると・・・なんだかエラーが出ます。調べてみるとArduino上の書込みスケッチのベリファイルーチンでチェックサムの計算をミスっていたので、これを修正するとベリファイもエラー無く終了しました。
なお書込みルーチンでもチェックサムを計算していますがこちらは正常です。
書き込みとベリファイは殆ど同じ処理なので上手くサブルーチンで共有すればいいのに面倒になってコピペで作成した為、デバッグの時にベリファイ側の修正を忘れていた様です。

修正版のArduino UNO用書込みスケッチ→PICWrite18F14K50_190621.zip

という事で・・・

秋月電子のAE-PIC18F14K50基板に専用PICライタを使わずファームを書き込めるようになりました(Arduinoは必要ですけど)。 直接ファームを書いても良し、ブートローダーを書いてUSB経由でファームを送り込むのも良しでお手軽にUSB工作が楽しめます。

HOI-Link:S-BUS→PC接続 完成

前回の続きです。前回は秋月電子のPIC18F14K50搭載基板をブレッドボードに挿して実験していました。今回は完成版として基板に収めるのでDIPパッケージで製作します。

まずKi-cadで回路図を書いて・・・

基板のパターンを作って・・・

片面基板なので表パターン(赤の配線)は実装時に導線で接続します。

CNCで削って基板を作ります。

FRISKケース(何年か前から大きくなった120%Booster版)に入れてみました。

寸法を合わせて作ったので当然ですがピッタリです。

ところでFRISKケースの場合ソケットを使ってマイコンを実装すると高すぎて蓋が閉まらなくなります。なので基板に直付けする前にブートローダーを書き込んでおきます(後からでも書けるけどブレッドボードに載せられる実装前の方がやりやすいので)。前に書いた9V電池書きこみ方式で・・・

006Pの9V電池書き込み方式

そして部品取り付け。
私のコントローラーはフタバのFASST方式ですが息子はFHSS方式なので受信機を取り替えられる様にします。最初はXHコネクタの3ピンを使うつもりでしたがL字型のポストが部品箱にありません。L字型でないとコネクタを刺す方向が縦になっておさまりが悪いのです。
代りにL字のピンヘッダがあったのでこれを基板にとりつけ、ここにRCサーボ等で使う3pinコネクタ(QIとかデュポンコネクタとか呼ぶやつ)で接続します。
但し逆刺しができてしまうのは要注意。

完成の図。

そして当初の目的であったドローンシミュレータ実行中。

参考のためマイコンに書いたファームウェアを載せておきます(例によってソースは試行錯誤の後が残ったままで汚いです)。コンパイルはMPLAB-IDEのバージョン8で行っていますが今となってはかなり古い環境だと思います。最新の環境でビルドできるかどうかは確かめていません。
また本来USB機器には固有のVID,PIDを書き込んでおく必要がありますがこのプログラムには適当な値を書いてあるのでそのまま使われる場合は自己責任でお願いします( 確率は低いですがもしVID,PIDがダブった機器を接続した場合に上手くつながらなくなる可能性あり)。
なおOpenStickLiteで使ったのと同じブートローダーから書き込む仕様でビルドしています。

HOI-Link:S-BUS→PC接続

PC上でドローンシミューレータを動かすとき、今までこんなコントローラーを使っていました。

10年くらい前、ムサシノ模型のモスキートモス号を作った時に練習用に買ったコントローラー

私レベルだとこれで問題ありません。しかし息子によると実物の送信機とは感覚が違うのでレースの練習はやりにくいとの事。
そこでトレーナーコネクタからPCに接続するインターフェースの購入も検討したのですが、その前に手元にあるものでなんとかできないか考えました。

まずトレーナーコネクタというのは送信機の裏についているこういう四角いコネクタ。ここからPWM信号が出ているらしいです。

右上の四角いコネクタがトレーナーポートです。

まずこのコネクタをどこで入手できるかというところから検討しなければなりません。またここから信号を取出せたとしてパルス幅をチャンネル数分カウントし、HIDデバイスとしてUSBに伝える処理も必要で何となく面倒です。

そこでRC受信機が出すS-BUS信号をマイコンで取り込んでUSBに伝えるのなら、OpenStickのファームウェアを少し改造して実現できそうです。しかもシリアル通信なのでパルス幅を数えるよりも精度が良い筈。但し受信機が一つ余分に必要なのと電波が出っぱなしになるのがちょっと気が引けますが、たぶんトレーナーコネクタから取り出す方式でも電波は出ているんではないですかね?(想像ですが)

こんな構造にしようと思います。

受信機はSBUSが出せれば何でもよいので、まずはこれで試してみます。

REDCON FT4X
ケースは外していました。

マイコンは秋月電子で買って放置していたPIC18C14K50搭載ボードです。このマイコンはOpenStickLiteでも採用しているので馴染みがあります。

そしてRAM領域の不足に悩まされましたが何とか動作し始めました。S-BUSは18チャンネル分のデータが含まれていますが私のT6EXで出せる6CHまでしか確認していません。あとで息子のT10Jで10chを試してみようと思います。


T6EXで実験中。ちょっと古いFASST方式ですが現役です。

実物のコントローラーだしケーブルをつなぐ必要もなく操作性は良いです。
何か他の事にも使えそうな気がします・・・今すぐ思いつきませんが・・ラジコン送信機でPCを操作する何か・・・
またPCの画面の前にカメラを置いてVTXで画像を飛ばし、ゴーグルで見ながらシミュレーターをやったらもっとリアルになるかも(かなりオタクだなぁ)。

現状はブレッドボードですが、この後ちゃんとした基板に載せ、ケースにも入れて完成させたいと思います。FRISKのケースあたりが良いかな?

リニアガイドで2代目ラダーペダル制作~その3~

二代目ラダーペダルの続きを製作します。

まず合板に部品取り付け位置を書込みます。
鉛筆で描いてもいいのですが手っ取り早くレーザーで描画しました。
真ん中の部分はボリュームが埋まる所なのでドリルと糸鋸でくり抜いています。

RudderPedal2nd_1

合板にレーザーマーキング

 

そして部品を取付けました。

RudderPedal2nd_2

部品取付け完了。

ペダルはリニアガイドに載っていて前後に動かすとワイヤーを通じて真ん中のプーリーに接続した可変抵抗器を回します。またワイヤーにより左右のペダルは交互に動作します。
ワイヤーの部分、当初は水糸を使ってみたけど伸びるので被覆付きのワイヤーに変更しました。

RudderPedal2nd_3

反対側から見たところ。

戸車プーリーと適当なバネ。

RudderPedal2nd_3.5

戸車プーリーでワイヤーを支えます。
プーリーは適当にプリントしたパーツで固定。

 

機構的な部分は大体できたので後はUSBインターフェースを取付けます。
今回はアナログ3軸だけなのでPIC18F14K50を使ったOpenStick Liteを使用しました。
部品数が少ないので今回は基板切削はせずユニバーサル基板で配線します。

jw-cadで配線計画を立てて・・・

RudderPedal2nd_4

ユニバーサル基板での配線予定図

配線しました。

RudderPedal2nd_5

基板完成

そういえばOpenStick Liteはβ版としてブログには載せましたが正式ページを作っていません(ま、いいか)。

配線も済んだので動画を撮ってみました。

 

ではMotionSimulatorに載せてみます。我が家の工作室だと狭いので機材一式を和室に運びました。

RudderPedal2nd_4

和室に移動しました。結構重いです。
しかし変な絵面だな。

ではFlightSimulatorXを立ち上げてフライトしてみます。今までのラダーペダルはペダル位置が高くて足が宙に浮いた感じでしたが、今回は踵を床に付けたまま操作できるので微調整がしやすくなりました。しかしワイヤーを通じたリンクの抵抗が若干大きい気がします。

 

因みに一代目ラダーペダルはこれ。シーソー式でした。

一代目ラダーペダル

何度もMakerFaireに持って行った一代目ラダーペダル。
今回でお役御免です。

こちらはお役御免です。お疲れさまでした。

OpenStick無線化実験~その2~

前回の実験ではTWE-Liteの標準アプリを用い、それなりに動作はしましたが微妙な遅延が気になりました。 そこで今回は最低限の遅延で動作する様、新たにTWE-Liteのアプリを作成してみました。

構想

TWE-Liteにアナログジョイスティックやボタンを接続し、その値を電波で飛ばします。それを受信側のTWE-LiteでUARTの信号に変換してPIC18F14K50に渡します。前回と違うのは受信側のTWE-LiteとPIC18F14K50の間をPWM→AD変換ではなくシリアルで直接伝える点で、無駄をなくした分反応が早くなる事を期待しています。

OpenStickAir-2-

無線には下のデータが流れます。またTWE-LiteとPICマイコン間の通信も全く同じフォーマットが流れます。先頭のR::に続く2桁の16進数はボタンの状態、続く3桁の16進数×4はアナログ軸の状態です。

R:01:3ff:3ff:3ff:3ff
R:00:3ff:3ff:3ff:3ff
R:01:040:0C0:3ff:3ff
R:01:040:0c0:3ff:3ff

 

TWE-Liteのプログラム

TWE-Liteは搭載されたマイコンのプログラムを書き換える事が出来るという特徴がありますが、このプログラムの作り方が結構分かりづらく、一度挫折した事があります。今回はDSAS開発室の部屋の記事を参考にさせて頂きました。このサイトはLチカから始まって基本的なところを説明してあり私でも理解できました。 但し今回の実験ではペアリングの設定処理は省略しており、チャンネルやアプリケーションIDはハードコーディングしています。

PIC18F14K50のプログラム

OensStickLiteのファームを改造しています。OpenStickLiteではマイコン内蔵のADCやGPIOの状態を取り込んでいましたが、これらをUART入力に変更します。
UARTからは上に記したフォーマットでデータを受け取り、これをジョイスティックの状態としてUSBに流します。

実行結果

前回の標準ファーム使用時よりだいぶ早くなっています。無線を使わないときと比べると微妙な遅延はありますが、まあこんなもんではないでしょうか。
今回は遅延確認だけを目的としているので公開するにはまだ色々と変更が必要です(ペアリングのあたりとか、コンフィグツールとか・・)。

BTLE化

並行してBluetooth化も検討していますが・・・なんか難しいです。先日から写真の本を読んでいますが、これでで基本的な知識を付けた上で公式サイトの資料を読む必要があり、ここでまた英語を頑張る必要があります。いつ完成するかわかりません。

BTLE本

BTLE本

これまたぼちぼちやっていこうと思います。
最近は「ぼちぼち」ばっかりです。「ほいほい堂本舗」ではなく「ぼちぼち堂本舗」にしようかと思います(ウソです)。

OpenStick無線化実験

MEDさんとの会話でOpenStickを無線化できないかという話題が出ました。そこでまずはTWE-Liteを使ったお手軽方式で 試してみました。TWE-Liteという無線モジュールは以前はTOCOS(東京コスモス電機)から出ていたのですが、今は独立したモノワイヤレスという会社になっています。

構想

TWE-Liteの出荷時に書き込まれている標準アプリでは、例えば2点間を接続したとすると、一方の4本のアナログ入力をそのまま相手の4本のアナログ出力(PWM)として、また4本のデジタル入力をそのまま相手のデジタル出力として伝える機能があります。これを利用してジョイスティックの可変抵抗やボタンとOpenStickとの間にTWE-Liteを挿入する感じでやってみます。

実験開始

OpenStickAir1

実験中・・・

ジャンクから外したジョイスティック(可変抵抗)及びボタンを左側のTWE-Liteにつなぎ、右側のTWE-LiteをPIC18F14K50に接続します。PIC18F14K50はOpenStickLiteによりジョイステックとして設定してあります。
要は普通にUSBジョイスティックを構成しておいて可変抵抗やボタンの配線にTWE-Liteを割り込ませただけです。
TWE-LiteのPWM周波数設定はデフォルトの1KHzから64KHzに変更しておきました。

なおTWE-Liteの動作電圧は3.3VなのでPIC18F14K50も3.3Vで動作させています。 これはソフト的には何も変えず単に電圧を変えただけです。
電源は写真には写っていませんが安定化電源から3.3Vを供給しています。TWE-Lite2個とPIC18F14K50は全て共通の電源で動作し信号だけが電波で飛んでいる形です。

 

結果

これでとりあえずは動作するのですが下の問題がありました。

  • 反応が遅い。
    目で見てわかる程度の遅延があります。フライトシミュレータで使う程度なら気になりませんがシューティングゲームの様な速い動きだと 影響が大きいと思われます。
  • アナログ軸の中心が大きくずれる。
    これはTWE-LiteのA/D変換はフルスケールが1.5V程度である為です(設定変更で1.8Vフルスケールにもできる様ですが大きな違いはなさそうなので試していません)。

中心位置のずれは可変抵抗に入れる電圧を落とせば問題ありませんが、反応が遅いのは用途によっては致命的です。 設定を色々といじくってみたのですが大きくは変わりませんでした。
まだ何か方法があるのかもしれませんが、TWE-Lite以外の方法も考えて見ようと思います。

 

ArduinoでPICマイコンに書込む~OpenStickLite(PIC18F14K50)編~

ジョイスティック自作用ツールキットOpenStickは元々PIC18F2550(又は2553)を採用していました。このマイコンは28pinで、DIPパッケージだと結構大きい部類になります。
そこで先日PIC18F14K50を使用したOpenStickLiteをβリリースしました。こちらは20pinなので入力ピン数は少なくなりますが、これでも大抵の用途には事足りると思っています。
価格もこちらの方が大幅に安くてすみます。

OpenStickもOpenStickLiteもUSBからプログラムを書き込む為のブートローダを使用しています。 電源投入時(またはリセット時)の条件設定によりブートローダが書き込みモードで立ち上がります。この状態で書き込みツール「MybootOS」を使うとUSBポート経由でプログラムを書き込める訳です。

この種の話題でいつも問題になるのがブートローダ自体はどうやって書き込むかという事です。 ブートローダでブートローダを書き込む事はできないので、通常はそのマイコン専用のライター(PICKit3など)を使用します。
しかし皆がライターを持っているわけではありません。 そこでArduinoを使ってPIC18F2550にブートローダを書き込む実験を過去に行い、問題なく書きこむ事ができました(下記を参照ください)。

今回はArduinoからPIC18F14K50にブートローダを書き込んでみます。これが可能になればOpenStickLiteを安価に使用できます。

まずここの資料でPIC18F14K50の書き込み仕様を調べます。 大体はPIC18F2550と同じですが微妙に違うところがあります。一番問題なのはPGD,PGC端子が耐圧3.3Vという記述です。 PIC18F2550の時はArduinoUNOを用いて5Vで駆動していました。特にPGDは双方向なのでレベル変換は面倒です。 よって今回は3.3V版ArduionoProMiniを用いることにします。
またスケッチには若干のWAITタイムの変更と書き込みイネーブルONのコードを追加しました。
スケッチ→PICWrite18F14K50.ino

書込み電圧は006Pの積層乾電池(9Vの四角いやつ)を用いる事にします。先の資料によると書込み電圧の上限は9Vという事なので、新品の電池だと定格を超える可能性がありダイオード一本で電圧を下げました(使い古した電池だとそのまま繋いで大丈夫です)。

回路

ArduinoProMiniはUSBシリアル変換回路を内蔵していないので、外部にFT232RLの変換回路を接続し、Arduino/PIC18F14K50に供給する3.3V電源もFT232RL内臓のレギュレータから取っています。
PIC18F14K50の電源-GND間のコンデンサは当初0.47μFを使いましたが、PIC18F14K50に電源を投入した瞬間にArduinoProMiniから反応が無くなる事がありました。恐らくFT232RLの3.3V出力が瞬間的にダウンする為と思われ0.22μF(実際には0.1μ×2本)に変更しました。 

PIC14K50WriteByArduinoProMiniSch

PIC18F14K50へArduinoProMiniで書き込む回路図。

参考までにUSBシリアル変換は次の回路です(最近の電子工作には何かと登場しますね。一家に一台FT232RLです)。
FT232RLは3.3Vのレギュレータを内蔵しており、これをVCCIO端子に入力する事で3.3Vレベルで使用できます。この回路ではスイッチを設けて5Vと3.3Vを切り替える様にしています。
但しレギュレータから取れるのは50mAまでなのであまり大きくはありません。

USBSerial

FT232RLによるUSBシリアルインターフェース

PIC18F14K50WriteByArduinoProMini

Arduino ProMiniで書き込み中。
横のFRISKケースはUSBシリアル変換です。

書込み手順

PIC18F2550の時に書いた内容とほぼ同じです。
※前回同様TeraTermの「貼り付けの行間遅延設定」を50mS程度にしておく必要があります(書込み時間待ちの為です)。

<PIC18F14K50にブートローダを書込む手順>

  1. まずPIC18F14K50の3.3V電源と9V電池は切り離しておく。
  2. Arduino IDEを立ち上げこのスケッチを書込む。
  3. TeraTermをシリアルモードにしてArduinoに接続する。
    シリアル設定:9600bps,8bit,パリティ無し,stop=1,フロー制御=none
    改行コードは送信・受信共にCRにする。
    また、「設定」→「その他設定」メニューの「コピーと貼り付け」タグを選び、「貼り付けの行間遅延」を50mS程度にしておく。
  4. 接続するとTeraTerm上に以下のメニューが表示される。
    r  <start address> <count>: read from PIC
    e : all erase
    w : write to PIC
    v : verify
  5. ここでPIC18F14K50に3.3V電源→9V電池の順で供給する。
  6. 必要に応じ’r’コマンドで現在書かれている内容を確認する。たとえば・・・
    r 0 0×100<CR>
    と入力すると、FLASHメモリの0番地から0FF番地の内容を表示する。
    消去済ならCODEエリア全ての内容がFFになっているはずである。
    (消去チェック機能はないので、どちらにしても次の消去コマンドを実行しておくべきです)
  7. 消去済みでない場合はeコマンドで消去する。
    ALL Erase <y/n>?と効いてくるのでyを入力する。
    このコマンドはチップ全体を消去する(一瞬で終わります)。
  8. ‘w’コマンドで書込む。w <cr>を入力すると’Send me intelhex text’と表示されるので、ここでIntelHEXファイルを送る。この際、上に書いた理由でコピペで貼り付ける方法で送る。 たとえばブートローダのHEXファイルである’Bootloader18F14K50.hex’をメモ帳等で開いて全域をコピーした後、Teratermの画面上に貼り付ける。
    (前に書いた様に「ファイル」→「ファイル転送」メニューからの送信だと取りこぼしが発生する)
  9. エラーなく書き込みが完了したら’v’コマンドでベリファイを行う。方法は’w’コマンドと同じで、v<cr>入力後IntelHEXテキストを貼付けるとFlashメモリを読出して比較する。  エラーが出なければ正常に書き込めた筈である。
  10. 9V電池→3.3V電源の順で切り離し、TeraTermの接続を切りArduinoのUSBケーブルを抜く。

やっぱりArduinoUNOでやってみる。

と、ここまでで書き込みが出来たのですが、やっぱり3.3V版Arduinoは少数派で手元にない場合もあると思われ、メジャーなArduino UNO等でも書けると何かと便利です。 この場合5Vで動作するArduinoと3.3Vで動作するPIC18F14K50の間をどう繋ぐかが問題です。ArduinoからPIC18F14K50へ一方的に入力するPGC信号は単に抵抗分割で問題ありません。一方PGD信号は双方向なのでまじめにレベル変換器を入れると結構面倒な事になります。しかし3.3VのHレベルはArduinoはHと認識してくれる筈と期待しPGDも単純抵抗分割で試してみました。

PIC14K50WriteByUNOsch

ArduinoUNOでPIC18F14K50に書き込んでみる回路図。

実験風景・・・

ArduinoUNOで書き込み

ArduinoUNOで書き込み。UNOは直接USBケーブルを繋げるのですっきりします。

特に問題なく書けました。これが手っ取り早いです。
気をよくしてFritzingでも回路を書いてみました。

PIC14K50WriteByUNO_ブレッドボード

Fritzingでも描いてみた。

 

各ファイル 

※PIC18F14K50用ブートローダは上記バイナリセットかソースのどちらにも収録しています。※言うまでもないとは思いますが、同様の実験をされて万一デバイスが壊れたりしても責任は持てませんので、そこんとこはよろしくお願いいたします。

 

FRISKサイズのUSBジョイスティック

OpenStickLiteが使える様になったので、Laser加工機用に小型のジョイスティックを製作しました。

これまでLaser加工機のジョグ制御には、下の様なジョイスティックを使用していました。見覚えがある方もいらっしゃるかもしれませんが、MakerFaireではラジコンシミュレータのコントローラに使用しているものです。
今回、OpenStickLiteを使って場所を取らない小型のものを作ろうと思います。

LaserCutterController

これまでのLaser加工機のコントローラ。
ちょっと大きくて邪魔になる。

 

X-Y軸入力のスティックはジャンクのゲームコントローラーから外したものです。HardOFFで108円で買ってきたコントローラをバラしてストックしています。
これはX-Yのアナログ制御に加えスティック自体を押し込む事でボタンをON/OFFできます。今回入力デバイスはこれ一つだけで、
X-Y軸とボタン1個だけにしました。

JoysticksFromPS

PlayStation用コントローラから外したジョイスティック

 

簡単に回路を描いて・・・

LaserStickSchematic

Laser制御用ジョイスティック回路図

 

基板切削CNCで削って・・・ 

LaserStickPCB

LaserStick基板
(実は一部パターンをミスっており、この後手配線で修正しました)

 

FRISKのケースに入れました。
FRISKはケースサイズが変わるという話ですが熊本ではまだ従来サイズしか見かけません。今回使用したのも従来サイズです。

LaserStick2

フリスクケースに収納。

 

中身はこんな感じです。
PIC18F14K50はフリスクケースにピッタリ。
部品がとっても少ないです。

LaserStick3

水晶発振子周りのスペースが厳しくなってしまったので、水晶を少し浮かして取付け、更にショート防止のためカプトンテープで保護しました。

LaserStick4

斜めからみたところ

 

コンフィグはこれを書き込みました。

LaserStick Configuration

今回のOpenStickConfigLiteの設定。
入力信号はX-Y軸とボタン1個だけ。

 

またLaser加工機に取付ける為、3Dプリンタでホルダーを製作しました。

LaserStick with Holder

ホルダーと小型ジョイスティック

そして加工機に取り付け!!

LaserStick6

ホルダーと共に加工機に取付けた図。

PIC18F14K50採用で小型機器が作り易くなりました。
SOP版を使うともっと小型化できそうです。

 

動画にしてみました。 2016-10-25

 

OpenStick Lite ~その4~(β版アップ)

PIC18F14K50を使用したOpenStickのLite版、今のところ大きな問題はなさそうなので一旦リリースしようと思います。
本当はピン割り当てをドラッグ&ドロップで自由に変更可能にしようと思っていたのですが、GUIを作るのがなかなか面倒なので今後ボチボチやろうと思います。とりあえず現行版ではOpenStickConfigLiteから一旦テキストに書き出し、メモ帳などで変更後に再読み込みする事でピン割り当てを変更可能です。

ファイル類

今回アップしたのは次のファイルです。一番上のバイナリセットがあればまずは動作させる事ができます。例によってソースは汚いので改造したりする際の参考程度にお考え下さい。

その他、書き込みツール(MybootOS)や書込みに必要なドライバ(MCHP-USB)はスタンダード版から変わっておらずOpenStickのページからダウンロードできます。
 バイナリセットには次のファイルが含まれています。
  • Bootloader18F14K50.hex・・・・・・・・・・・・・・・・・PIC18F14K50用ブートローダ
  • OpenStickLite.hex・・・・・・・・・・・・・・・・・・・・・・・OpenStickLiteファーム
  • Bootloader18F14K50+OpenStickLite.hex・・・ブートローダ+ファーム
  • OpenStickConfigLite.exe・・・・・・・・・・・・・・・・・Lite版コンフィグツール
基本的な事はPIC18F2550/2553を用いたOpenStickスタンダード版と同じです。
以下、主な違いを書きます。

回路

マイコンをPIC18F14K50に変更したので当然ながら回路も変わっています。
前回の投稿に書いた通りLEDはなくしてしまいました。
MCLR端子もリセットではなくIOポートとして使います。これにより入力ピンとして使えるのは13本です。ブートモードに入るにはMCLR 端子をLに下げた状態で電源を投入します。
水晶は12MHzです(スタンダード版は20MHzだったので要注意)。
PIC18F14K50にもウィークプルアップ機能があり、これを使える端子をデジタルピンとして使用する場合は内臓プルアップをONにするので回路上のプルアップは省いています。
秋月電子のAE-PIC18F14K50がほぼ同じ回路なのでこちらを使っても簡単に作れそうです。

ピンの用途

各端子は表の機能に割り当てています。IN4~6,IN9~13はアナログ入力可能端子、その他はデジタル専用端子です。 Wpup欄はウィークプルアップ機能がある端子を示します。

ピン用途

各端子の用途

 

ブートローダ

PIC18F4550用を改造しました。「Bootloader18F14K50.hex」をPICライターで書込みます。
このときだけはPICライター(PICkit3等)が必要です(いずれArduinoによる書込みも試したいと思っています)。
ブートローダが書込めればその後のファームやコンフィグデータは直接USBで書き込む事ができます。また「Bootloader18F14K50+OpenStickLite.hex」はブートローダとファームを一本にまとめたファイルなので、これを使えばファームを書く手間が省けます。

ブートローダを書き込みモードにするにはMODEボタンを押しながら電源を投入します。
スタンダード版では書き込みモードになるとLEDが点滅していましたがLiteではLEDがありません。しかし書込みツールMybootOSの左上に「PIC detected in BOOT mode」と表示される事で書き込みモードに入ったと判ります。

メモリーマップ

コンフィグデータの位置を変更しました。
スタンダード版は0x4000が先頭でしたがPIC18F14K50はFLASHメモリが0x3FFFまでしか無いので0x3C00を先頭にしています。

OpenStickLiteメモリーマップ

コンフィグ先頭を0x3c00に変更した。

MybootOS

ファームやコンフィグの書換えにはスタンダード版と同じMybootOSを使用します。
ファームを書き込む時、「Code Offset」には0x0800番地を指定します(これはスタンダード版と同じです。)。
コンフィグデータを書きこむ場合は「Code Offset」は0x3000番地を指定します。コンフィグデータの先頭は0x3c00じゃないかと疑問に思われるかもしれませんが、実はこの「Code Offset」とは書込み前に行われる消去動作の先頭番地を示すものなのです。 実際の書込み番地はIntelHEX形式のファイルに含まれています。今回、コンフィグの先頭が0x3c00なのでその手前の0x3000からFLASH最終番地までを消去します。なおファームは0x3000未満に収まっているので壊す事もありません。
・・・という事はIntelHEXに含まれる書込み番地を見て必要なところだけ消去する機能があればいいんですよね(またいずれ)。

MybootOS_Lite

MybootOSで接続。

 

コンフィグツール

Lite版のコンフィグツールはスタンダード版と見分けをつきやすくするため色を黄色にしました。

OpenStickConfigLite

スタンダードと見分けがつく様に色を変えました。
いずれ一本化したいのですが。

入力端子の任意割り当てに対応するため内部構造を大きく変更しています。
任意割り当てを行うGUIはまだできていませんが「SAVE」ボタンで一旦設定を保存し、それをテキストエディタで変更して「LOAD」で読み込ませるとピン割り当てを変更できます。
設定ファイルには下記の端子割り当てを追加しており、’=’の右の数字が入力端子番号で、これを書き換えます。LOAD時のルールチェックは厳密にできていないので書き換える際は注意してください。

#Pin asign
PIN:ANALOG(X) =4
PIN:ANALOG(Y) =5
PIN:ANALOG(Slider) =6
PIN:HatSwitch(UP) =10
PIN:HatSwitch(RIGHT) =11
PIN:HatSwitch(DOWN) =12
PIN:HatSwitch(LEFT) =13
PIN:BUTTON(1) =1
PIN:BUTTON(2) =2
PIN:BUTTON(3) =3
PIN:BUTTON(4) =7
PIN:BUTTON(5) =8
PIN:BUTTON(6) =9

 

また自動ピン配置も残すため「AutoAsgn」ボタンを追加しました。
(「ShowPin」ボタンと機能の差があまりなくなっており、いずれこのあたりは整理したいと思います)