レビューメディア「ジグソー」

Edisonをクライアント端末とし、Web APIを利用した情報表示試作機の開発

どうも、なのまるです。


今回「インテル(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
  • これからどんなものが出来るのか、お楽しみに!

 

これから電源を入れて初期セットアップをしていこうと思います!

更新: 2014/12/29
導入難度

少しでも電子工作に興味を持ったなら、楽しめる!

どうも、なのまるです。

今回は「インテル(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のドキュメントは英語ですが、スクリーンショットが多くわかりやすいです!
  • ファームウェアのアップデートに「エクスプローラー」使うって新鮮〜
更新: 2015/02/01
満足度

WebAPIからデータを取得して、LCDに表示してみました!

どうも、なのまるです。

今回で「インテル(R) Edison キット for Arduino」のレビューの最終回「完結編」です。

 

LCD Shieldを導入してみました!

 

 

最終ゴール

 

  • 天気情報をWi-FiでAPIから取得して、LCDに表示させる!

 

他にも「LCD付属のボタンを使って、コントロールできたらいいなw」

 

作業の流れ

 

  • 「WiFi Web Client」のサンプルコードを試してみる
  • JSONライブラリを導入
  • 結果をLCDに表示
  • ボタン操作を試してみる

 

 

「WiFi Web Client」のサンプルコードを試してみる

こちらの「Arduino - WiFiWebClient」のサンプルコードを利用

 

 

上記設定変更したところ情報取得が簡単に取得出来た!

 

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.jsPythonという軽量のWebで使われている言語も使われているので、試してみたいと思いました!

 

おしまい。

17人がこのレビューをCOOLしました!

コメント (0)

ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。

YouTube の動画を挿入

YouTube の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ニコニコ動画の動画を挿入

ニコニコ動画の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ZIGSOWリンク挿入

検索対象とキーワードを入力してください

    外部リンクを挿入

    リンク先の URL とタイトルを入力してください

    URL を正しく入力してください。

    画像を挿入(最大サイズ20MB)

    画像を選択してください

    ファイルサイズが20MBを超えています

    別の画像を追加

    ほかのユーザーのレビュー

    ZIGSOW にログイン

    ZIGSOW会員登録(無料)はこちらから