スイッチサイエンスのMicro:bit互換機を使ってみた

BBCが小学生に無料で配っているらしいMicro:bit互換機を手に入れたので、一通り触ってみたレビューです

本家: https://www.microbit.co.uk/

BBC-micro-bit
flickr

互換機

Micro:bitはイギリスのBBCが作ったもので、4cm×5cmの大きさのボードで、中身はCortexM0。 電池やUSBで動作するmbedな開発ボード。

Arduinoやmbedを使ったことがある人なら、そういうものの一種だと思ってもらえると。

ただし、micro:bitにはデフォルトでたくさんの入出力がついている。

  • 5×5のマトリクスLED (アルファベットも出せる)
  • Aボタン、Bボタン
  • コンパス(地磁気センサー)
  • 加速度センサー
  • BLE

特徴的な下側のエッジコネクタには、ワニ口クリップがつけやすいように大きなコネクタが5つついている(3つがGPIO、3V,GND)。小さいコネクタもそれぞれれGPIOとつながっている。

本家Micro:bitはイギリス仕様のため、日本の技適は通っていない。
そこでこの互換機です。

http://mag.switch-science.com/tag/microbit/

あのスイッチサイエンスが作っているものです。
モニターを募集していたので、ダメもとで応募したらなんと当選した。 ということで、僕の手元にMicro:bitの互換機がやってきたということです。

どうやらこれは来たる8/6, 8/7のMakerFairTokyoにて販売されるらしいので、この記事を見てほしくなった人は、予定と財布の準備をしておくとよいと思います。

Getting Started

プログラミングから実行までの流れがとてもスムーズだったので、その感動をお届けしようと思います。(micto:bitを持っていなくてもシミュレーターで遊べるので、暇な人は手順を追ってみてください)

まずはこちらにアクセス
https://www.microbit.co.uk/app/


「Create Code」をクリックすると、何でプログラムを書くか選ぶことができます。

  • JavaScript
    • JSでも書けるらしい。
  • BlockEditor
    • おすすめ、Blockyのようなビジュアルプログラミング環境でプログラムが作れます。 今回はこれを使ってみる。
  • TouchDevelop
    • まだ試していないけどMicrosoftのプログラム支援Web開発環境 これもおすすめ
  • MicroPython
    • Pythonでも書けるらしい

BlockEditorをクリックします。

それっぽい画面が出てきます。
あとは、ブロックを並べていきます。

試しにこんな感じ。

「run」をクリックすると、シミュレーションが動きます。



(実際はアニメーションしています)


よさそうなら、いよいよ書き込み。
「complie」をクリック おもむろにファイルのダウンロードが始まります。

  • Micro:bitをUSBでパソコンに接続すると、USBストレージが現れます。
  • 先ほどダウンロードしたファイルを、そのUSBストレージにコピーします。
  • 少し待ちます。
  • 書き込み完了です。



(実際はアニメーションしています)


すごい簡単!

ざっと感想

LED、加速度センサー、地磁気センサー、ボタン、BLE、などが初めからついているArduinoという感じ。
BlockEditorも簡単。とにかく手軽に始められる電子工作環境だと思いました。

Arduinoでもツールを組み合わせれば近いことはできるけれども、それがデフォルトでいきなり使えるというところがMicro:bitの強みかなと思いました。( https://developer.mbed.org/platforms/Microbit/ )

また中身はmbedなので、普通にmbedのIDEを使ってより複雑なプログラムを作ることもできるため、一通り遊んで、さらに踏み込んだことがやりたくなったときも、そのまま使い続けることができるというのも良いと思いました。

ともかく何もかも簡単なので、プロトタイピングはまずMicro:bitでやってみる、というのはありだと思いました。

ESP-WROOM-02を使って、温度湿度をWifi経由で取得してみた

これはなに?

最近じめじめしてきたので、部屋の温度・湿度を記録してみたくなりました。
せっかくなのでセンサーとWifiボードを直結して、自動的に記録をするシステムにしてみました。
Wifi経由でサーバに送信し、サーバ側ではinfluxDBとgrafanaを用意し可視化しました。


材料

最近はこういうものを作るのはすごく簡単になってます。

まずはWifiを簡単に扱えるマイコンボード
ESP-WROOM-02
http://cerevo.shop-pro.jp?pid=91592223

秋月やスイッチサイエンスでも買うことができます。
ブレイクアウトボード付きで1000円くらい。

ESP-WROOM-02ピッチ変換済みモジュール《フル版》

ESP-WROOM-02ピッチ変換済みモジュール《フル版》

今回はこのボードをArduinoとして利用します。

ちょうどこの前のIoT合宿で使い方を調べていたので、さくっと使い始めることができました。
http://d.hatena.ne.jp/inajob/20160606


それから温度センサ
AM2320
http://www.akizukidenshi.com/catalog/g/gM-08663/

こちらは秋月のちょっといいやつ600円

有名なものらしくArduinoのライブラリが公開されていたので、細かいことを気にせずに利用できそう。

計画

まずはESP-WROOM-02の使い方を調べます。
https://tech-blog.cerevo.com/archives/859/

配線はこれでよさそう
ESP-WROOM-02ファームウェアを書き換えることでArduino的に扱えるようになるとのことなのでそれも調べてみる。
http://deviceplus.jp/hobby/entry034/

この辺が参考になりそう。
書き込みの設定もいくつかある模様
http://qiita.com/umi_kappa/items/ced90c258a14be165291
この辺りを参考にした。

Wifiは電気を食うのでDeepSleepモードというものについても調べてみた
http://qiita.com/azusa9/items/65a5c3772c41631b5ca1


温度センサーの使いかた発見
https://www.sglabs.jp/esp-wroom-02-sensor/
http://d.hatena.ne.jp/high-sai/20160409/1460245483

さて、材料はそろったかな

試しに使ってみる。

https://tech-blog.cerevo.com/archives/859/
ここに従って回路を組み立てて、ATコマンドでWeb上のコンテンツをとってくるというのを試した。

続いてArduinoとして使えるというのを試すためにArduinoIDEからLチカのプログラムを流し込む。

最後に組み合わせ技で、Web上のファイルを読み込み、その中身に応じてLEDの光をつけたり消したりする、というのを作りました。

ここまでは肩慣らし。

設計

紙の上でばばばっと
(図中でESP-WROOM-02となっているところはCEREVOブレイクアウトボードです。 http://cerevo.shop-pro.jp?pid=91592223

この温度センサは1本の線で制御できるらしいということで、こんな感じ。

プログラムは

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#include <DHT.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;
DHT dht(4, DHT22);

void setup() {

    USE_SERIAL.begin(115200);
   // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFiMulti.addAP("<SSID>", "<PASSWORD>");

}

String getDHTString(){
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if(isnan(h) || isnan(t)){
    USE_SERIAL.print("failed to read from dht sensor!");
    USE_SERIAL.flush();
    return "";
  }
  return "t=" + String(t) + "&h=" + String(h);
}

void loop() {
    // wait for WiFi connection
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        http.begin("http://なんかエンドポイント?" + getDHTString()); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
        ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT); // 30sec 
        delay(10000);
    }

    delay(10000);
}

こんな感じです。

組み立て

はんだ付けして、空いていたZiplocに入れてみる。


外見はこんなかんじ

中はこんなの

電源は単三電池4本
基板は秋月C基板に これまた秋月のアクリルパネルをねじで固定して背面がショートするのを防いでいます。

アクリルパネル: http://akizukidenshi.com/catalog/g/gP-09853/


サーバ側

今回は自分でサーバ側も書きます。

手抜きでPHPでさっと作る。
たまたまサーバにはInfluxdbとGrafhanaがはいっていたのでそこに流し込みます。

<?php
error_log("get t=" . $_GET["t"] . " h=" . $_GET["h"]);

require_once __DIR__ . '/vendor/autoload.php';

define('INFLUXDB_HOST', 'INFLUXDBサーバ');
define('INFLUXDB_PORT', INFLUXDBポート);
define('INFLUXDB_NAME', 'DBの名前');
define('INFLUXDB_USER', 'ユーザ名');
define('INFLUXDB_PASS', 'パスワード');

$client = new InfluxDB\Client(INFLUXDB_HOST, INFLUXDB_PORT);
$db = $client->selectDB('INFLUXDB_NAME');
$points = array(
  new InfluxDB\Point(
    'temperature',
    (float)$_GET['t']
  ),
  new InfluxDB\Point(
    'humidity',
    (float)$_GET['h']
  ),
);
try {
  $result = $db->writePoints($points, InfluxDB\Database::PRECISION_SECONDS);
  #var_dump($result);
  error_log(var_export($result, true));
} catch (Exception $e) {
  error_log(var_export($e, true));
}
error_log("success");

?>

グラフだせた

いい感じ!


電池が切れた

3日目にして電池が切れました。 30s間隔で動かしてこんなもん(起動などがあるので実質1分間隔くらい)

ということで30分間隔にすると30倍持つということかな? であれば90日持つか?
これから実験してみよう

いったんまとめ

2000円くらいでセンサ+Wifiのこういうガジェットが作れるというのは、なかなか面白いです。
次はにおいセンサーに挑戦したいな と思いつつ、しばらく運用してみます。

IoT合宿に参加してきた

未踏な皆様と電子工作合宿をしてきました。
僕は参加者の中ではそこそこ電子工作をしている人だったので、レクチャーを聞きながら自分の作業をしてました。

僕のやったことですが・・

アンプ回路の確認

結構昔から作っている電子楽器「RakuChord」のアンプをどうしようかなと、、
過去作ってきたRakuChordのアンプをどうやって作ったかもう忘れてしまったので、基板をみながら、回路図を書くという「逆アセンブル」みたいなことをしていました。

ちなみにアンプはLM386を使っています
http://akizukidenshi.com/catalog/g/gI-00022/


RaspberryPiのGPIOを使って音を鳴らす

レクチャーでGPIOをやっていたので、勢い余って、高速にHigh/Lowを切り替えて音を鳴らしてみました。
出来るもんですね。

I2C液晶をRaspberryPiにつなげる

今回のレクチャーはI2Cの話だったので、僕も一緒にやってみた。
以前Arduinoにつないだことのあるaitendoの液晶をRaspberryPiから制御した。

液晶はこれを使いました。: http://www.aitendo.com/product/13239
i2cdetectコマンドの返事がなんだかおかしいけど、一応動きました。

申し訳程度に為替をインターネットから取得して表示するというのをやってみた。

555を使ってみる

マイコンを使わずに音を鳴らせてみたいということで、定番の555タイマーICを使って音を鳴らす回路を作ってみた。
その前にはLEDの点滅も作ってみた。

参考:http://pc.watch.impress.co.jp/docs/2008/1023/musashino015.htm
http://akizukidenshi.com/catalog/g/gI-08344/

キーボードを使ったおもちゃの整備

いま作成中のキーボードを使った電子工作のソフトウェア部分を改良して動作速度を向上させました。
ちゃんと出来上がったら適当にお披露目しようと思います。

ESP-WROOM-02に火を入れる

Arduinoとして使うというのをやってみた。
単純にWebサーバ上にあるファイルの中身を見てLEDをつける、消すを制御できるようなものを試作した。IoT!


ゲーム機を見せびらかす

以前作ったゲーム機を見せびらかしました。

http://d.hatena.ne.jp/inajob/20160322

感想

スイッチサイエンスの置き部品( https://www.switch-science.com/info/aidstation/ )と、電子工作に詳しい人がいる環境での電子工作合宿は、とても快適でした。
ちょっと詰まったところで、誰かに聞きに行くと、誰かしらが教えてくれるというとても良い環境でした。

あと、会場の椅子がすこし良い感じの椅子で、会議室にありがちな尻が痛い現象にならずに終始快適に作業が出来ました。

参加者の中には、電子工作は全くの素人という人もいましたが、合宿が終わる頃にはそこそこ出来るようになっているようでした。
電子工作は基本の「キ」の部分の障壁が高いため、こういう機会がないとなかなか始めることが難しいと思います。

かく言う僕も大学の頃に一晩かけて先輩に教えてもらって、そこからコツコツといろいろ(変なものを)作ってきました。

また次回の予定もあるらしいので、電子工作に興味はあるけれどもやったことのない未踏関係者は要チェック!です!

SpaceAppChallengeに参加してtracerouteを可視化した話

先に作ったものの紹介

「RouteVisualized+」


NASAは様々な地球に関するオープンデータを公開しています。
私達は、それに「インターネットの情報」を追加しようということに挑戦しました。

このWebアプリケーションを利用することで、インターネットの経路とNASAの公開するデータを重ねて見ることが出来ます。

こちらから見ることが出来ます→http://inajob.github.io/VisualizedEarth/view.html

(エンジニア向けに書くと要はtracerouteの可視化です)

以下製作の記録です

最近Hackathon参加記録となりつつある、このブログですが、今回はSpaceAppChallengeに参加してきました。

NASA主催の世界で同時に開催されるというこのイベント、宇宙をテーマということで、いつもの”なんでもあり”のHackathonとは少し違った感じ。

今回のメンバーは

  • ばりー さん(リーダー、Androidエンジニア)
  • 私( @ina_ani )
  • Nくん(デザイナー、会社の同期)
  • Kくん(エンジニア、ばりーさんの会社の後輩)

ばりーさんとNくんは良くHackathonに出ているらしく、今回はそれのチームに僕が誘われた感じ。
ばりーさんとは以前のHack Day 2016で一緒のチームに出場し、そのつながりです。

何を隠そう、このメンバー全員同じ会社です。(普段の業務ではほとんど関わりないですが・・)

Input Day

正直宇宙、なんたるか、全く知らない僕たちです。
まずは事前に行われるInput Dayに参加することにしました。

平日の夜に開催されたのですが、NくんとKくんは都合が合わず、私とばりーさんで参加しました。
すごい宇宙の話を聞かされて置いてきぼりにされないかな?と心配でしたが、そんなことはなく、BluemixやAzure、IDCFなどの紹介がメインのイベントでした。

よく見るとSpaceAppChallengeはHack Day 2016の運営メンバーが多く、Hackathonの流れも勝手知ったるHack Dayと似た感じだったので一安心。

また、NASAからのテーマというものが与えられ、しかも運営の方々が丁寧に翻訳してくださったものがあり、それを参考にして進めていくことにしました。

調べるとJAXANASAはかなり大量のデータをオープンデータとして公開しており、それらを見るだけでも面白かったです。

打ち合わせの日々

と言ってもこのHackathon、参加は抽選方式で、開催の1週間前に参加の合否が分かるというスタイルでした。
そのため、参加が決まってからいよいよ何をやるか考えねば、という感じで打ち合わせを始めた我々にはあまり打ち合わせをする時間がありません・・

平日は仕事してるので、夜にちょっと集まっては、何を作ろうかと話していました。

SpaceAppChallenge当日

朝10時から会場に集まり、チームビルディングなどが行われ、実際の開発は12時から開始ということでした。
ということで、すでにチームが決まっている我々は、この時間を使って何を作るかを詰めることにしました。
SpaceAppChallengeTokyoは土曜日の12時から翌日の12時までの24時間が開発期間でした。

さて何を作るか・・・

そこでふと、”インターネットのデータもNASAのデータと重ねて見てみたい” と思いそのアイデアをみんなに話したところ、面白い ということで、それを作ることになりました。

可視化するのは、みんな大好きtracerouteです。

パソコンからWebページを見ている時にどのような経路でパケットが相手サーバまで到達しているかを、地図上で見られるようなものをつくろうというものです。

そうと決まれば材料探しです。

IPから地図の緯度経度を対応づけるデータは、非商用で利用ができるGeoLite( http://dev.maxmind.com/ja/geolite2/ )を使うことにしました。
システムの見た目の部分はブラウザ上で動くWebアプリとして実装することにしました。

まず4人で役割分担です

  • 僕と、N君はフロントの見た目の部分
  • ばりーさんとK君はバックエンドのDBや実際にtracerouteを実行する部分

という分担にしました

地図の表示などはライブラリを使うのが良いだろうということで、はじめのうちしばらくは地図ライブラリを調べていました。

  • OpenLayers3

http://openlayers.org/
多機能そう・資料も多い
使ってみるとCanvasに描画しており非常に重い

  • DataMaps

http://datamaps.github.io/
d3.jsを使った地図情報表示ライブラリ。
SVGベースで軽快に動くが、表現力が低い

  • leaflet.js

http://leafletjs.com/
SVGベースで動き、表現力も十分

ということで、色々とライブラリを変えながら、最終的にleaflet.jsを使うことにしました。

地図は初めはOpenStreetMapなどのラスター形式の地図を使っていたのですが、色などのカスタマイズがやりにくかったため、最終的にNaturalEarchが提供しているgeojson形式の国境線のデータを利用しました。( https://geojson-maps.kyd.com.au/ )
leafletはgeojsonの形式のファイルを読み込む機能があり難なく世界地図を表示することができました。

国境データはそのまま描画すると、イギリスが中心となった世界地図なのですが、日本でよく見る形の東アジアが中心になった地図の方がわかりやすいということで、ロード時に座標をずらして読み込むようにしました。

NASAのデータはWMSというタイルマップを返すAPI形式のものを利用することにしました。
これもleafletが対応していたため、URLとレイヤー名を指定すると、NASAのデータを地図の上に表示することができました。

(たとえばここ、 かなり面白そうなデータがあります http://sedac.ciesin.columbia.edu/maps/services

フロントエンドはこうやって僕がJavaScriptのライブラリなどで、一応動くものを作り、N君が色やレイアウトを調整するという流れで作業しました。

作業はgitbucketのプライベートリポジトリを介して行いました。git便利

バックエンドはあまり関わっていないので詳しい流れはわからないのですが、ばりーさんがtracerouteをしたデータをDBに溜め込む部分を作り、K君がその結果とGeoLiteの緯度経度を紐付けて、APIで返す部分を作っていたようです。

GeoLiteのデータはIPのサブネットと緯度経度のペアの情報が大量にあるということで、IDCFのサーバ上で、これらのデータをSQLでjoinしまくるのが遅いというのが問題になっていたようです。

このHackathonは夜中もぶっ通しで開発してもいいよ、というものだったのですが、もう我々も歳だということで、一度は帰ることに・・

土曜日の夜の段階では、見た目はなんとなく動いていて、NASAのデータ、世界地図、ダミーの経路を表示できるようになっていました。バックエンドは、SQL上では返したいデータが取り出せるという状態でした。

僕は帰って4時間ほど寝て、ほぼ始発に乗って会場へ、、
日曜日は仕上げということで、クォリティを高めたり、プレゼン資料を作ったりしていました。

APIが完成すると、ちょっと気になるあのサイトの経路を調べて、遊ぶことができるようになりました。
Akamaiすごいなとか、ここは自社のデータセンター通ってるな とかを地図上で見れるのは思いの外面白かったです。

yahoo.comへの経路、シンガポールらしい(あと経由しているルーターは全部yahoo.comのものみたい)

ニュージーランドのサイトを見てみる

あのサイトはオランダから?


またNASAのデータを重ねることで、人口が少ないこんなところをインターネットが通っている!とか、風の強いこんなところにデータセンターがあるっぽい ということを見ることができました。

12時で開発は終了し、その後発表です。

ガチ技術のものから、斜め上の発想のものまで、様々な作品がありました。
僕たちの作品は見た目はかなりいいクォリティだったと自負しています。

が、宇宙との関わりの部分が弱かったため、賞はもらえず・・

しかし多くの方から

  • 完成度が高い
  • あのサイトの経路が見てみたい

などコメントをいただくことができました。

また、僕たちエンジニアはtracerouteなんて出来て当たり前と思っていましたが、見に来てくださった方の中には、こんな情報が公開情報なのか!と驚く方もいらっしゃって、エンジニアしか体験できていない、インターネットの中身の部分を、一般の方にも感じてもらえるきっかけになったかな? と思っています。 (宇宙関係無いけど・・)

雰囲気構成図


まとめ

今回はかなりスムーズに進めることができ、完成度もまずまずで、堅実なものづくりができたかなと思っています。
ただ、今回のようなテーマのあるHackathonでは、もう少しテーマに寄り添った作品にしたほうがよかったなというのが少し心残りです。
また社会人4人で1週間でネタを考える、というのもそもそも集まるのも難しく、次回はもっと時間を確保するか、 またはオンラインでうまくネタ出しをする方法を考えていきたいなと思いました。


SpaceAppChallengeは有志の方が運営をしているようで、宇宙愛の強さを感じました。
IT業界で宇宙のこと大好きな人、結構多いと思っているので、我こそは!と思う方は是非次回にでも参加してみると良いと思います。

ゲーム機のようなものをまとめてみる

これは?

最近僕がハマっているArduinoなどを応用した小型の携帯ゲーム機をまとめてみました。

これ以外にも知ってたら教えてください。

今回はIchigoJam(http://ichigojam.net)のような外部ディスプレイをつなぐタイプのゲーム機は除外して、ディスプレイ付きの、スタンドアローンで遊べるものに絞ってみました。

 

2018/04/21追記

更新しました。見た感じGamebuino Meta, Arduboy, Pokitto の3つが今イケてるゲーム機のように見えます。ほかにもこの手のゲーム機があれば教えてください!

Gamebuino Meta

Gamebuino - play & make games, quick & easy!

www.youtube.com

下に書いてあるGamebuinoの次世代版

  • SDカード
  • バッテリ内蔵
  • 10bit DAC 3.5mmジャック付き
  • 160*128pxカラー液晶(通常は80*64として利用する)
  • ATSAMD21 (Cortex M0+) 256KB flash, 32KB RAM(Arduino Zeroと同じ)
  • 99.99

 

Gamebuino (classic)

※上記Gamebuino Metaのひとつ前のバージョンです

gamebuino.com

f:id:inajob:20160323204242p:plain

僕がハマっていたハードウェア

自分で作ってみた記事:http://d.hatena.ne.jp/inajob/20160322

Arduboy

https://www.arduboy.com/

f:id:inajob:20160323233340p:plain

Pokitto

Pokitto.com | Pokitto.com

f:id:inajob:20180421121635p:plain

 

  • LPC11U6x NXP ARM Cortex M0+ 48Mhz,256kB Flash, 35kB RAM, 4kB EEPROM
  • 220*176カラーディスプレイ(110*88, 128*64, 84*48 モードあり)
  • 8bit DAC ステレオヘッドホンジャック付き
  • GPIOが上に引き出されている
  • ArduboyやGamebuinoのゲームが動くようなことが書いてあるが、どのレベルで互換性があるのか?
  • €49.90 (組み立てキット)

PocketSprite

PocketSprite | Crowd Supply

f:id:inajob:20180421123922p:plain

Meggy Jr RGB Soldering Kit

shop.evilmadscientist.com

f:id:inajob:20160323212518p:plain

  • $75で買える模様(組立済みのものは売り切れていました。)
  • 8x8フルカラーLED
  • 上下左右+AB ボタン
  • 単4電池3本 (ACアダプタとコネクタは別売の模様)
  •  シリアル端子が出ているのでUSB-Serial変換があれば書き込める。
  • 詳しい説明Wikihttp://wiki.evilmadscientist.com/Meggy_Jr_RGB
  • Arduino互換(atmega168)
  • 画面を120Hzで書き換えられる
  • 音も鳴らせる
  • とてもシンプルなライブラリhttps://github.com/evil-mad/MeggyJrRGB/
  • オープンソースで回路図公開(上記wiki内にリンクあり)
    • 16出力のsinkドライバを2つ

LED Game for AVR

http://www.nicotak.com/avr/ledgame.html

f:id:inajob:20160323213747p:plain

  • 16x16単色LED
  • 2007年Arduinoの黎明期と同じくらいの時期(多分)に発売している
  • atmega168
  • 上下左右+ABボタン
  • Arduinoではない、ISPで書き込む (Arduinoに改造している記事あり http://www.kako.com/neta/2008-006/2008-006.html
  • もう売ってなさそう
  • 様々な改造例あり。 SDカードのデータを読みこんでブートするGamebuinoみたいな改造もあった
  • 回路図あり オープン http://www.nicotak.com/avr/develop/inside.html
  • LED直結で抵抗がないけど大丈夫なのかな?(それの考察もあるけど結論が出ていない模様)
  • 輝度ムラの出来る配線 ソフトウェアで輝度ムラを除去するサンプルプログラムあり
  • 単三電池2本から

 

AVR-GAME-2S

http://www.microfan.jp/shop/7_1.html

f:id:inajob:20160323215913p:plain

  • 3240円くらい
  • キットなので自分で組み立てる
  • ボタンは4つ
  • 8x8 2色LED
  • スピーカ
  • atmega168
  • Arduino非互換 ISP書き込み
  • よく似た単色8x8LEDのものもある http://www.microfan.jp/shop/7_2.html
  • 回路図が見れる(ライセンス表記なし)
  • 別売りのACアダプタ電源

EGP01

http://www7a.biglobe.ne.jp/~elegan-konya/EGP/EGP01.html

http://elegan-konya.at.webry.info/

f:id:inajob:20160323221341p:plain

TFT液晶と3Dスティックを組み合わせた小型ゲーム機

  • dsPIC33FJ128GP804-I/P
  • 4方向+1タクトスイッチの3Dスティックのようなボタンが2つ
  • 液晶は別途購入 128x128のカラーTFT液晶
  • 3V駆動
  • 開発ブログが読み応えがある
  • もう売っていない

GAMBY

http://logicalzero.com/gamby/

f:id:inajob:20160323221946p:plain

  • Arduinoのシールドとしてのゲーム機(なのでArduinoでプログラミングできる)
  • 十字ボタン+4方向入力ボタン(写真左の黒いやつ)
  • スピーカ
  • オープンソース
  • Games for Arduino, Made By You!
  • 96x64モノクロ液晶
  • 25$くらいで販売中(たぶん自分で組み立てるキット)
  • ライブラリあり https://github.com/logicalzero/gamby

Nibble

https://www.kickstarter.com/projects/808254712/nibble-pocket-sized-arduino-wifi-oled-sd-card-ir

f:id:inajob:20160323222831p:plain

Kickstarterでfundedなやつ

  • Jun 2016に発送予定?
  • €49で募っていた模様
  • ATMEGA328P - 16 MHz
  • Wifi
  • 128x64 OLED Display (単色っぽい)
  • LiPo battery - 300 mAh - 8+ hours battery life
  • 8個のボタン
  • MicroSD(たぶんgamebuinoみたいにSDからhexを書き込める)
  • 赤外線送信機
  • スピーカ
  • Arduinoとして利用できる(マイクロUSBケーブルが刺せる)
  • 3Dプリンタで作られた筐体

Tiny Arcade

https://www.kickstarter.com/projects/kenburns/tiny-arcade-a-retro-tiny-playable-game-cabinet/description

f:id:inajob:20160323223706p:plain

これは有名だったから知ってる人も多そう

  • フルカラーOLED(96x64)
  • SDカードからゲームをロードできる
  • アナログジョイスティックと2つのボタン
  • スピーカ
  • リチウムイオンバッテリ
  • USBからプログラミングできる
  • Arduino Zero互換(32bit-ARM)
  • $60出資で組み立てキット
  • フリーでオープンソースなゲーム (そのもののサイトが見つからなかった。 これはTinyDuinoという姉妹プロダクトのサイトか?http://tinyduinogames.de/
  • 絶賛開発中の模様 (Mar 2016出荷予定だ、がんばれw)

Tetris(R) MicroCard

https://www.arduboy.com/store/products/tetris-microcard

f:id:inajob:20160323232529p:plain

  • Arduboyの人たちの前作?
  • $49
  • モノクロOLED (多分 128x96 を縦向きに使っている)
  • USB端子のようなものが見えるが、特に言及されていない

DIY Gamer Kit

https://www.adafruit.com/products/2123

f:id:inajob:20160323234940p:plain

  • Arduinoのシールドとしてのゲーム機(うしろにこっそりArduinoが見えます)
  • 9V電池
  • 自作キットとして販売 $56.95
  • 動画を交えた開発チュートリアル
  • 赤外線送信・受信

DigiPixel

http://www.bradsprojects.com/the-digipixel/ 

f:id:inajob:20160324000850p:plain

  • Arduinoのシールドとしてのゲーム機
  • 8x8フルカラーLED
  • 十字+ABボタン
  • ライブラリあり AirWriteという残像を使った表示を実現できる
  • 元々Kickstarterで、今はもう売ってないかな・・?

Magpi

http://www.instructables.com/id/Magpi-The-Micro-Arduino-Gaming-Platform-Interface/?ALLSTEPS 

 

f:id:inajob:20160324001152p:plain

  • The Micro Arduino Gaming Platform Interface
  • Arduinoを使った簡単なゲーム機
  • 製品ではなく作り方の紹介
  • 3Dプリンタ用のデータなども公開されている
  • ライブラリも提供されている

情報源

まとめ

Arduinoなどの普及によりこういうゲーム機はとても作りやすくなってきています。

オープンソースなので、自分で作ってみるもよし、買ってみて遊び倒すもよし、ゲームソフトを自作するのもよしです。

部品から仕組みを理解し、組み立てて、更にその上で動くゲームを開発するというのは、ある意味フルスタックな感じでとても満足感があります。

新しいことに挑戦してみたい方には是非薦めたい遊びです。

Gamebuinoつくってみた

Gamebuinoざっくり紹介

GamebuinoはArduinoを利用して作られたゲーム機とその環境です。

http://gamebuino.com/
(下記画像は公式ページのものです)

Arduinoに加えて下記の機能が搭載されています

  • ハードウェア
    • 48px*84pxのLCD(バックライト付き)
    • 十字ボタンとA,B,Cボタン
    • SDカードソケット
    • スピーカ
    • バッテリー
    • 通信対戦用のI2C端子
  • ソフトウェア

ハードウェアはまぁ書いてあるとおりの機能です。ソフトウェアがすばらしくてですね、、

ブートローダ

Arduinoブートローダーとほぼ同じなのですが

  • シリアル経由の書き込み(これはArduinoと同じ)
  • SDカード経由の書き込み
  • Cボタンが押された状態で起動した場合にLOADER.HEXを書き込む

という機能があります。
これにより、パソコンが無くても違うプログラムに書き換えることが出来ます。
ビルドしたバイナリをSDカードに入れておくことで、事実上ほぼ無限のゲームを入れ替えながら遊ぶことができます。
まるでゲーム機みたい!

ゲーム開発用ライブラリ

ゲームづくりにおいて大切なのは良いライブラリです。
ゲームが作りたいのに、円を書くアルゴリズムや直線をひくアルゴリズムの作成に時間を割かれたくありません。

GamebuinoにはよくできたSDKが提供されており、様々な機能が簡単に呼び出せる関数にまとめられています。
一例を以下に列挙

  • 名前入力などに使える文字入力(keyboard)
  • ちょっとした情報をユーザに伝えるpopup(アニメーション付きで表示されます)
  • ちょっとした当たり判定(physics)
  • ボタン周りの処理(キーリピートなど)
  • 8bitサウンドのソフトウェア音源とトラックの管理
  • 各種図形の描画ルーチン
  • 数種類の大きさのアルファベットのフォント

とてもすばらしい

Gamebuinoつくってみた



インベーダーも動きました!


さてさて こういう構成で作れば良いのか

お値段はざっとこんな感じ

LCD 500円 有機ELなら倍くらい
FT232RL 秋月のモジュールが1000円くらい(これは使いまわせるので1つあればOK)
Atmega328 250円
Speaker 100円(なにかしらのおもちゃから取り出してもOK)
ボタン 10個で100円くらい(良いボタンは1個100円くらいする)
レギュレーター 1個30円くらい、周辺にコンデンサが必要、これは1個10円もしない
基板 150円
SDカードスロット 250円
その他 もろもろ

2500円くらいかな

もし2個めを作るならFT232RLは共用できるので1500円くらいです

FT232RL

FT232RLからはシリアルの通信線でAtmega328と接続します。
TX,RXという送りの線と受信の線です。それと書き込み時にリセットを書けるための線を接続します。

シリアル接続は予め転送レートを決めておいて、そのクロックでデータを送り合う方式です。

Button

ボタンは全部で7つあります。
それぞれをAtmega328と接続します。
プルアップはAtmega328の内部で行うので不要です。

LCD

LCDとAtmega328はSPIというインターフェースで接続します。

  • CS(chip select)
  • MOSI(master out, serial in)
  • MISO(moster in, serial out)
  • SCK(serial clock)

SPI

SPIはMasterとSlaveという役割を割り振ります。MasterはAtmega328などのCPUで、Slaveは液晶などの周辺機器であることが多いです。

MasterがSCKからクロック信号(HIGH,LOWを切り替え続ける)を送り、そのクロックに合わせてMOSIを通してMasterからSlaveに、MISOを通してSlaveからMasterにデータを送ります。

また複数のSlaveを接続する際にピンを消費しないように、MOSI,MISO,SCKのピンは他のSlaveと共有することが出来ます。CSがHIGHのものだけがその信号をやり取り出来るようになっています。

Speaker

スピーカーはトランジスタを介して接続します。
たぶん今回の場合は小さいスピーカなので無くても大丈夫だと思います。

SDCard

SDカードとはSPIで接続します。
これはLCDと線を共有します。
ただしCSだけは違う配線で接続します。SPIはCSを使ってどの接続が有効かどうかを切り替えるのです。

  • CS(chip select)
  • MOSI(master out, serial in)
  • MISO(moster in, serial out)
  • SCK(serial clock)
レギュレーター

今回使うLCDやSDカードは3.3Vで動作します。
そのためには乾電池3本から得られる4.5Vを3.3Vにレギュレーターで降圧する必要があります。

普通のArduinoは5Vで動作しますが、Gamebuinoは3.3Vで動作します。

組み上げる

Gamebuinoのサイトを参考に結線します。
本当はブレッドボードにまず組んで、動作を確認してからユニバーサル基板を使うのが良いです。

ブートローダーの書き込み

ブートローダーの書き込みは少し面倒くさいです。
専用の書き込み器を使うか、既に作られてあるArduinoを利用するか、FT232RLを使う方法がありますが、どれも煩雑です。

ココに良い資料があるのでこの方法を使いました。
http://make.kosakalab.com/arduino/bootloader/

エンクロージャ

とりあえず配線の裏側を守るために木の板を用意してネジとナットで基板に固定します。


遊ぼう!

SDカードにHEXファイルを入れておくことで、複数のゲームを切り替えて遊ぶことが出来ます。ただしSDカードはSDHCではなく「SD」カードである必要があります。

これは2G以下のSDカードのことです。
今やあまり売っていないですが、なんとか調達しましょう。

http://gamebuino.com/wiki/index.php?title=Games

ゲームはここにたくさんあるので、ダウンロードしましょう。
液晶がGamebuinoとは別の場合は、液晶の命令セットが異なるためゲームを再度ビルドする必要があります。

まとめ

Gamebuinoは良いので、自分で作るか買ってみてください!

まずは公式ページにアクアセス! → http://gamebuino.com/

aitendoのTN液晶をarduinoで制御してみる

aitendoで99円くらいで売っていたTN液晶をArduinoから制御してみます。

たぶんこれ
http://www.aitendo.com/product/4410

HT1621BというチップでSPIみたいなインターフェースがある模様。
ネット上でもいくつか作例を見つけました。


  • CS
    • チップセレクト
  • RD
    • 読み出しの時に使うっぽい 今回は使わない
  • WR
    • 書き込みの時のクロック
  • DATA
    • データ線
  • GND
  • VDD
  • LED A
    • バックライト アノード
  • LED K
    • バックライト カソード

で、CSを HIGH->LOWして WRを動かしながらDATAからデータを流していく。

調べた所

SYS EN 100 0000-0001-0 -
BIAS 100 0010-1001-0 1/3bias 4 commons option
LCD ON 100 0000-0011-0 -

まで流すと初期化完了らしい。
読みやすいようにいろいろ書いたが、真ん中の列にある0や1をこの順で書きだせばOK

先頭の100がコマンドモード 後続の9ビットが引数のようなものらしい。

続いてデータの書き込み

DATA 101 AAAAAA DDDD .... Aはアドレス、以降4ビット単位でアドレスをずらしながら書き込んでいく。(例ではDと表記)

今の所とにかく各セグメントを点滅させるところまで出来た。

どのアドレスがどのセグメントに対応しているかはこれから調べる予定。

さて、何に使おうか

#define WR 6
#define DATA 7
#define CS 8

void data(bool b){
  digitalWrite(WR, LOW);
  digitalWrite(DATA, b);
  digitalWrite(WR, HIGH);
}
void com(bool b0, bool b1, bool b2){
  data(b0);
  data(b1);
  data(b2);
}
void op(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7, bool b8){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
  data(b4);
  data(b5);
  data(b6);
  data(b7);
  data(b8);
}

void op4(bool b0, bool b1, bool b2, bool b3){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
}
void op6(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
  data(b4);
  data(b5);
}
void setup() {
  pinMode(WR, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CS, OUTPUT);
  
  
  digitalWrite(CS, HIGH);
  
  // == 9bit code sequence ==
  // SYS EN  100 0000-0001-X
  // BIAS    100 0010-1001-X 1/3bias 4 commons option
  // LCD ON  100 0000-0011-X
  
  // pattern

  // BIAS    100 0010-0000-X 1/2bias 2 commons option
  // BIAS    100 0010-0100-X 1/2bias 3 commons option
  // BIAS    100 0010-1000-X 1/2bias 4 commons option
  
  // BIAS    100 0010-0001-X 1/3bias 2 commons option
  // BIAS    100 0010-0101-X 1/3bias 3 commons option
  // BIAS    100 0010-1001-X 1/3bias 4 commons option

  
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,0,0, 0,0,0,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,1,0, 1,0,0,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,0,0, 0,0,1,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  
  com(1,0,1); op6(0,0,0,0,0,0);

  op4(1,1,1,1);  
  op4(1,1,1,1);  
  op4(1,1,1,1);  
  op4(1,1,1,1);  
  
//  for(int i = 0; i < 100; i ++){
//    op4(0,0,0,0);
//  }

  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  
  int count = 0;

  while(true){
    digitalWrite(CS, HIGH);
    digitalWrite(CS, LOW);
    com(1,0,1); op6(0,0,0,0,0,0);
    for(int i = 0; i < 64+8; i ++){
      data(i >= count);
    }
    count ++;
    delay(50);
    
    if(count >= 64 + 8){
      count = 0;
    }
  }
}

void loop() {
}