本文へスキップ

未来の科学技術を子供たちに託す。 ジュニロボ <JRO>

〒619-0237 京都府相楽郡精華町光台8丁目

TEL. 070-5263-2200

jun@kinet-tv.ne.jp

初めに!!RECRUI

   このコーナーは、安価なセンサを教育用Robotに使えるようにしてみたり、新しいセンサを簡単に教育Robotに接続
  できるインターフェース基板を作ってみる作業場所です。
  これらの作業を行う為、技術アドバイザー<クラブ情報参照>の大湯さんにお願いして進めて行きます。

  大湯さんのHP : http://okgnz.web.fc2.com/index.htm

  この中に関する情報は、大湯さんに版権がありますので、無断転用はご遠慮願います。
  質問、転載等の許可に関しましては、下記メール(大湯さん)にて許可をお願いいたします。
  Kensuke Ooyu [gee01206@nifty.ne.jp]

リニアラインスキャンカメラ RECRUI


    超音波距離センサで開発した Arduino で、今回のリニアラインスキャンカメラを開発します。
   AVR への「Boot Loader」書き込み、Arduino での開発方法は、前ページの超音波距離センサのページを参考にしてください。

   ラインスキャンカメラの資料です。



  【 Ardino スケッチ仕様 】

  ■ 概略仕様
    loop 内に、次の2つの処理ブロックを入れています。
     * ラインスキャンセンサ制御と計測
     * コマンドインタプリタ

    タイマ割込みを使い、Arduino の D13 に接続しているLEDを点滅させます。
    これは、Arduino が動作している事をモニターする為に使用します。

  ■ ラインスキャンセンサによる計測
    500msごとにタイマー割込みでイベントトリガーによる通知で起動されます。
    結果を内蔵SRAMに保存するため、フラグ mflag を使います。
    コマンドインタプリタで計測を指定すると mflag をセットし、計測が終了すると mflag をリセットしています。

  ■ コマンドインタプリタ
    1文字コマンドを7種用意しています。

     * ?(ヘルプ)
       コマンド一覧を表示します。
     * M(計測)
       ラインスキャンセンサによる計測を開始します。
       128ピクセル(1ライン)分のデータをバッファに保存すると自動停止します。
     * S(データ表示)
       計測値を10進数で表示します。
       16データごとに改行します。
     * B(2値化データ表示)
       計測値を2進数で表示します。
       32データごとに改行します。
       スレショルド(閾値)は、データの最大値と最小値の相加平均しています。
     * C(計測バッファのゼロクリア)
       128ピクセル分の計測バッファをゼロクリアします。
       Mコマンドによる計測前にゼロクリアすると、どのピクセルで変化したのかを確認できます。
     * T(スレショルド設定)
       コマンドに続けて、1桁〜4桁のスレショルド値を設定できます。
       スレッショルド値は、10進数で指定可能です。
       データを2値化したいときに、値設定をします。
       Arduino の A/D コンバータは、最大で4095までになるので、その範囲で値を入れます。
     * b(スレショルドによる2値化データ表示)
       計測値を2進数で表示します。
       32データごとに改行します。
       スレッショルド(閾値)は、T コマンドで設定した値を使います。

  ■ 関数仕様

     * rs_putchar
       Serial.write のラッパー関数。
       スケッチ内で Serial.write を使うとコードサイズが増えるので関数に入れています。
     * crlf
       改行専用関数。
       rs_putchar を利用して、’\r’、’\n' を、この順に出力します。
     * show_help
       コマンド?で動かす関数、 コマンドの一覧を出力します。
     * send_si
       ラインスキャンセンサの SI 信号の H、L を設定します。
     * send_clk
       ラインスキャンセンサの CLK 信号の H, L を設定します。
     * send_led
       Arduino の D13 ピンに接続した LED の店頭、消灯を設定します。
     * update_trigger
       タイマー割込みライブラリ MsTimer2 から呼び出し、100ms ごとに mflag をセットします。
       また、変数 xcnt の LSB の値を、send_led に渡します。
       LED が 1 か 0 かで、LEDの店頭、消灯を制御します。
     * get_sensor
       SI、CLK を制御して、ラインスキャンセンサから情報を取得してバッファに保存します。
       SI を、L−>H−>L として、ラインスキャンセンサの CCD を起動します。
       CLKにより、CCD から情報を出力します。
       CCD からの情報は、CLK の128クロックで入力されるので、最後に内部回路をリセットする為にダミーでひとつ CLK を L->H->L
       とします。
     * show_raw_values
       コマンド S で動かす関数
       1データを10進数4桁で表示します。
       16データを表示後、改行します。
     * show_binary
       コマンド B、bで動かす関数
       1データを1ビットで表示します。
       32データを表示後、改行します。
       スレショルドをコマンド B と bで変えるので、パラメータに 0 を設定すると、コマンド B に対応します。
       コマンドbでは、パラメータに1を設定します。
     * show_digit4
       16ビット符号なし整数を、0 から 9999 で表示します。
     * clear_buffer
       コマンド C で動かす関数
       計測バッファをゼロクリアします。
     * get_hex
       16進数の 1 文字を、0 から 15 の数値に変換します。
       対応している文字は、’0’ から ’9’、’A’ から ’F’ 、’a’ から ’f’ の22文字に対応します。




AVR 【 ATmega 168 】へ Bootloader 書き込み RECRUI


   超音波距離センサの所でも書いていますが、新しいAVRマイコンチップには「BootLoader」をまず書き込むことから始まります。
  「BootLoader」の書き込みから、手順を見て行きましょう。

   書き込みには、AVRライター(自作)を使い開発ボード上で行います。<開発環境風景>
   開発ボードへの電源供給は、AVRライターから供給されます。 AVRライターへの電源供給はPCからのUSBパワーを使っています。
   写真右下の装置は、今回の開発には関係していません。



   まず、新しいAVRを開発ボードに挿入します。



  「BootLoader」の役割

   @ AVR内蔵のフラッシュROMに「BootLoader」を書き込んで置くと、AVRに電源供給を始めると、まず「BootLoader」が起動します。
   A 「BootLoader」は、約10秒程度ほど動作し、外部のフラッシュROMから書き込むデータを待ちます。
   B 約10秒ほど経っても新たな書き込みが無ければ、そのままAVR内蔵にあるプログラムを実行します。

   今回使用する「BootLoader」は、「ATmegaBOOT_168_diecimila.hex」を書き込みます。

   書き込みには、「hidspxG.exe」を使います。<画面 : アイコンと初期画面>





赤枠の「RST」ボタンを押すと左横の窓にAVRマイコン
の品番が表示されます。

下段には、AVR情報が表示されています。(黒色表示)

このAVRマイコンには、まだ Fuse Bits の書き込みを
指定していないので、エラーとなっています。
その他、情報としてフラッシュROMサイズ、複数ブロ
ック(128Bytesで128Pages)設定になっていること、
EEPROMサイズ等が表示されています。











   Fuse Bits の書き込みをします。<詳細内容は省略しています。>
   今回は、
     Low : F7
     High : DC
     Ext : F8
   を書き込みます。


Fuse (HEX) 欄のそれぞれに数値設定した後「Write」
ボタンを押して書き込みを行います。




「はい」をクリックします。





下段の黒いOUTPUT窓に、Fuse Bits が、EEPROMに
正常に書き込みが出来た事が解ります。


















   今までの出力結果が下段です。

Use (C:\hidspx-2012-0326\hidspx-2012-0326\bin\hidspx.exe)
> hidspx.exe -h
hidspx (b11.7) by t.k & senshu, Borland C++ 5.5.1, Mar 26 2012
----
AVRSP - AVR Serial Programming tool R0.46c (C)ChaN, 2010 http://elm-chan.org/
Write code and/or data : [] ...
Verify code and/or data : -v [] ...
Read code, data or fuse : -r{p|e|f|F|l} [-o]
HEX dump (Flash/Eeprom) : -r{p|e}h [-o]
-rp{h} Read Program(flash) memory
-re{h} Read Eeprom
-rf Read Fuse (use fuse.txt)
-rF Read Fuse list (HEX style)
-rl Read Fuse and lock bits
Get AVR Information(Web): -r{I|i|d}
-r{i|I} Read Fuse Information (new)
-rd Read chip Datasheet
Write fuse byte : -f{l|h|x}
Lock device : -l[]
Copy calibration bytes : -c
Erase device : -e
Control port [-pb1] : -p{c|l|v|b|u|h|f}[:]
SPI control delay [-d3] : -d
Help (Detail) : -? or -h or --help

Miscellaneous Options:
-q Query device type
-t Force device type
-w Pause before exit
-z 1KHz pulse on SCK

Supported Device:
AT90S 1200,2313,2323,2333,2343,4414,4433,4434,8515,8535
ATtiny 12,13,15,22,24,25,26,44,45,84,85,261,461,861,2313,4313
ATmega 8,16,32,48,48P,64,88,88P,103,128,161,162,163,164P,165,168,168P,
169,323,324P,324PA,325/9,325P,3250P,328P,3250/90,603,640,644,644P,
645/9,1280,1281,1284P,2560,2561,6450/90,8515,8535
USB USB82,USB162,8U2,16U2,16U4,32U2,32U4
AT90CAN 32,64,128, AT90PWM 2,3,216,316

Supported Adapter:
AVRSP adapter (COM -pc|-pv / LPT -pl), SPI Bridge (COM -pb[:BAUD]),
STK200 ISP dongle, Xilinx JTAG, Lattice isp, Altera ByteBlasterMV (LPT -pl)
USBaspx (USB -pu<:XXXX>), RSCR (COM -pf), ( == PORT Number)
HIDaspx (USB -ph<:XXXX>), HIDaspx(p) (USB -php<:XXXX>)
=== long options ===
--pause-on-start       Pause on Port Open
--pause-on-exit       Pause on exit
--set-serial          Set USBaspx serial number
--show-options        ShowOption Values
--show-spec         Show Setting Values
--list-bookmark -!      List userBookmarks
--list-port -p?        List COM Port
--list-usbasp -pu?      List USBaspProgrammer
--list-hidaspx -ph?      List HIDaspx Programmer
--list-adapter        ListSupport Adapters
--list-device         List Support AVR Devices
--new-mode         Newprogress mode

=== Open URL by Web browser ===
--avr-devices         AVR Deviceslist
--atmel-avr          Atmel (AVR 8-Bit RISC)
-- OK --
> hidspx.exe -r
HIDaspx(*) isn't  found.
-- Error(0x00000003) --
## Fuse Read NG ##
## Device Read(AVR Reset) ##
> hidspx.exe -r
Detected device is ATmega168P.
DeviceSignature = 1E-94-0B
Flash Memory Size = 16384 bytes
Flash Memory Page= 128 bytes x 128 pages
EEPROM Size = 512 bytes
-- OK -
- ## Fuse Write##
> hidspx.exe -fL0xF7 -fH0xDC -fX0xF8 -d30
Detected device is ATmega168P.
Fuse Low byte was programmed (0xF7).
Fuse High byte was programmed (0xDC).
Fuse Extend byte was programmed (0x00). -
- OK --
> hidspx.exe -r
Detected device is ATmega168P.
Device Signature = 1E-94-0B
Flash Memory Size = 16384bytes
Flash Memory Page = 128 bytes x 128 pages
EEPROM Size = 512 bytes
-- OK --
## Fuese Read ## > hidspx.exe -rf Detected device is ATmega168P.
==== ATmega168P ====
Low: 11110111
   ||||++++-- CKSEL[3:0] システムクロック選択
   ||++--SUT[1:0] 起動時間
   |+-- CKOUT (0:PB0にシステムクロックを出力)
   +-- CKDIV8 クロック分周初期値 (1:1/1,0:1/8)

High:11-11100
   |||||+++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V,100:4.3V)
    ||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
    |||+-- WDTON (1:WDT通常動作,0:WDT常時ON)
    ||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
    |+-- DWEN (On-Chipデバッグ1:無効, 0:有効)
    +-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----000
     ||+--BOOTRST (1:Normal, 0:BootLoader)
     ++-- BOOTSZ[1:0] (11:128W, 10:256, 01:512,00:1024)

Cal: 159
-- OK --

   Fuse Bits の書き込みが正常終了しましたので、やっと本題の「ATmegaBOOT_168_diecimila.hex」を書き込みます。


「ATmegaBOOT_168_diecimila.hex」があるフォルダ
を選択して「Write」ボタンをおします。

OUTPUT窓には、書き込んでべリファイしている様子が
表示されています。
















   次に、画像データーを確認する為の動作確認用スケッチを、AVRマイコンに書いてみます。