Makery Blog

西麻布のクリエイティブラボ「Makery」でテクノロジーとアイデアをこねています。

ハッカソンをやりました!(Arudinoチームプログラム編)

ハッカソンしました!(Arudino編)になります。

前回の記事ではバスの外観をどのように作ったかまでの記事でしたが、今回は技術面での内容をざっくりご説明します!!

技術面でやることは大まかに分けて下記の3点でした。
1.WEB上からバスの運行情報を取得。
2.次のバスが到着する時間をLCDに表示。
3.バスが到着するタイミングで人形が動く。

限られた短い時間の中で実装しないといけないため、持っているもので比較的に楽に実装できるものを今回は選択!

Intel Edison Kit for Arduino
WiFi機能もあってネットの接続もやりやすい。
プログラムはNode.jsで作成。
10秒に1回データを取得し、LCDの表示、Arduinoへの通信を行います。

(写真)

●Grove+LCD
Intel Edison Kit for ArduinoにGroveを装着。
Groveは様々なセンサー、アクチュエータをコネクタで挿すだけで使用することができます。

Arduino+サーボモータ
Groveでサーボモータも動かしても良かったんですが、二人で作業してたので作業分担できるように分けました。

IMG_20150606_165201.jpg

このあとEdisonとArduinoをシリアル通信させるためにTX->RXを接続します。

1.WEB上からバスの運行情報を取得。
Intel EdisonでWEB上から10秒おきにデータを取得します。

スクリプト:WEB上からデータを取得

var mraa = require("mraa");
var client = require('cheerio-httpcli');
client.fetch('http://www.example.com/api/',{ q: 'node.js' },function (err, $, res) {
  //データを取得した後の処理
});

2.次のバスが到着する時間をLCDに表示。
Intel Edisonで取得したデータをGroveにつないだLCDに表示します。

スクリプトLCDの表示

var LCD = require("jsupm_i2clcd");
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
myLCD.setColor(100, 255, 100);//背景色
myLCD.setCursor(0,0);//1行目の1文字目にカーソルを移動
myLCD.write('for Sibuya');//文字列表示
myLCD.setCursor(1,0);//2行目の1文字目にカーソルを移動
if (time == -1) {
  myLCD.write('Bus does not come for a while');
} else if (time == 0) {
  myLCD.write('Soon!');
} else {
  myLCD.write(time + 'min');
}

3.バスが到着するタイミングでキャラクターが動く。
サーボモータを3つ付けて、バスの下から針金で人形を押し上げる形で動かす。
Intel Edison Kit for Arduinoからシリアル通信でArduinoに命令を送る。

スクリプトIntel Edison Kit for ArduinoからArduinoへ送信

var SerialPort = require("serialport").SerialPort;
var port = "ポート名";
var serialPort = new SerialPort(port, {
  baudrate: 9600
}, false);
serialPort.open(function (error) {
  if (error) {
    console.log('Failed to open: '+error);
  } else {
    serialPort.on('data', function(data) {
      console.log('data received: ' + data);});
  });
}
});
serialPort.write('a');//送信

スクリプトArduinoサーボモータ(人形)を動かす

#include <Servo.h>

    Servo servo1;        //Servoオブジェクトを作成
    Servo servo2;
    Servo servo3;

    int inPin = 7;   // choose the input pin (for a pushbutton)
    int val = 0;     // variable for reading the pin status

    void setup()
    {
    Serial.begin(9600);
    pinMode(inPin, INPUT); // declare pushbutton as input
    servo1.attach(9);  //D9ピンをサーボの信号線として設定
    servo2.attach(10);  //D10ピンをサーボの信号線として設定
    servo3.attach(11);
    }

    void loop()
    {
    val = digitalRead(inPin);  // read input value
    if (val == HIGH || Serial.read() == 'a' ) {
    // check if the input is HIGH (button released)
    servo1.write(0); // サーボの角度を90°に設定
    delay(100);
    servo1.write(50);
    delay(100);
    servo1.write(30);
    delay(100);

    servo2.write(0);
    delay(100);
    servo2.write(50);
    delay(100);
    servo2.write(30);
    delay(100);

    servo3.write(0);
    delay(100);
    servo3.write(50);
    delay(100);
    servo3.write(30);
    delay(100);
    }
    }

今回バスが到着するタイミングでキャラクターを動かすところで2台のarudino通信を行っているのですが、テストの段階ではうまく通信できたのですが、いざ作品の発表の段階で通信ができず動かず・・・。
時間が差し迫る中で、結局は本番ではバスが来る時間に人形は動いてくれませんでした・・。(後日完成!)

時間が限られた中でしっかりバスの外観を仕上げてくれたデザイナの方々に感謝です!

次回のハッカソンではプログラマもしっかり本番で動かします!