IchigoJam に必要な物と起動方法、LPC1114 DIP28 データシート入手方法、USB-シリアルモジュールの入手方法と Mac でのキーボード入力、Xcode で IchigoJamSerialConsole をビルドする方法、IchigoJamSerialConsole と ORSSerialPort のソースを少し解析。

前回予告した IchigoJam について書きたいと思います。

まず最初に、IchigoJam を入手する必要があります。

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

本家サイト上記URLを開き、少しスクロールすると ‘IchigoJam 入手方法’ というタイトル項目が見つかります。
プリント基板キット版、プリント基板完成版、Get Started Set の取り扱い店が表示されています。私はプリント基板完成版 IchigoJam が欲しかったので、共立エレショップのリンクをクリックして購入しました。

【共立エレショップ】>> こどもパソコンIchigoJam 組み立て済完成品: 【開発・計測・ツール】 << 電子部品,半導体,キットの通販
http://eleshop.jp/shop/g/gF3K313/

上記 URL ページ左上の検索フィールドを ichigojam で検索すれば、多数の IchigoJam キットが表示されます。その中でも、

【共立エレショップ】>> IchigoJam電子工作パーツセット 32個のプログラムを保存!EEPROMカセット: 【開発・計測・ツール】 << 電子部品,半導体,キットの通販
http://eleshop.jp/shop/g/gF5U411/

は、お勧めです。私は上のキットが販売されているのを知らず、秋月電子通商でそれぞれ必要な部品を注文しました。

IchigoJam - ショップのふうせん
http://shopfusen.jimdo.com/ichigojam/

でも、購入できます。こちらは値段が高いですが、モジュールになっているので便利です。

【共立エレショップ】eleshop.jp:電子部品,半導体,キットの通販
http://eleshop.jp/shop/default.aspx

私が、共立エレショップで購入したものは

共立電子の店
エレショップ
こどもパソコンIchigoJam 組み立て済完成品
IchigoJam-G _
¥2,000
microUSBケーブル 1m■ジャンク■
IG-13004-DJK _
¥150
ビデオケーブル 1.5m[R指]
VD-015 _
¥282
商品金額合計
¥2,432
送料
¥480
注文金額合計
¥2,912

です。

IchigoJam について、下記 URL の本家サイト、ブログ、IchigoJam 情報サイト

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/
#IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/IchigoJam
こどもパソコン IchigoJam 情報サイト - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/

のリンクを辿れば、必要な情報は入手できると思います。私が公開している RSS リーダー iYKRSS、iYKRSSHD も

 #IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/IchigoJam
iYKRSS
カテゴリ/ニュース
無料
http://appstore.com/yoshiakikoyama/iykrss
iYKRSSHD
カテゴリ/ニュース
¥120
http://appstore.com/yoshiakikoyama/iykrsshd

福野泰介さんのブログ RSS を読めるように対応しました。

こどもパソコンIchigoJam「たいけんセット」 5ステップでプログラミングスタート! #opendata #shizuoka / 福野泰介の一日一創
http://fukuno.jig.jp/998

上記URLに最初にすべきことが記載されています。

IchigoJam を起動した手順を紹介したいと思います。

必要な物 - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/%E5%BF%85%E8%A6%81%E3%81%AA%E7%89%A9/

必要な物は上記 URL が参考になります。簡単に紹介すると

IchigoJam
microUSBケーブル
USB 電源アダプタ
ビデオケーブル
PS/2キーボード
テレビ

です。

USB 電源アダプタは、iPhoneiPadiPod touch 用の USB 電源アダプタで問題ないようです。ビデオケーブルは、赤、黄、白に色分けされたケーブルです。使用するのは、映像の黄色だけです。共立電子で私が買ったビデオケーブル のように、黄色だけのものもあります。

サンワサプライ PS/2キーボード SKB-L1BK

サンワサプライ PS/2キーボード SKB-L1BK

サンワサプライ PS/2キーボード SKB-L1BK
¥ 684

PS/2 キーボードは、Amazon などで売られています。また、USB キーボードを所有していれば PS/2-USB変換ケーブルを利用することもできます。

テレビですが、アナログ端子(RCA端子、赤、白、黄色の3つの端子) に対応しているものだと問題なく利用できます。私は、SHARP AQUOS 液晶テレビ 19型 ブラック LC-19K90-B を使用しました。

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

小さい画面が好みの人は、上記本家サイトの

オススメ周辺機器
テレビ

で紹介されている

Amazon.co.jp: 【ノーブランド品】2系統の映像入力 12V車用 ミニオンダッシュ液晶モニター 4.3インチ バック切替可能: 家電・カメラ
http://www.amazon.co.jp/dp/B0079RJ4AE/

車載モニタがお勧めです。


図 1) IchigoJam

上図が接続して電源を切った状態です。

プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gP-01864/

ただし、IchigoJam にスペーサーを取り付けてあります。

上図 1) のようにスイッチが2つあります。赤枠のスイッチ(SW1)が電源スイッチです。青枠のスイッチ(SW2、タクトスイッチ[ボタン]) は、BASIC 命令で押したかどうかを判定できます。

赤枠の電源スイッチSW1を入れても、基板の赤色ダイオードが点灯するわけではありません。赤色ダイオードBASIC の命令で操作できます。テレビに

IchigoJam BASIC 1.0.1 by jig.jp
OK

と表示されれば起動に成功です。IchigoJam のバージョンによって表示される文字列は違います。

IchigoJam で使用されているマイコン

IchigoJam組み立てキットで自分だけのパソコンづくり(上級編) #IchigoJam #maker / 福野泰介の一日一創
http://fukuno.jig.jp/671
マイコンLPC1114の外部クリスタルの自動判別方法 #lpc1114 #IchigoJam #maker / 福野泰介の一日一創
http://fukuno.jig.jp/1097

上記回路図より LPC1114 DIP28 です。

データシートは

LPCZone:NXP LPCマイコン情報・・LPCマイコン・ラインナップ
http://www.nxp-lpc.com/lpc_micon/

上記 URL よりダウンロードできます。回路図 Vdd = 3.3V より、LPC1100LV シリーズではなく LPC1100(X)L シリーズです。ハードウェアに関しては詳しくないので、間違っている可能性もあります。

LPCマイコン情報:LPC1100 (X)L Cortex-M0搭載-低消費電力,CSP,DIP,LPC1125,LPC1124,LPC1102,LPC1104,LPC1111,LPC1112,LPC1113,LPC1114,LPC1115, LPC1114FN28
http://www.nxp-lpc.com/lpc_micon/cortex-m0/lpc1100xl/
特徴
詳細はデータシート [ http://jp.nxp.com/documents/data_sheet/LPC111X.pdf ] でご確認ください。

の文字 ‘データシート’ のリンク、または

ドキュメント/技術情報
LPC111x(X)Lデータシート(PDF) [LPC1100] [ http://jp.nxp.com/documents/data_sheet/LPC111X.pdf ]
LPC1115, LPC1114, LPC1113, LPC1112, LPC1111, LPC1110。 LPC1114FN28/102も。

‘LPC111x(X)Lデータシート(PDF) ‘ のリンク

データシート
http://jp.nxp.com/documents/data_sheet/LPC111X.pdf

をクリックすると PDF ファイルがダウンロードできます。目的のLPCマイコン[ LPC1114FN28/102 ] データシートは

11ページ
6. Pinning information
Table 3.	Pin description overview
Part                            Pin description table       Pinning diagram
LPC1114FN28/102    Table 7                             Figure 13
26ページ
Table 7. LPC1100L series: LPC1112/14 pin description table (TSSOP28 and DIP28 packages)
18ページ
Fig 13. LPC1100L series pin configuration DIP28 package

上記ページが参考になります。OS X のアプリ ‘プレビュー’ で必要なページだけ抜き出して PDF 化すると便利です。メモリーマップは

46ページ
Fig 14. LPC1100 and LPC1100L series memory map

と IchigoJam 独自のメモリマップは

IchigoJamのメモリマップと演算子優先順位 #IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/984

で確認できます。

また、統合開発環境(IDE) LPCXpresso のフリー版は

Welcome NXP LPCXpresso Users! | www.LPCware.com
https://www.lpcware.com/lpcxpresso
Download LPCXpresso installers and the getting started guide
LPCXpresso IDE Downloads | www.LPCware.com
https://www.lpcware.com/lpcxpresso/download

からダウンロードできます。

次に OS X Yosemite 10.10.5 上で Mac のキーボードを IchigoJam のキーボードとして使用する方法を紹介したいと思います。

Mac のキーボードを IchigoJam のキーボードとして利用するには、USB-シリアルモジュールを用意する必要があります。また、USB-シリアルモジュールは Mac で IchigoJam のファームウェアを更新するのにも利用できます。

私が試したのは、


図 2) AE-FT234X

超小型USBシリアル変換モジュール AE-FT234X: 半導体 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-08461/
AE-FT234X
1パック ¥600(税込)
4pin
デバイス名: /dev/cu.usbserial-DJ002536


図 3) AE-FT231X

FT231X USBシリアル変換モジュール: 半導体 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gK-06894/
AE-FT231X
1パック ¥750(税込)
18pin
デバイス名: /dev/cu.usbserial-DJ004U12

の2つです。どちらも、細ピンヘッダは付属しています。ただし、細ピンヘッダは自分でハンダ付けする必要があります。ハンダ付けで失敗した場合は、はんだ吸取り線を利用してください。 率直に言うと値段も安いし、必要なのは 3 pin だけなので断然 AE-FT234X がお勧めです。

Ichigojam と AE-FT234X を接続するには、ジャンパーワイヤ(オス-メス) が必要です。秋月電子通商でいろいろな種類が売っています。
秋月電子通商の検索フィールドにキーワードを入力して検索するより、Google で直接

ジャンパーワイヤ site:akizukidenshi.com

上の語句で検索する方が、見つけやすいかもしれません。

Mac と接続するには

USBケーブル Aオス-マイクロBオス 1.5m A-microB: パーツ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gC-07607/
1本 ¥120(税込)

が必要です。


図 4) IchigoJam を USB-シリアルモジュールで Mac と接続した状態

上図は、AE-FT234X と IchigoJam を ジャンパーワイヤ(オス-メス) 3本で

AE-FT234X -	IchigoJam
TXD            -   RXD (15)
RXD            -  TXD (16)
GND           -  GND (8・22)

上記のように接続し、Mac とは USBケーブル で繋いだ状態です。AE-FT234X 側 VCC(3.3V)は接続する必要はありません。

MacOS X Yosemite 10.10.5 上では、最初からUSB-シリアルモジュール AE-FT234X、AE-FT231Xの FTDI 社用アップル純正ドライバがインストールされています。

IchigoJam の電源を入れ、

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole


図 5) IchigoJamSerialConsole でオープンするデバイス名を選択

IchigoJamSerialConsole (Xcode Version 6.4 (6E35b) による IchigoJamSerialConsole アプリケーションの作成の仕方は、後半に説明してあります。) を起動し、上図のようにデバイス名を選択し、Open ボタンをクリックすると下図のようにデバイスが開きます。


図 6) シリアルポートをオープンした状態

後は、キーボードで入力すると IchigoJam と接続したテレビに文字が表示されるはずです。(注意、IchigoJamSerialConsole アプリケーションが前面にないとキーボードの入力を受け取ることができません。) BASIC でプログラムができる状態になりました。IchigoJamSerialConsole を終了する前に、忘れず Close ボタンをクリックして、シリアルポートを閉じてください。(実際はウインドウを閉じればシリアルポートも閉じられます。)

LOAD ボタンをクリックすると文字コード: Shift JIS、改行コード: CR/LFのテキストファイルに保存した BASC プログラムを IchigoJam に転送できます。RUN + Return キーを入力すると実行できます。

注意) IchigoJamSerialConsole は、改行コード CR (0x0d) を送信しません。CoolTerm などで

Roger Meier's Freeware
CoolTerm
http://freeware.the-meiers.org/

生の BASIC プログラムを送信する場合、BASIC プログラムの改行コードを LF に変換してください。拙作、DUMP.bas.txt

DUMP.bas.txt  ; メモリダンププログラム version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/Sample/IchigoJam.zip

で IchigoJam のプログラムエリア #C00 をダンプすると改行コードが LF (0x0A) になっていることが確認できます。

BASIC プログラムは

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/
説明書・組み立て方
IchigoJam はじめのいっぽ&ミニゲームhttp://ichigojam.net/book/IchigoJam-firstgame.pdf
keynote
http://ichigojam.net/book/IchigoJam-firstgame.key
English-PDF
http://ichigojam.net/book/IchigoJam-firstgame-en.pdf
English-keynote
http://ichigojam.net/book/IchigoJam-firstgame-en.key
PROGRAM - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/program/

に、色々紹介されています。BASIC のバージョンには十分気をつけてください。

BASICリファレンスは、

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

上記URLページの右側

説明書・組み立て方
BASICリファレンス 1.0.1 / BASICリファレンス 0.9.7 / english version

BASICリファレンス 1.0.1、0.9.7 リンク

IchigoJam BASIC リファレンス 1.0.1
http://ichigojam.net/IchigoJam.html
IchigoJam BASIC リファレンス 0.9.7
http://ichigojam.net/IchigoJam-0.9.7.html

で読むことができます。

私が作ったメモリダンププログラムも下記URL で公開します。

IchigoJam BASIC バージョン 1.0.1 対応 BASIC 自作プログラム
DUMP.bas.txt  ; メモリダンププログラム version 1.0.0
SW2.bas.txt   ; SW2 タクトスイッチ判定プログラム version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/Sample/IchigoJam.zip

MacOS X Yosemite 10.10.5 上でのフォームウェア更新、外部記憶装置 EEPROM Coolterm の使い方、Coolterm の使用例と Parallels Desktop 10 の Windows 8 上での BUFFALO モニターモード搭載 USB用ビデオキャプチャー PC-SDVD/U2G の使用例などは次回に紹介したいと思います。

PC-G850V、PC-G850VS と Mac の間でシリアル通信ができるアプリケーション

PCG-LinkMac
http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html#pcglink

を公開している身としては、一番興味があったのは IchigoJamSerialConsole

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole

です。

最初に、IchigoJamSerialConsole のソースをダウンロードし、Xcode でビルドして IchigoJamSerialConsole アプリケーションを作成する方法を紹介したいと思います。

まず、MacApp Store から Xcode (私の環境は、Xcode Version 6.4 (6E35b) です。) をインストールしてください。インストールが終了したら、’/アプリケーション’ フォルダにある Xcode アイコンをダブルクリックして起動してください。

Xcodeの利用許諾(ライセンス同意契約)に Agree ボタンで同意し,パスワードを尋ねられるので入力してください。必要なコンポーネントがインストールされます。

Xcode をインストールするとコマンドラインツールはインストールされます。OS X Yosemite ではコマンドラインツールをインストールするために、ターミナル上でコマンド xcode-select –install を実行する必要はありません。

また、IchigoJamSerialConsole をビルドするには CocoaPods

CocoaPods.org
https://cocoapods.org/

が必要です。’/アプリケーション/ユーティリティ’ フォルダの ‘ターミナル’ を起動し

~ $ sudo gem install cocoapods

と入力し、 Return キーを押して CocoaPods をインストールしてください。パスワードの入力を求められるので、ログイン時のパスワードを入力します。しばらく時間がかかりますが、(反応がない状態が数分続きますが、そのまましばらくお待ちください。)

~ $ sudo gem install cocoapods
Password:
Fetching: cocoapods-core-0.38.1.gem (100%)
.
.
Parsing documentation for cocoapods-0.38.1
Installing ri documentation for cocoapods-0.38.1
3 gems installed
~ $ 

とプロンプト $ 文字が表示されれば終了です。CocoaPods のアップデートも、インストールと同じく再度 sudo gem install cocoapods を実行してください。

CocoaPods は最新の状態にしないと IchigoJamSerialConsole のソースを修正する必要が生じます。私が使用している CocoaPods のバージョンは、ターミナルのコマンド pod で確認すると


図 7) ターミナルで CocoaPods のバージョン確認

~ $ pod --version
0.38.2
~ $

0.38.2 です。

それでは、IchigoJamSerialConsole のソースをダウンロードします。2つの方法があります。厳密には GitHubGitHub on Mac アプリケーションを使う方法もあります。(私は GitHub on Mac を使ったことがないので詳しくは知らないのですが、Chrome で ‘Clone in Desktop’ ボタンをクリックすると GitHub on Mac が起動し、保存先を尋ねてくるそうです。)

一つ目は GitHub サイト

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole

の右中央の Downloaded Zip ボタンをクリックしてダウンロードする方法です。IchigoJamSerialConsole-master.zip という名前のファイルがダウンロードされ、ダブルクリックすると IchigoJamSerialConsole-master という名前のソースが含まれたフォルダが作成されます。好きな場所に IchigoJamSerialConsole-master フォルダを移動してください。

2つ目は、git コマンドを使う方法です。上記サイトの右中央


図 8) GitHubクリップボードアイコン

クリップボードアイコン をクリックします。クリップボードhttps://github.com/titoi2/IchigoJamSerialConsole.git という文字列がコピーされます。後は、ターミナルでインストールしたいフォルダに移動して (例としてデスクトップを指定しています。)、git コマンドを ‘git clone ‘ と入力し、続けて Command+v でクリップボードからターミナルに文字列をペーストしてください。最後に Return キーを押して実行します。


図 9) git コマンドでソースをダウンロード

~ $ cd Desktop
~/Desktop $ git clone https://github.com/titoi2/IchigoJamSerialConsole.git
Cloning into 'IchigoJamSerialConsole'...
remote: Counting objects: 145, done.
remote: Total 145 (delta 0), reused 0 (delta 0), pack-reused 145
Receiving objects: 100% (145/145), 94.62 KiB | 0 bytes/s, done.
Resolving deltas: 100% (67/67), done.
Checking connectivity... done.
~/Desktop $ 

これでデスクトップに IchigoJamSerialConsole という名前のフォルダが作成され、ソースがダウンロードされました。ターミナルで IchigoJamSerialConsole フォルダに移動します。

~/Desktop $ cd IchigoJamSerialConsole/

折角 git を使ったので、簡単な使い方を説明します。

現在ダウンロードしたリモートサーバーのアドレスを表示するには、git remote -v

~/Desktop/IchigoJamSerialConsole $ git remote -v
origin	https://github.com/titoi2/IchigoJamSerialConsole.git (fetch)
origin	https://github.com/titoi2/IchigoJamSerialConsole.git (push)

を使います。この場合、origin というリモートリポジトリの名前でリモートサーバーのアドレスを設定しています。

ブランチの表示には、 git branch -va です。

~/Desktop/IchigoJamSerialConsole $ git branch -va
* master                57820b4 ログクリアボタン追加
remotes/origin/HEAD   -> origin/master
remotes/origin/master 57820b4 ログクリアボタン追加
~/Desktop/IchigoJamSerialConsole $ 

上記より、現在のブランチは master です。

リモートリポジトリ origin の履歴を取得するには、 git fetch origin

~/Desktop/IchigoJamSerialConsole $ git fetch origin
~/Desktop/IchigoJamSerialConsole $ 

です。最新の履歴を表示するには、git branch -va

~/Desktop/IchigoJamSerialConsole $ git branch -va
* master                57820b4 ログクリアボタン追加
remotes/origin/HEAD   -> origin/master
remotes/origin/master 57820b4 ログクリアボタン追加
~/Desktop/IchigoJamSerialConsole $

で確認できます。

ステータスを確認するには、git status を使います。

~/Desktop/IchigoJamSerialConsole $ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
~/Desktop/IchigoJamSerialConsole $ 

git log を使うとコミットを確認できます。

~/Desktop/IchigoJamSerialConsole $ git log
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: xxxxxxxxxxx
Date:   xxx xxx x xx:xx:xx xxx +xxxx
:q

スペースキーを押すと次のページを開きます。終了は q キーを押してください。

git pull で自分のローカルリポジトリをリモートリポジトリの内容で更新します。

~/Desktop/IchigoJamSerialConsole $ git pull
Already up-to-date.
~/Desktop/IchigoJamSerialConsole $

git についてはあまり詳しくはありません。ソースを最新の状態にしたい場合は git pull を実行すれば良いようです。差分だけがダウンロードされ、最新状態になります。

次に CocoaPods を使って必要なライブラリをダウンロードする必要があります。

IchigoJamSerialConsole-master.zip ファイルをダウンロードし展開したフォルダ IchigoJamSerialConsole-master に ‘ターミナル’ 上で移動します。git コマンドでダウンロードした場合は、IchigoJamSerialConsole フォルダに移動してください。(今回の例では ‘デスクトップ/IchigoJamSerialConsole’ フォルダに移動しています。)

IchigoJamSerialConsole フォルダで説明します。(IchigoJamSerialConsole-master フォルダでも同じです。)

pod install コマンドを実行します。

~/Desktop/IchigoJamSerialConsole $ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing ORSSerialPort (1.8.1)
Generating Pods project
Integrating client project
Sending stats
~/Desktop/IchigoJamSerialConsole $

シリアルポートライブラリ ORSSerialPort がインストールされます。

open . コマンドで IchigoJamSerialConsole フォルダを Finder で開きます。

~/Desktop/IchigoJamSerialConsole $ open .

IchigoJamSerialConsole フォルダの IchigoJamSerialConsole.xcworkspace ファイルをダブルクリックして Xcode で開きます。(IchigoJamSerialConsole.xcodeproj ファイルではないので注意してください。)


図 10) IchigoJamSerialConsole.xcworkspace を Xcode で開いた状態


図 11) メニュー表示

図 10) のようにツールバーの IchigoJamSerialConsole 文字をクリックしてポップアップメニューを開き、図 11) ‘Edit Scheme …’ を選択します。


図 12) Edit Scheme

上図のように、左ペインから Run をクリックし、Info タブを選択します。


図 13) Build Configurarion 選択

Build Configurarion: release

Build Configurarion のメニューから release を選択します。リリースを選択するとビルドしたアプリケーションに余計な情報が含まれていません。

右下の Close ボタンをクリックしてウインドウを閉じます。


図 14) Project Navigator

上図のように Project Navigator (一番左のペイン) の IchigoJamSerialConsole 文字列をクリック、その横のエリア


図 15) PROJECT と Deployment Target 選択

PROJECT
IchigoJamSerialConsole

図 15) ‘PROJECT’ 下の文字 IchigoJamSerialConsole をクリック、さらに横の Info タブを選択

▼ Deployment Target
OS X Development Target 10.10

図 15) の OS X Development Target のメニューから、対応する最下位の OS を選択します。この場合だと OS X Yosemite 10.10 以上に対応しています。好きなバージョンを選択してください。あくまでも宣言しているだけであって、ソースが対応している必要があります。


図 16) TARGETS 選択

TARGETS
IchigoJamSerialConsole

図 16) 左から2番めのペイン ‘TARGETS’ 下の文字 IchigoJamSerialConsole をクリック、その横の General タブをクリック


図 17) Deployment

▼ Deployment Info
Development Target 10.10

図 17) のように先ほど選択した Deployment Target と同じか確認して下さい。違う場合は設定してください。

▼ Identity
Bundle Identifier: jp.aboutsoft.IchigoJamSerialConsole
Signing ◯ Mac App Store
◯ Developer ID
● None
Team: None

図 17) Identity の項目で今回は必要ありませんが、アプリケーションの識別子 jp.aboutsoft.IchigoJamSerialConsole を設定できたり、Mac App Store 以外で公開する場合の署名 Developer ID などを選択できます。Developer ID をクリックすると Team: None メニューから有効なメンバーを選択できます。

Apple Developer
https://developer.apple.com/

詳しくは、上記URLの Apple Developer Center/Member Center/Certificates, Identifiers & Profiles/Mac Apps/App Distrubution Guide を参照してください。

これで設定は終了です。


図 18) ビルド


図 19) 停止

図 18) 左上ツールバーの ▶ ボタンをクリックしてビルドすると IchigoJamSerialConsole アプリケーションの作成に成功しますが、警告が表示されます。図 19) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。


図 20) Issue Navigator

図 20) ツールバーの下にある Navigator (一番左のペイン) 上部の 8 つのアイコンが並んでいる中から、左から4番目の警告アイコン (Issue Navigator) が選択されているか確認して下さい。

図 20) のように一番左側ペイン Issue Navigator に IJCSerialManager.swift ファイルの5つの警告が表示されます。警告をクリックすると


図 21) Fix-it ダイアログ

Issue: ********************
Fix-it Replace "! ******************

図 21) のようなダイアログが開きます。青色で反転した Fix-it と書かれたエリアをダブルクリックするとソースが自動で修正されます。! マークを削除しているだけです。すべての警告をクリックして上のように修正してください。すべての警告がなくなります。

念のため、

メニュー/Product/Clean

を選択し、ビルドされているアプリケーションを削除します。


図 22) ビルド


図 23) 停止

再度、図 22) 左上ツールバーの ▶ ボタンをクリックしてビルドします。IchigoJamSerialConsole アプリケーションが起動しますが、図 23) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。


図 24) Project Navigator

図 24) のようにツールバーの下にある Navigator (一番左のペイン) 上部の 8 つのアイコンが並んでいる中から、一番左のフォルダアイコンをクリックしてください。プロジェクト・ナビゲーターが開きます。一番トップの IchigoJamSerialConsole から ▶ をクリックして階層を下って行くと


図 25) IchigoJamSerialConsole アプリケーション

▼IchigoJamSerialConsole
▼Products
IchigoJamSerialConsole.app

図 25) のように Products の下にアプリケーションアイコンと IchigoJamSerialConsole.app 文字列が見つかるはずです。これが目的の IchigoJamSerialConsole アプリケーションです。赤い文字列の場合、ビルドに失敗しています。


図 26) Finder に IchigoJamSerialConsole アプリケーションを表示

図 26) のように IchigoJamSerialConsole.app 文字列をマウスで右クリック (CTRL + 左クリック) し、’メニュー/Show in Finder’ を選択してください。

IchigoJamSerialConsole アプリケーションが Finder に表示されます。好きな場所にコピーしてください。

これで IchigoJamSerialConsole アプリケーションのビルドに成功しました。

ここからは個人的に関心があった簡単なソース解析です。

自作の PC-G850V、PC-G850VS と Mac の間でシリアル通信ができるアプリケーション

PCG-LinkMac
http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html#pcglink

の場合、シリアルポートを読み書きするプログラムは自作していたのですが、IchigoJamSerialConsole では便利なシリアルポートライブラリ ORSSerialPort を使用していました。こんな便利なライブラリがあったのですね。

ORSSerialPort ライブラリ、IchigoJamSerialConsole のソースを全て理解するのは無理なので、関心があるところだけ読み解きたいと思います。

キー入力は NSResponder クラスを継承した NSView のサブクラス MainView の func keyDown(theEvent: NSEvent)、func keyUp(theEvent: NSEvent) から

// MainView.swift
override func keyDown(theEvent: NSEvent) {
delegate.onKeyDown(theEvent)
override func keyUp(theEvent: NSEvent) {
delegate.onKeyUp(theEvent)

上のソース (ソースは省略してあるので、先頭に表示してあるファイル名とメソッド名を頼りに Xcode で確認して下さい。) のように delegate の onKeyDown(theEvent)、onKeyUp(theEvent) を呼び出しています。

// ViewController.swift
override func viewDidLoad() {
mainView.delegate = self

MainView の delegate は ViewController です。

// ViewController.swift
func onKeyDown(theEvent: NSEvent) {
keyDownProc(theEvent)

ViewController の onKeyDown(theEvent: NSEvent) から keyDownProc(theEvent) を呼び出しています。

// ViewController.swift
func keyDownProc(theEvent: NSEvent) {
serialManager.sendByte(c8)

ViewController の keyDownProc(theEvent: NSEvent) で PS/2 のキーコードに変換し、serialManager.sendByte(c8) を呼び出し、シリアルポートに1バイト出力しています。

serialManager は IJCSerialManager.swift の IJCSerialManager クラスをインスタンス化したものです。

// IJCSerialManager.swift
func sendByte(param:UInt8) {
sp.sendData(data)

sp は ORSSerialPort クラスです。sendData(data) で実際にシリアルポートに書き込んでいます;

// FileLoadViewController.swift
func loadData2Ichigojam(data:NSData) {
serialManager.sendByte(d)
NSThread.sleepForTimeInterval(0.02)

また、テキストをシリアルポートに書き込むメソッド loadData2Ichigojam(data:NSData)の場合、1バイト送るごとに NSThread.sleepForTimeInterval(0.02) で遅延しています。

IJCSerialManager.swift
func open(path:String) {

func open(path:String) メソッドを見るとシリアルポートを通信速度 115200 で開いていることが判ります。

ORSSerialPort ライブラリから呼び出されるプロコトル、シリアルポードを開く処理などは、すべて IJCSerialManager.swift でおこなっています。ORSSerialPort ライブラリのプロコトルから呼び出されるメソッドを IJCSerialManager.swift に実装し、そのメソッドから IJCSerialManager.swift 宣言したプロコトル IJCSerialManagerDelegate を使って ViewController.swift に流しています。

私にとって ORSSerialPort ライブラリはあまりにも複雑すぎて完全には理解できないのですが、シリアルポードは基本的に BSD ライブラリの

#include <fcntl.h>
int open(const char *path, int oflag, ...);
ssize_t write(int fildes, const void *buf, size_t nbyte);

上記システムコール関数 open() でデバイスを開き、write() 関数で書き込むだけです。詳しくは、ターミナルで

~ $ man 2 open
~ $ man 2 write
~ $ 

上記 man コマンドで確認して下さい。次ページを表示するにはスペースキーを押し、終了は q キーを押してください。
man の内容をテキストファイルに出力するには、以下のコマンド

~ $ man 2 open | col -bfx > open.txt
~ $ open open.txt
~ $ 

を実行してください。

デバイスの通信速度などの設定は

#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
struct termios termios_p;
int tcgetattr(int fildes, struct termios *termios_p);
int tcsetattr(int fildes, int optional_actions, const struct termios *termios_p);
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);

上記関数で設定できます。ターミナルで

~ $ man 3 tcgetattr

で確認してください。拙作 PCG-LinkMac や ORSSerialPort ライブラリでも基本は同じです。

ただし、ソースを解析していて驚いたのは入手できるシリアルポートを調べるのに IOKit を使っているところです。私は安直に /dev を開いて調べていました。

ちょと抜き出してみました。(ソースは省略してあるので、詳細は必ず IchigoJamSerialConsole.xcworkspace ファイルを Xcode で開き、ツールバー下にあるフォルダアイコンをクリックし、一番左側ペイン Project Navigator で

PodsPods
ORSSerialPort.m
ORSSerialPortManager.m

ORSSerialPort.m、ORSSerialPortManager.m を確認して下さい。)

// ORSSerialPort.m
#import <IOKit/serial/IOSerialKeys.h>
#import <IOKit/serial/ioss.h>
@property (readonly) io_object_t IOKitDevice;
+ (NSString *)stringPropertyOf:(io_object_t)aDevice forIOSerialKey:(NSString *)key;
{
CFStringRef string = (CFStringRef)IORegistryEntryCreateCFProperty(aDevice, (__bridge CFStringRef)key, kCFAllocatorDefault, 0);
return (__bridge_transfer NSString *)string;
}
+ (NSString *)bsdCalloutPathFromDevice:(io_object_t)aDevice;
{
return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIOCalloutDeviceKey)];
}
//  ORSSerialPortManager.m
// 220行目
 - (void)retrieveAvailablePortsAndRegisterForChangeNotifications;
{
self.portPublishedNotificationIterator = portIterator;
IOObjectRelease(portIterator);
NSMutableArray *ports = [NSMutableArray array];
io_object_t eachPort;
while ((eachPort = IOIteratorNext(self.portPublishedNotificationIterator)))
{
ORSSerialPort *port = [ORSSerialPort serialPortWithDevice:eachPort];
// シリアルポートの場合、配列 ports に追加
if (port) [ports addObject:port];
IOObjectRelease(eachPort);
}
// 入手できるシリアルポートに代入
self.availablePorts = ports;
#define kIOCalloutDeviceKey		"IOCalloutDevice"  // /dev/cu.usbserial-FTG6R5XK
#define kIODialinDeviceKey		"IODialinDevice"    // /dev/tty.usbserial-FTG6R5XK

上のソースがその箇所です。個人的に動作を調べるために作成したサンプルを

シリアルポートデバイスのパス名を Xcode 下のデバッガコンソールに表示するプログラム
http://kyoshiaki.sakura.ne.jp/osx/Sample/SerialPort.zip

上記URLで公開します。

USB シリアル変換ケーブルを接続して上記URLで公開しているプロジェクトをビルドすると、シリアルポートを Xcode 左下のデバッガコンソールに表示します。ソースは以下のとおりです。

/*
 IOKit からデバイス名を取り出す
 */
-(void)bsdPathFromDevice {
CFMutableDictionaryRef matchingDict = NULL;
// kIOSerialBSDServiceValue にマッチした IOService の CFMutableDictionaryRef を作成
matchingDict = IOServiceMatching(kIOSerialBSDServiceValue);
CFRetain(matchingDict); // Need to use it twice
// matchingDict に キー:CFSTR(kIOSerialBSDTypeKey) 値:CFSTR(kIOSerialBSDAllTypes) を追加
CFDictionaryAddValue(matchingDict, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDAllTypes));
// portIterator に matchingDict で指定した IOService object をセット
io_iterator_t portIterator = 0;
kern_return_t err = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &portIterator);
CFRelease(matchingDict);
if (err) return;
// portIterator からシリアルポート eachPort を取り出す
io_object_t eachPort = 0;
while ((eachPort = IOIteratorNext(portIterator)))
{
// デバイス名を取得
NSString *calloutPath = [ViewController bsdCalloutPathFromDevice:eachPort];  // /dev/cu.xxxxx
NSString *dialinPath = [ViewController bsdDialinPathFromDevice:eachPort];    // /dev/tty.xxxx
NSLog(@"%@\n", calloutPath);
NSLog(@"%@\n", dialinPath);
IOObjectRelease(eachPort);
}
IOObjectRelease(portIterator);
}
/*
 シリアルポートのデバイス名を取り出す関数
 */
+ (NSString *)stringPropertyOf:(io_object_t)aDevice forIOSerialKey:(NSString *)key
{
// ここが IOKit からシリアルポートのデバイス名を取り出している箇所
CFStringRef string = (CFStringRef)IORegistryEntryCreateCFProperty(aDevice,
(__bridge CFStringRef)key,
kCFAllocatorDefault,
0);
return (__bridge_transfer NSString *)string;
}
/*
 kIOCalloutDeviceKey: @"/dev/cu.xxxxx" を返す
 */
+ (NSString *)bsdCalloutPathFromDevice:(io_object_t)aDevice
{
return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIOCalloutDeviceKey)];
}
/*
 kIODialinDeviceKey: @"dev/tty.xxxxx" を返す
 */
+ (NSString *)bsdDialinPathFromDevice:(io_object_t)aDevice
{
return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIODialinDeviceKey)];
}

後、ORSSerialPort ライブラリでシリアルポートからの読み込みの部分をどう実装しているかと思ったのですが

//  ORSSerialPort.m
// 236行目
- (void)open;
{
// 288行目
// ここで非同期のシリアルポートを読むスレッド作成
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
int localPortFD = self.fileDescriptor;
struct timeval timeout;
int result=0;
while (self.isOpen)
{
fd_set localReadFDSet;
FD_ZERO(&localReadFDSet);
FD_SET(localPortFD, &localReadFDSet);
timeout.tv_sec = 0;
timeout.tv_usec = 100000; // Check to see if port closed every 100ms
dispatch_semaphore_wait(self.selectSemaphore, DISPATCH_TIME_FOREVER);
// デバイスに変化があったか
result = select(localPortFD+1, &localReadFDSet, NULL, NULL, &timeout);
dispatch_semaphore_signal(self.selectSemaphore);
if (!self.isOpen) break; // Port closed while select call was waiting
if (result < 0)
{
[self notifyDelegateOfPosixError];
continue;
}
// データの読み込みがあったデバイスが目的のデバイスでない
if (result == 0 || !FD_ISSET(localPortFD, &localReadFDSet)) continue;
// Data is available
char buf[1024];
// デバイスからデータの読み込み
long lengthRead = read(localPortFD, buf, sizeof(buf));
if (lengthRead>0)
{
NSData *readData = [NSData dataWithBytes:buf length:lengthRead];
// 読み込んだデータを receiveData: メソッドで呼び出す
if (readData != nil) [self receiveData:readData];
}
}
});

open メソッドを呼び出すと、データを読み込む別スレッドが dispatch_async 関数で作成されます。self.isOpen が NO になるとスレッドは終了します。[self receiveData:readData]; で読み込んだデータを下記のように

// 539行目
 - (void)receiveData:(NSData *)data;
{
// serialPort:didReceiveData: メソッドは、プロコトル ORSSerialPortDelegate  に準拠
// デリゲートに serialPort:didReceiveData: が実装されているか確認
if ([self.delegate respondsToSelector:@selector(serialPort:didReceiveData:)])
{
//
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate serialPort:self didReceiveData:data];
});
}
dispatch_async(self.requestHandlingQueue, ^{
[self.receiveBuffer appendData:data];
// データを受け取っていない場合、もう一度送る
// よく理解できなかった
[self checkResponseToPendingRequestAndContinueIfValid];
});
}

プロコトル ORSSerialPortDelegate に準拠したデリゲートに送信しています。

私も IOKit を使用したシリアルポートの入手方法を探していましたが、以前は見つけることができませんでした。今回、ORSSerialPort ライブラリのソースで理解できたので再度調べたら、私が所有していた

OS X and iOS Kernel Programming

OS X and iOS Kernel Programming

OS X and iOS Kernel Programming
Chapter 11
Serial Port Drivers
Location 6089
Accessing a Serial Port from User Space

Mac OS X and iOS Internals: To the Apple's Core

Mac OS X and iOS Internals: To the Apple’s Core

Mac OS X Internals:A System Approach
Chapter 10
Extending the Kernel
10.2 The I/O Kit
10.5 Communicating with the Kernel

で見つけることが出来ました。ここでは説明しませんでしたが ORSSerialPort.m の – (void)open 関数では、シリアルポートが存在するか、シリアルポートの CTS、DSR の状態チェックをする別のスレッドを作成しています。本当に ORSSerialPort ライブラリは綺麗にまとまっていますね。