2015/06/14

サクラエディタを黒背景の配色(Monokai風)にカスタマイズする - C/C++強調キーワードセット付き

Monokai for Sakura Editor

サクラエディタをMonokai風の配色するための色設定ファイルと,C/C++のソースコードをシンタックスハイライト表示するためのキーワード設定ファイルを作成してみました. GitHubにて公開しています.


Monokai for Sakura Editor
設定方法
C/C++
  1. 設定ファイルを準備する
  2. 下記リンクからGitHubに移動し,右側の「Download ZIP」からZIPファイルをダウンロードしてください. ダウンロード後,任意のフォルダでZIPファイルを解凍してください.

  3. タイプ別設定一覧を表示する
  4. サクラエディタを起動し,「設定」-「タイプ別設定一覧」を開きます.


    タイプ別設定一覧
  5. 設定ファイルをインポートする
  6. タイプ別設定一覧ウィンドウで「C/C++」を選択し,「インポート」をクリックします. ファイルを開くためのウィンドウが表示されるので,ZIPファイルを解凍してできたフォルダから,「cpp_monokai\cpp_monokai.ini」を開きます.

    「インポート確認」ウィンドウが表示されるので,「読込先:」を「C/C++」にして「OK」をクリックします.


    インポート確認
  7. 完了
  8. 「ファイルをインポートしました。」と表示されれば完了です. キーワード設定ファイルも同時にインポートされます.


    ファイルをインポートしました。
C/C++以外
  1. 設定ファイルを準備する
  2. 下記リンクからGitHubに移動し,右側の「Download ZIP」からZIPファイルをダウンロードしてください. ダウンロード後,任意のフォルダでZIPファイルを解凍してください.

  3. タイプ別設定を開く
  4. 配色をMonokai風にカスタマイズしたいタイプ(拡張子)のファイルをサクラエディタで表示した状態で,「設定」-「タイプ別設定」を開きます. または,タイプ別設定一覧ウィンドウでファイルタイプを選択した状態で「設定変更」を開きます.

  5. 色設定ファイルをインポートする
  6. タイプ別設定ウィンドウの「カラー」タブを表示し,「インポート」を開きます. ファイルを開くためのウィンドウが表示されるので,ZIPファイルを解凍してできたフォルダから,「monokai.col」を開きます. これで設定は完了です.


    タイプ別設定
製品紹介
2015/06/11

EV3RTでBluetoothを使用する

EV3RT + Bluetooth

EV3RTのBluetooth機能について色々と試行してみたことをメモしておきます. EV3RTとは,リアルタイムOSである​TOPPERS/HRP2カーネルをベースとした,Mindstorms EV3用の開発プラットフォームです.

デバイス名とPINコードの変更

公式ページなどに説明があります.

Windows PCとのBluetooth接続

公式ページに説明があります.

Bluetoothデバイス内蔵のPCかBluetoothドングルのほか,Bluetooth通信の基本処理を行うためのドライバ(プロトコルスタック)が必要です. どうやら,Bluetoothドングル,ドライバやOSによって接続できない場合があるようです(相性問題). 接続安定性に定評がある(…?),東芝のBluetoothスタックは下記ページから入手できます(30日間の評価バージョン).

手元の環境でテストしてみた結果,幸いにも接続不可になることはありませんでした. 公式ページと同様にまとめておきます.

メーカー 製品型番 ドライバ Windows 8.1 64bit
Abe UB22S Microsoft標準ドライバ
TOSHIBA Bluetooth Stack
iBUFFALO BSHSBD04BK Microsoft標準ドライバ
TOSHIBA Bluetooth Stack
PLANEX BT-Micro3E1X Microsoft標準ドライバ
TOSHIBA Bluetooth Stack
動的ローディング形式バイナリファイルのアップロード

Tera TermのZMODEM転送機能でアプリケーションのバイナリファイルをアップロードすることができます. NXTのようにUSBケーブルを抜き差ししたり,microSDHCカードを抜き差ししたりする必要がありません. 便利ですね.

Bluetooth通信機能

Bluetooth SPPによるシリアル通信を実装することができます.

製品紹介
iBUFFALO Bluetooth USBアダプター 3.0+EDR対応 class2 ブラック BSHSBD04BK
バッファロー (2010-09-29)
売り上げランキング: 854

Logicool MX620のチャタリングを修理

Logicool MX620が故障…

使用開始から6年目に突入した無線マウス Logicool MX620ですが,左クリックの調子が悪くなってしまいました. 左クリックを認識しなかったり,シングルクリックがダブルクリックになってしまったりとイライラします. 所謂「チャタリング」と呼ばれる現象です.

故障してしまいましたが,愛用のマウスなので修理してみることにしました. …お気に入りの「高速スクロール機能」を備えるマウスとなると製品が限られ,買い替え費用が結構な出費になるという理由も大きいです.

修理記録
マウスの分解

乾電池を取り外して,4箇所のゴム足を全て剥がし,ネジを外します(赤矢印). このネジを外すためには,T6の星型ドライバが必要です.


マウスの裏側
製品紹介

4箇所のネジを外すと,上側と下側(プリント基板やホイール機構が固定されたベース)の2つに分解できます. ここで,電池ボックスのリード線付き金属端子を電池ボックスから引き抜いた後,電池ボックスをホイール機構側にスライドさせて取り外します. 私の場合,プラス極側の金属端子の引き抜きが難しかったため,半田ごてを当ててリード線のみを取り外しました. また,電池ボックスをスライドさせる際,青矢印で示したラベルの固定部が引っ掛かりやすいので注意してください.

電池ボックスを取り外したら,レーザーセンサのフレキシブルケーブルを取り外した後,赤矢印で示した4箇所のネジを外します.


マウス内部

これで分解は完了です. 上下に分解したうちの下側は,プリント基板,ホイール機構,電池ボックスおよびベースの4つに分解しました.


マウスの構成部品
マイクロスイッチの交換

交換対象の左クリック用マイクロスイッチは青矢印で示した部品です. 今回は,左右のクリック感の統一と故障予防の観点から,右クリック用マイクロスイッチも交換します.

余談ですが,プリント基板の裏面にはAtmelのATmega168が実装されていました.


交換対象の左クリック用マイクロスイッチ

準備した交換用マイクロスイッチは,オムロン D2F-01Fです. ピン互換ですが,押下感や押下音は異なります. こればかりは仕方がないです.


取り外したマイクロスイッチ(左)と交換用マイクロスイッチ(右)
製品紹介

交換後のプリント基板裏面です. マイクロスイッチを取り外す際にランドが剥離してしまったので,すずメッキ線で配線しています.


交換後のプリント基板裏面

交換完了
リード線の交換

電池ボックスとプリント基板との間を結ぶリード線のハンダ付け状態が悪かったため,ついでに交換しました. これで部品交換は完了です. あとは,分解した際とは逆順に組み立てればOKです. ホイール機構に付着していたグリスは一度拭き取り,タミヤ セラグリスHGを少量塗布しておきました. また,ゴム足は両面テープを貼り直して復元しました.


交換後の電池ボックスのリード線

フレキシブルケーブルの挿入,ホイール機構の取り付け
製品紹介
Logicool ロジクール ワイヤレスマラソンマウス M705t
ロジクール (2013-08-02)
売り上げランキング: 242
2015/03/31

デスクトップやタスクバーにGMailのショートカットを作成する(Chrome)

1クリックで,Chromeを使用してGMailにアクセスする方法を紹介します. Chromeを使い始めてかなり経ちますが,最近まで知りませんでしたのでメモしておきます.


タスクバーに作成したGMailのショートカット
GMailのショートカットを作る

ここで紹介する方法は,Chromeのヘルプにも記載されています.

具体的には,下記のように操作します.

  1. ChromeでGMailにアクセスします.
  2. Chromeウィンドウの右上のアイコンからChromeメニューを開き,「その他のツール」-「アプリケーションのショットカットを作成」をクリックします
  3. ショートカットを作成する場所を選択し,「OK」をクリックします.

  4. アプリケーションのショットカットを作成
製品紹介

液晶テレビをPCディスプレイとして使用する

東芝 REGZA 22AC2とPCをHDMIケーブルで接続し,PCディスプレイとして使用するときの設定メモです. 液晶テレビとPCを単純に接続しただけだと,滲んだ(ぼやけた)表示になり,文字が潰れて見づらくなる可能性があります. これは,液晶テレビとPCの設定を変更し,Dot by Dot (DbD)表示にすることで解決できます. 他メーカー,他製品でも応用できると思います.たぶん.

液晶テレビの設定(東芝 REGZA 22AC2の場合)

リモコンの「クイック」を押下し,次のように設定を変更します. 「Dot by Dot」が画面サイズ切換の一覧にない場合は,PCの設定を先に変更してください.

  • 画面サイズ切換 -> Dot by Dot
PCの設定(Intel HD Graphics 4600の場合)
  1. デスクトップ上で右クリックし,「グラフィックス・プロパティー…」を開く
  2. 「インテル HDグラフィックス・コントロール・パネル」が開くので,「ディスプレイ」をクリックする
  3. 「ディスプレイの選択」で接続している液晶テレビを選択し,「解像度」と「スケーリング」を変更する
  4. フルハイビジョン(1920 x 1080パネル)ではない,ハイビジョン液晶テレビの場合は1366 x 768パネルの場合が多いと思います. ただし,Dot by Dot表示をする場合は,解像度は1360 x 768に設定するようです.

インテル HDグラフィックス・コントロール・パネル上での設定例
製品紹介

自作PCを組みました (Core i5 4690 + H97-PRO)

久しぶりにデスクトップPCを更新しました. 自作PCなのですが,データ保存用HDDを除く全てのパーツを入れ替えました. これまで使用していたパーツが2008年頃のものだったため,ほとんど流用できませんでした….

パーツ構成

ゲームをしないのでハイエンド構成ではありません. 内蔵グラフィックのIntel HD Graphics 4600でも3画面出力が可能なため,グラフィックボードは購入していません. 仮想マシンを使用するのでメモリは16GBにしました. 使用機会が少なくなっている光学ドライブは,手持ちのUSB接続のポータブルDVDドライブを使用することにしました. 既存機のDVDスーパーマルチドライブのインタフェースはIDEだったため,今回のマザーボードには接続できませんでした.

SSDはAmazon.co.jpで,それ以外の新規購入パーツはソフマップで購入しました. 合計で約8万円でした.

PCケース Antec SOLO BLACK 既存機から流用
OS Microsoft Windows 8.1 Pro 64bit 手持ち品
電源 SilverStone SST-ST50F-ES 新規購入
マザーボード ASUSTeK H97-PRO 新規購入
CPU intel Core i5-4690 (3.50GHz, 6M Cache) 新規購入
CPUクーラ 虎徹 SCKTT-1000 新規購入
メモリ シー・エフ・デー販売
Elixir W3U1600HQ-8G (8GB 2枚組)
新規購入
SSD Crucial CT250MX200SSD1 (SATA3, 250GB) 新規購入
HDD WESTERN DIGITAL WD20EARS (2TB)
日立 0S03224 (2TB)
既存機から流用
地デジチューナ 恵安 KTV-FSPCIE 既存機から流用
ディスプレイ TOSHIBA 22AC2
MITSUBISHI RDT232WLM
既存機から流用
キーボード DIATEC FILCO Majestouch FKB104M/EB 既存機から流用
マウス Logicool MX620 既存機から流用
各パーツについて一言
電源: SilverStone SST-ST50F-ES

「電源にはお金をかけた方が良い」とよく聞きますが,価格が高騰している(…?)印象を受けたので,安価な電源を購入しました. 2010年2月に発売された製品で,電源変換効率も良いとは言えないかもしれませんが(80 PLUS),長期に渡って供給されていることから品質は安定しているだろうと思います. 内蔵ファンも静かで,音は気になりません.

製品紹介
マザーボード: ASUSTeK H97-PRO

現行世代の定番製品のようです. マニュアルも日本語でわかりやすいです.

製品紹介
ASUSTeK Intel H97チップセット搭載マザーボード H97-PRO 【ATX】
Asustek (2014-05-17)
売り上げランキング: 813
CPU: intel Core i5-4690

オーバークロック対応の"K"付きにするか迷いましたが,私には必要ないだろうと判断して,若干安いこの製品を購入しました.

製品紹介
Intel CPU Core-i5-4690 3.50GHz 6Mキャッシュ LGA1150 BX80646I54690 【BOX】
インテル (2014-05-11)
売り上げランキング: 9,669
メモリ: シー・エフ・デー販売 Elixir W3U1600HQ-8G

これも定番製品のようです.

製品紹介
SSD: Crucial CT250MX200SSD1

2015年2月発売のMicron製SSDのハイエンドモデル「Crucial MX200」です. 昨年発売され,人気が高かった「Crucial MX100」の後継は「Crucial BX100」で,「Crucial M550」の後継が「Crucial MX200」らしいです. ややこしい….

詳しくは,下記Webサイトをご覧ください.

製品紹介
2015/03/29

TEMPとChromeキャッシュ用のRAMディスクを構築(Windows 8.1)

デスクトップPCを組み換え,システムディスクとしてSSDを導入しました. これに伴い,SSDの書込み回数を低減するため,一時ファイルを格納するためのRAMディスクを構築しました. ここでは,「SoftPerfect RAM Disk」を使用したRAMディスク構築方法と,WindowsのTEMPフォルダとChromeのキャッシュフォルダの設定変更方法をメモしておきます.

SoftPerfect RAM Disk
インストール

RAMディスク構築ソフトウェアとしてはSoftPerfect RAM Diskを使用しました.

Windows Windows 8.1 Pro 64bit
SoftPerfect RAM Disk SoftPerfect RAM Disk 3.4.6

下記Webページからダウンロードし,インストーラに従ってインストールを行いました.

RAMディスクの設定

SoftPerfect RAM Diskを起動し,メニューバーから「RAMディスク」-「起動時にマウントされるRAMディスクの追加」をクリックしました.


SoftPerfect RAM Disk

「RAMディスクの追加/編集」ウィンドウが開きました. 「ディスク情報」-「容量」で,RAMディスクの容量を設定しました. 私のPCは16384MB (16GB)のRAMを搭載しているので,そのうちの2048MB (2GB)をRAMディスクとして使用することにしました. この設定は,後で変更することが可能です.

「マウントオプション」-「ドライブ名」でドライブ文字を設定しました. 私は「Z:」にしました.

「ファイルシステムオプション」-「ファイルシステム」は,「NTFS」に設定しました. 「フォルダの作成」のテキストボックスに「Chrome」と「Temp」を追加しました. 「Chrome」はChromeのキャッシュフォルダ,「Temp」はWindowsのTEMPフォルダとして使用します.


RAMディスクの追加/編集

「RAMディスクの追加/編集」ウィンドウ右下の「高度な設定」をクリックし,「高度なディスクプロパティの設定」ウィンドウを開きました. 「ディスク識別」-「ボリュームラベル」に,RAMディスクのボリュームラベルを入力しました. 私は「RAM Disk」としました. 「OK」で開いたウィンドウを閉じると,RAMディスクが追加されます. この時点で,エクスプローラの「デバイスとドライブ」に「RAM Disk (Z:)」が表示されると思います.


高度なディスクプロパティの設定

SoftPerfect RAM Disk
Windows TEMPフォルダの設定

SoftPerfect RAM Disk上で設定可能です. メニューバーの「ツール」-「WindowsTEMPフォルダの設定」を開き,テキストボックスにフォルダのパスを入力しました.


Windows テンポラリフォルダ
Chromeのキャッシュフォルダの設定
既存キャッシュフォルダの削除

Chromeを終了し,下記パスにあるキャッシュフォルダ「Cache」を削除しました. アカウント名は,各自のWindowsのアカウント名に置き換えてください.

  • C:\Users\アカウント名\AppData\Local\Google\Chrome\User Data\Default
シンボリックリンクの作成

RAMディスク上のフォルダへのシンボリックリンクを作成しました. コマンドプロンプトを管理者として実行し,下記コマンドを実行しました. アカウント名は,各自のWindowsのアカウント名に置き換えてください.

  • mklink /d "C:\Users\アカウント名\AppData\Local\Google\Chrome\User Data\Default\Cache" "Z:\Chrome"

以上で,RAMディスクの構築と設定は完了です.

製品紹介
2015/03/19

OpenCV 2.4.11をUbuntu 14.04 32bitにインストール

OpenCV 2.4.11がリリースされていたので,仮想マシン上のUbuntu 14.04 LTS 32bitにインストールしました. 作業手順をメモしておきます. 掲載内容に間違いがありましたら,コメントにてご指摘いただければ幸いです.

インストール前の準備
  1. 既存環境を最新状態に更新する
  2. 下記コマンドを実行しました.

    1
    2
    ~$ sudo apt-get update
    ~$ sudo apt-get upgrade
  3. OpenCVのソースファイルをダウンロードする
  4. ホームディレクトリに「OpenCV」ディレクトリを作成し,OpenCVのソースをダウンロードしました. ダウンロードした圧縮ファイルは,展開しておきました.

    1
    2
    3
    4
    ~$ mkdir OpenCV
    ~$ cd OpenCV/
    OpenCV$ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.11/opencv-2.4.11.zip
    OpenCV$ unzip opencv-2.4.11.zip
インストール
シェルスクリプトの準備

作業を自動化するために,シェルスクリプトを作成しました. 「opencv-2.4.11.sh」というファイル名で,下記コードをホームディレクトリに保存してください.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/sh
 
echo "Installing Dependenices"
sudo apt-get update
# Build Tools
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
# GUI
sudo apt-get -y install libqt4-dev libgtk2.0-dev
# Media & Video
sudo apt-get -y install libjpeg-dev libpng-dev libtiff5-dev libjasper-dev
sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libxine-dev
sudo apt-get -y install libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
sudo apt-get -y install x264 v4l-utils
# Parallelism and linear algebra libraries
sudo apt-get -y install libtbb-dev libeigen3-dev
# Python
sudo apt-get -y install python-dev python-numpy
 
echo "Installing OpenCV 2.4.11"
cd ~/OpenCV/opencv-2.4.11
mkdir release
cd release
cmake \
    -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBUILD_EXAMPLES=ON \
    -DINSTALL_C_EXAMPLES=ON \
    -DINSTALL_PYTHON_EXAMPLES=ON \
    -DWITH_1394=OFF \
    -DWITH_OPENGL=ON \
    -DWITH_QT=ON \
    -DWITH_TBB=ON \
    -DWITH_V4L=ON \
    -DWITH_XINE=ON \
    ..
make
sudo make install
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
echo "OpenCV 2.4.11 ready to be used"
シェルスクリプトの実行

シェルスクリプトを実行しました. 実行中,パスワードの入力を求められる場合があります. 私の環境では,実行完了まで1時間弱かかりました.

1
2
~$ chmod +x opencv-2.4.11.sh
~$ ./opencv-2.4.11.sh 2>&1 | tee ./opencv-2.4.11_install.log
製品紹介
OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応
OpenCV 2 プログラミングブック制作チーム
マイナビ
売り上げランキング: 186,614
2015/02/28

16F84A XC8開発例 - 低消費電力水晶発振子を使用する(LP Mode)

概要

PIC16F84AとMPLAB XC8 C Compilerを使用した開発例として,32.768kHzの水晶発振子を使用する際のプログラム例を紹介します. 開発環境は下記のとおりです.

PIC PIC16F84A
MPLAB X IDE MPLAB X IDE v2.26
MPLAB XC8 MPLAB XC8 C Compiler v1.32
PICkit 2 Application Version 2.61.00 / Device File Version 1.61.00
回路
回路図

電源はPICkit 2から5.0Vを供給し,32.768kHzの水晶発振子でPIC16F84Aを動作させています. 7セグメントLEDの電流制限抵抗には200Ωを使用していますが,330~1kΩ程度の方が良いかもしれません.


回路図
回路部品

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

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F84A 1
X1 水晶発振子 32.768kHz 1
C1, C2 セラミック
コンデンサ
22pF 2
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円
(互換品)
R2 - R8 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
プログラム
main.c

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <xc.h>
 
// 16F84A
// CONFIG
#pragma config FOSC = LP    // Oscillator Selection bits (LP oscillator)
#pragma config WDTE = OFF   // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON   // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF     // Code Protection bit (Code protection disabled)
 
// プロトタイプ宣言
void display7seg(unsigned char font_id);
 
void main(void)
{
    unsigned char count = 0;
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
    TRISA = 0x00;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    while(1){               // 無限ループ
        display7seg(count);
        _delay(8192);       // 1秒の待ち時間: Fosc / 4
        count++;
        if(count > 9){
            count = 0;
        }
    }
}
 
/*
 * 7セグメントLED表示関数
 *
 * 引数:
 * unsigned char    font_id 表示するフォントのID
 *
 * 復帰値:
 * なし
 */
void display7seg(unsigned char font_id)
{
    const unsigned char font[11] = {
        // gfedcba  7セグメントLED 点灯パターン
        0b00111111, // 0
        0b00000110, // 1
        0b01011011, // 2
        0b01001111, // 3
        0b01100110, // 4
        0b01101101, // 5
        0b01111101, // 6
        0b00100111, // 7
        0b01111111, // 8
        0b01101111, // 9
        0b00000000  // 表示なし
    };
 
    PORTB = font[font_id];
}
2015/02/24

16F88 XC8開発例 - 複数の押しボタンスイッチからの入力

概要

PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,2個の押しボタンスイッチ(タクトスイッチ)を使用する際のプログラム例を紹介します. 開発環境は下記のとおりです.

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を使用して書込み
回路
回路図

電源はPICkit 2から5.0Vを供給し,内蔵クロック 8MHzで動作させています. 各タクトスイッチは,10kΩ抵抗でプルアップされた負論理入力回路となっています. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. 7セグメントLEDの電流制限抵抗には200Ωを使用していますが,330~1kΩ程度の方が良いかもしれません.


回路図
回路部品

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

番号 部品名 型番 数量 参考単価
U1 PICマイコン Microchip PIC16F88-I/P 1 250円
SW1 LED付き
タクトスイッチ
Switronic ST-12-303FC-G
(緑,正方形)
1 150円
SW2 タクトスイッチ 各社 1 10円
(互換品)
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 - R3 炭素皮膜抵抗 各社 1/4W 10kΩ 3 1円
(互換品)
R4 - R10 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
プログラム
タクトスイッチのチャタリングによる誤動作防止対策

タクトスイッチを使用する際は,チャタリング対策が必要です. 下記のプログラムでは,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. 1回目と2回目のスイッチの状態が一致し,なおかつ現在のスイッチの状態(sw_state)が前回のスイッチの状態(sw_state_prev)と異なる場合は,スイッチの状態についての判定(switch文)に移行します. これは,スイッチの状態が変化した直後のみ,スイッチの状態に対応する処理を実行するためです.

main.c

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <xc.h>
 
#define _XTAL_FREQ 8000000  // 8MHz
 
// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF
 
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
 
void main(void)
{
    unsigned char sw_state;
    unsigned char sw_state_prev = 0x00;
 
    OSCCON = 0b01110000;    // 内蔵クロックの周波数を8MHzに設定
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
 
    TRISA = 0x06;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    ANSEL = 0x00;           // A/D変換を無効化
    ADCON0 = 0x00;
    ADCON1 = 0x00;
 
    while(1){               // 無限ループ
        sw_state = (PORTA ^ 0xff) & 0x06;   // SW1,SW2の状態を反転して格納
        __delay_ms(10);                     // 10ミリ秒の待ち時間
        if((sw_state == ((PORTA ^ 0xff) & 0x06))    // SW1,SW2の状態を再確認および,
                && (sw_state != sw_state_prev)){    // 前回の状態からの変化有無の確認
            switch(sw_state){
                case 0x02:  // SW1押下
                    PORTB = 0b00000110;     // 7セグメントLED表示 "1"
                    break;
                case 0x04:  // SW2押下
                    PORTB = 0b01011011;     // 7セグメントLED表示 "2"
                    break;
                case 0x06:  // SW1およびSW2押下
                    PORTB = 0b01001111;     // 7セグメントLED表示 "3"
                    break;
                default:
                    break;
            }
        }
        sw_state_prev = sw_state;
    }
}
完成

タクトスイッチと7セグメントLEDの使用例
2015/02/22

Arduino - 押しボタンスイッチと7セグメントLEDを使用したカウンタ回路

概要

モーメンタリ動作の押しボタンスイッチ(タクトスイッチ)と7セグメントLEDを使用したカウンタ回路の製作例を紹介します. 開発環境は下記のとおりです.

Arduino IDE Arduino 1.0.5-r2
回路
回路図

私はArduinoを持っていませんので,Arduino Duemilanove互換回路をブレッドボード上に作成しました. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. SW1は負論理(押下されている時にLOW,押下されていない時にHIGH)になっています.


回路図
回路部品

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

番号 部品名 型番 数量 参考単価
SW1 LED付き
押しボタンスイッチ
Switronic ST-12-303FC-G
(緑,正方形)
1 150円
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 - R7 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
スケッチ
SW1のチャタリングによる誤動作防止対策

タクトスイッチSW1を押下される度に,7セグメントLEDの表示数値をインクリメントするスケッチを作成しました. この動作を実現するためには,SW1のチャタリング対策が必要です.

下記のスケッチ例では,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. スイッチが押下された状態の場合は,変数sw1_state_prevの値から前回のスイッチの状態を確認します. これはスイッチが押下された状態でインクリメントを複数回繰り返さないための判定処理です. sw1_state_prevがHIGHであればスイッチは押下直後ということになります.

スケッチ例

GitHubにて公開します.

完成

Webカメラで撮影したためピントが合っていません.ご了承ください.


7セグメントLEDカウンタ
製品紹介
2015/02/21

16F88 XC8開発例 - LED点滅回路

概要

PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,LED点滅回路のプログラムを紹介します. 開発環境は下記のとおりです.

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を使用して書込み
回路
回路図

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


回路図
回路部品

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <xc.h>
 
#define _XTAL_FREQ 8000000  // 8MHz
 
// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF
 
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
 
void main(void)
{
    OSCCON = 0b01110000;    // 内蔵クロックの周波数を8MHzに設定
 
    PORTA = 0x00;           // PORTAを初期化
    PORTB = 0x00;           // PORTBを初期化
    TRISA = 0x00;           // PORTAの入出力設定
    TRISB = 0x00;           // PORTBの入出力設定
 
    while(1){               // 無限ループ
        PORTB ^= 0b00100000;    // RB5をビット反転
        __delay_ms(500);        // 500ミリ秒の待ち時間
    }
}
完成

LED点滅回路
2015/02/16

TOPPERS/EV3RTの開発環境構築 on Ubuntu 14.04 32bit

はじめに

Ubuntu上に,ETロボコン2015の公式ソフトウェアプラットフォームの1つである,TOPPERS/EV3RT (Real-Time platform for EV3)の開発環境を構築しました. 下記の公式ウェブサイトの掲載内容をそのまま実行しただけですが,作業ログとして書いておきます.

私も初心者ですので,内容に誤りが含まれている場合があります. また,本記事投稿現在,実機での動作確認ができていません…. つきましては,何かお気づきの際は,コメントなどでご指摘いただければ幸いです.

開発環境

VMware Player上にインストールした,Ubuntu 14.04 LTS 32bit上に構築しました.

OS Ubuntu 14.04 LTS 32bit

ダウンロードしたパッケージは,下記のとおりです.

TOPPERS/EV3RT β3-1: ev3rt-beta3-1-release.zip
作業ログ
  1. パッケージの準備
  2. ダウンロードして展開しました.

    1
    2
    3
    4
    5
    ~$ mkdir EV3RT
    ~$ cd EV3RT/
    EV3RT$ wget http://www.toppers.jp/download.cgi/ev3rt-beta3-1-release.zip
    EV3RT$ unzip ev3rt-beta3-1-release.zip
    EV3RT$ tar xvf ./ev3rt-beta3-1-release/ev3rt-beta3-1.tar.xz
  3. ARM社のGNU Toolchainのリポジトリの導入
  4. マニュアル通りに実行しました.

    1
    2
    3
    EV3RT$ sudo apt-get remove binutils-arm-none-eabi gcc-arm-none-eabi
    EV3RT$ sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded 2>&1 | tee apt-get.log
    EV3RT$ sudo apt-get update
  5. 必要なパッケージのインストール
  6. マニュアル通りに実行しました.

    1
    EV3RT$ sudo apt-get install gcc-arm-none-eabi=4.9.3.2014q4-0trusty12 u-boot-tools libboost1.55-all-dev | tee apt-get-install.log
  7. EV3RTのコンフィギュレータのインストール
  8. 結構時間がかかったように感じますが,気が付いたら完了していたため,所要時間はわかりません.

    1
    2
    EV3RT$ cd hrp2/cfg/
    cfg$ make | tee make-cfg.log
2015/02/12

Zynq Linuxの使用メモリを制限する

はじめに

下記の記事で,device treeのbootargsを編集してLinuxの使用メモリを制限する方法が紹介されていました. 試してみたところKernel panicを起こしてしまいましたので,その対処方法もメモしておきます.

今やってみたいのはZYBOのVGAまたはHDMIからGUIを出力することなのですが,やり方がよくわからず困っています. もっとハードルが低いことからコツコツやった方が早いかも….

DTSのbootargsを編集する

「mem=384M」を加えて,Linuxの使用メモリを384MBに制限してみます. ZYBOはメモリを512MB搭載していますので,アドレス 0x18000000 ~ 0x1fffffff まではLinuxの管理外になるはずです.

1
console=ttyPS0,115200 mem=384M root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1

Kernel panicが発生して起動しませんでした. わからないなりにログを眺めてみると,Kernelの読込み開始直後に落ちているようです.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
0
Device: zynq_sdhci
Manufacturer ID: 74
OEM: 4a45
Name: USD
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.5 GiB
Bus Width: 4-bit
reading uEnv.txt
117 bytes read in 8 ms (13.7 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading uImage
3827936 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
10655 bytes read in 16 ms (649.4 KiB/s)
## Booting kernel from Legacy Image at 03000000 ...
   Image Name:   Linux-3.14.0-xilinx-13567-g906a2
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3827872 Bytes = 3.7 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
   Booting using the fdt blob at 0x2a00000
   Loading Kernel Image ... OK
   Loading Device Tree to 1fb29000, end 1fb2e99e ... OK
 
Starting kernel ...
 
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.14.0-xilinx-13567-g906a2c9 (省略) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23) ) #5 SMP PREEMPT Thu Feb 12 21:03:26 JST 2015
[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: xlnx,zynq-7000
[    0.000000] bootconsole [earlycon0] enabled
[    0.000000] cma: CMA: reserved 128 MiB at 10000000
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] Unable to handle kernel paging request at virtual address dfb29000
[    0.000000] pgd = c0004000
[    0.000000] [dfb29000] *pgd=00000000
[    0.000000] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[    0.000000] Modules linked in:
[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.0-xilinx-13567-g906a2c9 #5
[    0.000000] task: c07296f0 ti: c071e000 task.ti: c071e000
[    0.000000] PC is at __unflatten_device_tree+0xc4/0x278
[    0.000000] LR is at unflatten_device_tree+0x1c/0x34
[    0.000000] pc : [<c03e1764>]    lr : [<c0702d7c>]    psr: 600000d3
[    0.000000] sp : c071ff40  ip : c072ad0c  fp : cfffff40
[    0.000000] r10: c07293c0  r9 : c072accc  r8 : c07357b0
[    0.000000] r7 : c06eb7d4  r6 : c076e1c0  r5 : c076ca20  r4 : dfb29000
[    0.000000] r3 : 00000000  r2 : c06eb7d4  r1 : c0c956b8  r0 : dfb29000
[    0.000000] Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
[    0.000000] Control: 18c5387d  Table: 0000404a  DAC: 00000015
[    0.000000] Process swapper (pid: 0, stack limit = 0xc071e240)
[    0.000000] Stack: (0xc071ff40 to 0xc0720000)
[    0.000000] ff40: dfb29000 c0c956b8 c06eb7d4 c0c956b8 c06eb7d4 c070c234 c076e1c0 c072accc
[    0.000000] ff60: c07357b0 c0702d7c c07263c8 c06eab28 ffffffff 18c5387d c071e000 c076e080
[    0.000000] ff80: ffffffff 0000406a c07263c0 00000000 00000000 c04d92cc c0614719 00000001
[    0.000000] ffa0: c071e000 c076e080 ffffffff 0000406a c07263c0 00000000 00000000 c06e7818
[    0.000000] ffc0: 00000000 00000000 00000000 00000000 00000000 c070f860 18c5387d c072640c
[    0.000000] ffe0: c070f85c c072adfc 0000406a 413fc090 00000000 00008074 00000000 00000000
[    0.000000] [<c03e1764>] (__unflatten_device_tree) from [<c0702d7c>] (unflatten_device_tree+0x1c/0x34)
[    0.000000] [<c0702d7c>] (unflatten_device_tree) from [<c06eab28>] (setup_arch+0x5b0/0x884)
[    0.000000] [<c06eab28>] (setup_arch) from [<c06e7818>] (start_kernel+0x88/0x380)
[    0.000000] [<c06e7818>] (start_kernel) from [<00008074>] (0x8074)
[    0.000000] Code: e59f0184 e59f1184 e6bf2f32 ebf8d05a (e5942000)
[    0.000000] ---[ end trace 3406ff24bd97382e ]---
[    0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
Kernel panicの対処方法 / uEnv.txtの編集

原因と対処方法を調べてみると,下記Webページが引っかかりました. u-bootがdevice treeをメモリの上限アドレス付近に配置するため,Kernelの使用メモリを制限するとdevice treeが存在するアドレスを参照できない,ということでしょうか. 対処方法は,u-bootがdevice treeを配置する際の上限アドレス(fdt_high)を変更すれば良いようです.

u-bootのソースコード上では, include/configs/zynq-common.h で 0x20000000 に設定されているようです(自信はないです). ソースコードを編集してu-bootをリビルドするのは面倒なので,uEnv.txtでの設定を試してみました. 下記の1行目を追加しました.

1
2
fdt_high=0x18000000
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

正常に起動しました. /proc/meminfo を参照すると,使用メモリが384MB程度に制限されていることがわかります.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
0
Device: zynq_sdhci
Manufacturer ID: 74
OEM: 4a45
Name: USD
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.5 GiB
Bus Width: 4-bit
reading uEnv.txt
137 bytes read in 8 ms (16.6 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading uImage
3827936 bytes read in 342 ms (10.7 MiB/s)
reading devicetree.dtb
10655 bytes read in 16 ms (649.4 KiB/s)
## Booting kernel from Legacy Image at 03000000 ...
   Image Name:   Linux-3.14.0-xilinx-13567-g906a2
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3827872 Bytes = 3.7 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
   Booting using the fdt blob at 0x2a00000
   Loading Kernel Image ... OK
   Loading Device Tree to 17ffa000, end 17fff99e ... OK
 
Starting kernel ...
 
# 省略
 
root@linaro-ubuntu-desktop:~# cat /proc/meminfo
MemTotal:         376616 kB
MemFree:          154656 kB
MemAvailable:     187500 kB
Buffers:           11000 kB
Cached:            65284 kB
SwapCached:            0 kB
Active:           156280 kB
Inactive:          40620 kB
Active(anon):     121080 kB
Inactive(anon):     5300 kB
Active(file):      35200 kB
Inactive(file):    35320 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         376616 kB
LowFree:          154656 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              1024 kB
Writeback:             0 kB
AnonPages:        120824 kB
Mapped:            49328 kB
Shmem:              5608 kB
Slab:              16692 kB
SReclaimable:       7080 kB
SUnreclaim:         9612 kB
KernelStack:        1552 kB
PageTables:         3092 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      188308 kB
Committed_AS:    1102444 kB
VmallocTotal:     630784 kB
VmallocUsed:        5652 kB
VmallocChunk:     376448 kB

Ubuntu起動時の「システムプログラムの問題が見つかりました」表示を消す

はじめに

下記バージョンのUbuntuをVMware Player上で使用しているのですが,起動時に「System program problem detected」ウィンドウと「システムプログラムの問題が見つかりました」ウィンドウが表示されるようになりました. 英語と日本語,少しの時間を空けて2つとも表示されるので,とても鬱陶しいです.

OS Ubuntu 14.04 LTS 32bit

System program problem detected

システムプログラムの問題が見つかりました
対処方法

下記Webページで原因と対処方法が紹介されていました. クラッシュした際のレポートファイルが /var/crash ディレクトリに作成されるようですが,このレポートファイルの存在がUbuntu起動時のメッセージウィンドウの原因になっているようです. つまり,レポートファイルを削除してしまえばUbuntu起動時のメッセージウィンドウは表示されなくなります.

下記コマンドを実行してレポートファイルを削除すると,メッセージウィンドウが表示されなくなりました.

1
2
3
~$ ls -la /var/crash
# レポートファイル一覧が表示される
~$ sudo rm /var/crash/*

上記Webページでは,レポートファイルの生成や送信要求を実行している(…?)ソフトウェア,Apport自体を無効化する方法も紹介されています. 今回,私はレポートファイルの削除のみ実施しました.

2015/02/09

Xilinx SDKでDevice Treeを生成する

はじめに

FPGAの部屋を読んでいると,Xilinx SDKでDeviece Tree Source (DTS)を生成できることがわかりました. 下記の記事が参考になりましたが,開発環境が異なるほか,ファイルの取得方法が変わっていましたので,私の作業メモを残しておきます.

Xilinx Wikiの該当ページは下記のとおりです.
開発環境

DTSの生成に使用するXilinx SDK 2014.4は,Windowsにインストールしています.

OS Microsoft Windows 7 Professional x64 Service Pack 1
SDK Xilinx SDK 2014.4

ファイル取得に使用するgitクライアントやDTSからDevice Tree Blob (DTB)を生成する環境は,VMware Player上のUbuntuにインストールしています. Windowsとのファイル共有には,WinSCPを使用しています.

OS Ubuntu 14.04 LTS 32bit
Device Tree Generatorのセットアップ

Ubuntu環境でDevice Tree Generatorのgitリポジトリを取得しました. その後,ディレクトリごとWindows環境の「C:\work」にコピーしました. これにより,「C:\work\device-tree-xlnx」ができたことになります.

1
~$ git clone git://github.com/Xilinx/device-tree-xlnx.git

Vivadoでプロジェクトを開き,「File」 - 「Launch SDK」からXilinx SDKを起動しました. Xilinx SDKのツールバーから「Xilinx Tools」 - 「Repositories」をクリックし,「Preferences」ウィンドウを開きました. 「Local Repositories」に,「C:\work\device-tree-xlnx」を追加しました.


Preferences
DTSの生成

Xilinx SDKの「File」 - 「New」 - 「Board Support Package」をクリックしました. 「New Board Support Package Project」ウィンドウが開きましたので,「Board Support Package OS」を「device-tree」に変更して「Finish」しました.


Board Support Package

「Board Support Package Settings」ウィンドウが開きましたので,「bootargs」の「Value」に下記を入力しました. これは一例ですので,各自の環境に合わせる必要があります.

1
console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1


Board Support Package Settings

「Board Support Package Settings」ウィンドウを「OK」で閉じると,自動的に「device-tree_bsp_0」プロジェクトのビルドが開始され,DTSが生成されました.


device-tree_bsp_0
DTBの生成

「device-tree_bsp_0」ディレクトリごとUbuntu環境にコピーし,DTBを作成しました. ほとんどGUI操作だけでdevicetree.dtbが生成でき,タイプミス起因のエラーを回避できるのは良さそうですね.

1
2
~$ cd zybo_bsd_linux/device_tree_bsp_0/
~/zybo_bsd_linux/device_tree_bsp_0$ ../Linux-Digilent-Dev/scripts/dtc/dtc -I dts -O dtb -o ./devicetree.dtb ./system.dts
2015/02/01

ZYBO (Zynq PS)にI2Cキャラクタ液晶を接続する

はじめに

Zynq PSのI2Cモジュールを使用して,I2Cキャラクタ液晶を制御してみました.


テストプログラムの実行結果
開発環境
OS Microsoft Windows 7 Professional x64 Service Pack 1
Vivado Vivado 2014.4 WebPACK Edition (Windows)
SDK Xilinx SDK 2014.4
I2Cキャラクタ液晶

AitendoのI2C低電圧キャラクタ液晶モジュール(16x2行) [SPLC792-I2C-M]を使用しました. バックライトユニットも搭載されていて375円です.安いですね…. LCDモジュール単体でも取扱いがあります.

接続方法については,下記の記事が大変参考になりました. 私も,ピンヘッダを変換基板に取り付けて接続しています. 変換基板の短辺側にあるランド(SHL, DIRC)にもピンヘッダを取り付け,ジャンパピンでショートさせることで,液晶モジュールの表示方向を変更できるようにしました. バックライトユニットの電源(BL+)には,330Ωの抵抗を直列接続して3.3Vを印加しました.


ピンヘッダの取り付け
Vivadoでの作業メモ
  1. Zynq Block Designの設定変更
  2. ZYBO Base System Designを流用しました. Block Design上のZYNQ7 Processing SystemをダブルクリックしてRe-customize IPウィンドウを開き,Zynq Block Designで「I2C 1」にチェックを入れました. なお,下図ではTTCにもチェックを入れていますが,I2Cキャラクタ液晶の制御には必要ありません.


    Zynq Block Design
  3. MIO Configurationの設定変更
  4. Re-customize IPウィンドウでMIO Configurationに表示を切り替え,I2C 1のIOを「EMIO」に設定しました. なお,下図ではTTCについても設定していますが,I2Cキャラクタ液晶の制御には必要ありません.


    MIO Configuration
  5. Diagramの変更
  6. Re-customize IPウィンドウを閉じ,Diagram上で右クリックしました. 右クリックメニューのCreate Interface PortをクリックしてI2C 1用のインタフェースポート「IIC_1」を作成し,ZYNQ7 Processing SystemのIIC_1と接続しました.


    Diagram
  7. I/O Portsの変更
  8. 「Run Synthesis」後,「Open Synthesized Design」し,IIC_1関連のI/Oポートをアサインするためにツールバーの「Window」 - 「I/O Ports」を開きました. 私は,ZYBOのPmod JBコネクタのJB1 (T20)にiic_1_scl_ioを,JB2 (U20)にiic_1_sda_ioをアサインしました.


    I/O Ports
プログラム

今更ながらGitHubのアカウントを作成しましたので,GitHubにて公開します.

Xilinx SDKで作成したプロジェクト内には「system.mss」というファイルがあります. このファイル内に,Zynq PSのI2Cモジュール「iicps」のドキュメントとサンプルプロジェクトのリンクがあり,大変参考になりました. このI2Cキャラクタ液晶のテストプログラムは,サンプルプロジェクト「xiicps_polled_master_example」を基に作成したものです.

また,I2Cキャラクタ液晶の制御方法の理解には,下記の記事が大変参考になりました.

製品紹介