{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hello World(Lチカ)に挑戦\n", "## HelloWorldプロジェクトを作成\n", "最初に inoでHelloWorldプロジェクトを作成します。\n", "\n", "inoの環境に他のファイルが紛れ込まないように、最初にプロジェクト用のディレクトリ(helloWorld)を作成します。\n", "\n", "inoの作業はこのhelloWorldに入って作業を実行します。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "!mkdir helloWorld" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次に、ino initコマンドでinoプロジェクトを作成します。このとき-t blinkのオプションを追加するとテンプレートからblinkをコピーしてくれます。\n", "\n", "注)既にプロジェクトが作成されている場合には、以下の作業は不要です(ファイルがある場合にはino initは失敗します)。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%bash\n", "cd helloWorld\n", "ino init -t blink" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上記コマンドで以下のファイルが作成されます。\n", "- src: .inoファイルのディレクトリ\n", "- src/sketch.ino: テンプレートからコピーされたblinkスケッチ\n", "- lib: ライブラリのディレクトリ" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "helloWorld:\r\n", "total 0\r\n", "drwxr-xr-x 1 vagrant vagrant 102 Oct 16 02:23 lib\r\n", "drwxr-xr-x 1 vagrant vagrant 102 Oct 16 02:23 src\r\n", "\r\n", "helloWorld/lib:\r\n", "total 0\r\n", "\r\n", "helloWorld/src:\r\n", "total 4\r\n", "-rw-r--r-- 1 vagrant vagrant 182 Dec 13 2011 sketch.ino\r\n" ] } ], "source": [ "! ls -lR helloWorld" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "sketch.inoの内容を確認してみましょう。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r\n", "#define LED_PIN 13\r\n", "\r\n", "void setup()\r\n", "{\r\n", " pinMode(LED_PIN, OUTPUT);\r\n", "}\r\n", "\r\n", "void loop()\r\n", "{\r\n", " digitalWrite(LED_PIN, HIGH);\r\n", " delay(100);\r\n", " digitalWrite(LED_PIN, LOW);\r\n", " delay(900);\r\n", "}\r\n" ] } ], "source": [ "! cat helloWorld/src/sketch.ino" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## スケッチの書き込み\n", "次にスケッチをコンパイルし、Arduinoに書き込むの手順を説明します。\n", "\n", "### モデル名を調べる\n", "inoでは使っているArduinoを製品名ではなく、モデル名で指定します。\n", "\n", "以下のコマンドでモデル名の一覧を表示します。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Searching for Board description file (boards.txt) ... \u001b[92m/usr/share/arduino/hardware/arduino/boards.txt\u001b[0m\r\n", "\u001b[96m uno\u001b[0m: \u001b[91m[DEFAULT] \u001b[0mArduino Uno\r\n", "\u001b[96m atmega328\u001b[0m: Arduino Duemilanove w/ ATmega328\r\n", "\u001b[96m diecimila\u001b[0m: Arduino Diecimila or Duemilanove w/ ATmega168\r\n", "\u001b[96m nano328\u001b[0m: Arduino Nano w/ ATmega328\r\n", "\u001b[96m nano\u001b[0m: Arduino Nano w/ ATmega168\r\n", "\u001b[96m mega2560\u001b[0m: Arduino Mega 2560 or Mega ADK\r\n", "\u001b[96m mega\u001b[0m: Arduino Mega (ATmega1280)\r\n", "\u001b[96m leonardo\u001b[0m: Arduino Leonardo\r\n", "\u001b[96m esplora\u001b[0m: Arduino Esplora\r\n", "\u001b[96m micro\u001b[0m: Arduino Micro\r\n", "\u001b[96m mini328\u001b[0m: Arduino Mini w/ ATmega328\r\n", "\u001b[96m mini\u001b[0m: Arduino Mini w/ ATmega168\r\n", "\u001b[96m ethernet\u001b[0m: Arduino Ethernet\r\n", "\u001b[96m fio\u001b[0m: Arduino Fio\r\n", "\u001b[96m bt328\u001b[0m: Arduino BT w/ ATmega328\r\n", "\u001b[96m bt\u001b[0m: Arduino BT w/ ATmega168\r\n", "\u001b[96m LilyPadUSB\u001b[0m: LilyPad Arduino USB\r\n", "\u001b[96m lilypad328\u001b[0m: LilyPad Arduino w/ ATmega328\r\n", "\u001b[96m lilypad\u001b[0m: LilyPad Arduino w/ ATmega168\r\n", "\u001b[96m pro5v328\u001b[0m: Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328\r\n", "\u001b[96m pro5v\u001b[0m: Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168\r\n", "\u001b[96m pro328\u001b[0m: Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328\r\n", "\u001b[96m pro\u001b[0m: Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168\r\n", "\u001b[96m atmega168\u001b[0m: Arduino NG or older w/ ATmega168\r\n", "\u001b[96m atmega8\u001b[0m: Arduino NG or older w/ ATmega8\r\n", "\u001b[96mrobotControl\u001b[0m: Arduino Robot Control\r\n", "\u001b[96m robotMotor\u001b[0m: Arduino Robot Motor\r\n" ] } ], "source": [ "! ino list-models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチのビルド\n", "私のArduinoはArduino Duemilanoveなので、-m atmega328とモデルを指定しています。\n", "\n", "それでは、スケッチをビルドしてみましょう。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "src/sketch.ino\n", "Searching for Arduino lib version file (version.txt) ... /usr/share/arduino/lib/version.txt\n", "Detecting Arduino software version ... 1.0.5 (1:1.0.5+dfsg2-2)\n", "Scanning dependencies of src\n", "Scanning dependencies of arduino\n", "src/sketch.cpp\n", "arduino/WInterrupts.c\n", "arduino/wiring_analog.c\n", "arduino/wiring.c\n", "arduino/wiring_digital.c\n", "arduino/wiring_pulse.c\n", "arduino/avr-libc/realloc.c\n", "arduino/avr-libc/malloc.c\n", "arduino/wiring_shift.c\n", "arduino/Tone.cpp\n", "arduino/HardwareSerial.cpp\n", "arduino/WMath.cpp\n", "arduino/CDC.cpp\n", "arduino/new.cpp\n", "arduino/Stream.cpp\n", "arduino/USBCore.cpp\n", "arduino/main.cpp\n", "arduino/HID.cpp\n", "arduino/WString.cpp\n", "arduino/Print.cpp\n", "arduino/IPAddress.cpp\n", "Linking libarduino.a\n", "Linking firmware.elf\n", "Converting to firmware.hex\n", "Searching for Board description file (boards.txt) ... /usr/share/arduino/hardware/arduino/boards.txt\n", "Searching for Arduino lib version file (version.txt) ... /usr/share/arduino/lib/version.txt\n", "Detecting Arduino software version ... 1.0.5 (1:1.0.5+dfsg2-2)\n", "Searching for Arduino core library ... /usr/share/arduino/hardware/arduino/cores/arduino\n", "Searching for Arduino standard libraries ... /usr/share/arduino/libraries\n", "Searching for Arduino variants directory ... /usr/share/arduino/hardware/arduino/variants\n", "Searching for make ... /usr/share/arduino/hardware/tools/avr/bin/make\n", "Searching for avr-gcc ... /usr/share/arduino/hardware/tools/avr/bin/avr-gcc\n", "Searching for avr-g++ ... /usr/share/arduino/hardware/tools/avr/bin/avr-g++\n", "Searching for avr-ar ... /usr/share/arduino/hardware/tools/avr/bin/avr-ar\n", "Searching for avr-objcopy ... /usr/share/arduino/hardware/tools/avr/bin/avr-objcopy\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "make: Warning: File `.build/atmega328/Makefile.deps' has modification time 0.013 s in the future\n", "make: warning: Clock skew detected. Your build may be incomplete.\n" ] } ], "source": [ "%%bash\n", "cd helloWorld\n", "ino build -m atmega328" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチのアップロード(書き込み)\n", "最後にino uploadコマンドでArduinoに書き込みます。\n", "\n", "環境設定でシリアルポート2を指定しているので、ubuntuでのデバイスは/dev/ttyS1となります。\n", "ino uploadコマンドのポート指定は、-p /dev/ttyS1で指定します。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "avrdude: AVR device initialized and ready to accept instructions\n", "\n", "Reading | ################################################## | 100% 0.00s\n", "\n", "avrdude: Device signature = 0x1e950f\n", "avrdude: reading input file \".build/atmega328/firmware.hex\"\n", "avrdude: writing flash (1018 bytes):\n", "\n", "Writing | ################################################## | 100% 0.52s\n", "\n", "avrdude: 1018 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 1018 bytes\n", "avrdude: reading on-chip flash data:\n", "\n", "Reading | ################################################## | 100% 0.44s\n", "\n", "avrdude: verifying ...\n", "avrdude: 1018 bytes of flash verified\n", "\n", "avrdude done. Thank you.\n", "\n" ] } ], "source": [ "%%bash\n", "cd helloWorld\n", "ino upload -m atmega328 -p /dev/ttyS1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチの作成と変更\n", "スケッチの作成と変更は%%writefileを使って行います。\n", "\n", "delayの間隔を200に変更してみましょう。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting helloWorld/src/sketch.ino\n" ] } ], "source": [ "%%writefile helloWorld/src/sketch.ino\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(200);\n", " digitalWrite(LED_PIN, LOW);\n", " delay(200);\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ビルドして、アップロードします。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "src/sketch.ino\n", "Scanning dependencies of src\n", "src/sketch.cpp\n", "Linking firmware.elf\n", "Converting to firmware.hex\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "avrdude: AVR device initialized and ready to accept instructions\n", "\n", "Reading | ################################################## | 100% 0.00s\n", "\n", "avrdude: Device signature = 0x1e950f\n", "avrdude: reading input file \".build/atmega328/firmware.hex\"\n", "avrdude: writing flash (1018 bytes):\n", "\n", "Writing | ################################################## | 100% 0.53s\n", "\n", "avrdude: 1018 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 1018 bytes\n", "avrdude: reading on-chip flash data:\n", "\n", "Reading | ################################################## | 100% 0.45s\n", "\n", "avrdude: verifying ...\n", "avrdude: 1018 bytes of flash verified\n", "\n", "avrdude done. Thank you.\n", "\n" ] } ], "source": [ "%%bash\n", "cd helloWorld\n", "ino build -m atmega328\n", "ino upload -m atmega328 -p /dev/ttyS1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## シリアルモニタを使ってみる\n", "jupyterノート上でもシリアルの出力をみることができます(残念ながら入力はできません、どなたかご存じの方はtake.pwave@gmail.comまでお知らせください)。\n", "\n", "スケッチを以下の様に変更します。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting helloWorld/src/sketch.ino\n" ] } ], "source": [ "%%writefile helloWorld/src/sketch.ino\n", "#define LED_PIN 13\n", "\n", "void setup(){\n", " pinMode(13, OUTPUT);\n", " Serial.begin(9600);\n", "}\n", "\n", "void loop(){\n", " digitalWrite(13, HIGH);\n", " delay(1000);\n", " Serial.println(\"on\");\n", " digitalWrite(13, LOW);\n", " delay(1000);\n", " Serial.println(\"off\");\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ビルドして、アップロードします。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "src/sketch.ino\n", "Scanning dependencies of src\n", "src/sketch.cpp\n", "Linking firmware.elf\n", "Converting to firmware.hex\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "make: Warning: File `.build/atmega328/Makefile.deps' has modification time 0.016 s in the future\n", "make: warning: Clock skew detected. Your build may be incomplete.\n", "\n", "avrdude: AVR device initialized and ready to accept instructions\n", "\n", "Reading | ################################################## | 100% 0.00s\n", "\n", "avrdude: Device signature = 0x1e950f\n", "avrdude: reading input file \".build/atmega328/firmware.hex\"\n", "avrdude: writing flash (2408 bytes):\n", "\n", "Writing | ################################################## | 100% 1.24s\n", "\n", "avrdude: 2408 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 2408 bytes\n", "avrdude: reading on-chip flash data:\n", "\n", "Reading | ################################################## | 100% 1.06s\n", "\n", "avrdude: verifying ...\n", "avrdude: 2408 bytes of flash verified\n", "\n", "avrdude done. Thank you.\n", "\n" ] } ], "source": [ "%%bash\n", "cd helloWorld\n", "ino build -m atmega328\n", "ino upload -m atmega328 -p /dev/ttyS1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "スケッチを以下の様に変更してシリアルからの情報を表示してみましょう。\n", "\n", "出力を止めるには、JupyterのKernelメニューからInterruptを選択します。\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Searching for Serial monitor (picocom) ... \u001b[92m/usr/bin/picocom\u001b[0m\n", "picocom v1.7\n", "\n", "port is : /dev/ttyS1\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", "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000on\n", "off\n", "on\n", "off\n", "on\n", "off\n", "on\n" ] } ], "source": [ "! ino serial -p /dev/ttyS1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "とても簡単にArduinoプログラミンが体験できます。みなさんもjupyterで Arduinoプログラミングに挑戦してみてください。\n", "\n", "これからもArduinoのスケッチの作成過程をjupyterのノートブックで共有し、電子工作の楽しさを広めたいと願っています。" ] }, { "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 }