読者です 読者をやめる 読者になる 読者になる

littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

なのかー/なのぼーどをArduinoとしてプログラミング

なのかー arduino

f:id:pigshape:20151003210930p:plain

なのかーで利用されている「なのぼーどAG」はArduino(アルデュイーノ)互換となっているので、 Arduinoとしてプログラミングすることができます。

Arduinoとして使用すれば、Scratchを使わずに、Arduino言語(ほぼC言語)でプログラミングをして、アプリケーション(Arduinoでは「スケッチ」と呼びます)を本体に転送して、PC接続無しで単体で動作(なのぼーどの電源ONで即起動)させることができます。

実際に制御するための基本的な情報をまとめました。 これを元に、自走ロボットプログラミングにチャレンジしてみたいと思います。


Aruduinoをインストール後、 なのぼ~どを利用するには Aruduino IDEの設定ファイル board.txt に以下の内容を追加する必要があります。

board.txtはWindows の場合はインストールしたフォルダの ・・・\hardware\arduino の中にあります。

「board.txt」でパソコン内を検索したほうが早いかもしれません。

Macの場合は Arduinoアプリケーションで右クリック>「パッケージの内容を表示」を行って、以下をたどってください。

/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt
  • 以下の内容をファイルの末尾などに貼り付けて追加してください。
###########################
atmega8o83.name=chibiDuino pro ATmega8 38400 optiboot

atmega8o83.upload.protocol=arduino
atmega8o83.upload.tool=avrdude
atmega8o83.upload.maximum_size=7680
atmega8o83.upload.speed=38400

atmega8o83.bootloader.tool=avrdude
atmega8o83.bootloader.low_fuses=0×94
atmega8o83.bootloader.high_fuses=0xDC
atmega8o83.bootloader.path=optiboot
atmega8o83.bootloader.unlock_bits=0×3F
atmega8o83.bootloader.lock_bits=0×0F
atmega8o83.build.mcu=atmega8
atmega8o83.build.f_cpu=8000000L
atmega8o83.build.core=arduino
atmega8o83.build.variant=standard
atmega8o83.build.board=AVR_ATMEGA8O83
  • 2016/7/18 追記環境によっては
atmega8o83.bootloader.file=optiboot_cp83.hex

という記述が必要な場合があります。 その場合は

atmega8o83.bootloader.unlock_bits=0×3F

の上あたりに追記してください。

USBケーブルでなのぼ~どを接続して Aruduino IDEを立ち上げなおすと

メニュー > ツール >ボードから

「chibiDuino pro ATmega8 38400 optiboot」

が選択できるようになるので選択します。


Macの場合はUSBシリアル通信用のドライバーのインストールも必要です。 OSがアップグレードすると入れ替える必要がある場合があります。

El Capitanでは以下で動作しています。インストール後再起動が必要です。


そして、 メニュー > ツール >ポート から

「USBシリアルポート(usb-serial)」を選択してください。

これで準備は完了です。


で、やっとプログラミングです。

Analogセンサー値の取得

なのぼーどAGはアナログ端子が8個あります。

各センサーのID一覧

センサーID 取得可能値 説明
A0 マイクセンサー 音量を取得 音が鳴ると値が大きく
A1 抵抗Aの値 超音波距離センサーは、別の取得方法が必要
A2 抵抗Bの値
A3 抵抗Cの値
A4 抵抗Dの値
A5 明るさセンサー 暗くなると値が大きくなる
A6 スライダーセンサー 0-1023
A7 ボタンスイッチ ON:0 OFF(通常時):1023

analogRead([センサーID]) を利用してセンサー値を読み取ることができます。

  • スケッチサンプル A6:スライダセンサーの値をシリアルコンソールに表示
// the setup routine runs once when you press reset:
void setup() {

  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {

  int sensorValue = analogRead(A6);

  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

超音波センサーの取得

なのかーで利用する超音波センサーの値を取る際は、analogRead(A1);では取得できません。 別途、New Pingを利用して取得する必要があります。

  • ヘッダー部分にて
#include <NewPing.h>

#define TRIGGER_PIN  11  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     15  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 108 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
  • 実際の取得はこんな感じです。
void setup() {
  Serial.begin(9600);//9600にあんまり意味は無いです
}
void loop() {
  int  sensorValue = sonar.ping() / 5 ; // Send ping, get ping time in microseconds (uS).

  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

Lチカ(LEDを光らせる)

デジタルピン13がLEDです。以下内容で500msの間隔でLEDを点滅させます。

void setup() {
     pinMode(13, OUTPUT);     // NanoBoard LED port
}

void loop()    //プログラム本体(ずっと繰り返す。)
{
  digitalWrite(13, HIGH);   // set NanoBoard LED on
  delay(500); //500ms待つ。
  digitalWrite(13, LOW);   // set NanoBoard LED off
  delay(500); //500ms待つ。
}

モーターを動かす

なのぼ~どには2つのモーター出力用端子があります。 それぞれに関して出力(power)と正回転・逆回転が制御できます。

最近のArduinoボードでは、デジタルピン3, 5, 6, 9, 10,11が使えるようですが マイコンに「ATmega8」を使用しているなのぼーどAGでは デジタルピンの9, 10, 11の三つがアナログ出力(PWM)に利用できるようです。

  • モーターとピンの関連付け
モーター アナログ出力ピン デジタル出力ピン(正回転) デジタル出力ピン(逆回転)
モーター1(M1) 9 7 8
モーター2(M2) 10 5 6
  • モーターの動きと、各ピンの設定値
動作 アナログ出力ピン値 デジタル出力ピン(正回転) デジタル出力ピン(逆回転)
正回転 0(OFF)〜255(MAX) HIGH LOW
逆回転 0(OFF)〜255(MAX) LOW HIGH
  • コードで書くと以下の様に
void setup() {

   // モーター用のピン設定
   pinMode(9, OUTPUT);  //M1 analogOut
   pinMode(7, OUTPUT);  //M1 DigitalOut Thisway
   pinMode(8, OUTPUT);  //M1 DigitalOut Thatway

   pinMode(10, OUTPUT); //M2 analogOut
   pinMode(5, OUTPUT);  //M2 DigitalOut Thisway
   pinMode(6, OUTPUT);  //M2 DigitalOut Thatway
}

void loop() {

  //モーター1(M1)を出力100で正回転
  analogWrite(9, 100);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);  

  //モーター2(M2)を出力255(最大)で逆回転
  analogWrite(10, 255);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);

 delay(500);
}

拡張するなら

デジタルのD0,D1は使わないとして デジタルのD2-D4とD11-D13が空いている感じですが

  • D11は超音波距離センサー
  • D13はLED

で利用されているので、 拡張するなら、D2,D3,D4,D12あたりから使うといいかも知れません。(ちょっと自信ない)

アナログは、 A1(=D15)は超音波センサーなので、 A2,A3,A4ですかね。


開発環境

  • Arduino IDE 1.6.5
  • なのかーキット (なのぼーどAG1.4)
  • USBケーブル(スケッチの転送に利用します)※mini-Bなので注意。microBじゃないですよ。
  • Mac (もちろんWindowsもOK)

開発環境のセットアップやArduinoについては他のサイトを参考にしてください。

調査にあたっては、 なのぼ~ど NanoBoard AG « ちっちゃいものくらぶにある なのぼ~どAG最新ファームウエアのArduinoスケッチとHEXファイルを参考にしています。

また、スケッチをアップロードした後に、またScratchで操作するには、改めて、上記のArduinoスケッチをアップして元に戻す必要があります。

参考にしたサイト