元々興味はあったのだが、センサー類のための回路を組まなければいけないのかな、と尻込みをしていたら、まず、保護者から一緒にやりましょうよというプッシュがあって気持ちが動き、調べていくうちにシールドと呼ばれる拡張ボードがあって回路周りはなんとかなりそうだと踏ん切りがついたのと、Macにも開発環境があるのも大きかった。
まず、感想
ちょっとやってみての感想は、
- Rapsberry Piと同じく安価でしかも無料の開発環境や、各種周辺装置が整っているので教材として最適(いい時代だ)
- Raspberry PiはPCだが、Arduinoは制御系
- プログラミン言語としてC言語(C++)の知識が必要になるので学生はやっておいて損はなさそう
- いじってるうちにセンサーやデバイスにも詳しくなりそう
- 実生活には各種センサーをお手軽に使えそうだという実感がわいた
- IDE(開発環境)にシリアルモニタが用意されているのでセンサーの動きが分かり易い
- 情報を得るためには英語が読めた方がはるかにいい
入門書
ネットだけでは全体像がつかめなくて、まずは、教科書として「みんなのArduino入門」(高本孝頼著、リックテレコム)(リンク先はアマゾン。画像クリックでもOK)。
ハードもソフトも、ある程度網羅しているので、入門にはとても良いと思う。
もっとも、最終的にはプログラムは本家のReferenceに当たる必要があるけど。
ハードウェア
会の活動内容から、ロボットサッカーをイメージしているので、ハードウェアはメインのArduinoと、センサー類を揃える必要がある。
購入は、横着してモーター以外は全てアマゾンで揃えた。
メインのArduino基板は入出力ポートが足りないんじゃないかと思ったのでMEGA2560で、レビューを信じて安いSainSmartの互換製品を選択した。
センサー類(赤外線、超音波、コンパス)とシールド類(センサーシールドと4chモーターシールド)は、どれも紙の説明書などはついていないので、情報はネットから、しかも日本語サイトにはない場合が多く、英語から探すのが手っ取り早い。
以下はご参考。
- サインスマート(SainSmart) MEGA2560 互換ボード R3
- サインスマート(SainSmart)センサーシールド V5.0 互換品 (完成品) for Arduino UNO MEGA Duemilanove
- モーターシールド for Arduino
- ロボカップジュニア ボールセンサーセット (e-Gadget用) ダイセン
- HMC5883L 使用 3軸 デジタル・コンパス モジュール (3-5V 動作)
- HC-SR04 超音波距離センサーモジュール For Arduino
- サインスマート(SainSmart) 1.8" TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3
- 商品名:ジャンパワイヤ(オス~オス) 10本セット
- 商品名:ジャンパワイヤ(メス~メス) 10本セット
サンプルコードで試運転
まずは、各センサーの動作を確かめるために、というか、センサーが動くのかどうかも不安だったので、各センサーの製造元にあるサンプルコードをダウンロードし、動かしてみた。
で最初から躓いた。
振り返ってみると大したこと無いのだけれど、わからないというのはこういうことなのだなと思った次第。
(1) サンプルコードはIDE1.0へのバージョンアップに伴う変更に対応していない場合がある。
ウチのは1.0.5だったので、いくつか引っかかった。
大きい修正箇所は次の2つ。
2番目は次の(2)との合わせ技でちょっとハマった。
(2) IDEのライブラリファイルの扱いがよくわかっていなかった。
次の(4)-a)の例だが、ロボット制作には関係ないのに面白そうだからと買ってしまった1.8インチのTFTディスプレイでハマった。
サンプルコードをコンパイルすると"ST7735.h"にエラーが出まくりで、エラーコード(ある関数の引数int8_tの次の文字列で")"が期待されてる、など)を確かめつつ、怪しそうなところを文字列を置換したり(int8_t → char)しても動かない。
ネットで情報をあさっているうちに、IDEのバージョンでヘッダファイルが変更になっているのを突き止めたので(上の(1))、"ST7735.h"の#include文を"Arduino.h"に書き換えたりしてもダメ。
結論から言うと、"ST7735.h"をプログラムファイルと同じディレクトリに置いており、そのファイルだけを修正していたので、IDE立ち上げ時に読み込まれる正しい場所に置かれた"ST7735.h"には何も変更が反映されていないので、何度も同じエラーメッセージを見ては「合ってるはずだけどなぁ」と呟きつつ、反映されない修正を繰り返す、というドツボにはまった。
時間を置いて冷静にIDEの気持ちになって考えてみたらあっさり解決した。
つまり、読み込むライブラリはそのライブラリを登録するときに指定されているので、そのライブラリの”ST7735.h"を修正しないといけなかったのだ。
(3) ピン番号
サンプルコードには指定のピン番号が書かれている。
基板(UNOやMEGA)によってピン番号を書き換える必要がある、とコード内のコメントに書いてあるのでよく確認する必要があった。
(4) サンプルコード修正実例
いくつかのサンプルコードを修正したら動作したので記念に修正箇所を記す。
a) 1.8" TFTカラーディスプレイ
ライブラリヘッダファイルである "ST7735.h" のinclude文を書き換える。
リンク先に記述されている "Arduino demo code" の配列(51行目)を修正する ( outputData → outputData[i])。
とりあえず、今はここまででハードの動作試験終了といたっところ。
(2014/5/22追記)
本の紹介のように思えたのでタイトルを「Arduino入門」から「Arduino始めてみた」に変えました。
(1) サンプルコードはIDE1.0へのバージョンアップに伴う変更に対応していない場合がある。
ウチのは1.0.5だったので、いくつか引っかかった。
大きい修正箇所は次の2つ。
- 拡張子変更(*.pde -> *.ino) 例: graphicstest.pde → graphicstest.ino
- ヘッダーファイル変更 (#include <WProgram.h> → #include <Arduino.h>) (例: int8_tなどの宣言がエラーとなってしまう)
2番目は次の(2)との合わせ技でちょっとハマった。
(2) IDEのライブラリファイルの扱いがよくわかっていなかった。
次の(4)-a)の例だが、ロボット制作には関係ないのに面白そうだからと買ってしまった1.8インチのTFTディスプレイでハマった。
サンプルコードをコンパイルすると"ST7735.h"にエラーが出まくりで、エラーコード(ある関数の引数int8_tの次の文字列で")"が期待されてる、など)を確かめつつ、怪しそうなところを文字列を置換したり(int8_t → char)しても動かない。
ネットで情報をあさっているうちに、IDEのバージョンでヘッダファイルが変更になっているのを突き止めたので(上の(1))、"ST7735.h"の#include文を"Arduino.h"に書き換えたりしてもダメ。
結論から言うと、"ST7735.h"をプログラムファイルと同じディレクトリに置いており、そのファイルだけを修正していたので、IDE立ち上げ時に読み込まれる正しい場所に置かれた"ST7735.h"には何も変更が反映されていないので、何度も同じエラーメッセージを見ては「合ってるはずだけどなぁ」と呟きつつ、反映されない修正を繰り返す、というドツボにはまった。
時間を置いて冷静にIDEの気持ちになって考えてみたらあっさり解決した。
つまり、読み込むライブラリはそのライブラリを登録するときに指定されているので、そのライブラリの”ST7735.h"を修正しないといけなかったのだ。
(3) ピン番号
サンプルコードには指定のピン番号が書かれている。
基板(UNOやMEGA)によってピン番号を書き換える必要がある、とコード内のコメントに書いてあるのでよく確認する必要があった。
(4) サンプルコード修正実例
いくつかのサンプルコードを修正したら動作したので記念に修正箇所を記す。
a) 1.8" TFTカラーディスプレイ
ライブラリヘッダファイルである "ST7735.h" のinclude文を書き換える。
#include <WProgram.h>b) 3軸デジタルコンパス HMC5833L
↓
//#include <WProgram.h>
#include <Arduino.h>
リンク先に記述されている "Arduino demo code" の配列(51行目)を修正する ( outputData → outputData[i])。
最初に基板と手に入れてから1ヶ月、「ネットを漁るだけでは駄目だ」「そういえば、どうやってつなぐの」と気づいて教科書とジャンパワイヤーを入手してから3週間が経過した。if(6 <= Wire.available()) // If the number of bytes available for reading be <=6. { for(i=0;i<6;i++) { outputData=Wire.receive(); //Store the data in outputData buffer } } ↓
if(6 <= Wire.available()) // If the number of bytes available for reading be <=6. { for(i=0;i<6;i++) { outputData[i]=Wire.receive(); //Store the data in outputData buffer } }
とりあえず、今はここまででハードの動作試験終了といたっところ。
(2014/5/22追記)
本の紹介のように思えたのでタイトルを「Arduino入門」から「Arduino始めてみた」に変えました。
0 件のコメント:
コメントを投稿