{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成:2014/07/06" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 0A-MacOSXへのinoのインストールと使い方\n", "## 動機\n", "Arduino勉強会では、目の不自由な方も参加されており、コマンドラインからの コンパイルとアップロードができるようにしたいのとの要望がありました。\n", "\n", "調べたところ、Arduinoにコマンドラインでプログラム、書込ができるinoが 以下のサイトに見つかりました。\n", "\n", "- http://inotool.org/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### inoに必要なもの †\n", "最新のinoのバージョンは、0.3.6で、 GitHubで公開されており、pythonのeasy_installを使って簡単にインストール することができます。\n", "\n", "inoを使うのに必要なものは、以下の3つです。\n", "\n", "- Python 2.6以降\n", "- Arduino IDE\n", "- picocom (シリアル通信ソフト)\n", "\n", "現在inoがサポートしているOSは、以下の2つです。\n", "\n", "- Linux\n", "- MacOSX" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MacPortsを使ってMacOSXにInoをインストール \n", "私は、MacPortsを使って必要なソフトをインストールしています。 \n", "\n", "MacPortsを使わない場合には、以下のサイトを参考にしてください。\n", "\n", "- [ino使うとCUIでArduinoをビルドできて便利](http://shokai.org/blog/archives/7454)\n", "\n", "MacPortsの開発には、アップルの提供しているXCodeが必要です。\n", "\n", "以下のサイトからMacPortsの最新をダウンロードしてインストールしてください。\n", "\n", "- http://www.macports.org/\n", "\n", "Xcodeのインストールは、MacApp Storeからダウンロードしてください。\n", "\n", "- Xcode\n", "\n", "コマンドラインツールのインストールには、Xcodeの\n", "\n", "- Xcode-> Open DeveloperTool -> More Developer Tools… を選択\n", "- Auxiliary Tools for Xcodeを選択し、Downloads for Apple Developerページが開くのでそこのリストから”Command Line Tools(OS X Mavericks) for Xcode”をダウンロードしてインストールしてください" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python2.7のインストール \n", "以下の作業は、アプリケーション/ユーティリティ/ターミナルを使って行います。\n", "\n", "Pythonは、いろいろなバージョンが使われており、ここでは古いですが安定した python2.7を使います。\n", "\n", "```bash\n", "$ sudo port install python27\n", "```\n", "\n", "### picocomのインストール \n", "同様にpicocomをインストールします。\n", "\n", "```bash\n", "$ sudo port install picocom\n", "```\n", "\n", "### inoのインストール\n", "inoのインストールは、easy_installを使って行います。python2.7用の easy_install-2.7で以下の様にインストールします。 \n", "\n", "```bash\n", "$ sudo /opt/local/bin/easy_install-2.7 ino\n", "```\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## inoの使い方\n", "\n", "### プロジェクトの作成\n", "新しいスケッチを作成するために、プロジェクト用のディレクトリを作成し、 テンプレートからスケッチのひな形を作成します。\n", "\n", "用意されているテンプレートは、以下の2つです。\n", "\n", "- blink : Basic01のBlinkと同じスケッチがひな形として作成されます。\n", "- empty : 空のsetupとloopが作成されます。\n", "\n", "早速プロジェクトをつくってみましょう。\n", "\n", "```bash\n", "$ mkdir test\n", "$ cd test\n", "$ ino init -t blink\n", "```\n", "\n", "blinkテンプレートを使ってinoのinitコマンドを実行すると 以下の様にsrc, libのディレクトリが作成され、srcの下にsketch.inoファイル が作成されます。\n", "\n", "```bash\n", "$ ls -R\n", "libsrc\n", "\n", "./lib:\n", "\n", "./src:\n", "sketch.ino\n", "```\n", "\n", "sketch.inoの中身は、以下の様になっています。\n", "\n", "```bash\n", "$ cat src/sketch.ino \n", "```\n", "\n", "```C++\n", "#define LED_PIN 13\n", "\n", "void setup()\n", "{\n", " pinMode(LED_PIN, OUTPUT);\n", "}\n", "\n", "void loop()\n", "{\n", " digitalWrite(LED_PIN, HIGH);\n", " delay(100);\n", " digitalWrite(LED_PIN, LOW);\n", " delay(900);\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチのビルド\n", "Arduino IDEでも最初にすることは、ボードの選択ですが、inoでも 同様です。\n", "\n", "inoのデフォルトボードは、unoですが、それ以外のボードを使う場合 には、list-modelsコマンドで使用するボードに対応するモデル名を確認します。\n", "\n", "```bash\n", "$ ino list-models\n", "Searching for Board description file (boards.txt) ... /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt\n", " uno: [DEFAULT] Arduino Uno\n", " atmega328: Arduino Duemilanove w/ ATmega328\n", " diecimila: Arduino Diecimila or Duemilanove w/ ATmega168\n", " nano328: Arduino Nano w/ ATmega328\n", " nano: Arduino Nano w/ ATmega168\n", " mega2560: Arduino Mega 2560 or Mega ADK\n", " mega: Arduino Mega (ATmega1280)\n", " leonardo: Arduino Leonardo\n", " esplora: Arduino Esplora\n", " micro: Arduino Micro\n", " mini328: Arduino Mini w/ ATmega328\n", " mini: Arduino Mini w/ ATmega168\n", " ethernet: Arduino Ethernet\n", " fio: Arduino Fio\n", " bt328: Arduino BT w/ ATmega328\n", " bt: Arduino BT w/ ATmega168\n", " LilyPadUSB: LilyPad Arduino USB\n", " lilypad328: LilyPad Arduino w/ ATmega328\n", " lilypad: LilyPad Arduino w/ ATmega168\n", " pro5v328: Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328\n", " pro5v: Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168\n", " pro328: Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328\n", " pro: Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168\n", " atmega168: Arduino NG or older w/ ATmega168\n", " atmega8: Arduino NG or older w/ ATmega8\n", "robotControl: Arduino Robot Control\n", " robotMotor: Arduino Robot Motor\n", "```\n", "\n", "私は、Arduino Duemilanoveを使っているので、atmega328がボード を表すモデル名となります。\n", "\n", "以下のコマンドでビルドを実行します。\n", "\n", "```bash\n", "$ ino build -m atmega328\n", "Searching for Board description file (boards.txt) ... /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt\n", "途中省略\n", "arduino/WString.cpp\n", "Linking libarduino.a\n", "Linking firmware.elf\n", "Converting to firmware.hex\n", "```\n", "\n", "エラーも無くビルドが終了しました。\n", "\n", "しかし、lsコマンドでみても何も変わったものはありません。\n", "\n", "```bash\n", "$ ls\n", "lib src\n", "```\n", "\n", "ビルドコマンド作成されたファイルは、見えないディレクトリ.build/モデル名/以下のあります。\n", "\n", "```bash\n", "$ ls .build/atmega328/\n", "Makefile Makefile.sketch firmware.elf src\n", "Makefile.deps arduino firmware.hex\n", "```\n", "\n", "Arduinoに書き込むのは、firmware.hexファイルです。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチの書き込み\n", "スケッチの書込には、uploadコマンドを使います。\n", "\n", "```bash\n", "$ ino upload -m atmega328\n", "Searching for stty ... /bin/stty\n", "途中省略\n", "Writing | ################################################## | 100% 0.56s\n", "\n", "avrdude: 1076 bytes of flash written\n", "avrdude: verifying flash memory against .build/atmega328/firmware.hex:\n", "avrdude: load data flash data from input file .build/atmega328/firmware.hex:\n", "avrdude: input file .build/atmega328/firmware.hex contains 1076 bytes\n", "avrdude: reading on-chip flash data:\n", "\n", "Reading | ################################################## | 100% 0.46s\n", "\n", "avrdude: verifying ...\n", "avrdude: 1076 bytes of flash verified\n", "\n", "avrdude: safemode: Fuses OK\n", "\n", "avrdude done. Thank you.\n", "```\n", "\n", "無事書き込みが終了すると、ボードのLEDが点滅します。\n", "\n", "### 設定ファイル\n", "buildやupload時にモデル名を設定するのは面倒です。\n", "\n", "プロジェクトファイルにino.ini、あるいはホームディレクトリに~/.inorcを作成し、 以下のようにモデル名やシリアルポートをセットすることができます。\n", "\n", "```bash\n", "$ cat ino.ini\n", "[build]\n", "board-model = atmega328\n", "\n", "[upload]\n", "board-model = atmega328\n", "serial-port = /dev/tty.usbserial-A7006T8Y\n", "\n", "[serial]\n", "serial-port = /dev/tty.usbserial-A7006T8Y\n", "```\n", "\n", "これで、単にbuild, uploadとコマンドを入力するだけで済みます。\n", "\n", "```bash\n", "$ ino build\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### シリアル通信\n", "inoでは、Arduino IDEのシリアルモニターの代わりにserialコマンドが用意されています。\n", "\n", "Quick startに習って、スケッチを以下の様に変更します。\n", "\n", "```bash\n", "$ cat src/sketch.ino\n", "```\n", "\n", "```C++\n", "void setup()\n", "{\n", " Serial.begin(9600);\n", "}\n", "\n", "void loop()\n", "{\n", " Serial.println(millis());\n", " delay(1000);\n", "}\n", "```\n", "\n", "ビルドして、serialコマンドを実行すると以下の様に出力されます。 途中で止める時には、Ctrl-A, Ctrl-Xを入力します。\n", "\n", "```bash\n", "$ ino build\n", "出力省略\n", "$ ino upload\n", "出力省略\n", "$ ino serial\n", "Searching for Serial monitor (picocom) ... /opt/local/bin/picocom\n", "picocom v1.7\n", "\n", "port is : /dev/tty.usbserial-A7006T8Y\n", "flowcontrol : none\n", "baudrate is : 9600\n", "parity is : none\n", "databits are : 8\n", "escape is : C-a\n", "local echo is : no\n", "noinit is : no\n", "noreset is : no\n", "nolock is : yes\n", "send_cmd is : sz -vv\n", "receive_cmd is : rz -vv\n", "imap is :\n", "omap is :\n", "emap is : crcrlf,delbs,\n", "\n", "Terminal ready\n", "0\n", "999\n", "1999\n", "3000\n", "4000\n", "5000\n", "\n", "ここで、Ctrl-A Ctrl-Xを入力して停止\n", "\n", "Thanks for using picocom\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }