PICkit2でPIC12F1822に書き込む

秋月に行ったついでにPIC12F1822(単価¥80)を買ってみました。

目的は「なるべく小ピンかつ外付け部品なしで115.2kbpsのシリアル送受信をしたい」ということからです。

で、調べていたら、PICkit2でPIC12F1822に書き込むには一工夫必要なようです。

PICkit2(書き込みソフトの方)を立ち上げた後、「Help」→「About」としたときに、ダイアログの右上に表示される「Device File Version」が1.62以降でなければならいようです。

Microchip社のPICkit2のページの右のほうに「Device File 1.62.xx」というリンクがあるので、リンク先のZIPファイルを保存します。保存したZIPファイルの中の「PK2DeviceFile.dat」で「C:\Program Files\Microchip\PICkit 2 v2」フォルダの中の同じファイル名のものを上書きすると、認識するようになりました。

Core2Quadマシン静音化(失敗編)

前回、実験に使ったFANは7V 0.04Aのもので、これを9V電源でテストしていました。

そこで、12VのパワーのあるFANをちゃんと回せる回路なのかが気になって、秋月電子で適当に12V電源の3線タイプのFANを2個買ってきました。

で、さっそく2個のうちの1個の山洋電機製のFANをブレッドボードの回路につないで、電源を12Vに変更してみると、爆音を立てて回り始めます。(電源投入直後は全力で回るようプログラムを組んである)

・・・・・・・が、爆音を立てて回り続けるだけで、回転数が下がる気配がありません。オシロで波形をみると、センサからパルスが出ておらず、Lのままになっているように見えます。

もうひとつのミネベア製のFANも同様につないでみましたが、こちらもやはり爆音を立てて回り続けるばかりでまったく回転数が落ちる気配がありません。

で、山洋の型番を頼りにGoogleさんに聞いてみたところ、行き着いたのが、この技術資料です。

こちらによると、センサつきFANは以下の3種類があるようです。

  • パルスセンサ(回転信号出力型)
    モータ1回転につき、2周期の矩形波を出力する
  •  ロックセンサ(回転停止検出型)
    モータが回転しているか、停止しているかを検出して出力する
  •  ロースピードセンサ(回転速度検出型)
    モータの回転速度が設定回転速度より低下したときに出力する

ということで、FANの羽根を無理やり押さえつけて止めてみたら、信号が出力されました。これでは速度パルスを期待して速度制御しようとしても全開で回り続けるのは当たり前です・・・・orz

FreeNASアップデート

嫁さんが「(FreeNASに保存してある)写真にアクセスできない」というので、そんな馬鹿な・・・・と思いながら、管理コンソールにアクセスしてみたら、確かに応答がありません。直接コンソールをみても反応なしです。仕方がないので、強制電源OFF/ONしたら復帰しました。

で、調べてみると、いまインストールしてあるFreeNASは8.0.2なのですが、最新は8.0.4のようですので、アップデートしてみることにしました。

・・・が、その前に、別のHDDに中身をバックアップします。

いつものようにBunBackupを使って、Windows7マシンにつけてある外付けHDDに中身をバックアップします。やはり誤操作ですべてを失うリスクがありますからね。

8.0以降からのアップグレードの手順はこちらにあるようです。基本的な手順は、

  1. 設定ファイルの保存
  2. CDからフルインストール
  3. 設定ファイルの復元

のようですが、WebGUIからもアップデートできるようです。ただ、この場合は設定ファイル保存後に、一旦サービスを停止して、アップデート、再起動・・・という手順を踏むようです。(結構めんどくさい感じ)

で、CD-ROMからアップデートしようかと思ったのですが、結局WebGUIからアップデートをかけてみることにしました。

思ったほど手順は難しくありません。

  1. アップデート用のファイルのダウンロード
    こちらからアップデートに必要なファイルをダウンロードします。 WebGUIでのアップデートに必要なファイルは拡張子がxzになっているものです。あわせて、sha256のチェックサムファイルもダウンロードしておきます。
  2. ファイルの正当性チェック
    「$ sha256sum FreeNAS-8.0.4-RELEASE-x64.GUI_Upgrade.xz」
    として、チェックサムが一致するか確認します。(GUIの中でもチェックされるようです)
  3.  設定ファイルのバックアップ
    一応、設定ファイルをバックアップします。万が一WebGUIでアップデートするのに失敗した際に必要になるのでしょう。(自分は必要ありませんでした)
    Webの管理コンソール画面で、「システム」→「設定」→「一般的な設定」の中に、「設定のダウンロード」というボタンがあるので、これを押すと設定ファイルを保存できます。
  4.  サービスの停止
    「サービス」→「サービスの制御」でONになっているサービスをすべてOFFに変更します。
  5.  コンソール表示の設定
    「システム」→「設定」→「高度な設定」 で「フッタへのコンソールメッセージの表示(UIのリロードが必要)」にチェックを入れて、「Save」を押します。その後、ブラウザでリロードボタンを押すと、下の方にコンソールメッセージが表示されるようになります。
  6. ファームウェアのアップデート(一時保存場所の設定)
    同じ画面(「システム」→「設定」→「高度な設定」)で、「ファームウェアアップデート」を押すと、アップデートファイルを一時保存する場所を聞いてくるので、適当に設定します。(自分はデフォルトのままにしました)
  7. アップデートするファイルの指定
    アップデートするファイルがどこにあるか聞いてくるので、1でダウンロードしたファイルを指定します。併せて、sha256のチェックサムの結果もコピー&ペーストで入力します。
  8. あとはひたすら待つ
    途中、勝手に2回リブートがかかります。再起動の途中でブートメニューが一瞬表示されますが、触る必要はないようです。(自分は触りませんでした)
    コンソール画面を見ていると、2回リブート後に通常の「Console setup」の画面になり、アップデートが終了します。
  9. 停止したサービスを再開
    4で停止したサービスを再開します。

で、意外に簡単に終わりました。

 

Core2Quadマシン静音化(メモ)

マシン静音化工作に関連するものをメモっておきます。随時内容を追加していきます。

1.FANに使われるコネクタの品番(2012/03/23記載)

シリコンハウス共立さんのブログに情報がありました。

  • MOLEX 5051-3 (3Pレセプタクルハウジング=メス側)
    51191-0300を使っている場合があるみたい(3/31追記)
    マルツではケーブル付きで 売っているみたい
  • MOLEX 5159TL (専用コンタクトピン)
    →50802-8000を使っている場合があるみたい(3/31追記)
  • MOLEX 5045-3A (直型ポスト:マザーボードについているやつ)
    →5045-3Aは旧番号で、 22-04-1031が新しい製品番号みたい(3/31追記)
    図面を見ると、2.5mmピッチのみたい。Eagleのライブラリcon-molexの中に、
    22-?-03 として登録されているので、そのまま使える!
  • MOLEX 5046-3A (曲型ポスト:上記のアングルタイプ)
  • MOLEX 5240-31 (3Pプラグハウジング=オス側、ケーブル取付用)
  • MOLEX 5241TL (専用コンタクトピン)

 2.PCB製造メーカーの調査(2012/03/24記載)

調べてみると、こんな感じ。

  • OLIMEX
    定番ですね。160mm×100mmの両面で30ユーロ+送料8.5ユーロ。
    これまではこのサイズに収まれば複数のデザインを面付けしてくれたみたいだけど、2012/03/15からは複数デザインの面付けが有料(5ユーロ/ファイル?)になったようです。なんでも拙い設計の細かい基板をたくさん送ってくる初心者がいて、面付けにかかる時間が無駄だから、とのこと。ちなみに自分で面付けする分には無料とのこと。
  • FusionPCB
    5cm×5cm両面だと10枚で$9.90みたい。送料込みで$13.42だった、なんて話も。
    今回のものは5cm角なんて余裕で収まってしまうだろうから、問題無し。
    パターン幅やドリルの制限も緩いようだし、Eagle用のDRCファイルもあるようだ。
    しかもルーター切り出しもできるので、好きな形の基板が作れるようだ。板厚も選べるらしい。
  • CustomPCB(=SILVER CIRCUITS?)
    6.3inch×4inch(約15cm×10cmくらい?)の2層基板で$18/1枚のようです。
    パターン幅やクリアランスは最小7mil、最小穴は12mil(=0.3mm?)、最小シルク幅6miilみたい(ここを参照)。
  •  Advanced Circuits
    アメリカの会社のようです。 60平方インチの2層基板で$33/pcsのようですが、最小発注数量4pcsなので、最低でも$132かかります。設計ルールは line/space =6mil/6mil。最小穴は15milのようです。
  • ハッピーPCB
    検索で引っかかりました。日本でサービスをしているようですが、製造は韓国のようです。
  • P板.com
    言わずと知れたP板.com。

やっぱりFusionPCBですかね。もうちょっと調べてみましょう。

Core2Quadマシン静音化(実験編)

時間があいてしまいましたが、Core2Quadマシンを静音化するための実験をしてみました。

ブレッドボードに以下の回路を組み立てました。回路図作成にはBSch3Vを使わせていただきました。

回路自体はオーソドックスな降圧型のDCDCコンバータです。PIC12F683のCCP機能を使ってPWMの波形を生成し、それでPch-FETを駆動しています。最初は直接回転数をデューティー比にフィードバックしようかと思ったのですが、うまくいかないのでコンバータの出力電圧を分圧してADコンバータで取り込んでPWM信号のOFF/ONにより電圧を制御してフィードバックしています。そして電圧制御の目標をFANの回転数に応じて変化させています。回転数の目標はもちろんLM35で取得した温度に基づいて決定しています。ただ、ソフトウェア処理になっている関係で追従はかなり遅くなります。・・・が、ケースFANなので問題はないでしょう。

FANの回転数センサの信号はかなりノイズがのるので、PICのソフトウェア処理でノイズ除去をかけて、ポートに再出力してマザーボードに返します。これでFANの回転数がマザーボードからも見えるようになります。

ソフトウェアは1ms周期のタイマ割り込みを基準に動作させています。割り込み処理ルーチン内で以下の処理を行っています。

  • 1ms刻時
  • 温度と電圧を交互にAD変換
  • FANのセンサのノイズ除去と回転量検出(積算)

メインループでは以下の処理を行っています。

  • モニタLEDの表示(1ms周期)
  • 出力電圧の安定化制御(PWM信号のOFF/ON) (1ms周期)
  • 回転速度の計算と、目標出力電圧の決定 (2秒周期)
  • 温度に基づく目標回転速度の決定 (2秒周期)

後半の処理は実機にあわせてチューニングが必要なので、現時点ではいい加減なものになっています。

rkhunterのwarning

久しぶりに電源を入れたLinuxMint11環境で rkhunter -c を実行したら warning がたくさん出てきました。調べてみると、

$ sudo rkhunter -c

でチェックを行いますが、時々メンテナンスをしてやらないといけないようです。

普通行う作業としては、rootkit検索のためのテキストデータファイルのアップデートを

$ sudo rkhunter –update

で実施します。また、ファイルに変化がないかどうかを調べるためのデータベースファイルのアップデートを

$ sudo rkhunter –propupd

で行います。

ただし後者は無闇に実行すると感染したファイルを比較対象のデータベースに登録してしまうリスクがあります。感染ファイルをデータベースに登録してしまうとチェックの意味がなくなりますので要注意です。信頼できるところからチェックの対象となるファイルのアップデートがかかったときのみ実行するべきでしょう。

Core2Quadマシン静音化(調査編)

最近使っていないCore2Quadマシン(マザーボード:GA-G31M-ES2L、CPU:Core2 Q6600、OS:WindowsXP Home Edition)があります。なぜ使っていないかというと、はっきりいって「うるさい」のです。てっきり、CPUファンがうるさいのかと思っていたのですが、必ずしもそうではないようなので調べてみました。

このマシンにはCPUファンの他にフロントにケースファンがついています。それもかなり大きな多分12cmくらいあるものです。

まずFANの回転数を調べるためにOpen Hardware Monitorをダウンロードしてきて実行してみました。

FAN1が1640rpmくらい、FAN2が1380rpmくらいで回っています。機内温度は34℃くらい、CPU温度は45~50℃くらいであることがわかります。

次に、CPUに負荷をかけるためにIntelBurnTestにかけてみます。

しばらく放置すると、

となって、CPU温度が73℃、機内温度が60℃に達します。このとき、FAN1は2800rpm付近まで回転数が上昇していますが、FAN2は1375rpmでほとんど変わっていません。つまり、FAN2がケースFANで回転数は制御されておらず、常に全力で回っていてうるさいのだと思われます。

こいつ(ケースFAN)を何とかすれば静かになりそうです。(まあ、12cmもあるファンが1400rpmで回ってたら風切音がうるさくて当たり前のような気がしますが)

Android SDK in Linuxで実機デバッグ環境構築

http://developer.android.com/guide/developing/device.html#setting-upのページに沿って、Linux環境での実機デバッグに挑戦します。デバッグターゲットはPocketWifi S(S31HW)です。

1.Android Manifestでアプリケーションをデバッグ可能に設定する

eclipseにてパッケージエクスプローラにて「AndroidManifest.xml」を選択し、真ん中の「Android Manifest Application」にて下の方の「「ア」アプリケーション」を選択します。

その中の「Debuggable」の項目を「true」にします。結果はAndroid Manifext.xmlに

 android:label="@string/app_name" android:debuggable="true"

という記述が追加されているかで確認できます。

2.Androidの実機側でUSBデバッグを許可する

「設定」→「アプリケーション」→「提供元不明のアプリ」にチェックを入れる。

「設定」→「アプリケーション」→「開発」→「USBデバッグ」にチェックを入れる。

3.udevルールを作成する

(1)lsusbコマンドでUSBベンダIDを調べる

Androidデバイスを接続し、lsusbコマンドで接続されているデバイスを表示する。

$ lsusb
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
            :
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 12d1:1038 Huawei Technologies Co., Ltd.
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub

青の行がHuaweiなので、この行がPocketWiFi Sです。そしてベンダIDは赤字の「12d1」であることがわかります。

(2)udevルールファイルを作成する

ルート権限で「/etc/udev/rules.d/51-android.rules」を作成し、その中身を、

SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666", GROUP="plugdev"

とする。作成したファイルは、アトリビュートを変更しておく。

$ sudo chmod a+r /etc/udev/rules.d/51-android.rules

 (3)udevルールファイルを再読み込みさせる

udevadmでルールを再読み込みさせる。

$ sudo udevadm control --reload-rules

この後、一旦PCからAndroid機を取り外し、再度取り付けます。

4.実機でデバイスが認識されているか確認する

adbコマンドでデバイスが認識されているか確認してみます。

$ adb devices
List of devices attached
5Cxxxxxxxxxx device

となって、2行目の方(5Cで始まる行)で認識されていることが確認できます。

 5.Eclipse上で「実行」してみる

実行すると、PocketWiFiS上で動きました!

 

STM32 Value Line DiscoveryをLinuxで開発する(3)

こんどは、Eclipse Plug-in をテストしてみます。参考にしたのは、http://gnuarmeclipse.sourceforge.net/wiki/Main_Pageです。EclipseはすでにAndroidの開発環境の構築の際にインストール済みなので、そこにARMのPlug-inをインストールしてみることになります。

1.EclipseのPlus-inのインストール

http://gnuarmeclipse.sourceforge.net/wiki/Plug-in_installationに沿って、プラグインをインストールしていきます。

  1. 「ヘルプ」→「新規ソフトウェアのインストール」で「インストール」ウインドウが開きます。
  2. 「追加」ボタンを押し、「リポジトリの追加」ダイアログでロケーションに「http://gnuarmeclipse.sourceforge.net/updates」を入力してOKを押します。
  3. しばらくすると、名前のところに「CDT GNU Cross Development Tools」というグループが表示されるので、グループのチェックボックスはチェックなしのまま、1階層下を開き、「GNU ARM C/C++ Development Support」にチェックを入れます。チェックを入れたら「次へ」を押します。
  4. インストールする項目の確認画面が表示されるので「次へ」を押します。
  5. ライセンスの同意確認画面がでてくるので、同意して「完了」を押します。
  6. ソフトウェアのインストールが実行されますが、途中で署名なしコンテンツを受け入れるか確認する警告が表示されますので、「OK」を押します。
  7. Eclipseの再始動確認画面がでてくるので、画面に従います。

2.プロジェクトの生成とToolChainの設定

プロジェクトを生成し、http://gnuarmeclipse.sourceforge.net/wiki/Featuresを参考にツールチェーンの所在をCDTに教えます。

  1. C言語のプロジェクトとして新規のプロジェクトを生成します。
  2. プロジェクトタイプは「ARM Cross Target Application」とし、ツールチェーンは「ARM Linux GCC(Sourcery G++ Lite)」とします。 (summon-arm-toolchain は同じarm-none-eabi-gccなので)
  3. 構成の選択の拡張設定の中の「C/C++ビルド」の「環境」で「すべての構成」を選択した上で、「追加」を押して「名前」に「PATH」を追加し、「値」に「~/sat/bin」を展開した値を追加して、ツールチェーンの場所を知らせます。(展開した値でなければうまく行かないようです)
  4. 「OK」、「完了」、「はい」で、プロジェクトを生成します

3.ソースファイルの追加とビルド

  1. ソースの追加で、main.cを追加します。
  2. stlink/example/blink/main.c の内容をコピー&ペーストします
  3. 「プロジェクト」→「プロパティ」で「環境」の「C/C++ビルド」の「PATH」に「~/sat/bin」を展開した値が入っているのを確認します。
  4. 同じく、「ビルド変数」に「~/sat/bin」を展開した値が入っているのを確認します。

これでビルドすると一応コンパイルされるのですが、まず、サンプルはどのボード向けのコンパイルをするか指定するマクロ定義がないのでエラーになります。

さらに、コンパイルできても、リンク時のマップ指定(何番地からの前提でリンクするか)を指定する箇所がわかりません。素直にMakefileがある前提(自分で作る前提)のプロジェクトとしたほうが良さそうです。

・・・・とりあえず、ここまでで今日は挫折・・・orz

STM32 Value Line DiscoveryをLinuxで開発する(2)

続きです。

2.stlinkのインストール

gitでリポジトリをクローンします。

~/stm32-linux $ mkdir stlink
~/stm32-linux $ cd stlink/
~/stm32-linux/stlink $ git clone git://github.com/texane/stlink.git
Cloning into stlink...
remote: Counting objects: 3515, done.
remote: Compressing objects: 100% (1228/1228), done.
remote: Total 3515 (delta 2276), reused 3434 (delta 2204)
Receiving objects: 100% (3515/3515), 12.63 MiB | 45 KiB/s, done.
Resolving deltas: 100% (2276/2276), done.
~/stm32-linux/stlink $

パッケージマネージャで libusb-1.0 と pkg-config がインストールされていることを確認する必要があります。自分の場合は一見libusb-1.0がインストールされているように見えたのですが、実際にmakeするとエラーになったので、

$ sudo apt-get install libusb-1.0

でlibusb-1.0をインストールしました。

その後、コンパイルします。コンパイルは make 一発です。

~/stm32-linux/stlink/stlink $ make

STM32 Value Line Discoveryを取り付けます。・・・が、こいつのSCSIエミュレーションはだめだめらしいので、システムから無視させるために、

~$ sudo modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i

とすることになっていますが、エラーになってしまいます。しかも、アンマウントしても、すぐに復活してしまいます。恒久策としては

~$ sudo cp stlink_v1.modprobe.conf /etc/modprobe.d
~$ sudo modprobe -r usb-storage && modprobe usb-storage

なのですが、それでもエラーになってしまいますので、一旦強制的に挿抜しました。

次に、udevルールをセットアップします。

~/stm32-linux/stlink/stlink $ sudo cp 49-stlinkv*.rules /etc/udev/rules.d
~/stm32-linux/stlink/stlink $ sudo udevadm control --reload rules

ここでSTM32 Value Line Discoveryを取り付けると、/devの下が

~/stm32-linux/stlink/stlink $ ls -la /dev/stlink*
lrwxrwxrwx 1 root root 15 2012-02-08 02:40 /dev/stlinkv1_2 -> bus/usb/001/005

というようになります。

3.弄ってみる

gdbserverを起動してみます。

~/stm32-linux/stlink/stlink $ ./gdbserver/st-util -1 /dev/stlinkv1_2
non-option ARGV-elements: /dev/stlinkv1_2
2012-02-08T02:44:28 INFO src/stlink-sg.c: Current mode unusable, trying to get back to a useful state...
2012-02-08T02:44:28 WARN src/stlink-sg.c: received tag 0 but expected 3
2012-02-08T02:44:28 INFO src/stlink-common.c: Loading device parameters....
2012-02-08T02:44:28 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device, id 0x10016420
2012-02-08T02:44:28 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-02-08T02:44:28 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
Chip ID is 00000420, Core ID is 1ba01477.
KARL - should read back as 0x03, not 60 02 00 00
init watchpoints
Listening at *:4242...

とりあえず正しく認識して、gdbserverが起動しているようです。

4.何か動かしてみる

gdbserverが動いたままの状態にして、tutorialに沿って、Lチカのサンプルを動かしてみます。

まず、サンプルプログラムをコンパイルします。(赤字が入力箇所です)

~/stm32-linux/stlink/stlink/example/blink $ PATH=~/sat/bin:$PATH
~/stm32-linux/stlink/stlink/example/blink $ make
arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m3 -DCONFIG_STM32VL_DISCOVERY=1 main.c -o blink_32VL.elf
arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m3 -DCONFIG_STM32L_DISCOVERY main.c -o blink_32L.elf
arm-none-eabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -Wl,-Ttext,0x20000000 -Wl,-e,0x20000000 -mcpu=cortex-m4 -DCONFIG_STM32F4_DISCOVERY=1 main.c -o blink_F4.elf
main.c:83:6: warning: conflicting types for 'main'
main.c:53:2: note: previous implicit declaration of 'main' was here

次に、gdbserverに接続して、ダウンロード&実行します。

~/stm32-linux/stlink/stlink/example/blink $ ~/sat/bin/arm-none-eabi-gdb
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-none-eabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) target extended localhost:4242
Remote debugging using localhost:4242
0x08000b4c in ?? ()
(gdb) load blink_32VL.elf
Loading section .text, size 0x40 lma 0x20000000
Start address 0x20000000, load size 64
Transfer rate: 810 bytes/sec, 64 bytes/write.
(gdb) continue
Continuing.
Cannot access memory at address 0x7bf35cc8

ボード上のLEDがチカチカし始めましたので成功です。