青いやつの進捗日記。

べんきょうのしんちょくをかいていきます。プログラミング初心者。

Makeblock mBot Ultimate 2.0 (Arduino)にコードを書き込んで動かしてみる。問題も色々発生。

tech.motoki-watanabe.net

tech.motoki-watanabe.net

tech.motoki-watanabe.net

からの、次はmBlockでビジュアルプログラミングして直接操作するのではなく、コードをArduinoに書き込んで動かそうと思います。

いくつかやり方があります。

mBlockからArduinoにアップロードする

mBlockにはArduinoモードがあります。f:id:XxGodmoonxX:20180825181106p:plain

で、Arduinoにアップロードするを押せば、そのままアップロードできます。

で、アップロードそのものは出来るのですが、いかんせん問題がありまして、ここで書き込まれるコードはこのArduinoのコードっぽいものがアップロードされるのですよね。ここのコード、ビジュアルプログラミングで色々やってもなんにも変わらないんですよ…

ビジュアルプログラミングそのものは正しく動作してるのに…

と、思っていたら解決方法がわかりました。

MegaPi プログラム と書いてあるやつを置いてあげる

f:id:XxGodmoonxX:20180825223641g:plain

こんな感じです。 MegaPiプログラムとい書いてあるやつの使いみちが今までわかっていなかったのですが、なんとなく置いてみたらなんとコードが変わりました。

これに気づいたのは今なので、Arduinoに書き込んで実際どう動くかとか、コードの意味の理解とかはまだですが、これでどうやら書き込めそうです。

こちら参考になりそうです。 www.youtube.com

Arduino IDEでコードを書いて書き込む

まあこれは普通の方法ですよね。

Ultimate 2.0—Arduino programming
http://learn.makeblock.com/ultimate2-arduino-programming/

上記のサイトがUltimate 2.0をArduinoでいじるときのチュートリアル的なサイトです。

書いてあるとおりにやれば、Makeblockのライブラリを入れることになると思うので、そのサンプルを動かそうと思います。

ExampleのMe_MegaPiDCMotor/MeMegaPiDCMotorTestを開きます。

これを書き込めば、とりあえずモーターが動くはずです。

Ultimate 2.0ならば、ポート1とポート2のモーターが動くはずです。

で、動かずここでエラー出た人いませんか?

ここで問題なのは、Arduinoをどう起動したか、なんですよ。

mBlockってソフトにも、上記の通り、Arduinoにアップロードする機能がありますが、そのコードをArduino IDEで編集する、というのもありまして、そのボタンを押すとArduinoが起動します。

が。

そこで起動するArduinoがですね、
f:id:XxGodmoonxX:20180826011143p:plain

この左のターミナルみたいなUIのArduinoが起動するんです。

普通にArduinoをパソコンにインストールしていたらApplication直下にArduinoがあると思うのですが、そのArduinoではない別のソフトが起動してるのです。

Application/mBlockの、パッケージの内容を表示をした先の
Contents/Resources/Arduino/Arduino.app
このArduinoが起動しているのです。

Versionが1.6.5で、更にこのアプリで編集したファイルは保存先も特殊で、
このArduino.appのパッケージの内容を表示をした先、
Contents/Java/portable/sketchbook/ に保存されています。

で、このArduino.appでMeMegaPiDCMotorTestを開いた場合、コンパイルも普通に通り書き込めます。

しかし、Application/Arduino.app の方の自分でMakeblockライブラリを入れたArduinoでMeMegaPiDCMotorTestを開いた場合、コンパイルが通りません。

エラーはこうでるはず。

In file included from /Users/xxgodmoonxx/Documents/Arduino/libraries/Makeblock/src/MeMegaPi.h:78:0,
                 from sketch_aug24a.ino:19:
/Users/xxgodmoonxx/Documents/Arduino/libraries/Makeblock/src/MeColorSensor.h:75:18: fatal error: Wire.h: No such file or directory
 #include "Wire.h"
                  ^
compilation terminated.
コンパイル時にエラーが発生しました。

sketch_aug24a.inoの19行目

#include "MeMegaPi.h"

ここでincludeしてるMeMegaPi.h
の78行目

#include "MeColorSensor.h"

ここでincludeしてるMeColorSensor.h
の75行目

#include "Wire.h"

でエラー。このようなファイルはありません、と。

ほうほう、じゃあApplication/Arduino.appmBlock/Contents/Resources/Arduino/Arduino.appだと中身のライブラリのファイル構造が違うのかな…?と。調べてみました。

Application/Arduino.appなら大体DocumentにArduinoってディレクトリが作って、そこにライブラリや書いたコードのファイルも保存されるはずのが普通ですよね。

ではmBlock/Contents/Resources/Arduino/Arduino.appは?

mBlock下のArduino.appをパッケージの内容を表示をしてWire.hを探してみると、
Contents/Java/hardware/arduino/avr/libraries/Wire/Wire.h
Contents/Java/portable/sketchbook/libraries/makeblock/src/utility/Wire.h
の2箇所にあります。
コンパイルをすると、

Multiple libraries were found for "MeMegaPi.h"
 Used: /Applications/mBlock_v3.4.11.app/Contents/Resources/Arduino/Arduino.app/Contents/Java/portable/sketchbook/libraries/makeblock

とコンソールに出るので、使ってるのは後者の方だと思われます。

ライブラリがあるフォルダ、ということで見てみると、 Contents/Java/portable/sketchbook/libraries/makeblock/
Document/Arduino/libraries/Makeblock/
は中身は同じですね。

え、じゃあWire.hがApplication/Arduino.appの場合はどこに…
Document/Arduino/libraries/Makeblock/src/utility/Wire.h
ライブラリあるフォルダの中身という意味では同じ場所…

というわけで問題はフォルダ構造ではありません。
じゃあmBlock下のArduinoの方のWire.hをincludeしているContents/Java/portable/sketchbook/libraries/makeblock/src/MeColorSensor.hを見てみると

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <Arduino.h>
#include "MeConfig.h"
 #ifdef ME_PORT_DEFINED
#include "MePort.h"
 #endif // ME_PORT_DEFINED

そもそもWire.hをincludeしていない。

Document/Arduino/libraries/Makeblock/src/MeColorSensor.h
では

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <Arduino.h>
#include "MeConfig.h"
#include "Wire.h"
 #ifdef ME_PORT_DEFINED
#include "MePort.h"
 #endif // ME_PORT_DEFINED

こうなっています。

つまり結論は

Wire.hはそもそもこのコードにおいては使われていないみたいなので、
Document/Arduino/libraries/Makeblock/src/MeColorSensor.hを編集して、

#include "Wire.h"

を消すかコメントアウトするか、フォルダ構造に合わせて、

#include "utility/Wire.h"

とすれば解決します。コンパイル通ります。
ちなみに私は後者で、フォルダ構造に合わせました。

結果、私のDocument/Arduino/libraries/Makeblock/src/MeColorSensor.h

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <Arduino.h>
#include "MeConfig.h"
//#include "Wire.h"
#include "utility/Wire.h"
 #ifdef ME_PORT_DEFINED
#include "MePort.h"
 #endif // ME_PORT_DEFINED

としました。これでコンパイルを通せて無事ポート1とポート2に繋いでるモーターを動かせました。

Ultimate 2.0のRobotic Arm Tankの場合なら下のタイヤ部分2つのモーターが動きます。


現状サンプルとりあえず動かしただけなので、次はコード改変して意味を理解していきます。

そもそもMeColorSensor.hはなに動かすときのヘッダーファイル…カラーセンサー…?