{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "オリジナルの作成: 2014/02/15" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 02-ProtoSnap Pro Miniを使ってみる(その1)\n", "私たちのArduino勉強会は、小学生、ご婦人から目の見えない方まで幅広い人が参加されています。\n", "\n", "できるだけ、初心者でも分かるように、またArduino経験者にも楽しいでもらえるように進めています。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LEDチカチカ\n", "Arduino勉強会/01-Arduinoのセットアップの最後に使ったBlinkを使ってArduinoの動作について 説明します。小学生もいるので、Blinkのコメントを日本語にして、説明します\n", "\n", "Arduinoではプログラムをスケッチと呼びます。[1](#Ref_1)\n", "\n", "Arduinoでは、//から行末までと/* から */までがコメントとして扱われます。コメントには、スケッチの説明を書いておくとよいでしょう。\n", "\n", "Blinkのスケッチ(行番号を追加)を見ながら、簡単に動作を説明します。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```C++\n", " 1 /*\n", " 2 Blink\n", " 3 1秒LEDを点灯し、次の1秒は消灯、これを繰り返します.\n", " 4 \n", " 5 この例題はパブリックドメイン(自由に使ってよいプログラムのこと)\n", " 6 */\n", " 7 \n", " 8 // ほとんどのArduinoボードでは、13ピンにLEDが接続されています.\n", " 9 // 13番ピンにledという名前を付けます.\n", " 10 int led = 13;\n", " 11 \n", " 12 // Arduinoに電源を入れたり、リセットボタンを押すと最初に1回だけsetup関数が実行されます.\n", " 13 void setup() { \n", " 14 // ledのデジタルピンを出力用に初期化します.\n", " 15 pinMode(led, OUTPUT); \n", " 16 }\n", " 17 \n", " 18 // loop関数は無限に繰り返します.\n", " 19 void loop() {\n", " 20 digitalWrite(led, HIGH); // LEDを点灯する(HIGHは電圧レベル)\n", " 21 delay(1000); // 1秒間待つ\n", " 22 digitalWrite(led, LOW); //電圧をLOWにして、LEDを消灯する\n", " 23 delay(1000); // 1秒間待つ\n", " 24 } \n", "```\n", "\n", "- Blinkスケッチの説明(1から6行目まで)\n", "- 変数ledにLEDの13番をセット(10行目)\n", "- setup関数でledの13番のデジタルピンを出力用に初期化(13行から16行)\n", "- loopは無限に呼び出される関数で、その中でLEDの点灯、1秒待つ、LEDの消灯、1秒待つを繰り返す(19行から24行)\n", "\n", "たったこれだけのスケッチでLEDチカチカができるのがArduinoの魅力です。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 困ったときの対処\n", "上手く動かないと困ったときには、日本語のマニュアルが役に立ちます。\n", "\n", "Arduinoの日本語のマニュアルが武蔵野電波のホームページ \n", "[Arduinoマニュアル](http://www.musashinodenpa.com/arduino/ref/)\n", "に公開されていますので、分からない場合は参照して下さい。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ProtoSnap Pro Miniボードの特徴\n", "どんなArduinoを用意したら、初心者にも使ってもらえるか色々悩んだ結果、ブレッドボードを使わなくても いくつかの実験ができ、後でブレッドボードを使った実験にスムーズに移行できることからsparkfunの \n", "[ProtoSnap Pro Mini QUickstart Guide](https://www.sparkfun.com/tutorials/303)\n", "を使うことにしました。\n", "\n", "\n", "\n", "ProtoSnap Pro Miniには、Arduinoを試すために必要な以下のものが一つにパッケージされています。\n", "\n", "- Arduino UNOをブレッドボードで使えるサイズに小さくしたArduino Pro Mini\n", "- パソコンと通信したりプログラムを書き込む時に使用する通信ボードFTDI Basic\n", "- タクトスイッチ\n", "- 光センサー\n", "- カラー(RGB)LED\n", "- ブザー\n", "\n", "部品とArduino Pro Miniのピンの接続は以下のようになっています。\n", "\n", "| 部品のピン\t| Arduino Pro Miniのピン |\n", "|:-------------|:---------------------------:|\n", "| ボタン | 7 |\n", "| 光センサー\t| A0 |\n", "| 緑のLED\t| 5 |\n", "| 青のLED\t| 6 |\n", "| 赤のLED\t| 3 |\n", "| ブザー\t| 2 |\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## スイッチとLEDを連動させる \n", "ProtoSnap Pro Miniボードの部品を使って色々な実験をしましょう。最初にボタンスイッチ(Button)を使ってLEDのオン・オフを制御するスケッチを描いてみます。\n", "\n", "Arduino IDEからファイル→新規ファイルを選択し、以下のスケッチをコピーし、新しいスケッチに貼り付けてください。\n", "\n", "```C++\n", "int buttonPin = 7; // ボタンは 7番ピンにつながっています\n", "int ledPin = 13; // LEDは 13番ピンにつながっています\n", "\n", "int buttonStatus; // ボタンの状態を保持するための変数\n", "\n", "void setup() {\n", " pinMode(buttonPin, INPUT); // ボタンピンを入力として初期設定\n", " pinMode(ledPin, OUTPUT); // LEDピンを出力として初期設定\n", "}\n", "\n", "void loop() {\n", " /* 最初にボタンの状態を読み込みます\n", " HIGH = ボタンが押されていない状態\n", " LOW = ボタンが押されている状態 */\n", " buttonStatus = digitalRead(buttonPin);\n", " \n", " if (buttonStatus == LOW) {\n", " digitalWrite(ledPin, HIGH); // ボタンが押されていたらLEDを点灯する\n", " }\n", " else {\n", " digitalWrite(ledPin, LOW); // そうでなければLEDを消す\n", " }\n", "}\n", "```\n", "\n", "Blinkと同様に書き込みボタンをクリックしてスケッチをArduinoに書き込みます。 ボタンを押すとLEDが点灯することを確認してください。\n", "\n", "Blinkスケッチとの違いを見ながら、スケッチの説明をします。\n", "\n", "- LEDのピン番号13をledPin、ボタンスイッチのピン番号7をbuttonPinにセット\n", "- setup関数では、buttonPinのモードをINPUTに初期化しています\n", "- digitalReadがデジタルピンの値(HIGH、LOW)を読み込む関数です. digitalReadで読み込んだ結果をbuttonStatusにセットします.\n", "- if文は、条件によって処理が分かれる部分です。{}で括った文をブロックと呼び、以下の様に処理されます.\n", "```C++\n", "if(条件)\n", " 条件が真の時に処理するブロック\n", "else\n", " 条件が偽の時に処理するブロック\n", "```\n", "\n", "if文の使い方が分かったところで、どうしてbuttonStatusがLOWの時にLEDを点灯するのか、 その理由を簡単に説明します。\n", "\n", "以下の図がボタンの回路です。ボタンを押していないときには、7番ピンには抵抗を通じて少量の電流が流れ7番ピンの電圧がHIGHのレベルになっています。これに対してスイッチを押すとGNDにつながるので、7番ピンの電圧はGND=LOWになります。 そのため、buttonStatusがLOWの時にLEDを点灯しているのです。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 光センサーの電圧を測ってみる\n", "これまでは、デジタルピンを使ってきましたが、電圧を読み込む場合にはアナログピンを使用します。 アナログピンの電圧を読み込むときには、analogRead関数を使います。\n", "\n", "analogReadは読み込んだ電圧を0-1023の値に変えて教えてくれます。\n", "Arduino Pro Miniの電圧が5Vなので、1023で5V、512で2.5Vを相当します。 \n", "\n", "光センサーは、A0のアナログピンにつながっていますので、光センサーの電圧を読み込むスケッチではlightPinとしてA0を使います。 \n", "\n", "どのように光センサーの電圧を読み込んでいるのか説明するよりも動かしてみた方が何をしているか感覚が掴めるのではないかと思います。 \n", "\n", "まず、以下のスケッチをArduinoに書き込んで下さい(CTRL-U)。ファイルメニューから新規ファイルを選択し、以下のスケッチをコピー&ペーストしてください。\n", "\n", "```C++\n", "int lightPin = A0; // 光センサーはA0につながっている\n", "\n", "int lightReading; // 光センサーからの値を保持する変数\n", "\n", "void setup() {\n", " /* シリアル通信の速度を9600ボーにセットし、最初にHello…のメッセージを表示する */\n", " Serial.begin(9600);\n", " Serial.println(\"Hello world, let's read some light sensors!\");\n", "}\n", "\n", "void loop() {\n", " lightReading = analogRead(lightPin); // 光センサーから値を読み込む\n", " Serial.println(lightReading, DEC); // 読み込んだ値をシリアル通信を使ってシリアルモニターに送る\n", " delay(250); // 次の読み込みまで待つ\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 光センサーの測定結果をパソコンに送る\n", "光センサーの測定結果をみるために、光センサーの値をシリアル通信を使ってパソコンに送ります。\n", "\n", "Arduino IDEのツールメニューからシリアルモニターを選択(CTRL-Shift-M)すると以下の様なシリアルモニターが表示されます。 ここで、右下の転送速度が9600 baud(ボーと呼びます)になっていることを確認してください。\n", "\n", "次々にArduinoの光センサーから読み取られた値がパソコンに送られてくるのが分かります。\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### スケッチの説明\n", "スケッチの動きが分かったところで、スケッチの中身を見ていきましょう。\n", "\n", "- 光センサーは、アナログピンA0につながっているので、lightPinにA0をセットします\n", "- 読み込んだ値を保持するために、lightReading変数を用意(宣言)します\n", "- setup関数で、シリアル通信の速度を9600ボーにセットし、”Hello world, let's read some light sensors!”の文字列をパソコンに送ります\n", "- loop関数では、analogRead関数を使って光センサーから電圧を読み取り、Serial.printlnで電圧の値を10進(DECimal)でパソコンに送ります\n", "- 最後のdelay(250)を入れないとシリアルポートに一度にたくさんの結果が送られるので、1回の測定の測定の後に250ミリ秒(0.25秒)待ちます\n", "\n", "今回はこれまで、次回をお楽しみに!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 補足\n", "光センサーのパソコンに返す値とセンサーの電圧との関係を分かってもらえるように、テスターでセンサーの電圧を測ってみました。\n", "[2](#Ref_2)\n", "\n", "以下がテスターの値です。\n", "\n", "\n", "\n", "シリアルモニターに返された値は、160近辺の値です。\n", "\n", "\n", "\n", "Arduinoは、4.78Vで動いていましたので、予想される値149と大体同じ程度の値になっています。 \n", "[3](#Ref_3)\n", "\n", "- 予想されるパソコンの値: 0.695/4.78 * 1023 = 149" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 脚注\n", "- [1] Arduinoの兄弟プロジェクトProcessingでも同様にスケッチと呼びます。こちらの方がスケッチらしいです。\n", "- [2] 第3回Arduino勉強会にて\n", "- [3] 光センサーの値は結構振れ幅があるのと、測定タイミングずれているので大まかな比較とみてください。" ] }, { "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 }