{
"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
}