前回予告した 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 電源アダプタは、iPhone、iPad、iPod touch 用の USB 電源アダプタで問題ないようです。ビデオケーブルは、赤、黄、白に色分けされたケーブルです。使用するのは、映像の黄色だけです。共立電子で私が買ったビデオケーブル のように、黄色だけのものもあります。
- 出版社/メーカー: サンワサプライ
- メディア: Personal Computers
- クリック: 1回
- この商品を含むブログ (1件) を見る
サンワサプライ 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/
小さい画面が好みの人は、上記本家サイトの
オススメ周辺機器 テレビ
で紹介されている
【ノーブランド品】2系統の映像入力 12V車用 ミニオンダッシュ液晶モニター 4.3インチ バック切替可能
- 出版社/メーカー: ノーブランド
- メディア: エレクトロニクス
- この商品を含むブログを見る
Amazon.co.jp: 【ノーブランド品】2系統の映像入力 12V車用 ミニオンダッシュ液晶モニター 4.3インチ バック切替可能: 家電・カメラ http://www.amazon.co.jp/dp/B0079RJ4AE/
車載モニタがお勧めです。
上図が接続して電源を切った状態です。
プラスチックナット+連結(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 のファームウェアを更新するのにも利用できます。
私が試したのは、
超小型USBシリアル変換モジュール AE-FT234X: 半導体 秋月電子通商 電子部品 ネット通販 http://akizukidenshi.com/catalog/g/gM-08461/ AE-FT234X 1パック ¥600(税込) 4pin デバイス名: /dev/cu.usbserial-DJ002536
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)は接続する必要はありません。
Mac の OS 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 ボタンをクリックすると下図のようにデバイスが開きます。
後は、キーボードで入力すると 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
Mac の OS 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 アプリケーションを作成する方法を紹介したいと思います。
まず、Mac の App 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つの方法があります。厳密には GitHub の GitHub 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 コマンドを使う方法です。上記サイトの右中央
クリップボードアイコン をクリックします。クリップボードに https://github.com/titoi2/IchigoJamSerialConsole.git という文字列がコピーされます。後は、ターミナルでインストールしたいフォルダに移動して (例としてデスクトップを指定しています。)、git コマンドを ‘git clone ‘ と入力し、続けて Command+v でクリップボードからターミナルに文字列をペーストしてください。最後に Return キーを押して実行します。
~ $ 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 で開いた状態
図 10) のようにツールバーの IchigoJamSerialConsole 文字をクリックしてポップアップメニューを開き、図 11) ‘Edit Scheme …’ を選択します。
図 12) Edit Scheme …
上図のように、左ペインから Run をクリックし、Info タブを選択します。
Build Configurarion: release
Build Configurarion のメニューから release を選択します。リリースを選択するとビルドしたアプリケーションに余計な情報が含まれていません。
右下の Close ボタンをクリックしてウインドウを閉じます。
上図のように 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 以上に対応しています。好きなバージョンを選択してください。あくまでも宣言しているだけであって、ソースが対応している必要があります。
TARGETS IchigoJamSerialConsole
図 16) 左から2番めのペイン ‘TARGETS’ 下の文字 IchigoJamSerialConsole をクリック、その横の General タブをクリック
▼ 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) 左上ツールバーの ▶ ボタンをクリックしてビルドすると IchigoJamSerialConsole アプリケーションの作成に成功しますが、警告が表示されます。図 19) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。
図 20) ツールバーの下にある Navigator (一番左のペイン) 上部の 8 つのアイコンが並んでいる中から、左から4番目の警告アイコン (Issue Navigator) が選択されているか確認して下さい。
図 20) のように一番左側ペイン Issue Navigator に IJCSerialManager.swift ファイルの5つの警告が表示されます。警告をクリックすると
Issue: ******************** Fix-it Replace "! ******************
図 21) のようなダイアログが開きます。青色で反転した Fix-it と書かれたエリアをダブルクリックするとソースが自動で修正されます。! マークを削除しているだけです。すべての警告をクリックして上のように修正してください。すべての警告がなくなります。
念のため、
メニュー/Product/Clean
を選択し、ビルドされているアプリケーションを削除します。
再度、図 22) 左上ツールバーの ▶ ボタンをクリックしてビルドします。IchigoJamSerialConsole アプリケーションが起動しますが、図 23) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。
図 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 で
▼Pods ▼Pods 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
- 作者: Ole Henry Halvorsen,Douglas Clarke
- 出版社/メーカー: Apress
- 発売日: 2011/12/15
- メディア: Kindle版
- この商品を含むブログを見る
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
- 作者: Jonathan Levin
- 出版社/メーカー: Wrox
- 発売日: 2012/11/05
- メディア: Kindle版
- この商品を含むブログを見る
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 ライブラリは綺麗にまとまっていますね。