arduinoの勉強部屋 2010.04.11  

 arduinoを購入する計画はまったく無いのですがどのようなものか知りたくて同じ機能を持つものを自作しています

 同じ機能のものをつくる FT232RL(pic18spx)+ mega168
 usbrs232で動かしてみる
 手動書き込み
 DTR信号雑考
 「アルディ」ノススメ 2000円ほどの投資で遊んでみる
    fuse設定
    メモ IDE窓のサイズ IDEエディタ文字サイズ コンソールの文字 水晶発振 日本語リファレンス UARTの抵抗



(注)dude-wrapngは素晴らしいソフトですが、Arduino-0018専用です。Arduino-0019が公開されるにあたり、dude-wrapngより汎用性の高い avrdude-GUI(含avrdude改)が開発されました。今後は「アルディ」ノススメで紹介している Arduino-IDEオリジナル+avrdude-GUI の使用が適当です。

 dude-wrapng  2010-0528版よりこの名になりました(Next Generation)
    メモ IDE窓のサイズ IDEエディタ文字サイズ コンソールの文字 水晶発振 日本語リファレンス UARTの抵抗
 dude-wrap mega88を使ってみる
 dude-wrap mega328を使う
 dude-wrap pic18spxライタの実験
 adpy プログラミング(?)
   RTCを読み出す  I2Cを使う
   7セグメントLED 2桁表示  
   I2C受信 7セグメントLED 2桁表示  wsNak中尾氏の1バイト送信データ  
   I2C受信 7セグメントLED 4桁表示  5バイトデータを受け取って4桁の数値を表示する  











 同じ機能のものをつくる 2010.04.11

 以前にアルデュイーノが話題になったことがありました。ブートローダがあってライタがなくても書けると聞きました。今はもう時期遅れかと思いますが、プログラム環境がどのようなものか見たくて調べてみました。もちろん製品を購入することはまったく考えていません。多少便利であっても多様なことを覚えるのがしんどくなって来ているのも事実です。

USB-シリアル変換とAVRのブートローダ機能を使ってarduinoIDEでソース作り・コンパイル・書き込みを行うものだとわかりました。
また、ハードウエアはUSB-シリアルのTXDとRXDで読み書きを行いDTRでreset信号をコントロールしているようです。
ブートローダのファームはirukaさんのサイトに「mega168を使ったときはATmegaBOOT_168_ng.hexが適当です」とありましたので悩みが一つ減りました。

IDEはこのページウインドウズ用 Arduino-0018 をダウンロードしました。

ハードウエアの構成は、 FT232RLから TXD、RXD、DTR を取り出し、他方mega168はブレッドボードに設定して16MHzの水晶発振で動かしています。



写真のように、リセット回路10k+タクトswとLED1個、VccとGNDの配線、パスコンがあるだけです。
TXD←→RXD、RXD←→TXD とクロス接続して、DTR−0.1uF−RESET と結んでいます。信号回路の1k抵抗はFT232RL出力回路に120Ωの抵抗を入れてありますので省略しています。

ブートローダの書き込みは手持ちのAVRライタを使いました。arduino0018に含まれるATmegaBOOT_168_ng.hexを書き込み、fuseには水晶設定の他にブートローダ領域を確保するために exに 1111 1000 を設定しています。

arduino.exeをダブルクリックで起動して、「ファイル」−「スケッチ例」−「digital」−「blink」を選択しました(日本語が出てきます)。デジタル13番pinにつないだLEDが1秒ごとに点滅するプログラムのようです。書き込みボタンを押すと書き込んでいるようですが、完了からLEDが点滅するまでに10秒近くかかります。何をしているのでしょうか、今までは書き込み終了からタイムラグ無しに起動する環境でしたからしっくりしません。
なお、ピン番号はこのページでわかりました。この13番ピン=PB5 にLEDを付けてプログラムを確認しました。インターバルタイムを変更すると当然違った点滅になりました。

arduinoの第一歩を踏み出したことになるのでしょうか。
プログラムは簡単に書けそうですが新たにarduino語を覚えなければなりません。プログラムといわずにスケッチと言ったり、ライトと言わずにアップロードと新しい言葉を使うのも私好みでは無いようです。また、全画面のエディタを使い、コマンドプロンプトでコンパイルと書き込みをしてきた経験からIDEの狭くて小さな字も好きにはなれません。
正体の分からないモンスターと思っていたのですが、大枠の感じはわかったみたいです。時間があれば遊んでみましょう。ところで、電源断の後(リセット後)どのようにアプリケーションを実行するのでしょうか。ブートローダで止まっているような感じです(不勉強)。が、リセット後に10秒ほど待つとスケッチが実行されるようです。この10秒は何をしているのでしょうか。このあたりのメカニズムもやがては知りたいところです。

(2010.04.12)スケッチが書かれた状態でリセットされると(電源の入れ直しが行われると)PCからのロードを待つそうです。一定時間待って新しい書き込みが無いと以前に書かれたものを実行するそうです。これに10秒弱かかるようです。

別項のPIC18F14K50のusb-serial変換器を使ってみました。


左にあるのが変換器です。物理的な保護のためにビニルシートで巻いてあります。PIC18F14K50を直付けして小さくまとめています。このために専用のコネクタを増設しました。4ピンでTXD、RXD、DTR、GNDです。
16MHzの水晶は負荷コンデンサを省略しています(不具合があればすぐに挿入します)。

PIC18F14K50のファームで注意するところは 一般のusb-serial変換の cdc-18F14K50.hex は書き込み制御用のDTR信号が出ていません。この信号でmega168をリセットしていますので、リセットSWを手で押さないと書き込めませんでした。DTR信号が出ている端子をアナログテスタで測ってこの端子がすっとLのままであることがわかりました。(FT232RLではHから書き込み時にLに落ちています。)
irukaさんのサイトをよく読みますとarduino400のページmchip-cdc14k2.zipの紹介があります。このzipファイルに含まれる serial.hex はDTR信号が PB6 端子に出ています。 PB6--0.1u--reset とつなぐとうまく書き込めました。

PIC18F14K50のコンバータを使いますと \1000 未満でarduinoもどきが体験できることになります。工作好きでヒマのある方には面白い題材だと思います。



 usbrs232で動かしてみる 2010.04.28

実験している内にこのarduinoDTR信号が無くても、書き込みクリックの直前にリセットスイッチを一瞬押すと書き込めることがわかりました。これを使えばDTR信号のないコンバータでも書くことができます。TXDRXDがあればよいことになります。
結果的に書くことができました。リセットのタイミングはそれほど難しく無いようです。usbrs232はwindowsXPでしか有効でないそうですが、これがあればXPならarduinoの雰囲気を味わうことができます。


 手動書き込み(リセットボタンを手で押して書き込む) 2010.04.29

上に書いたようにarduinoはDTR信号でavrをリセットしています。このリセットのタイミングが合わなければ書き込めないのですが、実験をしてみると以外に簡単なようです。 リセットスイッチを左手でちょこっと押して、すぐに右手でクリックする、という感じで確実に書き込めました。
手元にあるUSB-シリアルコンバータは、
 @FT232RL自作
 Acp2102自作
 Bpic18spx(PIC18F14K50使用)
 Cusbrs232(tiny2313使用)
 
の4種ですがいずれもDTRを使わない(使えない)状態でうまく書き込むことができました。
初期の頃avrライタで書き込み時はスイッチをONにするものがありましたが、書き込む前にONにして書き込み後にOFFにするという2段の操作が必要でしたが、今回は1段で済みますから負担は少ないようです。
何度か書いてみましたがスイッチの手動操作は気にしなくても良いのではないかと思えてきました。

素人考えでは手動リセットが無難なようです。これで困る場面に出会うまでは手動で行きましょう。アマチュアの実験レベルではCの充放電によってコンバータが壊れてもAVRが壊れても大事には至りません。0.1uFで続行するのも一つの方法でしょう。



 DTR信号雑考 2010.04.29

arduino書き込み起動に関係するエラーを体験する中で、DTR信号について少し学びました。
DTR信号(Data Terminal Ready)は RS-232C の中にある信号線の1つで、通常は、シリアルポートが使用可能な状態になっている間ONになります。

RS232C信号線はデータ信号は負論理でその他の制御信号は正論理になっています。また、RS232Cのインターフェイスで論理が逆になりますから、TTLレベル(機器の中)では データ信号は正論理(ON=1=H)制御信号は負論理(ON=0=L)になります。
自作の機器間ではTTLレベルで通信しますから、この太字の論理になります。
すなわち、PCからarduinoに書き込み信号を送るときは DTRをL にして使用可能状態をarduinoに知らせ(aruduinoは本来のDTRは受け付けないが)、通信終了後に DTRをH に戻します。

AVRデバイスはリセットされるとブートローダモードになって(そう思います)、プログラム(スケッチ)(が入ってくればそれ)を受け取ります。
通信を受け取る時にリセットが必要ですから、DTRのLを利用します。通信中にずっとLでは困りますから、立ち下がりのエッジだけを利用するために0.1μFのコンデンサでDTR信号を受けてリセット端子に取り込んでいます。

これらは確かな情報と言えませんが、このように解釈するとDTRの働きが矛盾無く理解できました。

このあたりが確定している素子として FT232RL と cp2102 の動きを調べました。 PCに通信準備OKの信号を出させるためにターミナルソフトの teraterm と ハイパーターム を使ってこれらのターミナルソフトの開始と終了時のDTR信号をアナログテスタで調べました。
結果はともに同じで、ターミナルソフト立ち上げ前は  で、立ちあがると  になり、ターミナルソフトを終了すると  に戻りました。 もちろんHはVcc電圧で、Lは0Vです。
DTR信号は本来別の働きがあるはずです。これをリセットに使うのは単なる思いつきによるものとも聞きます。確かに書き込みでなくAVRとUART通信を行うときもリセットされることになるようです。




 dude-wrapng 2010.05.01 → 2010.05.30

 dude-wrapngはsenshuさんの考案で、Arduino-IDEを使ってhidspx制御のHIDaspxで書き込むことができるソフトウエアです。これを使うと単独のAVRmcuにHIDaspxライタを繋ぐだけでArduinoの多くのライブラリを利用してArduinoと同じプログラムを実行することができます。もちろんUSB-シリアル変換モジュールは必要ありません。
HIDaspxがあればAVRmcuだけ(わずかの部品が必要ですが)で、Arduinoと同じ実験ができます。

当初はIDEが使用しているavr-dudeを指定時にはhidspxを使うようにラッピングしたものでdude-wrapの名でしたが、2010-0528版よりラッピングではなく指定時にはIDEが直接hidspxを使用するように変更されました。そのため名が変わっています。
ここに導入の経過を報告しますが、「最良の方法」であるとは限りません。

Arduino-IDEはWinAVR(gcc)を含みますが、WinAVRをインストールすることなく使えるそうです。したがってこのシステムではすべてについてインストールの必要はないようです。

原作者のsenshuさんからいただいたメッセージを再掲します。
 私は、Arduino IDEが持つ不具合を解決するために改良作業を行っています。dude-wrapngではArduino IDE自体を修正して不具合を改善しています。

dude-wrapngとdude-wrapは結果として機能が似ているだけで、仕組みは全く異なります。後継という意味でこの名称にしただけなのです。

こうしたことから、dude-wrapngの特徴という表現は適当ではなく、「dude-wrapngを導入したArduino IDEの特徴」と紹介していただければ幸です。

dude-wrapngの主な改良点:(前身の dude-wrap から改良された点です)
 ・ラップではなくArduino-IDEの内部を修正して(指示があるときは)hidspxを使えるようにした。
  (同様に、bootloadHIDも使えるそうです)
 ・TEMPフォルダに大量のゴミファイルが残るバグを取り除いた。
 ・Ctrl+k でbuildフォルダを、「即」開くことができる。→ hexファイルを他のライタで書き込める。
 ・「COMポートが無いときのエラーが出ないようにする」ために boards.txt の設定をしている。
  (Reset処理の有効/無効の選択機能の利用)


ファイルのダウンロードと配置:  2010.05.28 dude-wrapng に変更されたので書き直しました。)
arduinoから arduino-0018.zip をダウンロードして解凍します。
senshuさんのアーカイブから dude-wrapng-2010-0528.zip をダウンロードします。

解凍したarduino-0018の置き場所ですが、空白を含むフォルダ や 日本文字を含むフォルダ は避ける方が良いと思いますので、c:\_ard を作ってそこに置きました。(アンダースコアを付けると一覧表示で上の方に出ます→探しやすい)

他方、dude-wrap-2010-0528.zip を解凍しますと、5個のフォルダ(Arduino、bin、doc、scr、wrap)と Readme.tex ができますが、このうち arduino フォルダを C:\Documents and Settings\ユーザ名\My Documents にコピーします(置きます)。(以前の版を使っていて、カスタマイズされた内容を含むときは保存処理を前もってしておきます。) この場所はプログラム中で指定されていますから必ずここに置きます。 その他のフォルダ・ファイルは任意の場所に置きます。(Arduino-0018と同じフォルダc:\_ardがいいでしょう)
注意:2010-0528版からbords.txtの形式が変わっています。自作で使っていたものは修正が必要です。


その他のファイルの処理:
日本語表記、TEMPフォルダに残るゴミファイルの除去などの改良で core.jar と pde.jar が変更されています。有効にするために \dude-wrapng-2010-0528\bin\lib\windows\ フォルダにある core.jarpde.jar を \arduino-0018\lib にコピーして同名のファイルを上書きで置き換えます。(リネームして置いておくのも自由です)
初期のの版では指定できるCOMポートが無ければ書き込み時にエラーになりましたが、現在は回避されますのでCOMポートがデフォルトではついていないノートPCでも問題なく使えるようになっています。


hidspx.exeの設置:
hidspx.exe と hidspx.ini を C:\_ard\arduino-0018\hardware\tools\avr\bin に置きます(貼り付けます)。(私は picspx-gcc.exe(pic18spx用)を使いますので、これを hidspx.exe にリネームして前者に置いています。こんなこともできています。)


arduinoIDEの確認:
以上でソフトウエアのセッティングが終わりましたのでIDEの確認をします。
C:\_ard\arduino-0018\arduino.exeのショートカットをデスクトップに置くと便利です。
arduino.exeを起動します。
次の画面の赤枠で示された部分が上記の操作で追加されているのがわかります。
(図は以前の版を使っていますので少し違いがあります)




dude_wrapngの実行:
tiny2313でテストします。ハードウエアとしてブレッドボードに、
 電源VccとGNDの配線
 reset端子を10kでプルアップ
 HIDaspxの接続
 PB1(13番ピン)に抵抗付きLED(Hで点灯)を接続
を準備して電源を入れます。(HIDaspx経由でVccが供給されるタイプなら電源は不要です)

準備ができたら電源を入れて、PCのarduinoを起動します。
次に「ツール」→「マイコンボード」→「My Arduino w/ ATTINY2313」を選択します。
続いて「ツール」→「 ブートローダを書き込む」→「hidspxを使う」を実行します。HIDaspxが働いてブートローダはありませんがfuse設定をしているようです。ここはエラーが起こらなかったのでそれ以外はわかりません。

いよいよプログラムのテストです。
readme.txtのLED点滅プログラムを使ってみました。
■ サンプルプログラム

// LED (PB1)の点滅
int led0Pin = 10; // LED ATtiny2313 PB1
void setup() // run once, when the sketch starts
{
pinMode(led0Pin, OUTPUT); // sets the digital pin as output
}
void loop() // run over and over again
{
digitalWrite(led0Pin, HIGH); // sets the LED on
delay(500); // waits for a second
digitalWrite(led0Pin, LOW); // sets the LED off
delay(500); // waits for a second
}
を貼り付けて、ビルドします。○の中に横向き△のアイコンのクリックです。
即座に成功してコンパイル終了のメッセージが出ます。

最後にチップに書き込みます。
□に横向き矢印のアイコンです。
コンパイル後のスケッチのサイズ:756バイト(最大容量2,048バイト)

#=> hidspx -d4 -ph --new-mode -d1 C:\DOCUME~1\y\LOCALS~1\Temp\build548829602125802808.tmp\sketch_may02a.cpp.hex 
Detected device is ATtiny2313.
Erase Flash memory.
Flash memory...
Writing   [##################################################]    756,   0.20s
Verifying [##################################################]    756,   0.11s
Passed.
Total read/write size = 1512 B / 0.58 s (2.55 kB/s)
と表示されて、すぐにLEDが点滅をはじめました。arduinoの待ち時間がここにはありません。

以上が試用成功までの経過です。
readme.pdfには重要な事項が沢山含まれます。実行に成功してみれば内容がよくわかるのですが、西も東もわからないときは理解に苦しみました。
自分の備忘録を兼ねて記録に留めましたが、参考にしていただくことがあれば幸甚です。


付 IDEのカスタマイズ==使わないものは表示しない:
私の場合は完成品を購入する予定がありません。また、hidspx(pic18spx)以外のライタは使う予定がありません。さらに、正式arduinoの書き込みを行う予定もないので不要な表示はしないことにしました。
本体の bords.txt と progurammers.txt をリネームするとIDEは読みませんので adruino商品名とライタ各種の表示が消えてすっきりします。必要ならリネームをもどします。自分一人だけのPCでは使い勝手を優先しています。共用ならこんなことはできません。




 dude-wrapng メモ 
IDE窓のサイズ:
 「ファイル」→「環境設定」の下部に表示される preferences.txt を変更します。

IDEエディタ文字サイズ:
 「ファイル」→「環境設定」の「文字サイズ」を変更します。

コンソールの文字サイズと色:  2010.05.08
黒字に赤文字でかつ小さいために見にくく感じていました。
senshuさんが文字の大きさと文字色を変更する方法を見つけてくれました。
C:\_ard\arduino-0018\lib\theme\theme.txt を変更します。
# GUI - CONSOLE
#console.font = Monospaced,plain,11
console.font = Monospaced,plain,14             ←14ポイントに変更している
console.font.macosx = Monaco,plain,10
console.color = #000000
console.output.color = #cccccc
#console.error.color = #ff3000
console.error.color = #cc9900         ←私はffff00の方が見やすいと思う


水晶発振:  2010.05.08
あるチップで内臓RC発振のままUART通信をPCと行っていました。RC発振でも以外とできるものだな、と思っていたのですがチップが変わると誤動作でどうにもならない状態になりました。通信速度を落としてもダメで、一部分が送られるだけです。
通常の使用であれば水晶を付加して、fuse設定とボーレートの設定値を変えれば済むのですが、Arduino-IDEでは クロック別の boards.txt を作る必要があります。
次のものは mega88 12MHz 水晶発振 のボードのために自作した(修正しただけの)ものです
############################################################## 2010.05.30一部変更
mym88.name=My Arduino(hidspx) 12MHz / ATmega88
mym88.upload.protocol=hidspx
mym88.upload.delay=-d1
mym88.upload.maximum_size=8192
mym88.upload.speed=19200
mym88.upload.disable_flushing=true
mym88.upload.using=hidspx

mym88.bootloader.low_fuses=0xff
mym88.bootloader.high_fuses=0xdd
mym88.bootloader.extended_fuses=0xFF
mym88.bootloader.path=atmega
mym88.bootloader.file=BOOT_void.hex
mym88.bootloader.unlock_bits=0x3F
mym88.bootloader.lock_bits=0x0F

mym88.build.mcu=atmega88
mym88.build.f_cpu=12000000L
mym88.build.core=arduino
##############################################################
この変更を追加すると新しいボード項目ができて使えました。ブートローダ書き込みは正常に終了します。
結果はもちろん正常に通信できました。UART通信を考えるなら水晶発振にしておくのが結局近道のようです。
Arduinoは製品の関係で 発振形式 と クロック は決め打ちになります。
AVRデバイス と 発振形式 と クロック をセットにしていくつかのモデルを決めておくのが良いのでしょう。


日本語リファレンス:  2010.05.08
これは便利です。→IDEのメニューからたどれます。


UART接続の抵抗:  2010.05.09
pic18spxシリアルコンバータの入出力端子を直接AVRのRD,TDに接続して実験してきました。USBハブを使うようになってPCの電源を切るとUSBの電源も切れます(直接のUSBは切れません)。
AVRは外部5V電源で駆動しています。AVRは起動したままでPCの電源を切ることがあるのですが、ふと気付くと電源の電流が異常に多くなっていました。
UARTの信号線を通じてAVR側からPIC18F14K50へ60〜70mAほど流れているようです。

早速、TDとRDにそれぞれ1kΩの制限抵抗を付けました。異常電流は解消しました。通常の使用時には起こらない不都合にも対応が必要でした。PIC18F14K50は死んでいなかったようです。
AVRのUARTを他のものとも接続するときはそのチップの出力とコンバータ出力の衝突(ショート)を防ぐために必要とは知っていたのですが、思わぬ伏兵であったようです。




 dude-wrap mega88を使ってみる 2010.05.02

使いそびれた mega88P が何個かありましたのでこれを使ってみることにしました。
実験用のブレッドボードです。上記のtiny2313と同じボードにのっています。ISP用の接続アタッチメント(?)は形は違うのですが以前からよく使っているものです。mega88用はチップが見えるようにUEWを使っています。



arduinoIDEの設定と実行:
注意は2313の場合と同じですが、
「ツール」→「マイコンボード」→「My Arduino w/ ATmega88」を選択します。
「ツール」→「 ブートローダを書き込む」→「w/ hidspx」を実行します。
エラーが表示されますがfuseの設定は正常に終わっていました。書き込まないブートローダに関係するエラーのようです。

mega88には 15番ピン にLEDを付けています。
最初にPWMでこのLEDの明るさを変化させるスケッチ「ファイル」→「スケッチ例」→「analog」→「Fading」を選びます。
「マイコンボードに書き込む」を実行します。
コンパイル後のスケッチのサイズ:1,048バイト(最大容量8,192バイト)

#=> hidspx -d4 -ph --new-mode -d3 C:\DOCUME~1\y\LOCALS~1\Temp\build401071476509345139.tmp\Fading.cpp.hex 
Detected device is ATmega88P.
Erase Flash memory.
Flash memory...
Writing   [##################################################]   1048,   0.42s
Verifying [##################################################]   1048,   0.44s
Passed.
Total read/write size = 2096 B / 1.12 s (1.82 kB/s)
と表示があってLEDが蛍火のように明滅します。C言語でPWMを書くとかなり手間ですがここでは簡単に書くことができるようです。
尤も中身がわかりませんので、修正するにはかなり考えなければと思います。


もう一つはusb-シリアル変換器を接続して、マイコンボードからPCへ文字を送るスケッチを実行します。
「ファイル」→「スケッチ例」→「communication」→「ASCIITable」を選びます。
ハードウエアはmega88の 2番ピンに変換器のTXDを、3番ピンにRXDをつなぎます。
スケッチの内容Serial.begin(9600);から9600bpsであることを知っておきます。

PCでteratermを起動して、通信のCOMポートを変換器のものに設定し、ボーレートを9600に設定しておきます。
「マイコンボードに書き込む」を実行します。
ASCIITableが送られてきて表示されます。文字化けがあればボーレートの設定を疑います。
33〜126までのコードが送られてきて止まりますが、resetではじめから繰り返されます。表示が速すぎるようなら適当な場所に delay(1000);などを入れると良いでしょう。
「コンパイル後のスケッチのサイズ:2,490バイト(最大容量8,192バイト」とかなり大きくなっています。
通信実験も簡単に行えます。しかし、本質を知り、応用ができるためにはしばらくの勉強が必要なようです。

本来のarduinoに比べて、ブートローダがない分だけプログラム領域が確保されます。また、なんとも言えない待ち時間がないのは嬉しいことです。
シリアル通信を行わなければHIDaspxの100円ライタだけでarduinoそのままのIDEが使えるのは素晴らしいことです。電子工作を楽しみながらの人にとってarduinoの雰囲気を味わうことができる嬉しいソフトです。
正式のaruduinoではブートローダ書き込みにAVRライタが必要だと思いますので、
  HIDaspx + シリアルコンバータ + AVRチップ
の組み合わせは変わらないので使用感の優れたdude-wrapに軍配が上がるのではないでしょうか。
機材と時間と興味のある方は是非試作されて作者のsenshuさんに感じたことを報告していただきたいと思います。
(シリアル通信用にコンバータ専用のpic18spxを作りました。なかなか具合がよろしい)




 dude-wrap mega328を使う 2010.05.03

フラッシュ32kBの mega328 もメモリの少ない物と値段があまり変わらなくなりました。
メモリの大きな物は余裕を持ってプログラムを書くことができます。ダウンロードしたファイルの中にmega88、168の物はあるのですが、mega328の物は無いようです。

多分 \My Documents\Arduino\hardware\MyArduino\bords.txt が関係しているのだろうと考えて、この中のmega88のものをコピーして追加し、88を328に変更しました。概ねよしと思ったのですが、コンパイルエラーが出て mega328 は知らないと言います。正規製品にあるはずだと本家を探しますと mega328p となっていました。 そこを変えると My arduino w/ ATmega328 マイコンボードが現れ、すんなり動いてくれました。
まだサンプルを実行するだけですが、AVRではmega88、168、328で同じソースで走ります。感心しました。Cでもmakefileを変えれば同じでいけるのでしょうか。

追加分を次に書いておきます。
##############################################################
Mymega328.name=My Arduino w/ ATmega328
Mymega328.upload.protocol=hidspx,-d3
Mymega328.upload.maximum_size=32768
Mymega328.upload.speed=19200

Mymega328.bootloader.low_fuses=0xe2
Mymega328.bootloader.high_fuses=0xdd
Mymega328.bootloader.extended_fuses=0x00
Mymega328.bootloader.unlock_bits=0x3F
Mymega328.bootloader.lock_bits=0x0F

Mymega328.build.mcu=atmega328p
Mymega328.build.f_cpu=8000000L
Mymega328.build.core=arduino
##############################################################
ブートローダ書き込みは例によってエラーが出ますが、fuseは書き込まれていますので続行します。

今回、「ファイル」→「環境設定」でIDEを大きくして、文字も大きくしました。見えやすくなっています。
軽快な操作に、特に困ることが発生しないかぎりもとの arduino に戻る気はしません。




 dude-wrap pic18spxライタの実験 2010.05.04

高性能な pic18spx + picspx-gcc.exe ライタは使用方法が HIDaspx + hidspx に極めてよく似ています。hidspxのGUIも実行プログラムを hidspx から picspx-gcc.exe に変更するだけで少なくとも基本的な機能は問題なく使えています。
dude-wrap は C:\bin にある hidspx.exe を使いますから、この hidspx(.exeと.ini)を退避して置いて、picspx-gcc(.exeと.ini)を hidspx(.exeと.ini) にリネームします。
通常どおりdude-wrapを実行すると正常に書き込めました。詳しい検討はしていませんが多分問題はないと思います。また、やがて dude-wrap は picspx-gcc.exe 指定に変更されると思います。

実験その2:パスを通してある C:\bin には正式の hidspx.exe を置き、
avrdude のある C:\_my\arduino-0018\hardware\tools\avr\binフォルダには hidspx.exe にリネームした picspx-gcc.exe を置きます。 (.ini ファイルはそれぞれ添えています)
一般のコマンドプロンプトでは正式の hidspx が使われることになり、dude-wrap を使うときには picspx-gcc が使われます。このようにしておくと pic18spx が利用でき、かつ、dude-wrap 以外では心配なく hidspx が使えることになります。しばらくはこうして最近作ったpic18spxを使おうと思っています。



 adpyプログラミング 2010.05.04

senshuさんが提案している dude-wrap によるAVRのプログラミングは簡略化されたIDEとその書き込みシステムによりwinAVRで構築するよりは簡単に進めることができる長所を持っています。
長い名前は使いにくいので adpy(アドピー)と自分流の愛称を付けてみました。arduinoIED dude-wrap programming + おまけのy です。
日本語流に発音できるとらくだと感じます。が、使うのはここだけでしょう。

WINAVR単独のプログラムに比べてオーバーヘッドが大きくサイズが大きくなると考える方もおられ、私自身が便利に包まれてしまっている某BASICを好きになれなかったことから理解できる部分も多くあり、この方法のみで進めようとの考えはありません。
その昔はZ80に64kBのメモリを積んでささやかなPCが動いていました。安くて便利な機械が作られるようになり、今では 1GHzのクロックと500MBのメモリでは十分に動かない世界になってしまっています。趣味の世界の話ですからいろいろな楽しみ方があってもいいかと思います。

ここを読むとarduinoの特質がよくわかります。抽象化(単純化、省略型)によってプログラムがわかりやすく書けそうです。使って見なくてはわかりませんが、少し調べてみようとの気持ちになりました。
(winavrで自由に書ける人と違って、ソースもろくに読めず作品を頂戴して使っているのと大きな違いはなさそうですが)




 RTCを読み出す  I2Cを使う 2010.05.04

秋月で購入してた RTC-8564NB があります。これはI2C通信で使うことになっていますが、悪戦苦闘してかつ正解を得られなかったのでそのままになっていました。
前述のページに簡単に取り扱えそうな記事がありましたので、試して見ました。

ハードウエアは mega88 のブレッドボードに RTCモジュールを挿し、電源を接続して、I2Cのクロック(28番ピン)とデータ(27番ピン)を接続しただけです。
RTCの接続
 1:CLKOE  2:CLKOUT→LED  3:INT   4:Vss→GND  5:SDA→27番  6:SCK→28番  7:NC  8:Vcc
そのページのスケッチを次に書いておきます。
#include <Wire.h>


int RTCDATA[16];  //read buf. from RTC unit

#define RTCaddress 0xa2 >> 1
                 //TWI address of RTC-unit

#define inPin 8
                 //set digital8 as input


void setup() {

  pinMode(inPin, INPUT);
  digitalWrite(inPin, HIGH);   //pull up

  
  Serial.begin(9600);

  Serial.println("initializing RTC unit");
                 //init message

  delay(1000);

  Wire.begin();  // join the TWI as bus-master
  
  Wire.beginTransmission(RTCaddress);
               //send to RTC address (write mode)
  Wire.send(0x00);
  //set internal register address
  // of RTC as 0 (auto increment)

  //set initial time & date & year
  // as 2010.05.05  08:00:00
  Wire.send(0x00);
      //control1 = 0x00
  Wire.send(0x03);
      //control2 = 0x03
  Wire.send(0x00);
      //seconds = 0x00
  Wire.send(0x00);
      //minutes = 0x00
  Wire.send(0x08);
      //hours = 0x08
  Wire.send(0x05);
      //days = 0x05
  Wire.send(0x03);
      //weekdays = 0x03 (Wednesday)
  Wire.send(0x85);
      //month/century = 0x85 (0x80 | 0x05)
  Wire.send(0x10);
      //years = 0x10
  
  Wire.send(0x00);
      //minutes alarm = 0x00
  Wire.send(0x12);
      //hours alarm = 0x12
  Wire.send(0x25 | 0x80);
      //days alarm = 0x25
  Wire.send(0x04 | 0x80);
      //weekdays alarm = 0x04 (Thursday)

  Wire.send(0b10000011);
      //clk out = 0x10000011 (1hz)
  
  Wire.endTransmission();
  delay(10);

  Serial.println("finished initializing RTC unit");
                //init message

}


void loop(void){

  int i;

  Wire.beginTransmission(RTCaddress);
    //send to RTC address with write mode
  Wire.send(0x00);
    //set internal register address of RTC as 0
  Wire.endTransmission();
  //
  Wire.requestFrom(RTCaddress,16);
              //request 16byte data from RTC
  //reading loop
  for (i=0; i<16; i++)
  {
    while (Wire.available() == 0 ){
    }
    RTCDATA[i] = Wire.receive();
  }

    //read data from RTC unit
  Serial.print(RTCDATA[8],HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[7]& 0x1f,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[5] & 0x3f,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[6] & 0x07,HEX);
  Serial.print("     ");

  Serial.print(RTCDATA[4] & 0x3f,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[3] & 0x7f,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[2] & 0x7f,HEX);
  Serial.print("     ");

  Serial.print(RTCDATA[11] & 0x3f,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[12] & 0x07,HEX);
  Serial.print(" ");
  Serial.print(RTCDATA[10] & 0x3f,HEX);
  Serial.print(" ");
  Serial.println(RTCDATA[9] & 0x7f,HEX);
  
  
  if (digitalRead(inPin)  == LOW){
    Wire.beginTransmission(RTCaddress);
         //send to RTC address (write mode)
    Wire.send(0x01);
         //set internal register address of RTC as 1
    Wire.send(0x03);
         //clear control2 as 0x03
    Wire.endTransmission();    
  }

  delay(100);
}
コピーして、コンパイルに入るとwebページのための全角<>を半角に戻すだけでエラー無くコンパイルできました。
プログラムを見て解説を読んで照合するのがやっとですが、以前に難儀したI2C通信が実に簡単に書けるようです。
teratermで時刻を受信することができました。




 7セグメントLED 2桁表示  2010.05.26

 手持ちのmega168ボードで 7セグメントLED 2桁表示 をしてみました。
ハードウエアは 12MHz水晶クロック、LEDはアノードコモンで、桁ドライブはPNPトランジスタ2SA1015でしています。
したがって、セグメント、桁共にLOWで点灯します。

表示だけが目的ですから、16進数表示として 1バイトデータを0から順にインクリメントしています。セグメントの選択はcase文でしています。web上のサンプルをいただいてアレンジしました。
#define  SEG_A  0  // PD0
#define  SEG_B  1  // PD1
#define  SEG_C  2  // PD2
#define  SEG_D  3  // PD3
#define  SEG_E  4  // PD4
#define  SEG_F  5  // PD5
#define  SEG_G  6  // PD6
#define  SEG_DP  7  // PD7
#define  DISP_1  8  // PB1
#define  DISP_2  9  // PB0

uint8_t  cnt = 0;
uint8_t  target = 0;

uint8_t data;
uint8_t dig10;
uint8_t dig1;
uint16_t i;

void setup()
{

  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_DP, OUTPUT);
  pinMode(DISP_1, OUTPUT);
  pinMode(DISP_2, OUTPUT);
  data=0;
}

void loop()
{

  dig10 = data / 16;
  dig1  = data - (dig10 * 16);

  digitalWrite(DISP_1, HIGH);
  digitalWrite(DISP_2, HIGH);
  digitalWrite(SEG_DP,HIGH);

  if(target == 0 ){    
    seven_seg_out( dig1 );
    digitalWrite(DISP_1, LOW);
    digitalWrite(DISP_2, HIGH);
    target = 1;
  } 
  else {
    seven_seg_out( dig10 );
    digitalWrite(DISP_1, HIGH);
    digitalWrite(DISP_2, LOW);
    target = 0;
  }
  i++;
  if(i==10000){
     data++;
    i=0;
  }
}

void seven_seg_out(uint8_t input)
{
  input = input & 0xf;
  switch(input){
  case  0:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,HIGH);
    break;
  case  1:
    digitalWrite(SEG_A,HIGH);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,HIGH);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,HIGH);
    digitalWrite(SEG_G,HIGH);
    break;
  case  2:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,HIGH);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,HIGH);
    digitalWrite(SEG_G,LOW);
    break;
  case  3:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,HIGH);
    digitalWrite(SEG_G,LOW);
    break;
  case  4:
    digitalWrite(SEG_A,HIGH);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,HIGH);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  5:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  6:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  7:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,HIGH);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,HIGH);
    digitalWrite(SEG_G,HIGH);
    break;
  case  8:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  9:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,HIGH);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  10:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,HIGH);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  11:
    digitalWrite(SEG_A,HIGH);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  12:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,HIGH);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,HIGH);
    break;
  case  13:
    digitalWrite(SEG_A,HIGH);
    digitalWrite(SEG_B,LOW);
    digitalWrite(SEG_C,LOW);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,HIGH);
    digitalWrite(SEG_G,LOW);
    break;
  case  14:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,HIGH);
    digitalWrite(SEG_D,LOW);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  case  15:
    digitalWrite(SEG_A,LOW);
    digitalWrite(SEG_B,HIGH);
    digitalWrite(SEG_C,HIGH);
    digitalWrite(SEG_D,HIGH);
    digitalWrite(SEG_E,LOW);
    digitalWrite(SEG_F,LOW);
    digitalWrite(SEG_G,LOW);
    break;
  default:
    break;
  }
}
出力ピンを自由に使えるのですが、その分プログラムが大きくなります。一長一短です。
Arduino-IDEだけで終わるなら、この方が簡単かもしれません。






 I2C受信 7セグメントLED 2桁表示  wsNak中尾氏の1バイト送信データ  2010.05.26

 前項で2桁LEDのダイナミック表示ができたので、別項の中尾氏の1バイト通信を受信して、16進教示するプログラム(スケッチ)を考えました。
ハードウエアは前項のもの(mega168)を使っています。
Arduino-IDEの I2C 制御は、C言語の関数のようにまとめられていて、受信のルーチンでは
  Wire.begin(0x20);           // join i2c bus with address #0x20 7ビット
  Wire.onReceive(receiveEvent); // receive event
  Wire.onRequest(requestEvent); // request event
を書くだけで受信できるようです。割り込みの指定はありませんがデフォルトで割り込み動作になっています。
表示ルーチンを loop で回して置いて、その中には受信に関する記述は何も書かないのですが、割り込みで取得したデータはメインのルーチンに反映しています。

前項のプログラムと重複しますが掲載します。
 /* **********************************************************
 wsNak氏の1バイトデータ通信スレーブ 2010.05.26
 インクリメントするデータを受信して2桁の7セグメントLEDに
 表示する
 *********************************************************** */

#include <Wire.h>

#define  SEG_A  0
#define  SEG_B  1
#define  SEG_C  2
#define  SEG_D  3
#define  SEG_E  4
#define  SEG_F  5
#define  SEG_G  6
#define  SEG_DP  7
#define  DISP_1  8
#define  DISP_2  9

byte target = 0;

byte data;
byte dig10;
byte dig1;
volatile byte dat = 0;

void setup(){
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_DP, OUTPUT);
  pinMode(DISP_1, OUTPUT);
  pinMode(DISP_2, OUTPUT);
  data=0;
  Wire.begin(0x20);           // join i2c bus with address #0x20
  Wire.onReceive(receiveEvent); // receive event
  Wire.onRequest(requestEvent); // request event
}

void loop(){
  data=dat;
  dig10 = data / 16;
  dig1  = data % 16;

  digitalWrite(DISP_1, HIGH);
  digitalWrite(DISP_2, HIGH);
  digitalWrite(SEG_DP,HIGH);

  if(target == 0 ){    
    seven_seg_out( dig1 );
    digitalWrite(DISP_1, LOW);
    digitalWrite(DISP_2, HIGH);
    target = 1;
  } 
  else {
    seven_seg_out( dig10 );
    digitalWrite(DISP_1, HIGH);
    digitalWrite(DISP_2, LOW);
    target = 0;
  }
}

void seven_seg_out(byte input)
{  //内容は上記と同じのため省略
}

void receiveEvent(int howMany){
  while (1 < Wire.available()){ 
    ; 
  }  // loop through all but the last
  dat = Wire.receive();       // receive byte as a character
}

void requestEvent(){
  Wire.send(dat);
}
webで頂戴したサンプルを変形して使っていますのでゴミとなったものが残っています(謝)。
WINAVRで直接書くことを思えば遥かに簡単になっています。資源(メモリ)をいとわなければ便利に使えます。これで約3.6kBですからmega16なら十分に使うことができそうです。
mega32もほとんど価格が変わらないので、これをスタンダードに使うとすると気楽に実験ができます。

japaninoのように「コストをどこで削減するか」と厳しい環境では贅沢ですが、アマチュアが使う分には問題はないと思います(ただし、買い溜めしたチップが不良在庫になるのは少し残念な気もします)。




 I2C受信 7セグメントLED 4桁表示  5バイトデータを受け取って4桁の数値を表示する  2010.06.01

4桁数字+小数点の5バイトをマスタから受信して表示できれば、LED駆動のポート数やポート種を考えなくても表示できるのでマスタの自由度が大きくなります。
そのために「5バイトの数字を受信すること」を実験しました。1バイトの受信は多くの例が見られるのですが、複数バイトの例は見つけることができませんでした。
接続がしっかりしたハードウエアとするために片面万能基板に組み立てています。


マスタはmega88を12MHzで使って、ブレッドボードに組んでいます。確認用のLEDと2本のバスのプルアップ抵抗4.7kを付けています。
マスタのプログラムはこれです。
Arduino-IDEの複数データの送り方の2とおりを試しています。
1つ目は Wire.send(data) を続ける方法で、2つ目は Wire.send(データ配列,データ数)で送る方法です。どちらも問題なく送信できました。

スレーブのプログラムは、NO1 と NO2 の二つを作ってみました。
NO1はArduino-IDEの書き方でポートのビット毎に記述しています。
NO2は、セグメントドライブのポートがPORTDだけで構成されていること、桁ドライブがPORTBだけで構成されていることから、ポートをまとめて書いた方がプログラムが短くなり読みやすくなるかと考えたものです。正規のArduinoだとUART通信にPORTDが使われるので連続したポートが使えませんから、NO2の方法は難しくなります。
ビルド結果はNO1が3432バイト、NO2が2698バイトとNO2が小さくなっています。動作自体は変化は見られません。

複数バイトの受信については例題がなく、1バイト受信のサンプルが上に書いたように、
void receiveEvent(int howMany){
  while (1 < Wire.available()){ 
    ; 
  }  // loop through all but the last
  dat = Wire.receive();       // receive byte as a character
}
となっていますが、whileループの空文の理解を間違えていてずいぶん苦労をした上でアドバイスとしていただいたサンプルからヒントを得て成功しました。
最後の1データを残してwhileループで読み取り、最後はループの外で取り込んでいます。1バイトの時はそれが最後ですから空文になっているとわかりました。 (データの到着を待つループと勘違いしていました)

Arduino-IDEの複数バイト受信は、簡単な前処理の後は、次のルーチンだけで受信できるのには驚きました。I2Cの構造を調べていたときは常に状態のチェックやACK、NACKに気を配る必要があったと思いますがここでは簡単な定型文の中に代入処理を書くだけで済みます。
void receiveEvent(int howMany){  
  i=1;
  while (1 < Wire.available()){  // 最後のデータを残してそれまではwhileループで取り込みます。 
    d[i] = Wire.receive();
    i++; 
  }  
  d[i] = Wire.receive();       // 最後のデータはここで取り込みます、
}
割り込みも自動で設定されますから考えることはほとんどありません。メモリを多く必要としますがそのメリットは感じられました。

送信時には
  Wire.beginTransmission(Slaveaddress);
  Wire.send(data*,バイト数);                          //(配列,バイト数)型送信
  Wire.endTransmission();
を書けば良いだけですから、表示をスレーブに任せることでマスタの負担は大きく軽減されます。
応用のめどがつきました。





 「アルディ」ノススメ   2010.07.02  2000円ほどの投資で遊んでみる

      以下の紹介はavrdude(YCIT版)とavrdude-GUIを一般的に述べているものではありません。
      使い方の一例を紹介しているだけです。2つのソフトウエアの詳細は原典のサイトに書かれています。

AVRにhidspx使用のライタを接続してArduino-IDEを使うと簡単な実験装置で楽しむことができそうです。
商標に抵触すると困りますので これらの実験環境をまとめて アルディ という名前を付けることにしました。

 この項は「こんなアプローチも電子工作の一つの方法かな?」と思いついたことを書くつもりです。読み流していただいて、おいしいところがあればつまみ食いをしていただくと光栄です。
 基礎知識を持たないものが、こんな事ができたよ、と言うだけですから動作の保証や安全保証はありません。この方法の利点はプログラムの書きやすさとインストール不要で必要なファイルを置きさえすれば済むことです。「インストール禁止」のPCでも実行できます。

 ところで、元になるArduinoはAVRマイクロコンピュータをUSBに接続できる工夫がされていて、かつ、プログラム書き込みの準備もされているコンピュータボードです。3000円程度で売られていて、多くの拡張ボード(シールドと言うそうです)が別途準備されています。これらを接続するとハンダ付けをしなくても多くの実験をすることができ、装置を組み上げることができるようです。なお私は実験に必要な経費を準備できませんので詳しいことはわかりません。もちろん製品は購入していません。

 実は、山形県立産業短期大学校のsenshuさんが開発された AVRライタHIDaspx と ライティングソフトhidspx、さらにArduino-IDEを使いやすくしたdude-wrapng があるためにここに書く実験ができるようになったのですが、dude-wrapngより汎用性が高い方式をsehshuさんが開発された(avr-dude改良、avrdude-GUI)ので、アルディの方式を2010年9月に変更する事になりました。

アルディ概要:
@ Arduino-IDE はそのライブラリを含めてプログラムを作る(hexファイルを作る)ためだけに使います。
  (Arduino-IDEの利点でプログラムが容易に書けます。)
A 書き込みソフトは極めて汎用性の高いavrdude-GUI、avrdude(YCIT版)を使います。
B ライタはHIDaspxを使いますが、ほとんどすべてのライタが使えます。
C デバイスは mega168、328を使い、クロックは水晶発振16MHzを基準にします。
  (これ以外もbords.txtを作れば可能です)


これらのソフトウエアとArduino-IDEのソフトウエアはwebから自由にダウンロードできます。

 ハードウエアは、
  HIDaspxプログラムライタ + マイコンボード
                        avrmega328または168(88でも可)
                        16MHz水晶
                        発光ダイオード+抵抗
                        ブレッドボード
                        その他

です。 あと、5Vの電源装置があれば便利です。PCのUSBから取ることもできますが、実験時にはショートのトラブルを避けるために私は使いません。



回路図


プログラムライタHIDaspxの作り方はこちらを見てください。
ファームウエアを書き込み済みのtiny2313が必要な方は送料とも200円でお送りします。また完成品が必要な方は(手作りの愚作ですが)用意することも可能です。

アルディボードのISPコネクタは使いやすいものを準備してください。写真の右に移っているようなコネクタを立てて配線する方がらくかもしれません。


 ハードウエアの心づもりができたらソフトウエアの準備です。
流れとしては
@Arduino-IDE(Arduino-0019)をダウンロードしてPCに展開します。インストールの必要はありません。
Aavrdude-GUIをダウンロードしてPCに展開します。インストールの必要はありません。
Bプログラムライタのソフトhidspxをダウンロードして組み込みます。
手続きは多くありますが難しいものではありません。順番に説明しますから手間を惜しまなければ心配はいりません。

まず最初の@Arduino-0019の展開です。ここからArduino-0019.zipをダウンロードします。
関係のファイルは c:\ardi フォルダに置くことにします。私はこの記事を書くために f:\ardi に置くことにします。Arduino-0019.zipを解凍してこのフォルダに入れておきます。
C:\ardi\arduino-0019\arduino.exeのショートカットをデスクトップに作っておきます。
このショートカットからArduino-IDEを起動してみます。メニューを探るとすべて英文の項目が出てくるのがわかります。これでArduino-IDEが展開できました。

次にAavrdude-GUIの設定です。
このソフトウエアはsenshuさんが開発中のためバージョンが変わりますが、2010.09.10現在ではavrdude-2010-0909b.zipです。千秋ゼミのサイト内検索で場所を見つけてダウンロードします。
解凍して、\avrdude-2010-0909b\bin\avrdude-GUI.exeのショートカットをデスクトップに作ります。

最後にBhidspx.exe(HIDaspxライタを使うためのライティングソフト)のダウンロードと組み込みです。
先ほどと同じsenshuさんのページからhidspx-2010-0823.zipをダウンロードして解凍します。この中の \hidspx-2010-0823\bin\setup.bat をダブルクリックで実行しますと必要なファイルが C:\bin\フォルダにコピーされます。そしてこのbinフォルダにパスを通しておきます。

これでソフトウエアの環境設定は終わりです。


fuse設定
Arduino-IDEでは書き込みをしませんのでfuse設定は avrdude-GUI を使って手動で書き込みます。
次に 主なfuse設定値 をあげておきます。(注:間違いないと思いますが確認を)
                    L  H  Ex
    ----------------------------------------------------------------------
    mega328P 16MHz  f7 d9 fc     -fL11110111 -fH11011001 -fx11111011  4.3V
                    f7 d9 fd     -fL11110111 -fH11011001 -fx11111101  2.7V
    ----------------------------------------------------------------------
    mega168  16MHz  f7 dc f9     -fL11110111 -fH11011100 -fx11111001  4.3V
                    f7 dd f9     -fL11110111 -fH11011101 -fx11111001  2.7V
    ----------------------------------------------------------------------
    mega88   16MHz  ↑(mega168に同じ)
    ----------------------------------------------------------------------
    mrga48   16MHz  f7 dc ff     -fL11110111 -fH11011100 -fx11111111  4.3V
                    f7 dd ff     -fL11110111 -fH11011101 -fx11111111  2.7V
    ----------------------------------------------------------------------
    mega8    16MHz  3f d9 ff     -fL00111111 -fH11011001 -fx11111111  4.0V  (fxは無い)
                    bf d9 ff     -fL10111111 -fH11011001 -fx11111111  2.7V
    ----------------------------------------------------------------------



試運転
上にあげたハードウエアを接続します。ハードウエアはmega168を使ったものを例にします。mega328では適当に読み替えてください。いずれも16MHzの水晶で始めて下さい。他のクロックではうまく行かないときがあります。

 @ Arduino-IDEをショートカットから立ち上げます。
 A tools → boad で mega168,16MHz のボードを選択します。名前は問題ではありません。
 B file → examples → 1Basics → Blink を選びます。
    プログラムが表示されます。 左端の○に横向き三角のボタン(verify)を押すと、
    しばらくしてコンパイルが終了します。

ここでAVRへの書き込みを行います。
 C ショートカットからavrdude-GUIを起動します。
 D 最下欄のprogrammerに (HIDaspx) hidspx を選びます。
 E 左上の read ボタンをクリックしてAVRを検出します。mega168が検出されると成功です。
 F 最初ですからfuseを ff  df  f9  に設定します(writeします)。
 G ここでavrdude-GUIの上でマウスカーソルをグレーの部分に置いて右クリックすると
   メニューが現れるので 5-1 Find Hex File (Arduino) を選ぶとflashにhexファイルが
   選択されますから write で書き込みます。(Arduino-IDEを終了するとダメ)
   LEDが点滅したら成功です。
 H ついでに file → samples → 1Basics → fade を実行してみてください。
    PWMで蛍のようにLEDが点滅します。

 めでたしめでたし、だったでしょうか。 これがアルディのすべてです。

 自作の安価なボードでArduino-IDEを使って製品のArduinoと同じ実験ができる環境が完成しました。あとはArduinoの例に倣ってテストを進めてください。
IDEの変更などについてはこのページに書いてある部分もありますので参考にしてください。なお、PCとの通信(UART)については usbまたはCOMポートの通信アダプタ(ハードウエア)が必要になります。

 avrdude-GUIと改良avrdudeのお陰で、Arduino-IDEのコンパイルまでの「いいとこ取り」をして、AVRのほとんどすべてのライタで書き込む方法が可能になりました。
Arduinoの製品は買わない(理由不問)方も雰囲気を味わうことができます。
         参考:
Arduinoピン番号
-------------------------------------------------------------------------------------------


 Arduino-IDE ・ avrdude-GUI メモ 
IDE窓のサイズ:
 「ファイル」→「環境設定」の下部に表示される preferences.txt を変更します。

IDEエディタ文字サイズ:
 「ファイル」→「環境設定」の「文字サイズ」を変更します。

コンソールの文字サイズと色:  2010.05.08
黒字に赤文字でかつ小さいために見にくく感じていました。
senshuさんが文字の大きさと文字色を変更する方法を見つけてくれました。
C:\_ard\arduino-0018\lib\theme\theme.txt を変更します。
# GUI - CONSOLE
#console.font = Monospaced,plain,11
console.font = Monospaced,plain,14             ←14ポイントに変更している
console.font.macosx = Monaco,plain,10
console.color = #000000
console.output.color = #cccccc
#console.error.color = #ff3000
console.error.color = #cc9900         ←私はffff00の方が見やすいと思う


水晶発振:  2010.05.08
あるチップで内臓RC発振のままUART通信をPCと行っていました。RC発振でも以外とできるものだな、と思っていたのですがチップが変わると誤動作でどうにもならない状態になりました。通信速度を落としてもダメで、一部分が送られるだけです。
通常の使用であれば水晶を付加して、fuse設定とボーレートの設定値を変えれば済むのですが、Arduino-IDEでは クロック別の boards.txt を作る必要があります。
次のものは mega88 12MHz 水晶発振 のボードのために自作した(修正しただけの)ものです
############################################################## 2010.05.30一部変更
mym88.name=My Arduino(hidspx) 12MHz / ATmega88
mym88.upload.protocol=hidspx
mym88.upload.delay=-d1
mym88.upload.maximum_size=8192
mym88.upload.speed=19200
mym88.upload.disable_flushing=true
mym88.upload.using=hidspx

mym88.bootloader.low_fuses=0xff
mym88.bootloader.high_fuses=0xdd
mym88.bootloader.extended_fuses=0xFF
mym88.bootloader.path=atmega
mym88.bootloader.file=BOOT_void.hex
mym88.bootloader.unlock_bits=0x3F
mym88.bootloader.lock_bits=0x0F

mym88.build.mcu=atmega88
mym88.build.f_cpu=12000000L
mym88.build.core=arduino
##############################################################
この変更を追加すると新しいボード項目ができて使えました。ブートローダ書き込みは正常に終了します。
結果はもちろん正常に通信できました。UART通信を考えるなら水晶発振にしておくのが結局近道のようです。
Arduinoは製品の関係で 発振形式 と クロック は決め打ちになります。
AVRデバイス と 発振形式 と クロック をセットにしていくつかのモデルを決めておくのが良いのでしょう。


日本語リファレンス:  2010.05.08
これは便利です。→avrdude-GUI右クリックメニューからたどれます。


UART接続の抵抗:  2010.05.09
pic18spxシリアルコンバータの入出力端子を直接AVRのRD,TDに接続して実験してきました。USBハブを使うようになってPCの電源を切るとUSBの電源も切れます(直接のUSBは切れません)。
AVRは外部5V電源で駆動しています。AVRは起動したままでPCの電源を切ることがあるのですが、ふと気付くと電源の電流が異常に多くなっていました。
UARTの信号線を通じてAVR側からPIC18F14K50へ60〜70mAほど流れているようです。

早速、TDとRDにそれぞれ1kΩの制限抵抗を付けました。異常電流は解消しました。通常の使用時には起こらない不都合にも対応が必要でした。PIC18F14K50は死んでいなかったようです。
AVRのUARTを他のものとも接続するときはそのチップの出力とコンバータ出力の衝突(ショート)を防ぐために必要とは知っていたのですが、思わぬ伏兵であったようです。












             以下、作成中です。
















inserted by FC2 system