2014/12/23

ZYBO Base System Design (Vivado 2014.4) - 2

はじめに

本投稿は,ZYBO Base System Design (Vivado 2014.4) - 1の続きです. Bitstreamの生成まで完了していますので,Xilinx SDK 2014.4を使用してソフトウェアの準備を進めます.

作業備忘録
  1. Xilinx SDKを起動する
  2. 「zybo_bsd.xpr」を開いた状態のVivadoで「File」 - 「Export」 - 「Export Hardware」をクリックします. 「Export Hardware」ウィンドウにおいて,「Include bitstream」にチェックを入れ,「OK」をクリックします.

    Export Hardware
    「File」 - 「Launch SDK」をクリックします. 「Launch SDK」が開きますので,「OK」をクリックします. Xilinx SDKが起動します.

    Export Hardware
    • Xilinx SDKが起動しないときは…
    • Vivadoをインストールした際に,SDKがインストール項目として選択されていなかった可能性があります. 「スタート」 - 「すべてのプログラム」 - 「Xilinx Design Tools」 - 「Vivado 2014.4」 - 「Add Design Tools or Devices 2014.4」から,インストーラを起動して追加インストールが可能です.なお,最初にインストールした際と同じディレクトリに,インストーラのファイルが展開されている必要があるようでした.

      Vivado 2014.4 Installer - Select Extra Content
  3. プロジェクトを新規作成する
  4. 「File」 - 「New」 - 「Application Project」から,プロジェクトを新規作成します. 「C:\work\zybo_base_system\SDK\README.txt」にしたがい,プロジェクト名は「base_demo」としました. 「Next」をクリックします.

    New Project
    「Empty Application」を選択して,「Finish」をクリックします. 「base_demo」プロジェクトが作成されます.

    New Project
  5. ファイルを追加する
  6. 「Project Explorer」で「base_demo」を展開し,「src」ディレクトリの上で右クリックします. 右クリックメニューから「Import...」をクリックし,「Import」ウィンドウを開きます. 「General」 - 「File System」を選択し,「Next」をクリックします.

    Import
    「From directory:」として「C:\work\zybo_base_system\SDK\base_demo」を選択し,すべてのファイルにチェックを入れます. 「Overwrite existing resources without warning」にもチェックを入れ,「Finish」をクリックしました.

    Import
    ファイルがインポートされ,自動的にBuildが開始されます.
  7. ソースコードを修正する
  8. undecidedly氏の「ZYBOの実験」で紹介されているように,ソースコード中の1行をコメントアウトしないとデモが動作しませんでした. 具体的には,「main.c」の82行目を,次のようにコメントアウトしました. 修正後,自動的にBuildが開始されない場合は,「Project」 - 「Build All」をクリックしました.
続きは…

ZYBO Base System Design (Vivado 2014.4) - 1

はじめに

ZYBO購入後,最初にZYBO Base System Designをやってみました. ZYBO Base System Designは,Digilentが配布しているリファレンスプロジェクトのようです. 下記ページにてダウンロードできます.

他に参考にしたWebページは,marsee氏の「FPGAの部屋」です. ZYBO Base System DesignにはVivado 2013.4用のプロジェクトファイルが付属していますが,marsee氏はVivado 2014.1を使用されていたので,私はVivado 2014.4でやってみることにしました.

事前準備
microSDHCのフォーマット

購入したmicroSDHCカードをフォーマットしておきました. 「デバイスの既定値を復元する」をクリックした後,クイック フォーマットを実行しました.


フォーマット
ドライバのインストール

UARTに必要なドライバをインストールしておきました.


ドライバー ソフトウェアのインストール
Tera Termのインストール

Tera Termなどのターミナルソフトウェアが必要になります. 私はインストール済みでしたので,設定のみ変更しました.


Tera Term: シリアルポート 設定
作業備忘録
  1. プロジェクトディレクトリを準備する
  2. 「zybo_base_system.zip」を展開し,できるだけ浅い階層のディレクトリにファイルを置きます. Windowsはファイルパスに文字数制限がありますが,Vivadoがディレクトリを自動生成する際に,この制限を超過しないようにするためです. 私は,「C:\work\zybo_base_system」に,展開してできたディレクトリの「source\vivado\」以下のファイル(「hw」および「SDK」)を移動しました.
  3. Vivadoを起動する

  4. Vivado
  5. プロジェクトを開く
  6. 「Open Project」から「C:\work\zybo_base_system\hw\zybo_bsd\zybo_bsd.xpr」を開きます. 下図のようなウィンドウが開きますので,「Automatically upgrade ...」を選択して「OK」をクリックします.

    Vivado
    「Default Library」ウィンドウも表示されましたが,「OK」をクリックしました.

    Vivado
  7. Upgrade IP
  8. 「Project Upgraded」ウィンドウが開きますので,「Report IP Status」をクリックしました.

    Vivado
    「Upgrade Selected」をクリックしました.

    Vivado
    「OK」をクリックしました.

    Vivado
    Critical Warningが出ましたが無視しました. 以降の「Generate Block Diagram」でもCritical Warningが出ましたが,同様に無視しても問題はありませんでした.
  9. Generate Block Diagram
  10. 「Flow Navigator」の「IP Integrator」 - 「Generate Block Diagram」を実行しました.
  11. Generate Bitstream
  12. 「Flow Navigator」の「Program and Debug」 - 「Generate Bitstream」を実行しました. エラーなく,Bitstreamを生成できました.

    Vivado
続きは…

2014/12/22

ZYBOを買ってみました

ZYNQ開発,始めます
はじめに

FPGA SoCを使用した組込み開発の勉強をしようと思い,ZYBOに手を伸ばすことにしました. FPGA評価ボードとしては安価ですが,現在の私からすると完全に宝の持ち腐れです. 使いこなせるように,コツコツ頑張っていきたいと思います….

ZYBOを選んだ理由

FPGA SoCとしては,XilinxのZYNQのほか,AlteraのCyclone V SoCが代表的なデバイスとして挙げられます. これらのFPGA SoCを使用した評価ボードは各社から発売されていますが,私はZYNQの評価ボードの一種であるZYBOを購入しました.

ZYBOを選んだ理由は,日本語情報が入手しやすいこと,自作回路を接続しやすいことの2点です. 既に,marsee氏の「FPGAの部屋」などで事例が紹介されているので,初心者の私にも参考になる情報が得やすいと考えました. また,ZYBOの入出力ピンはPmod準拠のピンソケットのため,自作回路を接続しやすそうだったことも大きな理由です. 2.54mmピッチなので,ハンダ付けも容易です. 他の購入候補としてはParallellaがありましたが,ParallellaのGPIOはピッチが細かく,自作回路の接続は簡単ではないと考えました. ハードウェア構成や製品コンセプトが異なるため単純には比較できませんが,ZYNQと自作回路を組み合わせて何かを作ろうと考えたとき,価格がお手頃で一番扱いやすそうなのがZYBOでした.

日本国内でも取扱店がいくつかありますが,他の電子部品と一括購入しやすかったので,私は秋月電子通商で購入しました.

開封

とてもコンパクトかつ,ペラペラで頼りない紙箱に入っています.


ZYBO

開封した様子です. ZYBO本体のみしか入っていません. ケーブル,説明書や保証書の類は一切入っていません.


ZYBO
同時に購入したもの / 購入したほうが良いもの

ZYBOは,付属品が一切ありません. 開発に必要で,手元にないものは同時に購入しておかねばなりません.

  • microUSBケーブル
  • 電源供給やデータのダウンロードに必須です. 私は,秋月電子通商で同時購入しました.
  • HDMIケーブル
  • 必須ではないかもしれませんが,デモを動作させるために必要です. もちろん,HDMI入力端子を備えたディスプレイがないといけません.
  • ACアダプタ
  • microUSBケーブルによる電源供給では不足する場合に,ACアダプタの接続が必要です. 出力がDC5V,DCジャックがφ2.1でセンタープラスのものであれば良いようです. 私は,手持ちの安定化電源から電源供給を行っています. デモを動作させるためにも必要ですので,必ず準備したほうが良さそうです.
  • microSDHC
  • すぐに必要にはなりませんが,組込みLinuxで遊ぶためには必要になりそうです. 記憶容量は8GB,Class10のものを購入しておきました.
動作確認

電源を入れるだけでデモが動作するようなので,動作確認をしました.microUSBケーブル,HDMIケーブルとACアダプタを接続して電源を入れると,ディスプレイに模様が描画されました.


ZYBO

2014/12/21

Xilinx Vivado WebPACKのインストール方法

はじめに

FPGA SoCの勉強をしようと考え,ZYBOを購入したので,早速Vivadoをインストールしてみました. 初心者なので誤った記述が含まれている場合があります. 気づかれた方は,コメントなどでご指摘いただければ幸いです.

インストール環境

インストール環境は下記のとおりです.

OS Microsoft Windows 7 Professional x64 Service Pack 1
Vivado Vivado 2014.4 WebPACK Edition (Windows)
Download Type Windows用Vivado 2014.4のフルイメージ (SDK 付き)
フルイメージのダウンロード

Vivadoのインストーラはスタンドアロン ウェブ インストール クライアント(Lightweight Installer)とフルイメージ(Full Product Installation)の2種類があるようです. 今回は,Windows用のフルイメージをダウンロードすることにしました. ダウンロードにはアカウント登録が必要です. 下記リンクからダウンロードページに飛ぶことができます.

ファイルの展開

フルイメージはTAR/GZIP (.tar.gz)形式で圧縮されています. 7-Zipなどを使用して,ファイルを展開してください. GZIP圧縮の展開とTAR圧縮の展開,計2回の展開処理が必要です.

インストール作業
  1. 「xsetup.exe」を「管理者として実行」する
  2. 「Windowsセキュリティの重要な警告」などが表示された場合は,「アクセスを許可する」を選択します. インストール作業中は,セキュリティソフトウェアを一時無効にすることが推奨されているようです.

    インストール作業
  3. 「Next」をクリックする

  4. インストール作業
  5. 3箇所の「I Agree」にチェックを入れ,「Next」をクリックする

  6. インストール作業
  7. 「Vivado WebPACK」を選択する
  8. 今回は無償版のWebPACKをインストールします. WebPACKにはデバイス制限がありますが,ZYBOに搭載されているデバイスはサポート範囲内ですので,基本的には問題ないと思います.

    インストール作業
  9. 「Software Development Kit」にチェックを入れ,「Next」をクリックする
  10. 私はここでミスをしました. デフォルト設定ではSoftware Development Kit (SDK)にチェックが入っていなかったのです. 後で追加インストールすることもできますが,ここでチェックを入れておきましょう.

    インストール作業
  11. 「Next」をクリックする
  12. デフォルト設定を変更する必要性は感じませんでした.

    インストール作業
  13. 「Yes」をクリックする
  14. 初めてXilinxの開発ツールをインストールする場合は,インストールディレクトリが新規作成されます.

    インストール作業
  15. 「Install」をクリックする
  16. スクリーンキャプチャには含まれていませんが,「Design Tools」にSDKが含まれているはずです. 「Install」をクリックするとインストールが開始されます. インストール中にはドライバのインストール操作を促すウィンドウなどが表示されますので,進捗状況を適宜チェックしてください.

    インストール作業
  17. インストール完了
  18. インストールが完了すると下図のようなウィンドウが表示されますので,「OK」をクリックして閉じます. このウィンドウはVivado License Managerなどの裏に隠れていることがあるようです. 引き続き,ライセンス登録作業を行います.

    インストール作業
ライセンス登録作業

インストールが完了すると,Vivado License Managerが自動的に起動するようです. 下図のような「Windowsセキュリティの重要な警告」などが表示された場合は,「アクセスを許可する」を選択します.


ライセンス登録作業
  1. 「Get Free Licenses」を選択し,「Connect Now」をクリックする
  2. ブラウザが起動し,XilinxのWebページに飛びます.

    ライセンス登録作業
  3. 「Xilinx Licensing Site」にサインインする

  4. ライセンス登録作業
  5. 登録情報の確認および更新を行い,「Next」をクリックする
  6. 私は,氏名や住所を英語で記入しています. 日本語で記入するとエラーになったような記憶があります.

    ライセンス登録作業
  7. Vivado WebPACKのNode-Locked Licenseを生成する
  8. 「Activation Based License」の「Vivado WebPACK License」にチェックを入れ,「Activate Node-Locked License」をクリックします. 続いて,「Generate Node License」ウィンドウが表示されるので,「Next」をクリックします. 「Node」欄には,VivadoをインストールしたWindows PCのコンピュータ名が表示されているはずです.

    ライセンス登録作業
    内容を確認して,「Next」をクリックします.

    ライセンス登録作業
  9. ライセンス登録完了
  10. ライセンス登録が完了しました. ライセンスファイルがメールで送付されてくるようですが,本投稿で紹介している方法でライセンス登録を行った場合は,自動的にVivado License Managerのライセンス情報が更新されるようです.

    ライセンス登録作業
    Vivado License Managerの「View License Status」でライセンス情報を確認できます.

    ライセンス登録作業

以上でインストール作業は完了です.

製品紹介
The Zynq Book: Embedded Processing with the Arm Cortex-A9 on the Xilinx Zynq-7000 All Programmable Soc
Louise H. Crockett Ross a. Elliot Martin a. Enderwitz
Strathclyde Academic Media
売り上げランキング: 9,093

2014/12/03

16F88 XC8開発例 - ロータリスイッチの状態をA/D変換で取得する

概要
はじめに

前回の記事「Arduino - ロータリスイッチの状態をA/D変換で取得する」と同様の回路を,PIC16F88とMPLAB XC8 C Compilerを使用して実装する方法を紹介します. この開発例では,PIC16F88のA/D変換モジュールによるA/D変換と,AUSARTモジュールによる調歩同期式シリアル通信を行っています. 開発環境は下記のとおりです.

PIC PIC16F88-I/P
MPLAB X IDE MPLAB X IDE v2.26
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 MPLAB X IDEを使用して書込み
通信仕様

通信仕様は下表のとおりです. 本記事では詳細は説明しませんが,今回はUSBシリアル変換モジュールを経由してPICとPCとの間で調歩同期式シリアル通信を行いました. 調歩同期式シリアル通信について調べる場合は,「RS-232C」や「UART」をキーワードに検索してみてください.

ボーレート 9,600 bps
データビット 8 bit
パリティビット なし
ストップビット 1 bit
フロー制御 なし
回路
回路図

PDFファイルにて公開します.

PICkit 2を使用してICSP (In Circuit Serial Programming)と電源供給を行うことを前提とした回路です. 今回は,これをブレッドボード上に組んで動作を確認しました.

ロータリスイッチ SW1の共通接点Aは,グランドに接続されています. 一方,PIC16F88のAN0ピンは,常にSW1の選択接点1に接続されています. スイッチを回転させると,合成抵抗の分圧比が変化し,アナログ入力ピンに印加される電圧が変化します. この変化を読み取ることで,SW1の状態を取得できます.

仮に共通接点Aがいずれの選択端子にも接続されていない状態になっても,AN0ピンは抵抗 R1でプルアップされている状態となり,ハイインピーダンスにはなりません.

回路部品

下表は使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

使用部品表
番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 250円
U2 USBシリアル変換
モジュールキット
秋月電子通商 AE-UM232R 1 800円
X1 セラロック 村田製作所 20MHz 1 35円
SW1 ロータリスイッチ 1回路12接点
ノンショーティングタイプ
1 150円
(互換品)
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
(互換品)
R2, R11 炭素皮膜抵抗 各社 1/4W 4.7kΩ 2 1円
(互換品)
R3 炭素皮膜抵抗 各社 1/4W 470Ω 1 1円
(互換品)
R4 炭素皮膜抵抗 各社 1/4W 680Ω 1 1円
(互換品)
R5 炭素皮膜抵抗 各社 1/4W 820Ω 1 1円
(互換品)
R6 炭素皮膜抵抗 各社 1/4W 1kΩ 1 1円
(互換品)
R7 炭素皮膜抵抗 各社 1/4W 1.2kΩ 1 1円
(互換品)
R8 炭素皮膜抵抗 各社 1/4W 1.5kΩ 1 1円
(互換品)
R9 炭素皮膜抵抗 各社 1/4W 2.2kΩ 1 1円
(互換品)
R10 炭素皮膜抵抗 各社 1/4W 3kΩ 1 1円
(互換品)
R12 炭素皮膜抵抗 各社 1/4W 8.2kΩ 1 1円
(互換品)
R13 炭素皮膜抵抗 各社 1/4W 15kΩ 1 1円
(互換品)
その他 リード線など 適量
回路製作例

ロータリスイッチ周辺の配線については,前回の記事の「回路製作例」で紹介しています.

プログラム
A/D変換値からロータリスイッチの状態を取得する方法

まず,ロータリスイッチの各状態における,AN0ピンへの印加電圧を計算してみましょう. 計算結果を下表に示します. 下表から,例えば選択接点2の場合は,AN0ピンへの印加電圧が0.455Vになることがわかります. PIC16F88のA/D変換の分解能は10bit(0~1023)ですから,A/D変換値は93になると考えられます. ただし,電源電圧や抵抗値の公差により,各値は多少変動します.

これらの計算結果を基に,A/D変換値と閾値を比較することで,ロータリスイッチの状態を割り出します. 例えば,選択接点が3以下か4以上かを調べるためには,各状態におけるA/D変換値(201と302)の中間値(252)を閾値にします. このような比較処理を繰り返すことで.選択接点が特定できます.

ロータリスイッチの選択接点とアナログ入力ピンへの印加電圧の関係
選択接点 印加電圧 [V] A/D変換値(10bit)
1 0.000 0
2 0.455 93
3 0.983 201
4 1.477 302
5 1.936 396
6 2.351 481
7 2.734 560
8 3.130 641
9 3.491 715
10 3.841 787
11 4.175 855
12 4.459 910
main.c

下記は,ソースファイル main.cです. このほかに,「16F88 XC8開発例 - 調歩同期式シリアル通信(AUSARTモジュール)」に掲載している,uart.cuart.hが必要です.

A/D変換値からロータリスイッチの状態を取得する,getRotarySwStatus()関数を作成しました. これは,前回の記事で紹介した,Arduinoのスケッチから移植した関数です. 復帰値1~12でロータリスイッチの状態を,復帰値0で取得エラーを示します.

getRotarySwStatus()関数内の条件分岐処理がif文の入れ子構造になっているのは,ロータリスイッチの状態によって関数内の処理時間が変動しないようにしたかったためです. この関数では,ロータリスイッチがいずれの状態であっても条件分岐処理が3回以内になっています. よりスマートなやり方があるのだとは思いますが….

製品紹介
超小型ブレッドボード(青)
SparkFun
売り上げランキング: 369,705

2014/11/24

Arduino - ロータリスイッチの状態をA/D変換で取得する

前置きが長いので,すぐに回路図とスケッチを確認したい場合は,最初の2項目を読み飛ばしてください.

しろくま氏のPWMパワーパックの改良

しろくま氏ジオタウンドットコムで公開している,PWMパワーパックを製作してみることにしました. プログラムをPICに移植して製作しようと思っていたのですが,Arduinoの使用経験がなかったこともあり,私の技術不足で一筋縄では行きそうにありません. そこで,Arduinoの開発環境を用意して,ひとまずArduinoで製作してみることにしました.

しろくま氏が記事を投稿してから3年以上経過しているため,既に多くの方が,しろくま氏のPWMパワーパックを製作したようです. ジオタウンドットコムのコメント欄を見ると,誤動作するという方も散見されます. どうやら,マスコンとして使用している,ロータリスイッチ周辺回路やプログラムに問題が1つあるようです. 今回は,このロータリスイッチ周辺回路とプログラムの改良について考えてみました.

誤動作の原因は回路にあると推測

誤動作の原因や対応策についてコメント欄でさまざまな議論がされていますが,私は回路に原因があると考えました. 記事の添付写真から推測すると,しろくま氏が使用しているロータリスイッチは,秋月電子通商で発売されているノンショーティングタイプの1回路12接点のものです. ノンショーティングタイプのロータリスイッチは,スイッチを回転させて選択接点を切り換える際,一時的に共通接点がどの選択接点にも接触していない状態になります.

ここで,しろくま氏の回路図を確認します. ロータリスイッチ RSW_12の共通接点aは,アナログ入力ピンに接続されています. つまり,ロータリスイッチを回転させた際に,一時的にアナログ入力ピンがどこにも接続されていない状態(ハイインピーダンス)になります. このとき,Arduinoがロータリスイッチの状態を取得できなくなりますので,誤動作が発生します. ただし,これは回路図から読み取った推測です. 実際には,見当違いであったり,複合的な原因である可能性もありますのでご注意ください. ご指摘があれば,コメントをいただければ幸いです.

次項から,改良した回路について紹介します.

回路
回路図

PDFファイルにて公開します. 回路図中の「ユーザ回路」部分を製作し,Arduinoのアナログ入力ピンに接続してください.

ロータリスイッチ SW1の共通接点Aは,グランドに接続されています. 一方,Arduinoのアナログ入力ピンは,常にSW1の選択接点1に接続されています. スイッチを回転させると,合成抵抗の分圧比が変化し,アナログ入力ピンに印加される電圧が変化します. この変化を読み取ることで,SW1の状態を取得できます.

仮に共通接点Aがいずれの選択端子にも接続されていない状態になっても,アナログ入力ピンは抵抗 R1でプルアップされている状態となり,ハイインピーダンスにはなりません.

回路部品

下表は,回路図中の「ユーザ回路」部分の使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

使用部品表
番号 部品名 型番 数量 参考単価
SW1 ロータリスイッチ 1回路12接点
ノンショーティングタイプ
1 150円
(互換品)
R1, R10 炭素皮膜抵抗 各社 1/4W 4.7kΩ 2 1円
(互換品)
R2 炭素皮膜抵抗 各社 1/4W 470Ω 1 1円
(互換品)
R3 炭素皮膜抵抗 各社 1/4W 680Ω 1 1円
(互換品)
R4 炭素皮膜抵抗 各社 1/4W 820Ω 1 1円
(互換品)
R5 炭素皮膜抵抗 各社 1/4W 1kΩ 1 1円
(互換品)
R6 炭素皮膜抵抗 各社 1/4W 1.2kΩ 1 1円
(互換品)
R7 炭素皮膜抵抗 各社 1/4W 1.5kΩ 1 1円
(互換品)
R8 炭素皮膜抵抗 各社 1/4W 2.2kΩ 1 1円
(互換品)
R9 炭素皮膜抵抗 各社 1/4W 3kΩ 1 1円
(互換品)
R11 炭素皮膜抵抗 各社 1/4W 8.2kΩ 1 1円
(互換品)
R12 炭素皮膜抵抗 各社 1/4W 15kΩ 1 1円
(互換品)
その他 リード線など 適量
回路製作例

私が製作した回路の写真です. 炭素皮膜抵抗R2R12は1/4Wの小型品を使用し,ロータリスイッチの接点間に直接ハンダ付けしました.


回路製作例
スケッチ
A/D変換値からロータリスイッチの状態を取得する方法

まず,ロータリスイッチの各状態における,アナログ入力ピンへの印加電圧を計算してみましょう. 計算結果を下表に示します. 下表から,例えば選択接点2の場合は,アナログ入力ピンへの印加電圧が0.455Vになることがわかります. ArduinoのA/D変換の分解能は10bit(0~1023)ですから,A/D変換値は93になると考えられます. ただし,電源電圧や抵抗値の公差により,各値は多少変動します.

これらの計算結果を基に,A/D変換値と閾値を比較することで,ロータリスイッチの状態を割り出します. 例えば,選択接点が3以下か4以上かを調べるためには,各状態におけるA/D変換値(201と302)の中間値(252)を閾値にします. このような比較処理を繰り返すことで.選択接点が特定できます.

ロータリスイッチの選択接点とアナログ入力ピンへの印加電圧の関係
選択接点 印加電圧 [V] A/D変換値(10bit)
1 0.000 0
2 0.455 93
3 0.983 201
4 1.477 302
5 1.936 396
6 2.351 481
7 2.734 560
8 3.130 641
9 3.491 715
10 3.841 787
11 4.175 855
12 4.459 910
スケッチ例

下記は,スケッチ例 rotary_sw.inoです. A/D変換値からロータリスイッチの状態を取得する,getRotarySwStatus()関数を作成しました. 復帰値1~12でロータリスイッチの状態を,復帰値0で取得エラーを示します.

getRotarySwStatus()関数内の条件分岐処理がif文の入れ子構造になっているのは,ロータリスイッチの状態によって関数内の処理時間が変動しないようにしたかったためです. この関数では,ロータリスイッチがいずれの状態であっても条件分岐処理が3回以内になっています. よりスマートなやり方があるのだとは思いますが….

製品紹介

2014/11/23

16F88 XC8開発例 - 可変抵抗でLEDの輝度を制御する

概要

PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,可変抵抗でLEDの輝度を制御するプログラムを紹介します. この開発例では,PIC16F88のA/D変換モジュールとCCPモジュールのPWMモードを使用しています. 開発環境は下記のとおりです.

PIC PIC16F88-I/P
MPLAB X IDE MPLAB X IDE v2.15
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 MPLAB X IDEを使用して書込み
回路
回路図

PICkit 2を使用してICSP (In Circuit Serial Programming)と電源供給を行うことを前提とした回路です. 今回は,これをブレッドボード上に組んで動作を確認しました.

電源はPICkit 2から5.0Vを供給しています. 内蔵クロックを使用するため,外部発振子は不要です. AN0に可変抵抗を接続し,RB3に電流制限用抵抗 330Ωを経由してLEDを接続しています.


回路図
回路部品

下表は使用部品表です.

使用部品表
番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 200円
LED1 LED 各社 各色 1 10円
VR1 可変抵抗 各社 30kΩ B 1 40円
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円
その他 リード線など 適量
プログラム
main.c

下記はソースファイル「main.c」です.参考になれば幸いです.

2014/11/18

Arduino - ソースコードを複数ファイルに分割して記述する(2)

.inoファイルは外部エディタで編集しづらい

前回の投稿で,スケッチを複数のファイル(タブ)に分割して記述する方法を紹介しました. 前回紹介した方法でも,コンパイルに問題はありません. しかし,できれば.inoファイルは作成せず,.cppと.hファイルのみでコーディングしたいと考えました. Arduino IDEのエディタは使いづらいのでサクラエディタを使用しているのですが,デフォルト設定のサクラエディタでは,.inoファイルは.cppファイルのように色分け表示や自動インデントが行われないからです. そこで,.cppと.hファイルのみでスケッチを構成する方法について調べてみました.

スケッチには最低1つの.inoファイルが必要

Intel Galileo Arduino IDEのユーザですが,調査された方を発見しました.

上記Webページによると,各スケッチには,スケッチフォルダ名と同名の.inoファイルが必要であるとのことです. ただし,.inoファイルには何も記述されていなくても良いようです(ブランクのダミーファイル.) 上記Webページを例に,適当なスケッチをダミーの.inoファイル,.cppファイルおよび.hファイルの組み合わせに変更してみました.

.cppと.hファイルのみで記述する方法
概要

.inoファイルのみで記述されたサンプルスケッチを,ダミーの.inoファイル,.cppファイルおよび.hファイルの組み合わせによる記述に変更します. ソースコードは.cppファイルと.hファイルに記述するため,外部エディタを使用しても色分け表示や自動インデントの機能が使用できます. また,別の開発環境やマイコンへの移植性の改善も期待できます.

サンプルスケッチ

LED点滅回路用のサンプルスケッチ,led_test2.inoです.

サンプルスケッチの記述変更例

6つのファイルに分割して記述しました. まずはダミーファイル,led_test3.inoです.

ヘッダファイル,stdafx.hです.

setup()関数およびloop()関数を記述した,led_test3.cppです.

ヘッダファイル,led_test3.hです.

led_toggle()関数を記述した,led_toggle.cppです.

ヘッダファイル,led_toggle.hです.

製品紹介

2014/11/17

Arduino - Arduino IDEのエディタのタブ幅を変更する

Arduino IDEの設定ファイル

Arduino IDEの環境設定は,「ファイル」-「環境設定」をクリックして表示されるウィンドウで変更できます. しかし,このウィンドウ上で変更できる項目は限られているため,より詳細な環境設定を行うためには,設定ファイルを直接編集しなければいけません. 設定ファイルのファイル名はpreferences.txtで,この設定ファイルのパスは環境設定のウィンドウで確認できます. パスをクリックすると,エクスプローラで設定ファイルが格納されているフォルダが表示されます.


Arduino
エディタのタブ幅を変更する

設定項目については,下記Webサイトにまとめが掲載されています.

デフォルトのタブ幅は2ですが,下記のようにタブ幅を4に変更しました.

Arduino IDEのエディタは貧弱…

行番号表示もできませんし,インデントにタブ文字が使用できないようです. 私は,外部エディタとしてサクラエディタを使用し,Arduino IDEはコンパイルにのみ使用しています. 今後のバージョンアップで機能増強が図られるのでしょうか….

製品紹介

Arduino - typedef宣言を使用する際の注意

C/C++のようで違う,Arduino

前回の記事でも書きましたが,関数のプロトタイプ宣言をユーザが記述する必要がないなど,Arduino IDEで使用するプログラミング言語はC/C++とは若干異なります.

実際には,スケッチ内のタブのうち.inoファイルと拡張子のないファイルは,コンパイル前に1つの.cppファイルに統合されるようです. 一方,.cファイルと.cppファイルは個別にコンパイルされ,最後にリンクが実行されます.

これらの処理は,ユーザのコーディングを簡略化することを目的としているのだと思います. しかしながら,ここに罠が隠れており,私はその罠にかかってしまいました.

typedef宣言が無視されてしまう
コンパイルエラーとなるプログラム

一見すると問題のないソースコードのようですが,コンパイルエラーが発生します. メッセージは「led_test2:12: error: 'STATUS_LED' does not name a type」でした.

問題の原因

この問題の原因は,Arduino IDEがプロトタイプ宣言を自動挿入する位置がプリプロセッサ(#include#defineのこと)の直後であることです. つまり,プロトタイプ宣言はプリプロセッサとtypedef宣言の間,8行目に自動挿入されることになります. したがって,typedef宣言でデータ型を定義する前にそのデータ型を使用したプロトタイプ宣言があることになり,コンパイルエラーとなってしまうのです.

問題の回避方法
方法(1) typedef宣言をヘッダファイルに移行する

Arduino Build Processでも紹介されている問題回避方法です. 自動挿入されるプロトタイプ宣言はプリプロセッサの直後なので,プリプロセッサでインクルードされるヘッダファイルでtypedef宣言を行えば良い,というものです.

方法(1)を適用したプログラムを示します. 下記は既存タブのled_test2.inoです. 新規作成するヘッダファイル,led_test2.hをインクルードしています.

下記は新規タブのled_test2.hです. typedef宣言を記述しています.

方法(2) プロトタイプ宣言を自分で記述する

プロトタイプ宣言が既に存在する場合は,自動挿入が実行されません. したがって,typedef宣言の後方に自分でプロトタイプ宣言を書いておくことでも,この問題を回避できます.

製品紹介

2014/11/16

Arduino - ソースコードを複数ファイルに分割して記述する

Arduino,はじめました

かなり今更ですが,最近になってArduinoを触り始めました. Arduinoと言っても,基板は買わずにATmega328Pを買ってきて,ブートローダと開発環境だけを使用しています. 参考書なども買っていないため,インターネットで調べつつ試行錯誤しています.

最初に躓いたのは,ソースコードを複数ファイルに分割して記述する方法についてです. Arduino Build Processでも説明されていますが,備忘録として記述しておこうと思います.

ソースコードを複数ファイルに分割して記述する
サンプルプログラム

説明に使用するサンプルプログラム,led_test.inoです. PIN_LEDで指定したデジタル入出力ピンのLEDを点滅させるプログラムです. LEDを接続する際は,電流制限用抵抗を忘れずに挿入してください.

今回は,loop()関数内の32~35行目の処理を関数化し,別ファイルに記述します.

新規タブを作成する

Arduinoでは,1つのスケッチで複数ファイルを扱うとき,各々を「タブ」と呼ぶようです. 新規タブは,ウィンドウ右側のアイコンをクリックすると表示されるメニューから作成できます. 私は最初これを知りませんでした….


Arduino

ウィンドウ下部に表示されるテキストボックスで,新規タブ名を指定します. Arduino Build Processによれば,タブとして扱うことができるファイルは,拡張子なし,.c,.cppまたは.hのいずれかのようです. しかし,私の使用しているArduino 1.0.5-r2では,このテキストボックスで拡張子を指定しなかった場合,拡張子は.inoになります. 1つのスケッチで,複数の.inoファイルが扱えるようです.

関数を記述するのであれば,C++言語ライクではなくC言語ライクに書くのであっても,個人的には拡張子は.cppを指定すれば良いと思います. 今回は拡張子を指定しませんでしたので,led_func.inoというファイルがスケッチフォルダに新規作成されました.


Arduino
ソースコードを編集する

上記のサンプルプログラムを分割して記述した例を示します. loop()関数内の32~35行目の処理を,led_func()関数として関数化しています. このように関数化やファイル分割を行うことで,ソースコードの再利用性が向上します.

下記は既存タブのled_test.inoです.

下記は新規タブのled_func.inoです.

なお,関数のプロトタイプ宣言は,Arduinoにおいてはコンパイル時に自動挿入されるため,必要ありません. また,作成したタブが拡張子.hのヘッダファイルでない限り,#includeの記述も必要ありません. しかし,これらにも例外があります. 詳細については,別記事「Arduino - typedef宣言を使用する際の注意」をご覧ください.

追加情報

よりC/C++言語ライクに記述したい場合は,Arduino - ソースコードを複数ファイルに分割して記述する(2)をご覧ください.

製品紹介

2014/11/14

16F88 アセンブリ言語開発例 - LED点滅回路

概要

PIC16F88とMPASM (アセンブリ言語)を使用した開発例として,LED点滅回路のプログラムを紹介します. 開発環境は下記のとおりです.

PIC PIC16F88-I/P
MPLAB X IDE MPLAB X IDE v2.15
MPASM MPASMWIN v5.57
PICkit 2 MPLAB X IDEを使用して書込み
回路
回路図

電源はPICkit 2から5.0Vを供給しています. 内蔵クロック 8MHzで動作させています. RB0には,電流制限用抵抗 330Ωを経由してLEDが接続されています.


回路図
回路部品

下表は使用部品表です.

使用部品表
番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 200円
LED1 LED 各社 各色 1 10円
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円
その他 リード線など 適量
プログラム
main.asm

下記はソースファイル「main.asm」です.参考になれば幸いです.

更新履歴
2014/11/15 プログラムを修正(動作にほぼ影響なし)
  • サブルーチンTIMER2内のNOP命令を削除
  • サブルーチンTIMER3内のNOP命令を削除
2014/11/14 公開開始