なのかー/なのぼーどをArduinoとしてプログラミング
なのかーで利用されている「なのぼーど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では以下で動作しています。インストール後再起動が必要です。
- http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41
- 一番上の「PL2303_MacOSX_1.6.1_20160309.zip」を使いました。
そして、 メニュー > ツール >ポート から
「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スケッチをアップして元に戻す必要があります。