福野泰介の一日一創 - create every day

やわらかセンサー「ショッカクポット」に続き、顔の画像認識を使った顔ポインティングデバイスをつくってみました。 顔を向けた方向にマウスカーソルが上へ動き、ゆっくりウィンクすると、クリック。前回と同様pyautoguiの遅さがちょっとネックですが、新鮮な操作感が楽しめました。

オムロンさんからお借りしている画像認識ハードウェア「HVC-P2」をUSBでMacにつないでPython3で接続! 顔の向き(上下左右傾き)、年齢、性別、視線の方向、右目つむり、左目つむりと表示させています。他にも喜び度合いや、顔認証などのサクッと使える機能があって、最大35名分をまとめて認識するのがすごい。


ヒューマンビジョンコンポ (HVC-P2) B5T-007001|製品紹介|オムロン人画像センシングサイト:+SENSING
製品情報タブから、コマンド仕様書をダウンロードできます。 シンプルなシリアル通信で、簡単接続!カメラで撮影した、画像データの取得もリクエスト時の設定で可能です。(src on GitHub

import serial ser = serial.Serial('/dev/tty.usbmodem11', 921600, bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE) ser.write(0xfe.to_bytes(1, 'little')) ser.write(0x00.to_bytes(1, 'little')) ser.write(0x00.to_bytes(2, 'little')) ser.flush() fe = int.from_bytes(ser.read(), 'little') # recv 0xfe n = int.from_bytes(ser.read(), 'little') # res code len = int.from_bytes(ser.read(4), 'little') # len for i in range(len): print(ser.read())

ID受信するプログラム in Python3、シンプルですね!
IchigoJamなど、UART接続する場合、このケーブルが使えそう?
PRT-10361 JST SHコネクタ付ケーブル 6P (基板用ポスト付属)


画像認識ハードウェアをラズパイで自作するのも楽しいですね!


ラズパイマガジン 2019年4月号、特集「ラズパイ&人気ボード20枚」に、IchigoJam, IchigoLatte がランクイン!

適材適所、いろんなハードウェアを使いこなして、創りたいもの創りましょう!
創ってできたオリジナル製品、秋葉原に新登場した明和電機のリアルショップ「ラジオスーパー@ラジオデパート2F(未掲載、2F桜屋電機向かい)」での販売もいいですね!

一日一創オープンソースハードウェア「光るネクタイ」が、Hana道場発プロダクトとして、販売開催!
初日から大盛況! 明和電機の公式ショップがついにオープン (取材中に見つけた○○なもの) - AKIBA PC Hotline!

早速、第二期募集スタート!
第二期 ラジオスーパー応募要項 - 明和電機 - Maywa Denki明和電機 – Maywa Denki

化粧用スポンジの収縮を計測する変わり種センサー「ショッカクポット」を使ったやわらかボタン。 シリアル通信で使え、3.3Vでも動いたので、PC用のUSBシリアルを経由してマウス替わりのポインティングデバイスにしてみました。

やわらかい触り心地の新操作感、小さなこどもから、高齢者、障害者の方まで、幅広く提供する、インクルーシブソフトウェアとしてもオススメです! ThinkPadの赤いポインティングデバイスをご存知の方には、大きくなって、柔らかさが増した感じというとわかりやすいかも。


ショッカクポットの5V、GND、Tx、Rx、RSTを、3.3V(定格外ですが)、GND、RXD、TXD、DTSに接続すればハードウェアの準備はOK!

今回は、Python3でプログラムを書きました。

serport = '/dev/tty.SLAB_USBtoUART' import time, serial ser = serial.Serial(serport, 57600, bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE) ser.dtr = True #reset time.sleep(0.1) ser.dtr = False time.sleep(0.1) ser.write('m'.encode('utf-8')) ser.read() # dummy recv 0xff time.sleep(0.1) import pyautogui try: data = [ 0, 0, 0, 0 ] # 10bit date: CH1, CH4, CH2, CH3 while True: ser.write(0x6d.to_bytes(1, 'big')) ser.flush() sum = 0 for i in range(4): n = int.from_bytes(ser.read(2), 'big') data[i] = n sum += n print(data) # drive Shokkaku pot! if sum / 4 > 40: pyautogui.click() else: dx = (data[3] - data[0]) / 2 dy = (data[1] - data[2]) / 2 dx = dx * abs(dx) dy = dy * abs(dy) pyautogui.move(dx, dy) except KeyboardInterrupt: ser.close()

pyserial, pyautogui を pip3 でインストール!
# drive Shokkaku pot! の下を書き換えるといろいろ好きに使えます
つまむ動作を認識して、特定の動作に対応させるのも、楽しそうです!


pyautogui.move の動作がちょっとぎこちないのが残念・・・。重いので自乗して簡易的に加速させています。java.awt.Robot版ともいいかも。

何事もまずは試作。山口県訪問時に買ってきた瓦そば。山口では家庭でフライパンやホットプレートで作って食べるのが一般的とのことなので、挑戦してみました。
高専生活躍! 異分野 x アプリ/IoTが熱い、G空間ハッカソン in 山口

一番の難関は錦糸卵。初挑戦に選んだ参考書はこちら
簡単すぎてウソみたい!失敗しない錦糸卵の作り方&春色アレンジレシピ3選♩ - macaroni

卵液を初回は全部いれてしまい分厚くなって失敗。2度目は裏返し忘れて失敗。3度目は焼き具合はよかったものの、細く切る技術が足りずそこそこなでき。「ひとつまみ」という、謎料理単位に悩みましたが、前進あるのみ。


牛肉を先に焼いておき、ゆでて水でしめて、ザルで水切りした茶そばを炒める。やきそばと違って、あまりかき混ぜず、焼く感じがポイントと知ったのは作った後。 確かに、本場で食べた瓦そば、下の方はカリカリしてました。その触感の違いもまた特徴とのこと。


ネギ、ノリ、レモン、もみじおろしを省略、しかも卵と肉が逆だった、第一試作でしたが、おいしかった!
次は、フルバージョンにチャレンジしたい!(Amazonにありました他多数

links
- タッチエンスのショッカクポット(POTU-001-1)を触ってみた。 - Qiita
- やわらかIoTボタンとバーチャルリアリティ VR ZONE SHINJUKU体験で想うVRゲーセンの未来形
- ショッカクポットI2C版 - Amazon

日本の宇宙オープンデータ時代の幕開け!
宇宙(ソラ)からの目、衛星データを無償提供する、Tellus OS ver 1.0 公開記念イベント。
目標は、現在の日本の宇宙関連市場1.2兆円を2030年までに倍の2.4兆円!

Tellus SPACE xData Fes.
Tellusが提供するオリジナルの衛星データなどは、ユーザー登録、原則コピー不可な、非オープンデータですが、 二次成果物の利用は自由となっているので、オープンデータ化することが可能です(利用規約に一部条件あり)。 また、エンドユーザーに有償で利用させる場合(利用規約)は、別途アグリーメントが必要。


さくらインターネット社長、舞鶴高専の高専違いの1つ上の先輩、田中さんによるオープニング!
公開したら終わりの従来ソフトウェアではなく、プラットフォームなので、ここからが本当の始まり。
膨大なデータを解析するための環境も用意し、宇宙データを使う敷居をぐっと下げる。
小学生でも活用しちゃうかも!?


世界最高水準50cmの分解能の衛星写真(光学)と、雲を透視でき植生などが分かる電波の反射による地上観測データ(SAR)が、無償で閲覧可能になりました!(画像提供、さくらインターネット)


宇宙 x ??、トークセッション1に登壇。
夏野さん、お久しぶりです!日本中のオープンデータ、全部Tellusに入れちゃう案、大賛成。
ガラパゴスにならない世界連携プラットフォームを創る最後のチャンス!
夏野さん、これからのベンチャーに何が必要ですか? (impress QuickBooks)


夏野さんの宇宙事業へのアドバイスは「派手に」
TELLO EDU 操縦用プログラムによる、自動撮影デモにで撮れた映像です。
新しいソラからの目、衛星とドローンとは補完関係。
(Python3による自動撮影プログラムは末尾参照)


宇宙 x アートが熱かった、トークセッション2
高解像度な宇宙アート写真が3,000万円! 月や火星などへの第二次宇宙ブーム、未知への憧れ、再び!


衛星画像データから、船が動いているか、停まっているか、艀(はしけ)かをいかに認識できるか競った、賞金総額200万円のAI画像認識コンテストの総評。
ロシア人プログラマーのNick Sergievskiyさんによる最優秀モデルで、56.7%と、なかなか難問だった様子。(最終評価で47.5%?)
コンペティション詳細/Tellus Open&Free Platform / 経済産業省 | SIGNATE - Data Science Competition


こちら、正解データ。3種類を高精度で見分けるモデルをいかに作れるか?


分割して、回転させたりジッターしたりで学習用画像を水増し、よく効くと噂の Faster-RCNN でモデルを組んで、機械学習!
上位はみんな類似のモデルだったそうです。(使用言語は、ほぼPythonほぼDeep Learning


THETAで撮った小笠原さんによる乾杯!宇宙っぽく丸く。広い会場、満員な上に椅子増席という人気!


懇親会時に開催された、Tellus SPACE アイデアワークショップ!
宇宙データと地上データをマッシュアップして何作ろう!?


宇宙感!


xData SPACE Fes. 会場向かいは、東京タワー。
今日、この遥か上空からの見下ろす「宙(ソラ)の目」を、誰もが獲得したわけです。
さて・・・あなたは何を見る?

links
- 2019年2月リリース! 衛星データプラットフォーム「Tellus」でできること | 宙畑 (SORABATAKE)
- 衛星データを無料で活用できるクラウドサービス「Tellus」、さくらインターネットが開始 | IT Leaders
- ASCII.jp:衛星データプラットフォーム「Tellus」が運用開始
- 衛星データを無償公開 さくらインターネット  :日本経済新聞
- 政府、衛星データを無料提供 新ビジネス創出を期待 - 毎日新聞
- 衛星情報の無料開放始まる 様々なサービスに期待
- 衛星データ“無料開放”サービス|NHK 首都圏のニュース
- 衛星データの”開放”は成功するのか? | 新・科学の世紀 | NHKオンライン
- さくらインターネット、クラウド上で衛星データの分析ができる日本初の衛星データプラットフォーム「Tellus(テルース)」を運用開始|さくらインターネット株式会社のプレスリリース
- 宇宙オープンデータ活用アライアンス「xData Alliance」参画! オープンデータで理解する大気圏、成層圏、対流圏
- 宇宙からのデータ活用で社会が変わる!衛星データプラットフォーム「Tellus(テルース)」発表
- 【イベント】日本の宇宙ビジネスを加速させる日本初の衛星データプラットフォームが公開!「Tellus(テルース)」記者発表会 | さくらインターネット
- 宇宙データはイノヴェイションの新たなトリガーだ!:Tellus SPACE xDATA Fes.で語られたこと|WIRED.jp

TELLO EDU による、360度自動撮影 Python3 プログラム

import threading import socket import sys import time event = threading.Event() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) tello_address = ('192.168.10.1', 8889) sock.bind(('', 9000)) def recv(): while True: try: data, server = sock.recvfrom(1518) print(data.decode(encoding = "utf-8")) event.set() except Exception: print('Exit recv') break recvThread = threading.Thread(target = recv) recvThread.start() def send(command): msg = command.encode(encoding = "utf-8") sent = sock.sendto(msg, tello_address) event.wait() event.clear() import cv2 import datetime def getNow(): return datetime.datetime.today().strftime("%Y%m%d%H%M%S") takepicture = False def takePicture(): global takepicture takepicture = True print("take a picture") videowriter = None def startMovie(): global videowriter if videowriter is None: FPS = 30.0 SIZE = (960, 720) FOURCC = cv2.VideoWriter_fourcc(*'mp4v') videowriter = cv2.VideoWriter("cap/" + getNow() + ".mp4", FOURCC, FPS, SIZE) print("start movie") def stopMovie(): global videowriter if videowriter is not None: vw = videowriter videowriter = None vw.release() print("stop movie") cap = None def capture(): global cap while not cap.isOpened(): time.sleep(0.1) while True: if cap is None: break ret, frame = cap.read() if frame is not None: global takepicture if takepicture: cv2.imwrite("cap/" + getNow() + '.jpg', frame, [ cv2.IMWRITE_JPEG_QUALITY, 95 ]) takepicture = False global videowriter if videowriter is not None: videowriter.write(frame) def startCapture(): global cap cap = cv2.VideoCapture('udp://127.0.0.1:11111') capThread = threading.Thread(target = capture) capThread.start() def endCapture(): global cap if cap is not None: tcap = cap cap = None tcap.release() send("command") send("streamon") print("stream on!") startCapture() startMovie() send("takeoff") takePicture() send("up 200") send("flip f") send("cw 360") send("flip b") send("land") stopMovie() endCapture() sock.close()

PM2.5が気になる季節、以前作った福井PM2.5 APIを使って、しゃべるPM2.5計スマートスピーカー Google Home Mini版を作ってみました。 人感センサーをつけて、朝一のリビングに入った時などに、しゃべってもらうといい感じかも。

Google Home を、ただのネットワークスピーカーとして使いたいときには、google-home-notifier。 再生してほしいmp3の音声ファイルのURLを渡すと通知して鳴らしてくれるというシンプルなもの。

PM2.5の値を取得し、しゃべらせたい文章を作成、Mac標準の音声合成コマンド say を使って、音声ファイルを作って、ffmpegでmp3化して、ローカルで立てたwebサーバーに設置して、Google Home Mini へ通知を送ればできあがり!

saypm25.py - PM2.5 APIから鯖江市神明の値を取得し、次へ

import os import urllib.request url = 'http://sabae.club/pm25/1/fukui/sabae.txt' req = urllib.request.Request(url) with urllib.request.urlopen(req) as res: body = res.read() n = int(body) print('response: ' + str(n)) s = 'おはようございます!鯖江市神明地区で計測したPMにぃてんごの値は、' + str(n) + 'です。' if n <= 70: s += '不要不急の外出は避けましょう。' os.system('./say-google.sh "' + s + '"')

say-google.sh - 日本語をmp3音声ファイルに変換して、次へ(ローカルwebサーバーの所定pathを設定)

say -v Kyoko $1 -o say.aiff ffmpeg -y -i say.aiff say.mp3 cp say.mp3 [** path ** ]/ node say.js

say.js - google-home-notifier を使って、通知する(ローカルwebサーバーの所定URLを設定)

const googlehome = require('google-home-notifier') googlehome.device('Google Home', 'ja') googlehome.play('http://[** ip, port, path ** ]/say.mp3', function(res) { console.log(res) })

毎朝、決まった時間にしゃべらせるなども、カスタマイズしましょう。

小さくても、結構大きな音がでる Google Home Mini、イベントや、ハッカソンなどでも活用できそうです。

G空間ハッカソンで活躍した、webアプリハンズオン研修、来週、福井市で再び開催!
G空間オープンデータで地図アプリ作成ハンズオン - connpass

links
- PM2.5時計(鯖江編)
- 玄関先でPM2.5の値を教えてくれる音声合成を使ったIoTデモ

人気のプログラミング言語、Pythonを使ったリアルタイム画像処理と思って、Macのカメラを読み込み、とりあえず画面に表示するだけプログラムをつくるも、フレームレートが著しく悪い。カクカクして、これでは興ざめ。

import cv2 cap = cv2.VideoCapture(0) print("fps: " + str(cap.get(cv2.CAP_PROP_FPS))) while True: ret, frame = cap.read() frame = cv2.flip(frame, 1) # horizontal flip cv2.imshow("esc key to close", frame) k = cv2.waitKey(1) if k == 27: break cap.release() cv2.destroyAllWindows()

Djangoより、シンプルなwebアプリフレームワーク Flask を使って、ブラウザで表示するととっても滑らかになりました!

左右反転させるだけのただの鏡アプリです。
画像認識してネコ耳を上書きしたり、背景を消したり、いろいろ遊ぶテンプレートとして活用ください。

import cv2 from flask import Flask, Response app = Flask(__name__) webcamid = 0 cap = cv2.VideoCapture(webcamid) print("fps: " + str(cap.get(cv2.CAP_PROP_FPS))) def getFrames(): while True: ret, frame = cap.read() frame = cv2.flip(frame, 1) # horizontal flip ret, jpg = cv2.imencode("test.jpg", frame) yield b'--boundary\r\nContent-Type: image/jpeg\r\n\r\n' + jpg.tostring() + b'\r\n\r\n' @app.route('/') def video_feed(): return Response(getFrames(), mimetype='multipart/x-mixed-replace; boundary=boundary') import webbrowser webbrowser.get().open("http://localhost:5001/") app.run(host = '0.0.0.0', port = 5001, threaded = False) # only 1 client

ブラウザを開くコードもついているので、Python3で動かすと、ブラウザが開いてすぐに表示が始まります。
Content-Type: multipart/x-mixed-replace は、初めて使いましたが、なかなか豪快なプロトコルでおもしろい!
複数開いて問題が置きないように、Flashの設定で threaded = False として、シングルスレッド処理としています。

スレッドモデルなプログラミング言語 Python の yield がポイントです。

目指せ世界最先端IT国家、日本の危機脱出にIT活用は必須!
プログラミングもIoTも、ちょっと試せばぐっと楽しい!大人も始めよう、国民総エンジニア&国民総データサイエンティスト!(昨日は徳島県、大塚グループさんにてIoTプログラミング研修

予想外に湧いた、DJIの教育用ドローン「TELLO EDU」をプログラミングによる自動運転飛行!プログラミングがちょっとできると、結構いいことありますよ!


スライド「1行で簡単実現「IoT」プログラミング×オープンデータ利活用! (PDF)
こどもたちに未来を切り開く、エンジニア&データサイエンティストスキル獲得のきっかけを!


360度カメラ、THETAで撮った舞台、ここでドローンの自動飛行!


Intelさんの機械学習に寄る画像識別のデモ展示、OpenVINOは無料お試し中のこと!
プログラミングができると遊べる最先端のおもちゃが、世界中から日々登場するエキサイティングな時代!
何年やっても飽きないどころか、いつか使ってみたい積みテクノロジーが増える一方。
みんなでシェアしましょう。


徳島県立 徳島科学技術高等学校の展示、鏡型情報端末。
身の回りのデバイス、IoTでみんな自分のコントロール下に置いちゃいましょう!


穴吹情報公務員カレッジの展示、どこでもリモコン。
レゴを使って、リモコンを物理で押す、潔さ!(IchigoJam学習リモコンもどうぞ)


教えないのが逆にいいCodeDojo tokushima 代表、谷岡さんと!
小中学生のものづくりを表彰する、PCNこどもプロコン、ぜひご活用ください!


京都で実験中、スマート観光の取り組み by シスコさん!


デジタルサイネージを通じて、遠隔の観光地のおじさんから声がかかるのおもしろい!


なんと徳島で、鯖江のおとな版地域活性化プランコンテストで一緒に戦った、京都のADDD Link 上治さんに再会!


会場は、昨年の高専プロコン以来のアスティとくしま!
明日は、いよいよこどもプログラミングワークショップ! IoT もちょっと実演するので、大人の見学も大歓迎!
親子で挑戦!こどもパソコン「IchigoJam」でプログラミング!|徳島県ホームページ


プログラミングで飛ばすドローンのデモも、やりましょう!
壇上から飛んだ TELLO EDU、Python3による制御プログラムはこんな感じでした。
(TELLO SDK: dji-sdk/Tello-Python: This is a collection of python modules that interact with the Ryze Tello drone.)

import threading import socket import sys import time locaddr = ('',9000) event = threading.Event() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) tello_address = ('192.168.10.1', 8889) sock.bind(locaddr) def recv(): while True: try: data, server = sock.recvfrom(1518) print(data.decode(encoding="utf-8")) event.set() except Exception: print('\nExit . . .\n') break recvThread = threading.Thread(target=recv) recvThread.start() def send(command): msg = command.encode(encoding="utf-8") sent = sock.sendto(msg, tello_address) event.wait() print("next!") event.clear() send("command") send("takeoff") send("up 500") send("flip l") send("up 200") send("left 250") send("forward 250") send("right 250") send("flip f") send("right 250") send("back 250") send("left 250") send("flip r") send("land") sock.close()

links
- とくしまICTバザール - とくしまICTバザール

I want to make web apps in Python3.
Python3でwebアプリを創りたい!
Django!


I made the simplest sample web app. (only 27 lines)
超シンプルなサンプルwebアプリを作りました。(たった27行)

import os webappname = os.path.basename(__file__)[0:-3] if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', webappname) import django.core.management django.core.management.execute_from_command_line([ '', 'runserver' ]) SECRET_KEY = 'secret' ROOT_URLCONF = webappname WSGI_APPLICATION = webappname + '.application' import django.core.wsgi application = django.core.wsgi.get_wsgi_application() DEBUG = True #ALLOWED_HOSTS = [ "localhost" ] # webapp main from django.http import HttpResponse from django.shortcuts import redirect, render def root(req): return HttpResponse("<h1>simple django</h1>") from django.contrib import admin from django.urls import path urlpatterns = [ path('', root), ]

At the first, install Django.
まずは Django のインストール

pip3 install django

If you want to run after saving that python program as the name 'test.py'
動かすときは、さきほどのPythonプログラムを 'test.py' として保存して

python3 test.py

Try to access 'http://localhost:8000/' on your browesr!
ブラウザで 'http://localhost:8000/' へアクセス!

It's simple isn't it?
シンプルでしょ?

This is a sample program using the parameter and redirecting (see also official document)
パラメータを使ったり、リダイレクトしたりするサンプルはこちら(詳細は公式ドキュメントをどうぞ!)

# webapp main from django.http import HttpResponse from django.shortcuts import redirect, render def root(req): return HttpResponse(""" <h2>hello django</h2> <a href=t1?p=param>param</a><br> <a href=t2>redirect</a><br> """) def test1(req): return HttpResponse(req.get_full_path()) def test2(req): return redirect("http://fukuno.jig.jp/2388") from django.contrib import admin from django.urls import path urlpatterns = [ path('', root), path('t1', test1), path('t2', test2), ]

links
- Django
- Django documentation | Django documentation | Django
- Django ドキュメント | Django documentation | Django
- simpledjango src on GitHub

3社共催、親子プログラミングイベント、楽しんでくれました!

2019-2-3 はじめてのIoTデータ活用 親子プログラミングワークショップ

かんたんデータ管理の kintone(キントーン)の サイボウズ
かんたん格安IoTの sakura.io(サクラアイオー)の さくらインターネット
かんたんプログラミングの IchigoJam(イチゴジャム)の jig.jp

人間業じゃない計算力と記憶力を持ち、世界中とつながるコンピューターくんを味方にしよう!
「データで遊ぶ」をテーマに、その入口を親子で楽しく体験するイベント。

スライドダウンロード
はじめてのIoTデータ活用 親子プログラミングワークショップ kintone x sakura.io x IchigoJam (PDF)


サイボウズ社長室ビジネスプロデューサー 中村龍太さんから、kintoneの魅力をご紹介!
牛乳で身長は伸びる?運動で身長は伸びる?データで検証してみよう!


まずはプログラミングはじめの定番、LEDの制御、エルチカゲーム、エルチカロボット、かわくだりゲーム!
電子工作も、プログラミングも、極力シンプルでインパクトあるものにとチューニングしています。


本題、IoTとは? IoT = Internet of Things、(人じゃなくて)モノのインターネット
いろんなものとネットを通じて話ができたり、モノとモノ同士がお話したりする世の中のスタートです。


インターネットは、世界100億台のコンピューターがつながったもの。
2台のIchigoJamをつないでネットワーク実験!
子供2人、Aさん、Bさんとしてペアになって、順番に操作!


遠隔操作、ブロック、チャット体験、コンピューターはつなぐともっとおもしろい。


今回使ったIchigoSodaは、IoT通信モジュール sakura.io が内蔵されたIchigoJam。

こちらが1行ずつ、楽しくキーボードからタイピングしてできあがった、かわくだりゲーム!

10 CLS:X=15 11 CLT 20 LOCATE X,5:?"O" 30 LOCATE RND(32),23:?"*" 35 WAIT 3 36 X=X-BTN(LEFT)+BTN(RIGHT) 39 IF SCR(X,5) GOTO 50 40 GOTO 20 50 ?"GAME OVER!" 60 S=TICK():?S

1行足すだけで、IoTエディションのできあがり!

70 IOT.OUT S

かわくだりゲームが、みんなの反射神経を計測するIoTデバイスに早変わり!


kintoneでみんなから送られたデータをみよう!


かわくだりゲーム、スコアランキング!
しばらく放っておいたらチートされてすごいスコアにw


大人の問題、子供がチャレンジ!
お父さん、お母さんに課題を聞いて、IoTでどう解決するか考えてみよう!
「大人の課題」とかけて「子供の好きなもの」と解く、その心は?
と、なぞかけ形式にして、即興で答えを出してもらうのもいいかも。
時間があれば、じっくり時間をかけて「こどもIoTハッカソン」が楽しい!
(課題例:留守中の火災が怖い → 創電さん、IchigoSodaで、IoT火災報知器「火守くん」を開発、販売!)


自由時間、果敢にサーボや光センサーに挑戦する子供たち!


kintone の今回のイベントページ。質問や、感想などもこちらに描いていただきました。
右側にあるアプリがメイン!


お父さん参加が多かった、今回の親子ワークショップ。親子で楽しくプログラミング、ぜひご家庭でも!


自分でつくれる IcihgoJam、秋葉原にある PCN秋葉原Assemblage ではんだづけできますよ!


楽しい作品、PCNこどもプロコンへぜひどうぞ!
決まった、第9回のノミネート作品はこちら。
PCNこどもプロコン2018 一次審査結果発表 | PCN プログラミング クラブ ネットワーク


ちょうど節分!


kintone x sakura.io x IchigoJam IoT.OUT
大人も楽しいかんたん、IoTプログラミング!

IoTでデータを気軽に集めて、kintone のグラフでいろいろデータで遊んでみると、また新たなデータが欲しくなる。
オープンデータを含めて、たくさんデータを集めてできたビッグデータ、かんたんAIを使ったアドバンストコースも楽しそう!
さくらインターネットさん中心で進む、宇宙オープンデータプラットフォーム「Tellus」β公開しています!

Tellus


本日の機材、準備らくらく IchigoJamスピードパックのIchigoSoda&わくわく電子工作キットバージョン
こんの研修してみたい!機材提供など、ご相談ください!

技術的なお話

IchigoJam ver 1.3 で正式対応した、IoT.OUT を使って、64円/月/1万回通信の格安IoT sakura.ioを通じて、1コマンドでネットへ送信。 Python3 で sakura.io から WebSocket で受け取ったデータ kintone REST API で、kintone アプリに送信、グラフ化などが簡単!というシカケ。


通信モジュールを sakura.io の管理画面で登録、サービス連携として、WebSocketを設定。
ここで表示されるトークンを使います。


ドラッグ&ドロップでできちゃう、kintone上でのアプリづくり。
かわくだりゲームのスコアランキングアプリは、「文字列(1行)」でモジュール番号、「数値」でスコアを入れることにします。
設定、APIトーク、生成する、アクセス権、レコード追加にチェックをいれて、こちらのAPIトークンと、例として URL app=?? と書かれている ID を使います。

こちらPython3のプログラム、WebSocketで受け取ったデータを、kintone に送る

import http.client import websocket import json import ssl SAKURA_TOKEN = *sakura.ioのトークンを設定* KINTONE_DOMAIN = "*kintoneのドメインを設定*.cybozu.com" KINTONE_TOKEN = "*kintoneのAPIトークン" KINTONE_APPID = *kintoneのAPP ID* SAKURA_MODULE = [ { "id":"m01", "module":"*モジュールID1*" }, { "id":"m02", "module":"*モジュールID2*" }, ] def getModule(moduleid): for item in SAKURA_MODULE: if item['module'] == moduleid: return item['id'] return None def sendData(module, val): record = { "app": KINTONE_APPID, "record": { "文字列__1行_": { "value": module }, "数値": { "value": val } } } requestJson = json.dumps(record) headers = { "Content-Type": "application/json", 'X-Requested-With': 'XMLHttpRequest', 'X-Cybozu-API-Token': KINTONE_TOKEN } connect = http.client.HTTPSConnection(KINTONE_DOMAIN) connect.request("POST", "/k/v1/record.json", requestJson, headers) response = connect.getresponse() print(response.status) data = response.read() print(data.decode("utf-8")) def on_message(ws, message): data = json.JSONDecoder().decode(message) mestype = data['type'] if mestype == 'channels': module = getModule(data['module']) val = data['payload']['channels'][0]['value'] print('on_message: ' + module + " -> " + str(val)) sendData(module, val) if __name__ == "__main__": websocket.enableTrace(True) path = "wss://api.sakura.io/ws/v1/" + SAKURA_TOKEN ws = websocket.WebSocketApp(path) ws.on_message = on_message ws.run_forever(sslopt = { "cert_reqs": ssl.CERT_NONE })

*参考
レコードの登録(POST) – cybozu developer network
IchigoSoda スタートガイド — sakura.io ドキュメント
WebSocketでの通信内容の確認 — sakura.io ドキュメント


あとは受け取ったデータでグラフをつくるだけ。こちらも選択ボックスから順番に選ぶだけ、右側にプレビューがあるのでわかりやすい!


かわくだりゲーム、一番たくさんやったのはだれかなランキング!
いろんな切り口のグラフが、簡単に作って、すぐにグループ内で共有できます。


sakura.io、イベントアラートを設定しておけば、いつのまにかすごい数が通信されてしまう心配も無用。
切断アラートを使えば、電池切れや意図しないトラブルの検出もできます!

* 撮影協力、チアプログラミング 浅井さん

links
- 小学生がつくるIoTプログラム教室、サイボウズ、jig.jp、さくらインターネットが共催 - BCN+R
- はじめてのIoTデータ活用 親子プログラミングワークショップ レポート | CSAJ 一般社団法人コンピュータソフトウェア協会

JavaとJavaScriptは、メロンとメロンパンほどは違いません。
どちらもプログラミング言語、名前が似ているだけあって、使い方も似ているところも多いです。

何か得意な言語をもつと、違う言語の習得も楽々。私の場合、Javaが長いので、あまり変わりないJavaScriptは覚えやすく、ちょっと違うPython3はその違いを覚えるまでに一手間必要です。

こちら忘れがちな、Python3の文字列操作をJavaとJavaScriptとの比較と合わせて記載したものです。
結構似てます。単語単位では、英語とフランス語ほど違いがあるわけではありません。言うなれば方言程度?


Python3の短さがよくわかりますね。慣れるとJavaやJavaScriptでの文字列操作が億劫になってしまうほど!


strfuncs」 - シンプルな JavaScript 文字列操作チェックプログラム

PCNこどもプロコンの一次審査では、JavaScript, Python, Swift を使いこなしている小学生もちらほら!
ありがとう、329作品! 小中学生PCNこどもプロコン一次審査とJavaScriptで触るScratch - lib4scratch.js

links
- IchigoJamからのステップアップ - IchigoJam BASIC / Python3 / JavaScript / Java / C言語 対照表

オープンデータ伝道師への出動要請あって、新潟県妙高市へ。

鯖江市などでのオープンデータの活用を事例を交えて紹介、IoTプログラミング体験、地理院マップアプリをベースに避難所一覧2つ星オープンデータのアプリ化、SPARQL!

妙高市役所、上越市役所の皆さんと!5つ星オープンデータで、つなげましょう、上越と鯖江!


妙高市避難所一覧(サンプル)
こちら、研修内にて使った、妙高市オープンデータの避難所一覧を表示するものに、更に、今回の旅写真を加えてみました。避難所データはWordファイルで、緯度経度未記載。緯度経度地図を使って、3点ほど追加してみました。 マップアプリづくりも、IchigoJamのプログラミングを一歩先。(src on GitHub

5つ星オープンデータを手軽に実現する odp で、アプリ作成もとっても簡単に!
災害別避難所案内「ヒナンパス」は、データをいれると、即使えます。


縮小すると、上越妙高駅付近や、名物とん汁ラーメンなどの写真も置いてみました。(addIcon)


妙高市議の村越さんと!(アップいただいた、IoT研修中の動画


月額64円で実現、IchigoSoda(sakura.io x IchigoJam)でかんたんIoTプログラミング!
妙高市役所、オープンデータ担当の池田さん、とても楽しそう!


雪の上越妙高駅!雪は少ないそう。


会場は、妙高市役所。エレベーターで見かけたゆるキャラ「ミョーコーさん
胸元の馬は、雪解けとともに山に現れる、跳ね馬!
跳ね馬(はねうま)・牛形 - haneumas jimdo page!
妙高市役所最寄りの新井駅から上越妙高駅をつなぐ、妙高はねうまラインの名前の由来。


災害相互応援協定を結ぶまち、姉妹都市など、関係ある都市同士を結ぶオープンデータもおもしろそう。


松茶屋のとん汁ラーメン、一見大きなとん汁


でも、らーめんが入ってる!


唐辛子を雪にさらして、3年寝かす、薬味、かんずり!いろいろ付けておいしい!


上越妙高駅近くにあるコンテナを並べた飲食店、FURUSATTO(フルサット)


こちらにも、かんずり!特性中華ソースで食べる、地元の鳥料理が美味!(食堂酒場 酉かつ

その土地ならではの特産物、ローカルチェーンなど、グルメオープンデータ、あるといいですね!

EXIFのGPS、位置情報付き写真から、JSONデータをつくるPython3のプログラムつくりました。お手軽マップづくりがはかどります。

from PIL import Image def toDegree(v): d = float(v[0][0]) / float(v[0][1]) m = float(v[1][0]) / float(v[1][1]) s = float(v[2][0]) / float(v[2][1]) return d + (m / 60.0) + (s / 3600.0) def fixfloat(d, beem): s = str(d) n = s.find('.') if n < 0: return s s += "0000000000" return s[0:n + beem + 1] def fixnum(n, beem): s = "0000000000000" + str(n) return s[-beem:] def getExifGPS(fn): im = Image.open(fn) exif = im._getexif() for id, value in exif.items(): if id == 0x8825: # GPS gps = value lat = toDegree(gps[2]) if gps[1] == 'S': lat = -lat lng = toDegree(gps[4]) if gps[3] == 'W': lng = -lng return fixfloat(lat, 7) + "," + fixfloat(lng, 7) return '' def getExifDate(fn): im = Image.open(fn) exif = im._getexif() for id, value in exif.items(): if id == 0x9003: # DateTimeOriginal s = ''.join(value.split(':')) return ''.join(s.split(' ')) return '' def getImageSize(fn): im = Image.open(fn) h, w, c = im.shape return str(w) + '.' + str(h) import os import sys files = os.listdir('./') list = [] for f in files: if f.endswith('.jpg') or f.endswith('.JPG'): list.append([ f, getExifDate(f) ]) list.sort(key = lambda x: x[1]) if len(sys.argv) > 1: nameprefix = sys.argv[1] n = 0 for i in range(len(list)): f = list[i][0] f2 = nameprefix + '-' + fixnum(n, 2) + ".jpg" os.rename(f, f2) list[i][0] = f2 n += 1 print('[') for item in list: f = item[0] print('{ name: "' + f + '", size: [ ' + getImageSize(f) + ' ], latlng: [ ' + getExifGPS(f) + ' ] },') print(']')

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像