福野泰介の一日一創

めがね産業高度化に向けた4者提携、前夜の作戦会議時の3D写真!

平行法で立体に見えます。VR用の3Dテクスチャーとしても使えます。
(参考、福井高専、KDDI、jig.jp、エル・コミュニティ、地域産業高度化に向け提携 | 2019年 | KDDI株式会社


撮影機材、Insta360 EVO、レンズ2つでステレオ撮影!(折り曲げて360度カメラにもなる)


裏面は何もなし!撮影時の気分は、昔なつかし写ルンです!


スマホのアルバムへエクスポートしたままの写真はこちら。


中心部をクロップ(切り出し)するといい感じの3D写真になるので、Pythonで切り出しプログラム「crop3d.py」づくり。

import os import sys import PIL.Image if len(sys.argv) < 2: print("crop3d [input jpg file] [output jpg file] (ratiow) (ratioh) (offx) (offy)") sys.exit() f = sys.argv[1] fo = sys.argv[2] if len(sys.argv) > 2 else f ratiow = float(sys.argv[3]) if len(sys.argv) > 3 else .6 ratioh = float(sys.argv[4]) if len(sys.argv) > 4 else ratiow offx = float(sys.argv[5]) if len(sys.argv) > 5 else 0 offy = float(sys.argv[6]) if len(sys.argv) > 6 else 0 src = PIL.Image.open(f) iw, ih = src.size iw2 = int(iw / 2 * ratiow) ih2 = int(ih * ratioh) dst = PIL.Image.new(src.mode, (iw2 * 2, ih2)) x = iw // 4 + int(iw2 * offx) y = ih // 2 + int(ih2 * offy) iml = src.crop((x - iw2 // 2 , y - ih2 // 2, x + iw2 // 2 + 1, y + ih2 // 2)) imr = src.crop((x - iw2 // 2 + iw // 2, y - ih2 // 2, x + iw2 // 2 + iw // 2 + 1, y + ih2 // 2)) dst.paste(iml, (0, 0)) dst.paste(imr, (iw2, 0)) dst.save(fo, 'JPEG', quality=95, optimize=True)

画像加工はPillowを使用(参考、Pillowに関する情報 | note.nkmk.me


パラメータで切り出す大きさ、縦横のオフセットを元画像サイズ比で指定。
レンズ間がそんなに広くないので、遠景のステレオ感は薄め。


月イチ開催、会社のランチ会のデザート付属のドライアイス。この距離感、いい感じ!

広角化、多眼化するスマホのカメラ、ぜひVR180対応、できればインカメラも180度広角化して、360度対応してほしい。

パソコンとスマホ、どちらが入力速いですか?

日本人、実はスマホ派の方が多いのかもしれません。 実際、日本語入力であれば、フリック入力方式と変換予測と慣れによって、あまりストレスなく使えています。(編集機能が貧弱なので、長文はまだ面倒)

パソコンとスマホのいいとこ取りをすべく、スマホでコントロールするパソコン第一弾、シンプルなプレゼンクリッカーを作成。

キー操作や、マウス操作をプログラミングするAPIをネット越しに呼び出せばOKです。今回はサーバー側は Python3 + Flask で作りました。 pyautogui を使うと、Javaで言う java.awt.Robot と同様、キー操作、マウス操作をエミュレートできます。

from flask import Flask, render_template app = Flask(__name__) @app.route('/') def home(): return render_template("index.html") import pyautogui @app.route('/api/left') def left(): #pyautogui.click() pyautogui.keyDown('left') return "" @app.route('/api/right') def right(): #pyautogui.rightClick() pyautogui.keyDown('right') return "" app.run(host = '0.0.0.0', port = 8001)

templatesフォルダに、操作するクライアント側プログラムを HTML+CSS+JavaScriptで以下のように記述。

<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width"/> <title>clicker</title> </head><body> <div class=btn id=left>←</div> <div class=btn id=right>→</div> <style> body { text-align: center; font-family: sans-serif; } .btn { display: inline-block; margin: 5vh 1vw; width: 40vw; height: 50vh; line-height: 50vh; background-color: gray; color: white; font-size: 30vw; } </style> <script> left.ontouchstart = function(e) { fetch('api/left') e.preventDefault() } right.ontouchstart = function(e) { fetch('api/right') e.preventDefault() } </script> </body> </html>

パソコンとスマホを同一ネットワーク内で起動して、IPアドレスを ifconfig (Mac) か ipconfig (Windows) で調べて、スマホで表示してみましょう(QRコード連携が便利です)

スライド表示して、スマホから左右ボタンを遠隔操作できました。
機能を増やしたり、マウス替わりにしてみたり、WebSocket化して高速化したり、いろいろ試すベースができあがり!

最強の学習ツール、ネットにつながったパソコン。

IchigoJam BASICで学び、ノートパソコンにステップアップする一歩手前、無線LAN接続ボード「MixJuice」を使って IchigoJam をブラウザ化する「Ichigobrowser」を作ってみました。webサイトへアクセスして日本語が読めます!

単にパソコンを手にしたこどもは、ゲームで遊んだりYouTubeにハマってしまうだけかもしれません。 プログラミングから触れてもらうことで、こどもたちは自分で創る楽しさ、自分で学ぶ楽しさ、コンピュターとネットの本当の力に気がついてくれます。

10/1から募集開始になった「第10回PCNこどもプロコン2019-2020」でノートPCをゲットできるよと話すと、鯖江の小学生の子たちみんな目をキラキラさせてチャレンジしたいという頼もしい声!(鯖江市全4年生総合2コマプログラミング教育授業動画公開


Ichigobrowser の仕組み:サーバーで中継プログラムを動かして、URLをMixJuice経由でおくると、IchigoJamで読めるようにカタカナ化されて、リンクと共に文章が送られてきます

11111 @A:?"MJ GET sabae.cc:5001/?u=";STR$(S):END OK2 S="https://ichigojam.net/":GSB@A

Ichigobrowserの使い方:コマンド「OK2」でエラー表示を止めて、変数SにURLをいれて、中継サーバー(仮に動作させている sabae.cc:5001)に渡すと、そのページが返ってきます。意外と読めるカタカナページ!


目指すはMSX! Raspberry Pi より安価な IchigoJam 発表!」をIchigobrowesrで表示!

Ichigobrowser」は、サーバーで動くPythonの中継プログラムで実現しています。
プログラムはオープンソース、こどもたちのために活用ください(src on GitHub)


ロゴデザインはドット絵ツール「dote


参考になった、PCN大阪、森さん著の「Python 2年生 スクレイピング入門
requetsを使って、BeautifulSoup4でタグ解析、Aタグのリンクを抽出して、カタカナ化して、返却!


こちらの本、jigブラウザがきっかけで取り組みを始めた鯖江市のオープンデータも掲載!
データをプログラムで使う楽しさ、広まりそうです。


2004.10.1の jigブラウザ 誕生からちょうど15年!
人類最強のコミュニケーションツール、web上の革命はまだまだ始まったばかり。

2019年度の人気プログラミング言語ナンバーワンのPythonGitHubのアクティブでも不動の1位、PC上のPythonを使ってIchigoJamをコントロールして、かんたんIoTを実現してみましょう!

ネットにつながっているPC、Pythonを使えば世界中のさまざまなデータをAPI経由、スクライピングなどで、取得し放題。
Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる! | 森 巧尚 | コンピュータ・IT | Kindleストア | Amazon」(まもなく登場!1年生はこちら

でも、PCではデバイスやセンサーなどを直接制御はできません。
そこで、それら電子部品の制御が得意なIchigoJamとUSBシリアルでつないでいいとこどり。

IchigoJamにUSBシリアルをつなぐか、IchigoKamuyを使って、PCに接続したら、Python用シリアル通信ライブラリ「pySerial」をセットアップ

pip3 install pyserial

USBシリアルのポート(port)を /dev/tty.〜 または COM3 などで指定し、LEDをつけるプログラムはこちら(シリアルを閉じる前に0.1秒待ちをいれてます)

import serial import time port = '/dev/tty.SLAB_USBtoUART' ser = serial.Serial(port, 115200) ser.write(b'LED1\n') time.sleep(0.1) ser.close()

好きなコマンドをIchigoJamへ送って、結果を1行表示するPythonプログラムをつくって

import serial import time import sys port = '/dev/tty.SLAB_USBtoUART' ser = serial.Serial(port, 115200) ser.write(sys.argv[1].encode('utf-8')) ser.write(b'\x0a') print(ser.readline().decode('utf-8')) time.sleep(0.1) ser.close()

IchigoJamコマンドをPCのコンソールから自由自在に送信可能!(例、LEDオフ、出力ポート制御、アナログ入力、サーボ制御)

python3 command.py 'LED0' python3 command.py 'OUT1,1:WAIT60:OUT1,0' python3 command.py '?ANA(2)' python3 command.py 'PWM2,100'

IchigoJam 1.4βファームウェアを使えば、マイコン内蔵フルカラーLEDのまとめて制御もこのように簡単!(リファレンス

python3 command.py 'LET[0],10,0,0:WS.LED1,50'


ネットで取得したデータに合わせて派手にお知らせできますね!
その他、いろいろサンプルプログラム in Python はこちら
IchigoJam/IchigoJam-control-by-python: IchigoJam control by Python

links
- Rubyで操るフルカラーLED50コ、USBシリアル x IchigoJam x Ruby編!
- IchigoJamでパソコンとUSBシリアル通信。Node.jsを使うとキーボードとモニタいらず – しずかなかずし

データで遊ぼう!

山口県工業技術センターにて開催「衛星データ解析技術研究会」にてオープンデータ特集。
オープンデータと宇宙データを組み合わせると、ますます楽しく遊べます。

自治体5つ星オープンデータ化を支援するodpなど、5つ星オープンデータの広まりを心待ちにしつつも、いますぐプログラミングして遊べる楽しいこと、はじめましょう!


Tellusで使える2010年3月〜2018年7月末までの降雨量データ、緯度経度共に0.1度の精度で降雨量が分かります。これを使って宇部市、常磐公園や宇部高専あたりの晴天率を調べてみました。

2018年6月の晴天率は、60%とでました。
Tellus OSでもチェックできますが、プログラムにするといろんな場所を自動的にチェックできて便利です。

こちらが計算するのに使った、Jupyter Notebookで動かすPythonプログラム。

TOKEN = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" import os, json, requests, math from skimage import io from io import BytesIO import calendar import matplotlib.pyplot as plt %matplotlib inline def get_image_GSMaP(date, xtile, ytile): sname = "GSMaP" zoom = 5 url = "https://gisapi.tellusxdp.com/{}/{}/{}/{}/{}.png".format(sname, date, zoom, xtile, ytile) print(url) headers = { "content-type": "application/json", "Authorization": "Bearer " + TOKEN } r = requests.get(url, headers=headers) return io.imread(BytesIO(r.content)) def ll2tile(lat, lng, z): w = math.pow(2, z) / 2 yrad = math.log(math.tan(math.pi * (90 + lat) / 360)) return [ (lng / 180 + 1) * w, (1 - yrad / math.pi) * w ] def get_pixel_GSMaP(date, lat, lng): tile = ll2tile(lat, lng, 5) img = get_image_GSMaP(date, math.floor(tile[0]), math.floor(tile[1])) return img[math.floor(tile[0] * 256 % 256)][math.floor(tile[1] * 256 % 256)] def calc_fine_ratio(y, m, lat, lng): cnt = 0 _, ndays = calendar.monthrange(y, m) for d in range(1, ndays + 1): date = "{:0=4}-{:0=2}-{:0=2}".format(y, m, d) rgba = get_pixel_GSMaP(date, lat, lng) #n = (rgba[0] << 24) | (rgba[1] << 16) | (rgba[2] << 8) | rgba[3] n = rgba[3] print(date, n) if n < 255: cnt = cnt + 1 return cnt / ndays calc_fine_ratio(2018, 6, 33.931245,131.277600)

緯度経度からタイル座標への返還は、こちらJavaScriptのプログラムを参考にしています。


PCN山口代表のコヤマさんにも会えました!宇部高専生によるPCN宇部との連携、はじまります!


さくらインターネット、小笠原さん、牟田さんとも楽しいパネルディスカッション。


講演資料オープンデータ「オープンデータと宇宙データで地域活性化(PDF)


日本の衛星、だいち2号(ALOS-2)の1/3スケール模型。この子が宇宙からデータを届けてくれているんですね!
1/1スケール模型、Oculus QuestでぜひVR表示させたいところ!3Dオープンデータ探します。


山口名物、瓦そば!
瓦そばオープンデータがあったら、衛星データと組み合わせて、どんなアプリを作りますか?
こどももおとなも、レッツ、プログラミング!

宇宙データプラットフォームを使った分析はじめ、続いては、お気に入りデバイス Oculus Questと組み合わせます。
2.5mの分解能で宇宙から標高を計測する、ALOS-PRISM。Tellusの開発環境、Jupyther Notebookを使って富士山付近のデータをエクスポートして、VR表示しました。


VR fujisan
マイクラでリアルなマップを再現したい夢、データとプログラミングを使えば簡単に叶います!

作り方
1. Tellusに、Jupyther Notebook か Jupyter Lab を利用申請。
2. 富士山の位置のメッシュを調べる。(タイル座標確認ツール
3. Jupyter Notebook上、Pythonでプログラムをかく

TOKEN = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" import os, json, requests, math from skimage import io from io import BytesIO import matplotlib.pyplot as plt %matplotlib inline def get_image(zoom, xtile, ytile, opacity=1, r=3, g=2, b=1, rdepth=1, gdepth=1, bdepth=1, preset=None): sname = "aw3d30" url = "https://gisapi.tellusxdp.com/{}/{}/{}/{}.png?opacity={}&r={}&g={}&b={}&rdepth={}&gdepth={}&bdepth={}".format(sname, zoom, xtile, ytile, opacity, r, g, b, rdepth, gdepth, bdepth) if preset is not None: url += '&preset='+preset headers = { "content-type": "application/json", "Authorization": "Bearer " + TOKEN } r = requests.get(url, headers=headers) return io.imread(BytesIO(r.content)) img = get_image(10,906,404) io.imshow(img)

富士山の標高データが画像で表示されます。
4. RGB値が最高になっているようなので、最大値を求めてみる(きっともっとシンプルに書けます)

max = 0 for d in img: n = (d[0] << 16) | (d[1] << 8) | d[2] if n > max: max = n print(max)

結果

12766

富士山の高さは3766mなので、9000ずれた1m単位だと推定。 5. 試しにテキストで表示してみる

for y in range(256): for x in range(256): d = img[x,y] n = (d[0] << 16) | (d[1] << 8) | d[2] n -= 9000 n /= 4000 n = math.floor(n) print(n,end='') print()


それっぽい。
6. JavaScript用に配列データとして出力

h = [] for y in range(256): for x in range(256): d = img[x,y] n = (d[0] << 16) | (d[1] << 8) | d[2] n -= 9000 h.append(n) print(h)

このデータを、fujisan-data.js として保存して、JavaScriptでWebVRを使ったVRアプリをつくって、できあがり!

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>VR fujisan - data by Tellus</title> <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script> <script src="https://fukuno.jig.jp/app/webvr/fujisan-data.js"></script> </head> <body> <script>"use strict" window.onload = function() { var scene = document.querySelector('a-scene') const r = 1 const rw = 4 // sampling rw * rw const bw = 256 // org data sampling w and h const w = bw / rw let map = [] for (let i = 0; i < w * w; i++) { const x = i % w const y = (i / w) >> 0 const p = x * rw + y * rw * bw const n = HEIGHT[p] map[i] = n } for (let i = 0; i < map.length; i++) { const x = i % w const y = (i / w) >> 0 const h = map[i] * 0.0005 let box = document.createElement('a-box') box.setAttribute('position', { x: (x - w / 2) * r, y: h / 2 * r - 7, z: (y - w / 2) * r }) box.setAttribute('depth', r) box.setAttribute('width', r) box.setAttribute('height', r * h) scene.appendChild(box) } } </script> <a-scene id="scene"> <a-sky color="#000000"></a-sky> <a-light color="blue" position="1 0.1 0.5"></a-light> <a-light color="cyan" position="0.1 4 2"></a-light> </a-scene> </body> </html>

縮尺は適当なのでリアルな富士山ではないですが、これで怪獣や巨人になった気分で富士山付近を歩けます。
VR x Tellus、楽しいですよ!

links
- VRではじめる現代HTML入門 - Oculus Quest x 福井高専生
- 50行で作るVRマイクラ風 / boxcraft for Oculus Quest with A-Frame
- モバイル時代こそバス! つつじバスロケVRビジュアライズ - リアルタイムオープンデータ x Oculus Quest
- 異次元の分かりやすさ、触って学ぶVR数学、ベジェ曲線編 on Oculus Quest

600万円、これは世界一高い参議院選挙立候補に必要な供託金(市議選は30万円)。
第25回参議院選挙の投票日は7/21。 前回投票日の2016年7月10日の投票所と人の流れをTellusで見てみました。


Tellus ver 1.1 によって追加された、位置情報データ「Profile Passport」を使って、投票日7/10の10時時点(日本時間はUTC+9時間)を品川区の5つ星オープンデータ、投票所と組み合わせて表示した図。 もう一歩分解能がほしいところですが、投票所への人の流れがわかるかも?通常の日曜日との比較なども可能です。


鯖江市の選挙ポスター掲示場、オープンデータと宇宙データ、だいち(ALOS)のセンサーAVRIR-2による植物活性度を重ねたもの。鯖江市の東側、自然豊かな場所にあることが一目瞭然。


Tellusを使った分析は、Jupyter Notebookや、後継サービスJupyter Lab上のPythonで行います。
5つ星オープンデータを集約する opendata.cc のAPI、SPARQLを呼び出し、GeoJSONにしてpostするとTellus上の「取り込みマップ」として表示できます。

API_TOKEN = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Tellus マイページ、APIアクセス設定で生成したトークン import json, requests, urllib.parse URL = "https://api.tellusxdp.com/v1/geojson-files" def get(id = ""): return requests.get(URL + "/" + id , headers = { "Authorization": "Bearer " + API_TOKEN }).json() def post(data): headers = { "Authorization": "Bearer " + API_TOKEN, "Content-Type": "application/json" } return requests.post(URL, headers = headers, json = data).json() def delete(id): return requests.delete(URL + "/" + id, headers = { "Authorization": "Bearer " + API_TOKEN }).json() SPARQL_ENDPOINT = "https://sparql.opendata.cc/data/sparql?output=json&query=" def sparql(query): url = SPARQL_ENDPOINT + urllib.parse.quote(query) return requests.get(url).json() def toGeoJSON(res): fs = [] for d in res["results"]["bindings"]: f = { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ d["lng"]["value"], d["lat"]["value"] ] } } if "name" in d: f["properties"] = { "name": d["name"]["value"] } fs.append(f) return { "type": "FeatureCollection", "features": fs } def addLayer(rdftype, layername): gj = toGeoJSON(sparql(""" select ?uri ?name ?lat ?lng { ?uri <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <""" + rdftype + """>. optional { ?uri <http://www.w3.org/2000/01/rdf-schema#label> ?name. } ?uri <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?lat. ?uri <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?lng. } """)) #print(gj) post({ "originalName": layername, "transparency": 1, "windowNumber": 1, "data": gj }) addLayer("http://odp.jig.jp/odp/1.0#Polls", "odp 投票所") addLayer("http://odp.jig.jp/odp/1.0#PosterPlace", "odp 選挙ポスター掲示場") print("ok")

rdftypeに設定するデータ種別と対応地区は「5つ星オープンデータ対応一覧表」をご参照ください。


Tellus x オープンデータ、いろいろ遊んでみましょう!

宇宙と科学のシンポジウム、ISTS福井大会の展示期間が終了。IoT人流カウンターの値を集計してみました。

ほぼ一人ずつ通過する場所に設置し、精度良くデータが取れた、8Fの上りエスカレーター出口のデータを、10分置きにカウントをとって、簡易的にグラフにしたもの。

確かに人が少なかった月曜日の様子や、セッションのはじまり時間に合わせて流量が増えている様子がデータにも現れています。データを蓄積して、イベントデータと共に解析すると、優位な予測や、取り組みの効果測定に十分使えそうです。


こちら5日分のまとめ。


8Fに4箇所設置した、値を半分にして推定のべ人数としています。実際にはその場で立ち続けている人を重複カウントしたり、まとまって通った数を1として数えたりするので、あくまで目安です。

import csv def ana(fn, m, w): with open(fn) as csvfile: reader = csv.reader(csvfile) cnt = 0 bkd = None for row in reader: datetime = row[0] module = row[1] value = row[2] if m == module: #dt = datetime[0:13] # 1時間単位 dt = datetime[0:15] # 10分単位 if bkd is None: bkd = dt elif bkd == dt: cnt += 1 else: #w.write(bkd + "," + str(cnt) + "\n") # csv for 1時間単位 w.write(bkd + "0," + str(cnt) + "\n") # csv for 10分単位 bkd = dt cnt = 0 if not bkd is None: w.write(bkd + "," + str(cnt) + "\n") # csv fn = "ists-fukui2019.csv" modules = { "uZwuY2G0vn7C": "1FJ", # 1FJAXA内", # BSCM-B28 "uAbs00TuPz23": "5FR", # 5F展示 右", # BSCM-B94 "u52oJ7ReEICB": "5FL", # 5F展示 左", # BSCM-A00 "uXaXTQ866fqt": "8FU", # 8F上りエスカレーター", # BSCM-C07 "uKIpvNgHMhMZ": "8FD", # 8F下りエスカレーター", # BSCM-C12 "urBprjzYcYx8": "8FL", # 8Fエレベーター左", # BSCM-B27 "uHJqMGJf3tJ6": "8FR", # 8Fエレベーター右", # BSCM-B90 } for m in modules: print("analyze:", m, modules[m]) w = open("data-" + modules[m] + ".csv", "w") ana(fn, m, w) w.close()

人流センサーのローデータ CSV を解析するPythonプログラム(参考、Python3でCSVほか)


1F JAXAに設置していたカウンター(テレビの下)

IchigoJam x sakura.io を使った、IoT人流カウンターはオープンソース
福井x宇宙! 200円測距センサーとIchigoJamで作って実験、ISTS福井大会用、IoT入場者数カウンターとリアルタイムオープンデータ

観光地、施設出入り口、市役所の窓口など、いろいろ活用ください!
AI、EBPM、RPA、何を使うにしても、改善するなら、まずは計測しましょう!

やわらかセンサー「ショッカクポット」に続き、顔の画像認識を使った顔ポインティングデバイスをつくってみました。 顔を向けた方向にマウスカーソルが上へ動き、ゆっくりウィンクすると、クリック。前回と同様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

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