ラベル マイコン の投稿を表示しています。 すべての投稿を表示
ラベル マイコン の投稿を表示しています。 すべての投稿を表示

2011/12/30

X-CTUを使ったAE-UM232R経由でのXBeeの構成方法

ひさしぶりにAE-UM232Rを引っ張り出してきてXBee (Series2)と接続して、X-CTUによるセットアップを行ないました。 接続やら何やら忘れそうなのでメモを残します。

秋月謹製USB-シリアルコンバータ:AE-UM232RによるXBeeの設定 by X-CTU

普通のUSBデバイスと同じように、接続前にFTDI製のドライバをインストールしてあれば、特に迷うことはなく進められると思います。

ただしXBeeを使うためには基本的な構成などを理解する必要があります。 図書カードを使って「XBeeで作るワイヤレスセンサネットワーク」を入手して手元に置いていますが、XBee Series2に対応していて、情報が新しいので2011年12月時点ではお勧めです。

構成

XBeeは秋月で一緒に購入した2.54mmピッチ変換ボードに載せています。 1番ピンには5V(+4V〜20V)を与える必要があります。

AE-UM232RとXBeeとの接続方法

ブレッドボードにAE-UM232Rとピッチ変換ボードに載せたXBeeを並べています。 電源はUSBから5VをVCCに出力させるため、AE-UM232RのJ2ジャンパはショートさせています。

電源用にAE-UM232RとXBeeのVCC, GNDをブロッドボードのバスに接続している他には、TXD⇔DIN(3番ピン)、RXD⇔DOUT(2番ピン)の接続に2本の線を使っただけで、USBケーブルを除けば、AE-UM232RとXBeeそれぞれの4端子以外はオープンです。

「XBeeで作るワイヤレスセンサネットワーク」では、ArdionoからATMEGAを外して、TXD⇔DOUT, RXD⇔DINを接続してUSB接続していました。

X-CTU接続時のパラメータ

PC Settingsタブの"Test/Query"ボタンでテスト接続に成功した時のパラメータは次の通りです。

  • Baud: 9600
  • Flow Control: None
  • Data Bits: 8
  • Parity: None
  • Stop Bits: 1

テストした結果は次のように表示されていて、Modem Configurationのタブから設定をするためにメモをしておきます。

  • Modem type = XB24-B
  • Modem firmware version = 2264
ファンクションセットの設定

テストが成功した後は、Modem Configurationタブに移って作業を行ないます。

表示されたModem typeはXB24-Bでしたが、ここでは真ん中のプルダウンメニューで次のように選択しました。

  • Modem XBEE: XB24-ZB
  • Function Set: ZIGBEE COORDINATOR AT
  • Version: 208C

あとはWriteボタンを押すと更新が終わります。 PC Settingsタブに戻ってQueryボタンを押すと、次のような表示になりました。

  • Modem type = XB24-B
  • Modem firmware version = 208C

もう一つのXBeeは同様にZIGBEE ROUTER ATに設定して、それぞれどのFunction Setを導入したかラベルを張っておきます。

この記事で取り上げた品々

2009/05/09

V-USB (a.k.a. AVR-USB) のライセンスをチェック

休日を利用してV-USBに名前がかわったAVR版ソフトウェアUSBドライバーのクライアント側コードを眺めていました。
libusbのサンプルコードを元に少し自分でライブラリを叩くと、firmwareのコードも含めてそれなり見通せるようになってきました。usbdrvのコードは複雑でまだまだ手をつけられませんが…。
とりあえず温度センサーICが余っているから気温ロガーでも作ってみる事にしましょう。 モールス信号練習機のお題も残ってるんだよなぁ…。

自分用にUSBデバイスを作成するのが目的なのでライセンスにはそれほど気をつかわなくても良いのですが、気になってV-USBのライセンスを眺めてみました。

ポイントはGPL v2と商用のデュアルライセンスになっているというところでしょうか。
Free版はGPL v2の元で配布されています。
これを採用する場合には、自作したデバイスを配布したり販売したりする場合には、コードもろもろ一式を提供する用意がある事を一緒に伝えなければいけないという事になります。
実際にはコードをデバイスにくっつけて提供するだけで十分で、必須ではないものの、V-USBのWebサイトに登録したりして積極的に公開するように求めています。

あとはそういった事を避けたかったり独自のIDが欲しい自作派のために1つのVID/PIDのペアを9.9ユーロ(だいたい1300円ぐらい)で商用ライセンスとして販売している点でしょうか。
どこかで公開する事を考えているなら協賛の意味で購入しても良いかなぁという値段にはなっています。

オープンソースなプロジェクトでもなくなって困るものにはPayPalでdonationをしたりしていますが、この値段でVID/PIDのペアが付いてくるなら買おうか迷うなぁ…。
もう少しV-USBを使ってみて、使い続けるなら購入する事にしましょう。

しかしIPAが公開しているGNU GPL v3 逐条解説書(第1版)を読むと、ストールマン先生というかGPLが大人になったなぁという印象です。
いや上から目線なのはおかしんですけどね。

2009/05/06

ATmega88p+AT24C256引き続き: マクロとコードの断片、気になったコーディング

基本的にAVR側がMasterとしてI2Cバスのクロックを制御しているためか、"TWINT"をセットする事でAVRの内部回路をスタートさせ、"TWINT"が再度セットされるまで待つというコードを良く書きます。

使っているWinAVRは20090313版ですが、"avr/io.h"の中でincludeされている"avr/sfr_defs.h"の中にloop_until_bit_is_setマクロがあり、よりプリミティブな書き方をするデータシートのコードよりも、これを使った方が見通しが良いと思います。

int twi_start() {
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
  loop_until_bit_is_set(TWCR, TWINT);
  return TW_STATUS;
}
...
void usart_write_string(char *str) {
  for(int i=0; str[i] != '\0'; i++) {
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = send_char;
  }
}
...
r = twi_start();
if(r != TW_START && r != TW_REP_START) {
  usart_write_string("error at twi_start()\r\n");
  continue;
}
"loop_until_bit_is_clear"というのもありますが、どちらも中身をみるとおもしろいですね。
#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit))
もちろん"bit_is_clear"の部分もマクロで、データシートのコーディングをまとめだだけなのかなと思いきや、ずっとさかのぼっていくと"sfr"部分は、
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
の"mem_addr"部分に還元されます。
考えてみたらコンパイラが意図しないタイミングで変更されるから、"volatile"を付けるべきなんですよね。
でもこの状況だとvolatile付けcastしても意味ないかな。 どっちにしても、グローバル変数とかは気をつけないとだなぁ…。

そうそう、twi.hの中で#defineされている"TW_STATUS"はデータシート中では"TWSR & 0xf8"と書かれている部分と同じですね。

あとは"_BV()"という書き方もよくみますが、実際には"#define _BV(bit) (1 << (bit))"というマクロとして定義されています。
AVR Studioではgccのオプションとしてデフォルトで"-std=gnu99"が定義されているので、変数宣言を関数の先頭で行なう必要がなくなって、"for(int i=0;..."のような書き方ができるようになっています。

プリプロセッサのマクロは便利ですが、使い過ぎは初心者の読もうという意欲を失なってしまう可能性があります。
AVRのプログラミングからC言語を始めるような方にはコードを読み易くするための工夫が、逆に作用する事があるかもしれません。
意味もわからず本に書かれたコードを単純にコピーして動かそうとして、動かずに呆然とした懐しい記憶が呼び起こされます。
いまの時点から過去を振り返ってみると、大学時代の時間を無駄に使って興味を追求していた贅沢な時間が必要だったのだなぁと思います。

ATmega88pとAT24C256をI2C通信させてみる

秋月で256Kbit EEPROMの"AT24C256"が売られていたので、ATmega88pのI2C通信の練習用に買ってみました。 しばらくブレッドボード上で接続したまま放っておいたのですが、5月の連休を利用して動かしてみました。
なんとか1文字を放り込んで取り出すのが精一杯ですが、まぁなんとか動いています。

今回、参考にしたのは以下のサイトです。

全体の構成

おおまかには"ATmega88p"+"AT24C256"+"AE-UM2232R"をブレッドボード上に接続しています。
"AE-UM232R"はデバッグ用のメッセージを出力させるために使用しています。 このコードは以前作成したものを使い回しました。

EEPROMもAVRもATMEL社製なので、データシートはどちらも同じような体裁で、どちらも読み易く構成されていると思いました。 英語なので細かいところまでは読まずに斜め読みでしたが、こんなドキュメントが構成できるようになりたいものです。
最初はデータシートとAVRのI2C通信について書かれたコードを手本に進めたのですが、 いくつかはまってしまうポイントがありました。

  • AVRマイコン側
    • twi.hの使い方
    • デバッグ用USART(シリアル)通信の文字化け
    • MT, MRモード用コードの送信タイミング
  • EEPROM側
    • "A0","A1"ピンの意味
    • SDA/SCLピンのプルアップ
結局は参考にしたサイトがピンポイントで同じ構成で、いろいろ説明があったので、足りないところはコードを読んで何とか形になりました。

twi.hの使い方

AVRでI2C通信をしようとAVR Freaksに辿り着くとtwi.hを使わずにコーディングしている方がいました。 まぁうまく動かないから投稿されていたわけですが、さすがにそのパワーはありません。
I2C通信をしたくてWinAVRを使っているならtwi.hを使うべしというのは、いろいろ検索してすぐに分かったのですが、微妙にコードが古かったり、RTCと接続したりする例があって、使えるかどうか微妙な感じでした。
I2C通信を始めるならコードをコピーするのではなく最初はいろいろ試行錯誤するのがお勧めです。

デバッグ用シリアル通信で文字化け

これは原因不明ですが、突然デバッグ用に使っていたkermitに出力される文字列が化けてしまいました。 出力自体はされているのですが、プログラムを以前テストした単純にエコーバックするものをロード仕直しましたが、それも上手く動きませんでした。
電源はAE-UM232Rから3.3Vを取っていたので、一度USBケーブルを抜き差しして電源を入れ直して、kermitを立ち上げ直してみたところうまく動きました。こんな事もあるんだなぁ。

MT, MRモード用コードの送信タイミング

ATmega88pのデータシートにはTWDRにSTARTコードをセットした後、TWDRにSLA_W、SLA_Rを設定する事でMaster TransmitterモードあるいはMaster Receiverモードを切り替えるようなサンプルコードが載っています。twi.hの中には"SLA+W", "SLA+R"の文字列でコメントがありますが、該当しそうなものは"TW_WRITE"、"TW_READ"のマクロがあります。

AT24C256のデータシートにはSTARTコードの後にデバイス指定のコードを加えて8bitを送信するように書かれています。 後から参考にしたリンク先のコードをみてわかったのですが、このタイミングでWRIETモードの時は"0xA0"、READモードの時は"0xA1"を送信する事で解決しました。

"A0","A1"ピンの意味

AT24C256のチップを複数バスに接続するために、固有のデバイス番号を振るために使う事ができます。 何にも接続しないとGNDになるようになっているようですが、微妙な条件があったので安心のためにはGNDと接続してしまうのが良さそうです。

このピンをプルアップすると、STARTコードの次に送るSLA_W, SLA_Rとして送信するコードが"0xA0", "0xA1"から変化します。
今度秋月に注文する時にAT24C256を追加して、バスらしくI2C通信を使ってみようと思います。

SDA/SCLピンのプルアップ

よくデータシートを読めばよかったのですが、SDA, SCLピンのプルアップの必要性に気がつくのに少し時間がかかりました。
プログラムを試す前にデータシートを読み直していて気がつきましたが、判っていれば当然な事だと思います。
しかしわかっていないと延々に見落してしまうところかもしれません。

2009/04/25

BeagleBoardをオーダーしてみる

とりあえずシリアルケーブルやらは手持ちの部品を加工すれば良さそうなので本体のボードのみをオーダーする。

www.digikey.comで途中までオーダー処理を進めていて、どうしても送料が加算されてしまう…。
いろいろ情報漁ってみたけれどjp.digikey.comからオーダーしないと送料無料にならない、なんて知らなかった〜。

しばらく時間がかかると思うので、GW期間中はAVRとInterfaceの付録のLPC2388で遊びましょう。

2009/04/03

7セグLEDとAVR

とりあえずカソードコモンな7セグLEDを3つ並べて、AVRから任意の数字を表示してみた。 元ネタは東芝e-learningコースのカウンタ回路です。
このカウンタ回路は大きいブレッドボード上に組みましたが、配線がスパゲティ…。 2つのLEDを光らせて桁上りが動く事を確認して放ってありました。

LEDについては、2つのLEDを並べて素直にロジックIC4511を2つ載せて4bit入力x2 + 電源2pinの、10bit入力から2桁の数字を出力するような基板を作っていました。
まぁ14ピン使って7セグLEDx2の制御をしないだけマシという程度で、ピンの数は8ピンでも多い上にLEDを追加すると単純に4ピン増えてしまう。
ブレッドボードの時のように配線が原因で挫折してしまいます。

そこで4msec毎に各LEDを順番に選択するようにして、擬似的に2つのLEDを光らせる事にしました。
たぶん父親の世代のマイコンを触った人達は、こういう事をやっていたんでしょう。

このメリットはLEDを追加する度に7セグLEDのGNDに接続するための1ピン追加するだけでよくて、 必要な出力端子は、数字を出力する4ビット分+LEDの数+電源の2ピンぐらい。 4511も一つでいいし。

本当は各LEDのGNDを引き込むためのスイッチとして秋月の"TD62083AP"を1つ使っているので、LED8個までは1ピンの追加だけで良いかな。

まだATmega88pと一緒のブレッドボード上にありますが、4511を1つとLEDを4つぐらい並べて4桁の任意の数字を表示するための基板を作りましょう。10ビット分の端子か…丁度いいかな。

本当は擬似的にLEDを光らせ続けなければいけないので、小さいAVRにこのループを任せて、I2Cなんかで表示させる数字だけ投げるようにしたいなぁ。
今度はI2C通信について勉強しないと、まだまだ壁は高い…。

2009/03/25

ブレッドボード上にAVR-USBを実装してみる

PICでブレッドボード上でライターに接続して失敗しましたが、 あれからAVRにも手を出していろいろ試行錯誤していました。
PICはライターの重みで接触があやしかったので、共立エレショップでQIコネクタのハウジングとコンタクトピンを購入して接続用の短いケーブルを自作しました。
QIコネクタはPCケースの電源ボタンやLEDから出ている線を、マザーボードに接続するために使われているものですが、 受け側だけではなくてピンが出ている方を使うとブレッドボードに差せるので本当に便利です。

AVRにも使って3x2列のハウジングから1ピン毎にバラしたケーブルを使って、ブレッドボードとAVRISP mkIIを接続しています。
かなり便利なのですが「QIコネクタ」という名前にたどりつくまでが長くて、マルツでも千石のWebショップでも扱いはないんですよね。 他の方々はどうしているんでしょう。他に適当なケーブルあるのかなぁ…。

と、ここまで書いていろいろ検索してみると、千石電商には「信号伝達コネクタ」の名前で取り扱いがあり、呼び名はいろいろですがメジャーなようですね。
ブレッドボードとピンヘッダを接続したりするのにも便利なので、また追加で注文しないと…。

2009/03/22

ATmega88pでavr-usbのhid-dataサンプルを動かしてみる

秋月からATtiny2313, ATmega88p、ITプラザからATmega168などを購入して遊んでいたのですが、USB経由で接続してみようとしてみました。
結論からいうとATMega88pについては、AVR StudioでDeviceタイプを”ATmega88” (Pなし)に設定した上でコンパイル、Hexファイル書き込みをして動かしています。

今回使用した機器はこんな感じです。

  • 開発機: Windows Vista (Inspiron 640m)
    • 開発環境:AVR Studio 4.16
    • コンパイラ:WinAVR 20090313
    • AVRライター:AVRISP mkII
    • avrusbライブラリ:avrusb-20081126
  • HIDホスト: Ubuntu 8.04 x86_64版

作成した基板はAVR-USBに付属するイメージ(circuits/with-zener.png)の通りで、AVRISP mkIIに接続するために6ピン端子を付け、ATmega88p用にAVccの接続を加えて、クロックは16MHzの水晶発振子を使っています。(後で20MHzに変更し無事に動きました)

AVR Studio側では適当なプロジェクトを作成して、ダウンロードしたavrusb-20081126の中にあるusbdrvフォルダの中からドキュメントを除いたファイルとexamples/hid-data/firmware/usbconfig.hをコピーしています。
examples/hid-data/firmware/main.cは作成したプロジェクトの.cファイルに内容をそっくりコピーしてコンパイルしました。

AVR Studio側での変更はusbconfig.hの中で、D-,D+にするポートの指定部分だけです。

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      3
#define USB_CFG_DPLUS_BIT       2

ほぼ同じコードで、ATmega168もATtiny2313も動いたのですが、ATmega88pはATmega168と差し替えてもなぜか動かず、試行錯誤していました。
ふと試したATmega88のDeviceタイプでコンパイル、書き込みをしたところホストのUbuntu側で認識されてhidtoolでの読み書きも成功しています。でもこれでいいのかなぁ…。

$ dmesg | tail -3
[325427.701138] usb 3-2.2: new low speed USB device using ehci_hcd and address 111
[325427.800787] usb 3-2.2: configuration #1 chosen from 1 choice
[325427.809613] hiddev96hidraw3: USB HID v1.01 Device [obdev.at DataStore] on usb-0000:00:02.2-2.2

$ sudo ./hidtool read | head -2
0x03 0x33 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
$ sudo ./hidtool write 0xa4 0x20
$ sudo ./hidtool read | head -2
0xa4 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

hidtoolはlibusbを導入したUbuntu側ではmakeしただけで導入できました。
さてこれから解析していかないと。
ATmega88のデバイスタイプにしている事で消費電力に変化があるかわからないけれど、他に何か不具合は起こらないのかな…。

2009/03/13

AE-UM232RとAVRでシリアル通信

AVR ATmega88Pと秋月から買ってきたFTDI製のチップが載っているUSBシリアル変換器、AE-UM232Rを繋げてみました。

データシートではUSARTの項で解説されていて、C言語でのサンプルコードも載っていて、痒いところまで手が届いていそうで、うまく動かない…。
データシートが悪いわけがないので自分のコードをいろいろ変更してみたりして、ブレッドボード上の回路もいろいろ変更してみたり。

結局20MHzのセラロックを使ったところ問題なく接続できたのですが、うーん8MHzの内部RC発振じゃ無理なのかぁ…。9600bpsで接続するなら無理じゃないと思ったんだけどなぁ…。

CKDIV8はオフにしているし、クロックが8MHzで動かない理由がわからない、明日横浜にいく途中で秋葉原によって8MHzの水晶発振子でもかってきて試してみるか。東京週末フリーキップは駅でゲット済みだから準備は万端。
でもその前に、この週末に仕組みのところから解説しているWebサイトをいろいろみて勉強してみます…。

さてさてプログラムの書き込みはAVR Studioが便利なのでWindows VistaなInspiron 640m上で行ないますが、シリアルケーブルの先はLinuxです。
まずはUSBケーブルを接続した後で、dmesgを実行して最近認識されたデバイスの名前を確認します。

$ dmesg | tail -3
[1682131.118019] ftdi_sio 1-2.3:1.0: FTDI USB Serial Device converter detected
[1682131.118056] /build/buildd/linux-2.6.24/drivers/usb/serial/ftdi_sio.c: Detected FT232RL
[1682131.118161] usb 1-2.3: FTDI USB Serial Device converter now attached to ttyUSB0

$ kermit
C-Kermit> set port /dev/ttyUSB0
C-Kermit> set speed 9600
C-Kermit> set carrier-watch off
C-Kermit> connect
あとはキーを打つとエコーバックするサンプルプログラムが動いて、確認完了。 けれどちゃんとAE-UM232RとAVRが接続できていない時も、AE-UM232Rがエコーバックしてしまったので、LEDをPB0に接続して打鍵毎に点滅"PORTB ^= (1<<PORTB0);"するようにしないと、ちょっと不安です。

どうでも良いですが、TeraTermでLinuxに接続してkermitを実行した時に、SKKIME 1.5を使っていると、Kermitを抜ける時に打つ"C-\c"(Control+\ c)が取られてしまい、TeraTermがKermitに伝えてくれませんでした。
MS IME 2007に切り替えて正常に終われましたが、まぁこんな使い方は僕もめったにしないから大丈夫か…。とりあえず勉強しないとだなぁ。

2009/03/02

秋月から購入した"dsPIC33FJ32GP202"を使おうとしてみる

右も左もわからずに始めたPICですが、いまさらだから開き直ってAVRもやろうという事で、今はAVRの環境も準備しています。
まだ仕事との連携は直接ないし、LED光らせる程度ですがいまのうちは楽しいですね。

8bit PICだけなのも寂しいので、秋月の通販でもろもろ購入するついでにdsPIC("dsPIC33FJ32GP202")購入してみました。
とりあえずPICkit2と接続するための基板がないとテストのしようがないので、あいかわらずガラスエポキシ基板にICコネクタと6ピンヘッダ+10kΩ抵抗+データシートで作ってみて困ったことのメモを残します。[dsPIC33FJ32GP202 DataSheet]

  1. 4ピンPGD、5ピンPGCに対応するピンが分からないところ。
  2. PICkit2ソフトウェアから認識されないところ。

PGD, PGCピンがわからない

dsPICのデータシートをみていて、微妙にというか、体裁以外は8bit PICと違うところが多くて困ってしまいました。ざっと眺めると"5.0 Flash Program Memory"で、PGEDx、PGECxのいずれかの組み合せと(Vdd,Vss,MCLR)とで使うと書かれていて、PGC,PGDとして{PGED1,PGEC1}を使う事にしました。

PICkit2から認識されない

ここまで順調にハンダ付けも終って、dsPICをソケットに挿してPICkit2を起動したけれど、どうしても電源周りの接続を確認するようにメッセージが表示されてしまいました。

PIC16F819との違いをみていて、Vssが2つあるのに気がついたので、両方をGNDに接続。
続いて、Vddcoreという端子に気がついてデータシートを調べてみると電源レギュレータの出力を安定させるためにコンデンサを挟んでGNDに接続するとのこと。

データシート曰く、

  • Vddに接続してはいけない
  • 容量は4.7uF~10uF (16V)の範囲
  • 種類はセラミックかタンタル
らしい。

手持ちにはパスコン用の0.01uF、0.1uF(104)ぐらいのものしかないので、中学時代に買ったジャンクのコンデンサ箱を漁って、やたら大きい0.24uFの積層コンデンサをみつけGNDとの間に挟んでみました。

これでうまくPICkit2から認識されましたが、"Flash Program Memory"の項目にはVddcoreの事は触れられてなかったなぁ。レギュレータの端子がGNDに落ちていないくても、コンデンサを直列に入れているから繋がなくても動きそうなもんだけどなぁ…。いろいろ難しい…。
中学の時に2アマに合格したものの、この方面は挫折してソフトウェアな人になったのに、電子回路の勉強しないとだなぁ…。

2009/02/23

PIC16F819、PIC12F629で遊んでみる

組み込み用途としてはAKI-H8みたいな方が便利そうだけれど、転職して回路図をみる機会もでてきたので、電子回路の勉強がてら秋月からPICマイコンを買ってみました。 とりあえず準備した環境は、こんな感じです。

  • OS: Windows Vista SP1 32bit版 (Inspiron 640m)
  • Software:
    • PICkit 2 Programmer v2.60
    • MPLAB IDE v8.20
    • HI-TECH C Lite v9.60PL5

選んだのは18ピンの"PIC16F819"と8ピンの"PIC12F629"の2種類とMICROCHIP製の純正ライターの"PICkit2"。 値段と機能は比較しましたが、それほどちゃんとした基準で選んだわけではないです。

書き込み用のライター機能だけを持つ基板を作成しました。 いちいちプログラムを修正するためにPICをつけかえる事は避けたいですが、ブレッドボード上にピンヘッダをつけたところ、PICkit2との接触が悪いらしく書き込み時にVerifyできない旨のエラーが表示されてしまいました。
そこで最終的にガラスエポキシ基板にICソケットやらライター機能用の結線だけ半田付けをして、PICkit2と接続して使っています。

PICの勉強を一人でやるとはいっても情報を公開している方が大勢いますが、問題もやっぱりあって、IOポートにLEDを接続して光らせるだけでもうまくいかない場合がありました。

"PIC12F629"は3番目のIOポートが入力専用だっていう点と、他のポートから信号を出力させるために"CMCON"レジスタの下位3ビットを立てた上で、"TRISIO"を0で初期化すること。

#include  <htc.h>
__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTDIS & WDTDIS & INTIO);
void  init(void) {
        CMCON = 0b00000111; // 0x07;
        TRISIO  = 0b00000000;
}
void  main(void) {
        init();
        _delay(100);

この他にもC言語(PICC)でプログラムを書いてみましたが、内部クロックで動作させるためにINTIOをセットするとか、外部クロックで動作させるときに、どんなオプションが設定できるかわからず、結局インクルードファイルを直接みてコメントを読んで理解しました。 情報の探し方がわかればいいけれど、PICチップ自体の仕様とC言語からどうやって操作するかはHI-TECH社の作り方との組み合せなので、「PICもC言語も始めてです」、っていう場合には混乱しそうです。
とりあえずPICのDataSheetと、HI-TECH社のPICCのインクルードファイルを比較しながら手探りで進めて行こうとしています。

HI-TECH PICCのQuickstart guideにもサンプルコードが載っていますが、ターゲットのPICによって__CONFIGの後ろとかTRISIOの名前が違ったり、ポート名違ってコンパイルできず最初は困りました。
Cygwinを使って"C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include"の下にあるヘッダファイルにgrepしながら、なんとか進んでいます。 "12F629"のヘッダファイルは、コメントが豊富で良かったですが、"16F819"のは不親切な感じです。いろいろみてみなければ…。

2008/11/08

Ubuntu 8.04 LTSでArduino Diecimilaを使ってみる

後継機としてはDuemilanoveというモデルが出ているらしいけれど、Diecimilaもどっちも発音できないのでどうでもいい。

USBで接続する前にドライバの導入

とりあえずUbuntu 8.04にUSBでArduinoを接続するためのドライバを導入する。 とはいってもしばらく前にBuffaloのSirial-USBケーブルを接続するために導入してしまったので思い出してみる。

$ sudo apt-get install libftdi0
これでいいはず。

UbuntuとArduinoをUSBでつないでみる

まず必要なものは次のようなもの。

  • 公式サイトで配布している開発環境 - Arduino - 0012
  • gccとライブラリ、ヘッダーファイル一式
開発環境はダウンロードして適当な場所に展開して、その中にあるarduinoを起動します。
$ cd /tmp
$ tar xvzf ~/arduino-0012-linux-amd64.tgz
$ cd arduino-0012
$ ./arduino
ここで適当なサンプルプログラムを公式サイトからコピーして実行してみたところ、エラーがいろいろ出てしまいました。とりあえず最初のエラーは"avr-gccがない"で、次に"avr/io.hが発見できません”でした。 これを回避するためにavr関連のパッケージを導入します。
sudo apt-get install avr-libc gcc-avr
ちなみにarコマンドなどが入っているbinutilsはgcc-avrと一緒に導入されます。
avr用のgccクロスコンパイラを導入しただけではヘッダーファイルがなくて怒られてしまいます。

サンプルプログラムの実行

公式サイトでは"Learning"というメニューから用途別のサンプルコードをみる事ができます。最初にあるDigital I/Oの"Blink"というコードをそのまま実行(Fileメニューから"Upload to I/O Board"を選択)してみます。
コードと一緒にある写真ではLEDをポート13番にさしていますが、Diecimila君はボード上にLEDがあるためLEDを別途接続しなくても確認できます。 手持ちのLEDをGNDとポート13に接続したところ明るく点滅し、オンボードのLEDは暗くなりました。

2008/11/07

コンビニ受け取りの荷物が行方不明に…

ちゃんと出てきたから良かったのですが、某所で購入したArduino Diecimila君を受け取るために某宅急便会社のコンビニ受け取りサービスを使いました。月曜日に不在通知が届いたから、週末まで待つのもなぁ、と思ってコンビニで受け取る事にしたところ一時行方不明に…。いつも通りに土曜日の午前中に届けてもらえばよかった。

仕事帰りに受け取りに行ったところ店員と責任者らしき方の二人が出てきて当店にはそのような荷物はない旨の回答をもらいました。まぁWebで地図に出てきた店をクリックして指定したとはいえコンビニの店名か場所を間違えたかもしれないし、と思って一時帰宅。 けれどメールチェックの住所をGoogle Mapでみても、どうも勘違いではなさそう。

結局コールセンター経由で探してもらう事にしました。 そこでも配達員はコンビニに確かに置いたし、電話で近くのコンビニに聞いたけれど、どこにもないって事になりました。それでも人を送って探しますという事で、折り返し発見した旨の返事がきました。

でもね、コンビニで最初に物がないっていう返事をした人もしらんぷりだし、こうなってくると配達員がそっとコンビニに置き忘れた荷物を持っていったのかもしれない。 横浜に住んでいた時は便利に使ってたんだけどなぁ。田舎だからこんなサービス使うのは僕だけなのかなぁ。 まぁ対応にはそれほど問題はなかったけれど、コンビニに荷物を預けるのは止める事にしよう。

この事件の隙をついて実家から来た荷物はすぐに営業所預かりにしました。今度はどうかなぁ…。ちなみにArduino君はlinuxに繋いでいて、LEDを光らせながら元気に動いています。