このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点Processingのプログラム(Applet)を表示する方法
ArduinoやProcessingについては「建築発明工作ゼミ2008」の方にまとめてあります。
秋葉原の電子工作マップ、Arduino販売店についてはこちら。 :

2009年6月13日土曜日

ProcessingとArduinoの学習方法

これからプログラミングを学ぼうとする際(初心者向け)のヒントについてです。

Processing、Arduinoともプログラミングすることで様々な機能や表現を可能にしますので、まずはプログラミングの仕方としてProcessingから開始することをおすすめします。一旦プログラミングの流儀に慣れれば、Arduinoでのエレクトロニクス制御のプログラミングも理解しやすくなると思います。最終的にはシリアル通信という方法を用いてProcessingとArduinoを連動させ、デジタルとフィジカルの世界を行き来する内容へと発展させます。

以下は段階ごとの大まかな学習方法のリストです。各項目の詳細については「建築発明工作ゼミ」のサイトでも紹介してありますので参考にしてください。

Processing:
Processingは、任意の図形やイメージなどをコンピュータのスクリーン上に表示するツールだと思ってください。図形は数値や各コマンドによって定義されます。
また、アニメーションのように図形を動かしたり、インタラグティブな要素としてマウスやキーボード入力のコマンドを利用することで、画面表示内容にリアルタイムで変化を与えることが可能になります。

・表示画面サイズの設定
・図形の塗り面/外形線、色、線の太さ、基準位置の設定
・図形(点/線/矩形/円など)の描画方法(種類、サイズ、画面上での位置)
・図形のアニメーション(ループの利用)
・マウス入力/キー入力

ループと変数

アニメーションやリアルタイムで動くプログラムの場合は、「ループ(繰返しの処理)」や「変数」という方法を用います。最初のうちは、「ループ」や「変数」という概念に戸惑いを感じるかもしれません。
例えば図形をアニメーションで動かしたい場合は、「何秒後にここへ」というように時間と位置を指定したくなるのですが、プログラム上では、速度の値がどのくらいであり、何ループさせるかを実行処理させます。つまり、動画の1コマずつの位置の変化量(速度)をプログラム上で定義し、それら変化量を累積する計算をさせて距離(位置)を導きだすことになります。距離を微分すると速度になり、速度を積分すると距離になるという捉え方です。
また、静止画の円の場合、中心座標と半径(あるいは幅や高さ)で定義しますが、動的に円を描かせるプログラムになると、円の描画開始点と曲率で定義することになり、中心座標は結果的に導きだされるのであって最初に定義する項目ではなくなります。
等速度運動の場合であれば、時間の進み方(1秒間に何コマ:初期設定60コマ)と速度は一定であり、距離だけが変化します。自由落下のような加速度運動の場合であれば、時間の進み方は一定ですが、速度と距離は常に変化していきます。このように、変化しない値と変化する値を区別し、変化する値を計算上代入可能にするために「変数」を用いると便利になります。
変化したり移動したりするものを、時間と位置(距離や結果)でとらえるのではなく、変化量で把握できるようになれば、どのようにプログラムすればいいのかが分かってくると思います。同時にプログラミングに慣れていくことで、ものごとの現象を変化量あるいは微分・積分でとらえる感覚が身に付くと思います。
というように、必要な結果を導きだすプロセスをデザインし計算させるのであって(アルゴリズム)、必要な結果を無理矢理コンピュータにお願いするのではないという点に注意して下さい。


Arduino:
Arduinoでは、エレクトロニクスを制御するためにプログラミングが必要であり、それに加え電気の知識も必要になりますが、基本はスイッチのオン/オフ(デジタル出力)となります。まずは、センサなどを用いず、プログラムだけで出力方法(点灯/点滅/明るさ調節など)を制御するところから始めるといいと思います。delay()というコマンドを使うことで、一定時間点灯させるなどの制御が可能です。

・デジタル出力(プログラムによるLEDのオン/オフ制御)
・アナログ出力(プログラムによるLEDの照度を段階的に制御、256段階で調節可)

つぎにセンサを接続し、そのセンサから読み取った値を出力に反映させます。センサには複雑なものもありますが、まずは可変抵抗器(ボリューム:音量調節用の回転式のつまみ)を手に入れて(安価で仕組みが理解しやすい)利用するといいと思います。

・デジタル入力(オン/オフ切替式のスイッチやセンサを接続しLEDのオン/オフ制御)
・アナログ入力(度合いを調節可能なセンサを接続しLEDの照度を段階的に制御)

これらデジタル出力/アナログ出力/デジタル入力/アナログ入力の組み合わせによって、複雑な仕組みの構築を可能にします。


ProcessingとArduinoとの連動:

さらに次の段階では、ProcessingとArduinoを「シリアル通信」という方法で連動させます。この段階でようやくデジタルとフィジカルな世界を行き来する内容が可能になります。シリアル通信の方法については、建築発明工作ゼミの「シリアル通信1〜6」を参考にしてみてください。


初心者の方はここを目標に:
まずは、基本操作としてProcessingによる図形描画やArduinoによるLED点灯実験から始めることになるのですが、それだけでは退屈なので、学習意欲もあまり湧きません。
そこで、最初の目標として「建築発明工作ゼミ」の「Arduino-Processing シリアル通信1」を実践してみてください。

Arduino-Processing シリアル通信1」では、ArduinoとパソコンはUSB接続されており、Arduinoには可変抵抗器が接続されており、Processing上には連動する図形が描かれています。内容的には、自作の入力装置をパソコンに接続し、パソコン上に表示されている図形をリアルタイムで操作するということになります。
ここでは:
・Arduinoにおけるアナログ入力(センサからの値の読取り)
・Processing-Arduino間のシリアル通信(値の送信/受信)
・Processing上での図形描画(受信した値を図形描画に反映させる)
ということを学習することになります。

当然ながら、この段階に到達するためにもある程度知識やスキルは必要になります。質問、トラブル、不明な点については、投稿/コメントして下さい。「ここまでやってみたけど、その先が分からない」、「〜ってなんだ?」とか「全然動かない」など初歩的な質問や失敗談でも構いませんので投稿してみてください。皆さんで解決していきましょう。

8 件のコメント:

  1. はじめまして、四谷工作研究所のサイト( http://onurl.de/xxUiE6W )を読みまして、質問したくコメント投稿しております。
    100vの調光で使われた抵抗は何Wのものを使われたのでしょうか?
    色々調べてみたのですがわからなかったので確認しようとした次第であります。

    あと、フォトトライアックのS21ME1を見つけることができず、S21ME3で代用してみようとしているのですが可能でしょうか?

    突然の質問失礼致しました。
    お答え頂けると嬉しいです。

    返信削除
  2. すみません、先程の者です。
    何Wの抵抗というのは、定格電力の事です。
     
    よろしくお願い致します。

    返信削除
  3. 1/4Wの抵抗、S21ME3でも大丈夫だと思います。

    返信削除
  4. こんにちわ!(^^)!
    はじめまして・・・
    ちょっと教えていただきたいことがあるのですが・・・
    私は12月15日までに卒論を出さないといけない兵庫県の大学4年生です。
    テーマは、新しいコミュニケーションツールの開発です。
    今曲げセンサと接触位置センサから得た値を使って、LEDを光らせようとしているのですが、プログラムがうまくいきません。
    もしよろしければ協力していただけないでしょうか???

    返信削除
  5. 黒見さん
    どのような内容でしょうか?
    ここに書いて下さっても構いません。

    返信削除
  6. お返事ありがとうございます。
    自分たちはArduinoボードじゃなくてリリパッドを使っています。
    曲げセンサと接触位置センサから得られる値をつかって数値の大きさによって光の色を変えようとしてるのですが、ずっと同じ色が光っぱなしでそこから前に進めません・・・
    あまりプログラムの意味を理解してないからかもしれませんが・・・
    なにかアドバイスいただけませんか??

    曲げセンサ&LED

    //曲げセンサに接続したアナログピンの番号
    const int sensorPin = 0;


    void setup(){
    Serial.begin(9600);
    }

    void loop(){
    //曲げセンサの値を読み取る
    int value = analogRead(sensorPin)/4;
    Serial.print(value,BYTE);
    //次のループ開始まで100ms待つ

    if (value > 300 && value < 400){
    analogWrite(9,127);//R
    analogWrite(10,127);//G
    analogWrite(11,127);//B
    delay(3000);
    }else{
    analogWrite(9,0);//R
    analogWrite(10,0);//G
    analogWrite(11,0);//B
    delay(3000);
    }
    }

    接触位置センサ&LED

    const int minimum = 100;

    const int maximum = 1000;

    const int threshold = 50;

    const int sensorPin = 0;

    const int ledPin = 9;

    boolean wasPressed = false;

    void setup(){
    pinMode (ledPin, OUTPUT);

    Serial.begin(9600);
    }

    void loop(){
    int value = analogRead(sensorPin)/4;
    Serial.print(value);

    boolean isPressed = wasPressed;

    if (value < threshold){
    isPressed = false;
    }

    else if (value >= minimum){
    isPressed = true;
    }

    int position = map (value, minimum, maximum, 0, 50);

    if (!wasPressed && isPressed){
    onPress(position);
    }

    else if (wasPressed && !isPressed){
    onRelease();
    }

    else if (wasPressed && isPressed){
    onDrag(position);
    }

    wasPressed = isPressed;

    delay(1);
    }

    void onPress(int position){
    analogWrite(ledPin,255);


    }

    void onRelease(){
    analogWrite(ledPin,0);
    }

    void onDrag(int position){

    }

    返信削除
  7. おそらくプログラム自体は大丈夫だと思います。もしかすると各センサとの配線/回路に問題があるのかもしれません。
    それぞれのセンサに抵抗(10KΩ)を接続しているでしょうか?
    プルアップ抵抗もしくはプルダウン抵抗をつけないと、センサが何も感知していないときにanalogRead()の端子に通電されず、読み込まれる電圧は不安定な値になってしまいます。
    プルアップ/プルダウン抵抗については:
    http://kousaku-kousaku.blogspot.com/2008/06/blog-post.html
    曲げセンサについては:
    http://kousaku-kousaku.blogspot.com/2008/10/arduino-processingbluetooth.html
    などのセンサと抵抗の接続例を参考にしてみてください。

    返信削除
  8. お返事ありがとうございます。
    結局リリパッドをちがうのに取り替えたら
    なんとかできました。
    またわからないことがあったら教えてください(^^)

    返信削除

*