{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成:2014/08/31" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 0C-米粒Arduinoを使ってみる\n", "## 米粒Arduinoを使ってみる\n", "Arduino勉強会のメンバーの岡野さんに米粒大のAVR ATtiny10を紹介して頂きました。 調べて見るとArduino用にライブラリーを提供している人もいるので、米粒Arduinoを 使ってみることにしました。\n", "\n", "### Atmel Studioの入手\n", "ATTiny10に書き込むには、Atmel Studio6を使ってAVR MkIIのファームウェアを書き替える 必要があるのですが、最新の6.2にはtoolメニューにAVR Tools Firmware Upgradeがありません。\n", "\n", "そこで、以下のサイトから6.1betaをダウンロードしました。\n", "\n", "- http://atmel-studio.software.informer.com/6.1b/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ライターの変換モジュール\n", "ATtiny10はとても小さいので、秋月の実装モジュールを運良く購入できました。\n", "\n", "変換基板も秋月にありますので、自分でハンダ付けすることも可能です。\n", "\n", "- http://akizukidenshi.com/catalog/g/gP-03659/\n", "\n", "最初に用意したのは、ATtiny10へのライターとATtiny10との変換モジュールです。 配線は、 \n", "[米粒AVR(ATtiny10)をArduino IDEで使う。暫定レポート2](http://make.kosakalab.com/make/attiny10-2/)\n", "を参考にさせて頂きました。\n", "\n", "\n", "\n", "変換モジュールの結線は、以下の通りです。\n", "\n", " | AVR MkII\t | ATtiny10 | \n", " | ---|---|\n", " | 1: MISO\t | 1: D0/A0 | \n", " | 2: VCC\t | 5: VCC | \n", " | 3: SCK\t | 3: D1/A1 | \n", " | 5: RESET\t | 6: RESET | \n", " | 6: GND\t | 2: GND | \n", " \n", "ピン配置は、以下の画像を参照してください\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ライターの動作確認\n", "変換モジュールができたので、正しく動作することをAtmelStudioを使って確かめます。\n", "\n", "良く例題にでているのは、D0にLEDを接続するものですが、これではライターを識別できず、書き込めません。 そこで、D2にLEDを接続するように修正しました。\n", "\n", "```C++\n", "#include \n", "#include \n", "\n", "int main() {\n", " DDRB = 0xff;\n", "\n", " for ( ; ; ) {\n", " PORTB |= 4;\n", " _delay_ms(500);\n", " PORTB &= 0xfb;\n", " _delay_ms(500);\n", " }\n", "}\n", "```\n", "\n", "書込には、Tools Device Programmingを選択し、Tool: AVRISP mkII, Device: ATtiny10をセットします。 Production fileでビルドされたelfファイルを指定して、Programボタンを押すと書込が始まります。\n", "\n", "書き込む時には、ATtiny10に5Vの電源を供給し、書き込み後はリセット(電源を再度つなぎ直すことで対応) する必要があります。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 電源とUSBシリアル変換モジュール\n", "ATtiny10への電源供給とUSBシリアル変換を行うために、マルツパーツの\n", "\n", "[【MPL2303SA】超小型USBシリアル・モジュール ](http://www.marutsu.co.jp/shohin_137791/)\n", "を使用しました。\n", "\n", "MPL2303SAのピン配置は、以下の通りです。\n", "\n", "\n", "\n", "### LED点灯の様子\n", "MPL2303SAとATtiny10をつないで、LEDを点滅している様子です。 LED点灯のプログラムで、128Byteになります。ATtiny10のフラッシュは、 1024Byteなので、約1割を使ってLEDの点滅が動いています。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ATtiny10をArduino IDEで使う\n", "世の中にはすごい人がいるもので、ATtiny10をArduino IDEでプログラミングできるようになりました。 kosakalabの方がその方法を公開されています。\n", "\n", "- [米粒AVR(ATtiny10)をArduino IDEで使う。暫定レポート2](http://make.kosakalab.com/make/attiny10-2/)\n", "\n", "MacとWindowsに対応していますが、ここではMacの方法のみを簡単に整理しておきます。\n", "\n", "- ATtiny用定義ファイル群(\n", "[attiny.zip](data/attiny.zip)\n", ")をダウンロードし、Arduinoのスケッチが保存されるフォルダーにhardwareというフォルダを作成し、その中に展開したattinyフォルダを入れる\n", "- [AVR-GCCコンパイラー](http://www.obdev.at/products/crosspack)をダウンロードし、インストール\n", "- Arduino IDEの内容を以下の手順でターミナルから変更($ はシェルのプロンプトです)\n", "\n", "```bash\n", "$ cd /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/\n", "$ mv avr avr-original\n", "$ ln -s /usr/local/CrossPack-AVR /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr\n", "```\n", "\n", "### 使い方\n", "準備ができたので、Arduino IDEでATtiny10のスケッチを作成し、書き込んでみます。\n", "\n", "- 「ツール」→「マイコンボード」→「ATtiny10 (Internal 8MHz clock)」を選択します\n", "- 「ツール」→「書込装置」→「AVRISP mkII」を選択します\n", "\n", "LED点滅を書き込みます。最初の例題との違いが分かるように点滅時間を短くしてみます。 ledの番号は2を使います。\n", "\n", "```C++\n", "int led = 2;\n", "\n", "void setup() { \n", " pinMode(led, OUTPUT); \n", "}\n", "\n", "void loop() {\n", " digitalWrite(led, HIGH); \n", " delay(200); \n", " digitalWrite(led, LOW); \n", " delay(200); \n", "}\n", "```\n", "\n", "実際に書き込んで動作している様子です。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## シリアル通信(送信のみ)を試す\n", "LED点滅だけでは、つまらないのでシリアル通信をしようと 「スケッチの例題」→「04.Communication」→「ASCIITable」 をコンパイルするとエラーになってしまいました。ATtiny10にはシリアル モジュールがないので、当たり前と言えばその通りです。 それでSoftSerialを使って見たのですが、こちらも未対応でエラーになりました。\n", "\n", "調べて見るとATtinyでシリアル通信(送信)を実行した人がいらっしゃいました。\n", "\n", "- [米粒AVRでシリアル通信(ただし送信だけ)](http://s2jp.com/2012/08/attiny10-serial/)\n", "\n", "ここで紹介されているシリアル関数を使ってArduino IDEからHello World!を表示するスケッチを 作って見ました。\n", "\n", "```C++\n", "#define led 2\n", "\n", "void setup() {\n", " serialBegin();\n", " pinMode(led, OUTPUT); \n", "}\n", "\n", "void loop() {\n", " digitalWrite(led, HIGH);\n", " delay(1000);\n", " digitalWrite(led, LOW);\n", " delay(1000); \n", " // 直接文字を出力しないとタイミングがずれて文字化けする\n", " serialWrite('H');\n", " serialWrite('e');\n", " serialWrite('l');\n", " serialWrite('l');\n", " serialWrite('o');\n", " serialWrite(' ');\n", " serialWrite('W');\n", " serialWrite('o');\n", " serialWrite('r');\n", " serialWrite('l');\n", " serialWrite('d');\n", " serialWrite('!');\n", " serialWrite('\\n');\n", "}\n", "```\n", "\n", "ここで、タブにTinySerialを追加します。\n", "\n", "```C++\n", "#include \n", "#include \n", "\n", "#define DELAY 500\n", "// 9600bps\n", "#define SERIAL_TIME_PER_BIT1 104\n", "#define SERIAL_TIME_PER_BIT2 102\n", "\n", "#define SERIAL_TX_PIN PB1\n", "\n", "void serialBegin() {\n", " CCP = 0xD8;\n", " CLKMSR = 0x00;\n", " CCP = 0xD8;\n", " CLKPSR = 0x00;\n", "\n", " DDRB |= _BV(SERIAL_TX_PIN);\n", " PORTB |= _BV(SERIAL_TX_PIN);\n", "}\n", "\n", "void serialWrite(uint8_t data) {\n", " PORTB &= ~(_BV(SERIAL_TX_PIN)); // start bit\n", " _delay_us(SERIAL_TIME_PER_BIT1);\n", " uint8_t i;\n", " for(i=1;i;i<<=1) {\n", " if(data&i) {\n", " PORTB |= _BV(SERIAL_TX_PIN);\n", " }\n", " else {\n", " PORTB &= ~(_BV(SERIAL_TX_PIN));\n", " asm volatile (\"nop\");\n", " }\n", " _delay_us(SERIAL_TIME_PER_BIT2);\n", " }\n", " PORTB |= _BV(SERIAL_TX_PIN); // stop bit\n", " _delay_us(SERIAL_TIME_PER_BIT1);\n", "}\n", "```\n", "\n", "書き込む前に、ATtinyの3番(D1)とMPL2303SAの4番(RXD)を結ぶ線は外しておいて下さい。\n", "\n", "ATtiny10への書込が成功したら、上記の線を結線し、MPL2303SAをUSBに接続し直し、シリアルモニターを表示し、9600ボーで受信して下さい。 LEDが点滅した後、Hello World!が表示(たまに文字化けがあります)されます。\n", "\n", "\n", "\n", "### タイミングのずれ?\n", "ここで、なぜSerialWriteをforループで書かないのか疑問がでると思いますが、Forループの処理を 入れると文字化けしたり、止まったりするのです。\n", "\n", "以下がForループを使ったスケッチです。\n", "\n", "```C++\n", "#define led 2\n", "\n", "char *msg = \"Hello World!\\n\";\n", "\n", "void setup() {\n", " serialBegin();\n", " pinMode(led, OUTPUT); \n", "}\n", "\n", "void loop() {\n", " digitalWrite(led, HIGH);\n", " delay(1000);\n", " digitalWrite(led, LOW);\n", " delay(1000); \n", " for (char *s = msg; *s; s++)\n", " serialWrite(*s);\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## bitDuinoに切替\n", "Twitterにこのページを紹介したら、まりすさんからbitDuinoを紹介して頂きました。\n", "\n", "- [世界最小?のArduino互換ボードを作ってみた(暫定版)](http://100year.cocolog-nifty.com/blog/2014/08/arduino-f0f0.html)\n", "\n", "コンパイルサイズも小さく、動かなかったForループを使ったスケッチが動くようになりました。 Forループのスケッチは、以下の通りです。\n", "\n", "```C++\n", "#define led 2\n", "\n", "static char *msg = \"Hello World!\\n\";\n", "\n", "void setup() {\n", " serialBegin();\n", " pinMode(led, OUTPUT); \n", "}\n", "\n", "void loop() {\n", " digitalWrite(led, HIGH);\n", " delay(1000);\n", " digitalWrite(led, LOW);\n", " delay(1000); \n", " for (char *s = msg; *s; s++)\n", " serialWrite(*s);\n", "}\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 }