2011年6月2日木曜日

Scratch+Arduinoを試してみた(追記あり2015年2月17日)

(2015年2月17日追記:たいへん古いエントリですが検索上位に上がるため、いまでもよく読まれているようです。現在ではいろいろと相違がありますので、阿部先生が配布されているScratchへのチェンジファイルとArduinoに書き込むスケッチがセットになった「SensorBoardWirhMotor」(ページの上から6番目の項目です)をご利用ください。下記の問題も解決しているとのことです。阿部先生の所属もかわっており、現在津田塾大学のほか多くの活動をされています。詳しくは最近の各著書「わくプロ」「どきプロ」「すくプロ」などを参照してください。)


ArduinoをPicoBoard互換にしてさらにWeDo的使い方もできる、というScratchの拡張(サイバー大の阿部和広先生作)を試してみました。

使い方は、ヱンガワシステムズさんのエントリにある通りなのですが、このページに置かれている「全部入り」をダウンロードして、それに含まれているArduinoのスケッチをArduino IDEで書きこんで、いっしょに入っているScratch 1.4 modを起動するという手順です。

標準のScratchでも、PicoBoard用の

  • スライダー
  • ボタン
  • 光センサ
  • マイク

入力に対応しているので、入力装置にするだけなら同ページにあるスケッチ(SensorBoardWithMotor.pde)の書き込みだけでよいのですが、「Lチカ」をやりたかったので、WeDo拡張を含むこのパッケージにしました。

Arduinoを接続して、手順通りに「調べる」タブの「センサーの値」ブロックを長押しするとメニューが出て、たしかにステージに、センサの値をリアルタイム表示する「ScratchBoard監視盤」が現れました。なかなか感激です。

Arduinoの端子との対応は、

  • スライダー - A0
  • 明るさ - A1
  • 音 - A2
  • 抵抗A - A3
  • 抵抗B - A4
  • 抵抗C - A5
  • 抵抗D - A5 (抵抗Cと同じ)
  • ボタン - D2


なので、それにしたがってボタンの回路やPOD(半固定抵抗)などをブレッドボードで組んでやると、ちゃんと値が出ます。

ちなみに、ボタンは押すとGNDに落ちる回路。つまり、LOWのときにScratchはtrueを返します(HIGHがfalse)。PODの値は適当なのを適当につないでも0〜100になるようになっていて、よくできてるなーと思いました。

で、Lチカさせるために、
  • モーター - D11-(PWM)

に接続して、こんなスケッチ

を書いてみたんですが、LEDは点きっぱなしで、チカチカしてくれません。

おかしいなーと思って他のモーター関係の命令を試していて気づきました。例えばこんなのだったらうまく動きます。

PODを回すと、LEDの明るさがそれに応じてかわります。

それでようやく気づいたのですが、ミソは「PWM」ということなんですね。つまり、こんなスクリプトならLチカします。

Arduinoのプログラミングをある程度やった人ならわかると思いますが、この「モーターのパワーを( )にする」というブロックは、analogWrite()に相当するわけです。つまり、Lチカの例題
#define LED 11
void setup() {
   pinMode(LED, OUTPUT);
}
void loop() {
  digitalWrite(LED, HIGH);
  wait(1000);
  digitalWrite(LED, LOW);
  wait(1000);
}
これとは違うわけです。

念のために、スケッチを確認したところ、setup()のなかではpinMode(PWM_PIN, OUTPUT);しているのですが、loop()のなかはanalogWrite(PWM_PIN, motorPower);としか書いていないので、「D11-」ではないのですね。でもその直後に、

      digitalWrite(THISWAY_PIN, motorDirection & isMotorOn);
      digitalWrite(THATWAY_PIN, ~motorDirection & isMotorOn);
と書いてあります。つまり、「モーターの回転を[ こちら向き ▼]にする」ブロックに対応する、この記述が「モーターをオンにする」「モーターをオフにする」ブロックに効いてくるわけです。

ちなみに、

  • THISWAY_PIN - D4
  • THATWAY_PIN - D7

なので、D4にLEDをつなぎなおして確かめてみると、
うまいぐあいにLチカしてくれました。

このあたり、PWM端子でもdigitalWrite()するように書くことができるドリトルのほうがわかりやすいのかな、と思いました。(前回のエントリ参照)