RepliesMakerFaireでOpenStickを展示していると、「Arduinoでできないの?」と聞かれる事がある。Arduinoでは(Leonardo等の一部を除き)USBとは仮想シリアルで接続しており、HIDデバイスを実現しにくいのだ。PIC18F2550で製作するのと比べて値段も高い。PICでなくてArduinoを使いたい理由のひとつとしてはPICライタが必要という点であろう。OpenStickの場合、あらかじめPIC18F2550のFlashメモリにブートローダを書込んでおくのだが、その為にPICライタが必要になる。一般的なライターであるPICKit3は秋月電子でも¥4500する。(こんな自作ライターを使っていた時もありましたが最近のPCはプリンタポートが無いし・・)昨今、PICライタよりもArduino基板の方がよっぽど浸透しているだろう。OpenStickをArduinoに移植するのは難しいが至る所に存在するArduinoを使ってPIC18F2550にブートローダを書込む事ならできそうな気がする。いう事で実験を行った。PIC18F2XXXにプログラムを書込む方法はマイクロチップテクノロジー社のこの資料に書いてあった。ICSPモード(以下5Vモード)がある。5Vモードを使うには制約があり、コンフィグ設定のLVPビットに’1’が書かれていなければならない。新品購入時、LVPビットはデフォルトで’1’なのだが、ブートローダを書込むと’0’になってしまう。5Vモードだけだと一度書き込んだら書き換えができないという事になるので、今回は外部電源を使って12Vモードで書込む事にした。<今回の回路図>今回の実験に使用した回路図MCLR端子に外部から12Vを与えている。デバイスの規格でここの電源はVDD+4V~12.5Vの範囲となっており、12V電源のままで入力可能な筈だが上限値に近いので、念のためダイオードで少し電圧を落とした。ArduinoはUNOを用い、+5V,GNDのほかは8ピンをPGC、9ピンをPGDに接続した。PGDは双方向なので念の為3.3KΩを挿入したが、デバッグ完了後はダイオードも抵抗も直結で問題なく動作した。ArduinoでPICライターPC側はTeraTermでArduinoに接続し、キーボードからコマンドを入力して操作する。プログラムの書込みおよびベリファイは’w’コマンドに続いてIntelHEXのデータをテキストとして送る。UNOのRAMは2KBしかないので全部を蓄えてから書込む事はできず、IntelHEXデータを1行ずつ読んでは書込みを繰り返すのだが、ArduinoとPC間のシリアル通信ではフロー制御を行っていないため、一気にデータを送ると書込みが間に合わず取りこぼしが発生してしまう(この場合パリティエラーとなる)。この対策としてTeraTermの「貼り付けの行間遅延」設定を増やしておく必要があった(こちらの環境では行間遅延が20mSだと取りこぼしが発生し、50mSだとOKだった)。この関係でTeraTermからIntelHEXデータを送る際はコピペで送る必要があり、これを「ファイル」→「ファイル転送」メニューで送ると行間遅延が加わらないらしく取りこぼしが発生した。結果として下記の方法で書き込み/読み出しができ、更にOpenStickを使ってジョイスティックコントローラとして動作させる事ができた。<PIC18F2550にブートローダを書込む手順>まず12V電源はOFFにしておく。IDEを立ち上げこのスケッチを書込む。TeraTermをシリアルモードにしてArduinoに接続する。シリアル設定:9600bps,8bit,パリティ無し,stop=1,フロー制御=none改行コードは送信・受信共にCRにする。「設定」→「その他設定」メニューの「コピーと貼り付け」タグを選び、「貼り付けの行間遅延」を50mS程度にしておく。接続するとTeraTerm上に以下のメニューが表示される。verifyここで12V電源をONにする。必要に応じ’r’コマンドで現在書かれている内容を確認する。0x100<CR>と入力すると、FLASHメモリの0番地から0FF番地の内容を表示する。消去済ならCODEエリア全ての内容がFFになっているはずである。(消去チェック機能はないので、どちらにしても次の消去コマンドを実行しておくべき)消去済みでない場合はeコマンドで消去する。<y/n>?と効いてくるのでyを入力する。このコマンドはチップ全体を消去する。‘w’コマンドで書込む。text’と表示されるので、ここでIntelHEXファイルを送る。この際、上に書いた理由でコピペで貼り付ける方法で送る。ブートローダのHEXファイルである’20M-18f2550.hex’をメモ帳等で開いて全域をコピーした後、Teratermの画面上に貼り付ける。(上に書いた様に「ファイル」→「ファイル転送」メニューからの送信だと取りこぼしが発生する)エラーなく書き込みが完了したら’v’コマンドでベリファイを行う。方法は’w’コマンドと同じで、v<cr>入力後IntelHEXテキストを貼付けるとFlashメモリを読出して比較する。エラーが出なければ正常に書き込めた筈である。12V電源をOFFにした後、TeraTermの接続を切りArduinoのUSBケーブルを抜く。・Arduinoのスケッチ(zip)・Arduinoのスケッチ(ブラウザで見る)・ブートローダ(千秋ゼミさんへのリンク)※言うまでもないと思いますが、試される方は自己責任でお願いします。(特に12Vを印加する端子を間違ったりすると・・・ああ)※コマンド入力のエラーチェックはあまり詳しく行っていません。AMとても参考になる資料を残していただきありがとうございます。AMISE_TACHIKOMAさん、こんにちは。たしかに「Arduinoのスケッチ」をクリックすると化けて表示されますね。右クリックでダウンロード(このあたりブラウザによってちがうかも)してPICWriteという名前のフォルダーをつくってそこに放り込んでみてもらえますでしょうか?これをArduinoIDEから開くと正常に表示できる様です。PICwriter」で検索したらここにたどり着きました。Wordで開いたら文字化けは直りました。それをTXT保存してからメモ帳で開けば、文字化けは無くなる。結論から言うと、htmlのバージョンが上がって文字コード混在が可能になった為でしょう。複数のウィンド(フレーム)に個々の文字コードで書いても今は文字化けしない。(多分このコメント欄も、文字コードが違うと思う。)逆に文字コード指定が書いてないと、前Webページの文字コードを採用するので文字化けが起こる。Wordは、ほぼすべての文字コードに対応しているから、スマホでも出来ました。AM日曜大工さんこんにちは。無事退院されましたでしょうか?文字化けの件ですが、Arduinoのスケッチなのでそこに文字コード指定を書く訳にいかず、対策としてzip圧縮したファイルに変更しました。ブラウザで直接コードを見たい場合もあるんですね(その可能性を考えていませんでした)。今回はブラウザーで見るメニューも追加してみました。簡単な手術(在宅医療点滴用)なので、予定通り退院しました。Uno+PIC18F2550と14K50用のPCBを書いていたりしたので、返事が遅くなりました。文字化けは問題無いようです。最近はArduinoのオープンコードの方が魅力的でPIC系は使わなくなってしまったのが本音ですが、PCBまで公開している方もいて、様々な物が作れます。PICの方は、自分自慢の情報が多く、Arduinoに、変えたと言う感じです。PICでは、Basicを使っていたのですが・・・C言語は勉強すらした事がありませんが、Arduino用のC言語を説明してくれるサイトもあるので、PICより使いやすいです。PICkit4まで買ったのですが、まともに使ったのはAKI-PICkit2が主で、一様、下駄をはかせてDIP4PinのPIC10F系まで非改造対応をさせました。された様で安心いたしました。PIC18F2550と14K50は安価にUSBを使える所が魅力ですよね。私もそれ以外はArduinoを便利に使っています。IOアドレスや機能を調べたりしなくて良いので、特に限界を引き出す様な用途でなければ事足りますもんね。ところで日曜大工様は作られたものをどこかで紹介されていますでしょうか?紹介ページやSNSがあれば見てみたいです。feedWordPress.orgこちらも見てちょ~だい。