どうも、なのまるです。
今回「インテル(R) Edison キット for Arduino」のレビューをさせていただきます。
よろしくお願いします。
早速ですが、「インテル(R) Edison キット for Arduino」が届いてたので、開封して中身を見ていこうと思います。
開封の儀
とっても小さい箱で届きました。こちらが「インテル(R) Edison キット for Arduino」の箱になります!
大きさを比較しようと「iPad mini 2」と並べてみましたが、わかりにくいですねw
こちらが「Intel Edison」のモジュール本体になります。
この中に
- Atom CPU
- 1GB メモリ
- 4GB Disk
- 無線機能(WiFi,Bluetooth)
をこのサイズに詰め込んである、ミニコンピュータですね!
for Arduino キットの中身については以下のものが含まれていました。
Edison本体、拡張ボード、それらの足
インターフェイス紹介
「インテル(R) Edison キット for Arduino」のインターフェイスについて、見ていきます
まずは「USBホスト ポート」、「AC電源ポート」
そして「microUSB」が2つあるんですが、これは「電源供給・USB-OTG用」と、「シリアル接続用」との2つに分かれています。
microSD のスロットも付いていました。
今回は軽く、開封だけにしぼってみました。
まとめ
- 本当にとっても小さかった!
- 何しようか、このままだと悩みますねw
- これからどんなものが出来るのか、お楽しみに!
これから電源を入れて初期セットアップをしていこうと思います!
少しでも電子工作に興味を持ったなら、楽しめる!
どうも、なのまるです。
今回は「インテル(R) Edison キット for Arduino」のレビューの第2回目です。
まずは、パソコンにつないで無線LANにつなげるところまでやってみました!
導入の難易度は「何も考えずに出来るものではありません」
少しでも、電子工作に興味を持ったなら楽しめると思います!
参考
まずは、公式ドキュメントであるインテルのドキュメント(英語のみ)を参考にやってみました!
1.組立
小さなEdisonボード本体を、拡張ボードに載せていきます。
ポチっとはめ込むのが力加減が分からずドキドキ
出来ました!
USBケーブルをはめ込んで、電源を入れていきます〜
2.ツールのダウンロードと起動
公式からIDE(7z)をダウンロード!
解凍しようとするが、Lhaplusではエラーとなる・・・
からダウンロードして解答成功!
3.ドライバを導入
からドライバのダウンロード・インストール!
4.サンプルコード(Blink)を動かしてみる
サンプルコード(Blink)を動かしてみました!
いわゆるLチカ!(電子工作のHello World!)
「Transfer complete」というメッセージとともに正常動作を確認しました!
5.Wifiにつなぐ
ドキュメント通り「デバイスマネージャー」から「COMポート」番号を確認「COM3」へ接続し、設定コマンドを叩く
# configure_edison --setup
を実行すると、オプションエラーに。
# configure_edison --help
を実行したが、setupというオプションは存在しない…。
完全にここを見逃していたw
ファームウェアをアップデートしないと以下のことが起きた
- 「configure_edison --setup」が使えない
- 作業中、puttyで1文字目の入力が無視される現象が発生
- ブラウザからローカルIPでhttp接続で見れるというデバイス情報のページが表示されない。
6.ファームウェア更新
バージョンの確認
root@cutie:~# cat /etc/version edison-weekly_build_56_2014-08-20_15-54-05
IDEのダウンロードページにファームがあったのでDL
ファイルを解凍して、「エクスプローラー」かファイルを転送
7.実行
再度Edisonにログインし、
# reboot ota
を実行すると、ファームの自動書き換えが始まる
8.書き換え後バージョンの確認
root@edison:~# cat /etc/version edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
- before:edison-weekly_build_56_2014-08-20_15-54-05
- after:edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
書き換えが正常に終わったので、ファームウェアファイルを削除する
9.再設定
ファームウェアの更新により、セットアップ情報がすべてクリアされたので、再設定を行う
# configure_edison --setup
ファーム書き換え前は実行できなかったが、今度は実行できた。サクサクっと設定を完了させる。
10.ブラウザ経由でアクセスしてみる
ファーム書き換え前は実行できなかったが、今度はアクセスできた。
11.Wifiでのssh
Wifi経由でEdisonのローカルIPに22ポートでアクセスしてみたらあっさり接続できた。
おまけ
電源は、手持ちのモバイルバッテリーからも供給が可能でした!
まとめ
- ファームウェアを最初にアップデートしましょう!w
- Intelのドキュメントは英語ですが、スクリーンショットが多くわかりやすいです!
- ファームウェアのアップデートに「エクスプローラー」使うって新鮮〜
WebAPIからデータを取得して、LCDに表示してみました!
どうも、なのまるです。
今回で「インテル(R) Edison キット for Arduino」のレビューの最終回「完結編」です。
LCD Shieldを導入してみました!
最終ゴール
- 天気情報をWi-FiでAPIから取得して、LCDに表示させる!
他にも「LCD付属のボタンを使って、コントロールできたらいいなw」
作業の流れ
- 「WiFi Web Client」のサンプルコードを試してみる
- JSONライブラリを導入
- 結果をLCDに表示
- ボタン操作を試してみる
「WiFi Web Client」のサンプルコードを試してみる
こちらの「Arduino - WiFiWebClient」のサンプルコードを利用
- Wi-Fiの設定
- 天気情報のAPI(OpenWeatherMap)のAPI URLに設定
上記設定変更したところ情報取得が簡単に取得出来た!
JSONライブラリを導入
結果がJSONで返ってくるので、JSONを処理するライブラリを導入しました!
Bing検索して、一番使いやすそうだった「ArduinoJson」(bblanchon/ArduinoJson · GitHub)を利用してみます。
↓使ったのはこちら
ArduinoJson-v4.1-old-layout.zip for older versions
並んでいた、↓これはバージョンがあわない(ライブラリの構成が異なる)
ArduinoJson-v4.1.zip for Arduino IDE >=1.0.6 and >=1.5.6
コチラに中身をコピーする
<your Arduino Sketch folder>/libraries/ArduinoJson
先ほどのサンプルコードに「ArduinoJSON」の読み込みを追加してサンプル通りパースしてみるがうまくいかず。。。
原因はサンプルコードのままだと、OpenWeatherMapのJSONがHTTPヘッダを含むものになっていた・・・。(シリアルプリント(Serial.print)で変数の中身をデバッグ)
結果をLCDに表示
試行錯誤の結果、「Tokyoの天気」を表示できるようになりました〜
ボタン操作を試してみる
LCDに付属しているボタンを使って、サンプルコードからボタンの処理を試してみました!
↓サンプルコード
Arduino LCD KeyPad Shield (SKU: DFR0009) - Robot Wiki
Tokyoの天気情報が取れるようになったので、他の地域にも対応するようにしてみました!
ボタンは
SELECT LEFT UP/Down RIGHT RST
と並んでいます!
今回
- SELECT → 初期表示
- UP/DOWN → 都市選択
- RIGHT → 決定ボタン
という操作を行うことにしました。(※他のボタンは使わず)
動作を記録した動画です〜
完成したコード
全ての実装が完成したコードがこちら
ProjectX.ino
#include <ArduinoJson.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <WiFi.h>
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define COUNTRY 0
#define CITY 1
#define WEATHER 2
int screen_status = 0;
int selected_city = 1;
char ssid[] = "YOUR SSID"; // your network SSID (name)
char pass[] = "YOUR PASSWORD"; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
char server[] = "api.openweathermap.org";
char parameter[] = "/data/2.5/weather?q=Tokyo,jp";
WiFiClient client;
// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
// For V1.1 us this threshold
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
return btnNONE; // when all others fail, return this...
}
void clearTop() {
lcd.setCursor(0,0);
lcd.print(" ");
}
void clearBottom() {
lcd.setCursor(0,1);
lcd.print(" ");
}
void writeLcdTop(char* str) {
clearTop();
lcd.setCursor(0,0);
lcd.print(str);
}
void writeLcdTop(const char* str) {
clearTop();
lcd.setCursor(0,0);
lcd.print(str);
}
void writeLcdTop(String str) {
clearTop();
lcd.setCursor(0,0);
lcd.print(str);
}
void writeLcdBtm(char* str) {
clearBottom();
lcd.setCursor(0,1);
lcd.print(str);
}
void writeLcdBtm(const char* str) {
clearBottom();
lcd.setCursor(0,1);
lcd.print(str);
}
void writeLcdBtm(String str) {
clearBottom();
lcd.setCursor(0,1);
lcd.print(str);
}
String getCity() {
switch (selected_city) {
case 0:
{
return "Sapporo,jp";
break;
}
case 1:
{
return "Tokyo,jp";
break;
}
case 2:
{
return "Osaka,jp";
break;
}
case 3:
{
return "Fukuoka,jp";
break;
}
case 4:
{
return "NY,us";
break;
}
case 5:
{
return "Paris,fr";
break;
}
}
}
void getWeather() {
writeLcdTop(getCity());
writeLcdBtm("--Preparing WiFi");
while (status != WL_CONNECTED) {
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
delay(300);
}
writeLcdBtm("--Connecting");
client.stop();
if (client.connect(server, 80)) {
client.println("GET /data/2.5/weather?q=" + getCity() + " HTTP/1.1");
client.println("Host: api.openweathermap.org");
client.println("Connection: close");
client.println();
// read weather
char tmp;
int cnt = 0;
int braceCnt = 0;
char json[511];
while (client.available() && cnt < 1000) {
tmp = client.read();
if (tmp == '{') {
braceCnt++;
}
if (braceCnt > 0) {
json[cnt] = tmp;
cnt++;
}
if (tmp == '}') {
braceCnt--;
}
}
json[cnt] = '\0';
Serial.println();
Serial.println("read");
StaticJsonBuffer<1000> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
// set weather
const char* wmain = root["weather"][0]["main"];
const char* wdesc = root["weather"][0]["description"];
writeLcdTop(wmain);
writeLcdBtm(wdesc);
}
else {
writeLcdTop("Not Connected");
}
}
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
screen_status = CITY;
writeLcdTop("Select City");
writeLcdBtm("> " + getCity());
}
void loop()
{
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) {
case btnRIGHT:
{
screen_status = WEATHER;
getWeather();
break;
}
case btnLEFT:
{
break;
}
case btnUP:
{
if (screen_status == CITY) {
selected_city = (--selected_city + 6) % 6;
Serial.println(selected_city);
writeLcdBtm("> " + getCity());
delay(600);
break;
}
}
case btnDOWN:
{
if (screen_status == CITY) {
selected_city = (++selected_city) % 6;
Serial.println(selected_city);
writeLcdBtm("> " + getCity());
delay(600);
break;
}
}
case btnSELECT:
{
screen_status = CITY;
writeLcdTop("Select City");
writeLcdBtm("> " + getCity());
break;
}
case btnNONE:
{
break;
}
}
}
ファイルはこちらからダウンロードできるようにしておきました!
https://gist.github.com/snickerjp/816935b5739ac57c62bd
まとめ
- WebAPIの結果をLCDに表示するという、IoTらしい処理が実現できるEdisonはオモシロイと思った!
- Arduinoのコードをそのまま書くのは結構ツライw
- EdisonのOSでは、node.jsやPythonという軽量のWebで使われている言語も使われているので、試してみたいと思いました!
おしまい。
ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。