AVTOKYOの一番長い日
AVTOKYO 2017に参加して半田付けしてきました。
参加者に配られた基板はこうして出来上がったという視点でレポを記します。
2017年11月5日(日) 足立区保塚地域学習センター
AVTOKYOの1週間前であるこの日、足立区の公民館に13時に集まり今回の基板製作者(@nanbuwks)より当日の流れと基板がまた到着していない知り驚く。
上が当初の構想段階であった。
残念だが力及ばずこうならなかった。
プログラムの流れ検討
今回の基板に使用したのはstm32f103c8t6でありAliexpressで非常に安価($2)で手に入る。
環境を構築するとarduinoIDEで使用可能になる。
adafruitのOLEDのライブラリを修正後プログラムを書いていた。
4時過ぎにコーヒー休憩をしてお子さんが散らかした部屋に掃除機を掛けて時間となった。
終了後は@nanbuwksファミリーを車に乗せて秋月電子八潮店に向かった。
初めて入った八潮店は通路が広く快適でここでは基板に付ける電池ボックスが調達された。
下のお子さんがとことこやってきて「う◯こ」と言われたが時すでに遅かった。
@nanbuwksファミリーを送り届けた後帰宅した。
11月9日(木) 秋葉原 ナノラボ
基板が到着し半田付けを手伝うため夜19時、秋葉原ナノラボに6人が集まった。
夜10時まで半田付けがもくもくと行なわれた。
この時点で完成していたのは150枚ほどだったろうか。
ナノラボで紙袋を頂き70枚分の部品を自宅に持って帰った。
11月10日(金) 自宅
朝家を出る前に親父に半田付け依頼を出す。
10時に帰宅するとマイコンの半田付けはほぼ終了していた。グッジョブ親父。
セブンのホットドッグを齧りながら半田付け作業が始まった。
11月12日(土)自宅、CLUB SIX TOKYO - 六本木
AVTOKYO当日である。
親父の活躍により12時過ぎにはマイコンとOLED、赤外線LEDの半田付けが完了していた。残りはスイッチであったが表面実装のため時間がかかり70枚のスイッチが付いたのは朝4時であった。
スイッチをつけた基板にブートローダを焼いた後活動限界を迎え仮眠を取った。
8時半に起床、荷物をまとめ会場の六本木に向かう。
荷物の搬入を手伝い作業スペースで半田付けとプログラム書き込みに分かれて作業が始まった。
この時点で会場オープンまで残り1時間半である。
危機を察知したスタッフ、一般参加者も加わって半田付け作業が進められた。
手伝って頂いた方云く、硫黄島のような絶望的戦いとのことである。
私は戦時中の工場で働く気分を感じることができた。
そうこうするうちに会場オープンまで後15分となったが、この時点で完成品はどれだけ出来たのか、プログラムは動いているのか、あと何枚残っているのかなど状況を把握している者はおらず混乱の坩堝である。
本来であれば入場時に基板が配られる予定だったが主催者判断により後で配布されることとなった。
誠に申し訳ない…
そうこうするうちに12時に会場オープンとなり続々と参加者が入ってきた。
半田付けスペースは会場入り口すぐのところであったためおのずと人目についたがこちらはそんなことは気にしてられない。
早く半田付けをして基板を完成させないと参加者に配布できないのである。
取り憑かれたように半田付けを続行し16時頃には何とか配布できる分を捌いて一息つけただろうか。
ラムコークを一杯飲んで一息付けた後、不良品を修正するため作業スペースに戻った。
半田不良や部品付け忘れに取り組み18時過ぎには主催者から予定数が足りたとのことで組み立て工場は稼働を終えることになった。
この時点で朝から何も食べていなかった。
ぐったりして座っていると19時を回った。
20時で終わるために片付け作業を始めないといけない。
とりあえず持ってきたものを箱に詰めていき工場閉鎖はつつがなく完了した。
クローズを見届けた後、荷物とともに会場を出た。
打ち上げの招待券を頂いたのでありがたく中華をがっついた。
北京ダッーーーーーク!!
23時前に打ち上げは終了、日比谷線への荷物搬入を手伝い帰宅した。
こうして長い一日は終わったのであった。
初めて参加したAVTOKYOであったが六本木のクラブで半田付けを行うという貴重な体験が出来たのでとてもよかったと思う。
参加者がクリックして遊んでくれてるのを見て半田付けした甲斐があったなと実感した。
個人的には表面実装のコツが掴めたので半田付けがちょっと上手くなったかも。
※AVTOKYOは半田付けを行うイベントではありません。
アルコール片手に語り合うセキュリティ・カンファレンスです。
ESP32を始めてみる AWS IoTにデータを飛ばす編
ということをやってので備忘録として思い出して書いておきます。
抜けている個所や説明が間違っていたらすみません。
適時公式ドキュメントとかで保管して頂きたく。
下の写真でスイッチを押したらDHT11センサーから取得した温湿度をESP32でAWS IoTに飛ばしてS3にデータを保存します。
AWSの設定
AWS IoTのコンソールを開きモノを作成します。
次に接続時に使う証明書を作成してダウンロードします。
ポリシーを作成して証明書をひもづけます。
作成したモノと証明書をひもづけます。
今回作成したモノのAPIエンドポイントのURLをコピっておきます。
最後にデータをS3に保存するルールを作成します。
ESP32というルールを作成してS3にメッセージを格納するというアクションを設定します。
ルールクエリの'ESP32/DHT11'がトピックの部分になります。
これでAWS側の準備は完了だったはずです。
Arduinoでスケッチ作成
必要な以下のライブラリをライブラリマネージャから入れます。
・ArduinoJson
・DHT sensor library
・Adafruit Unified Sensor
スケッチ例にあるWiFiClientSecureをもとにスケッチを作成していきます。
スケッチ例の11行目と12行目にWifiのSSIDとパスワードをセットし、14行目にはコピっておいたAPIのエンドポイントを貼り付けます。
20行目のtest_root_caにダウンロードしたルート証明書の内容を貼り付けて置き換えます。
50行目のtest_client_keyにxxxxxxxxxx-certificate.pemの内容を貼り付け、
51行目のtest_client_certにxxxxxxxxxx--private.pem.keyの内容を貼り付けます。
最後に76行目と77行目のコメントアウトを除きます。
スイッチが押されてOFFを検知したらDHT11から読みだした温度と湿度をJSONにセットしてHTTPSに飛ばします。
最後にスケッチを貼り付けておくのでご笑覧ください。
スケッチができたらESP32に書き込んで動作確認を行います。
まずはシャドウステータスの更新を行ってみます。
シャドウステータスの場合はURLが "/thing/作成したモノの名前/shadow"になります。
それではスイッチを押してみると...
更新されました。
シャドウステータスが送信したJSONデータになっています。
次にURLをトピックのものに書き換えてデータがS3に保存されることを確認します。
トピックのURLは "/topics/ESP32/DHT11"になります。"/topics/"の後ろがルールクエリとなる仕組みのようです。
それではスイッチを押すと...
ちゃんとデータが保存されていました。
というわけでこんな感じでAWS IoTとESP32で遊ぶことができました。
今回は簡単にS3にデータ保存するだけでしたが、AWS lambdaでサーバーレス処理とかにもチャレンジしてみたいですね。
あと、HTTPSをMQTTにするとかも。
最後にスケッチを貼り付けておきます。
micropythonをはじめよう(ESP32編)
ESP32が国内発売されるようになり半年以上が立ちにわかにmicropythonが取り上げられるようになってきました。
以下の記事や今月号のトラ技でも記事が書かれています。
ESP32のファームウェアは夏ごろから公式サイトで公開され自分でビルドする必要もなくなり、今では書き込みツールでファームウェアを書くだけで手軽にmicropythonをスタートできるようになりました。
改めてファームウェアの書き込みと公式ドキュメントのチュートリアルをちょこっとやってみたいと思います。
※micropythonのファームウェアをESP32に書き込むことで技適の認証に抵触する可能性があります。あくまで自己責任でお願い致します。
・ファームウェアの書き込み
何はともあれファームウェアを公式から落とします。
MicroPython - Python for microcontrollers
次に書き込みツールをインストールします。
GitHub - espressif/esptool: ESP8266 and ESP32 serial bootloader utility
# pip install esptool
ツールを適時インストールしたら、ファームウェアを書き込みます。
esptoolの場合はこんな感じです。
# esptool.py --port COM4 --baud 460800 write_flash --flash_mode dio --flash_size=detect 0x1000 esp32-20171006-v1.9.2-276-ga9517c04.bin
CLIもGUIも0x1000にファームウェアを書き込みます。
ファームウェアに書き込みが正常に終了したら、teratermやscreenコマンドでシリアルポートにアクセスします。
micropythonのREPLが開きコードを入力→実行ができます。
micropythonには公式ドキュメントがあります。
ESP32のドキュメントはないのですがほぼ同じのESP8266のものに沿ってチュートリアルを進めていきます。
MicroPython tutorial for ESP8266 — MicroPython 1.9.2 documentation
・Lチカ
>>> from machine import Pin
>>> p = Pin(4, Pin.OUT)
・ADC
>>> pin32 = Pin(32, Pin.IN)
>>> adc = machine.ADC(pin32)
>>> adc.read()
・ファイル操作
>>> f = open('data.txt', 'w')
>>> f.write('micropython')
11
>>> f.close()
>>>
>>> import os
>>> os.listdir()
['boot.py', 'data.txt']
>>>
>>> f = open('data.txt', 'r')
>>> f.read()
'micropython'
>>> f.close()
>>>
>>> os.remove('data.txt')
>>> os.listdir()
['boot.py']
>>>
・neopixel
>>> import machine
>>> import neopixel
>>> pin = machine.Pin(4, machine.Pin.OUT)
>>> np = neopixel.NeoPixel(pin, 20)
>>> np[0] = (255, 0, 0)
>>> np[1] = (0, 128, 0)
>>> np[2] = (0, 0, 64)
>>> np.write()
・wifi接続
>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> sta_if.active(True)
>>> sta_if.scan()
>>> sta_if.connect('ssid', 'password')
>>> sta_if.ifconfig()
・ソケット
>>> import socket
>>> addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)
>>> addr = addr_info[0][-1]
>>> s = socket.socket()
>>> s.connect(addr)
>>> while True:
... data = s.recv(500)
... print(str(data, 'utf8'), end='')
※スターウォーズのAAが流れ続けるのでCtl+Cで止めましょう。
さてここまではREPLでコードを実行してきました。
自作したプログラム(pyファイル)を実行する場合はツールでファイルを転送します。
以下のコマンドでツールを入れます。
# pip install adafruit-ampy
adafruitが出しているこのampyツールにはget、ls、put、rmなどのコマンドがありポートを指定してファイルを転送したり削除したりします。
ダウンロードしたファームウェアはboot.pyファイルしかない状態です。
boot.pyファイルは起動時に1回のみ実行されるファイルです。
>>> import os
>>> os.listdir()
['boot.py']
>>>
永続的にプログラムを実行させる場合はmain.pyを作成してampyツールで送り込みます。
boot.pyとmain.pyはArduinoでいうところのsetupとloop関数というわけですね。
# ampy -p COM4 ls
# ampy -p COM4 put main.py
以上、簡単な紹介でした。
ぜひ皆さんもmicropythonで遊んでみましょう!
CentOS7にZabbixを入れる
dockerで触ってましたが、CentOS7の仮想マシンに入れました。
・環境
# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
・rpmを追加
# curl -O http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
# rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
・Zabbixをインストール
# yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent
# yum install -y mariadb-server
・DBの設定
以下を/etc/my.cnf.d/server.cnfに追加
[mysqld]
character-set-server = utf8
collation-server = utf8_bin
skip-character-set-client-handshake
innodb_file_per_table
DBを起動させてDBを作成。パスワードをセット。
# systemctl start mariadb
# mysql -uroot
MariaDB [(none)]> create database zabbix;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'password' ;
MariaDB [(none)]> exit
初期データを作成します。
# zcat /usr/share/doc/zabbix-server-mysql-3.2.7/create.sql.gz | mysql -uroot zabbix
/etc/zabbix/zabbix_server.confにDBのパスワードをセットします。
DBPassword=password
/etc/httpd/conf.d/zabbix.confにタイムゾーンをセットします。
php_value date.timezone Asia/Tokyo
・サービスを起動
# systemctl start zabbix-server
# systemctl start zabbix-agent
# systemctl start httpd
# systemctl enable zabbix-server
# systemctl enable zabbix-agent
# systemctl enable httpd
ところがzabbix-serverが起動せず、selinuxを切ると起動しました。
# setenforce 0
# systemctl status zabbix-server
● zabbix-server.service - Zabbix Server
Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; disabled; vendor preset: disabled)
Active: active (running)
・firewall設定
webにアクセスできず、firewallの設定を忘れていました。。
# firewall-cmd --add-port=10051/tcp --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
# systemctl restart firewalld
・ログイン
http://ZabbixサーバーのIPアドレス/zabbix/ にアクセスして初期設定を順次入力していきます。
入力後、Admin/zabbixでログイン。
完了しました。
dockerでZabbixを触ってみる
お仕事でZabbix触るっぽいんでdockerで触ってみたお。
ほぼチュートリアルをなぞっただけ。
Dockerized Zabbix - Zabbix.org
環境はUbuntu16.04です
・imageの取得
必要なdockerimageをpullしてきます。
$ sudo docker pull monitoringartist/zabbix-db-mariadb
$ sudo docker pull monitoringartist/zabbix-xxl
・DB用のコンテナ起動
$ sudo docker run \
-d \
--name zabbix-db \
--env="MARIADB_USER=zabbix" \
--env="MARIADB_PASS=my_password" \
monitoringartist/zabbix-db-mariadb
・Zabbixサーバのコンテナを起動
$ sudo docker run \
-d \
--name zabbix \
-p 8080:80 \
-p 10051:10051 \
-v /etc/localtime:/etc/localtime:ro \
--link zabbix-db:zabbix.db \
--env="ZS_DBHost=zabbix.db" \
--env="ZS_DBUser=zabbix" \
--env="ZS_DBPassword=my_password" \
--env="XXL_zapix=true" \
--env="XXL_grapher=true" \
monitoringartist/zabbix-xxl:latest
・ログイン
ブラウザでアクセスし
admin、zabbixでログイン
おしまい。
Intel NUCで始める自宅ESXi6.5
というわけでIntel NUCを買いました。
第6世代のNUC6i3SYHです。
お仕事でWindowsサーバを触れることも多くなりAWSでもいいんだけど、手元にあったほうが何かと便利だしESXiの勉強にもなるかなと思う次第でありまして。
購入代金はなんとかボーナスでまかなえるはず。。。。(震え声)
秋葉原のツクモに行って必要なものを購入、取説みて組み立てます。
thinkpadの分解とかよりはるかにラクチンであっという間です。
組み立てたらキーボードとHDMI-VGAの変換ケーブルをモニターに接続して電源ON、BIOS画面へ入ります。
ちゃんとメモリとSSDが認識しているのを確認します。
メモリとSSDの認識を確認したらダウンロードしたVMware-VMvisor-Installer-6.5.0-4564106.x86_64.iso をUSBメモリに書き込ませてインストールしました。
特にエラーもなくすんなりとインストールできました。
インストール後、以下の2つを対応しました。
1.データストアのアクセスが遅い
isoのアップロード遅くね?OSのインストール遅くね?とか思ってたら、以下のページと同じ現象が起きていたようなので、SSHログインして以下コマンドを実行しました。
[root@localhost:~] esxcli system module set -e=false -m=vmw_ahci
2.NICを追加
NUCはデフォルト1ポートしかNICがありません。以下URLそのままにUSBのLANアダプタを買ってきてNICを追加しました。
http://blog.techlab-xe.net/archives/5227
USB 3.0 Ethernet Adapter (NIC) driver for ESXi 6.5 | virtuallyGhetto
↑のURLを参考に以下コマンドを実行した後、再起動すると追加したNICが認識されました。
[root@localhost:~] esxcli software vib install -v /vghetto-ax88179-esxi65.vib -f
Installation Result
Message: Operation finished successfully.
Reboot Required: false
VIBs Installed: virtuallyGhetto_bootbank_vghetto-ax88179-esxi65_6.0.0-1.0.0
VIBs Removed:
VIBs Skipped:
[root@localhost:~]
[root@localhost:~] esxcli system module set -m=vmkusb -e=FALSE
というわけでこれから楽しいESXiライフを送ろうと思います。(`・ω・´)
raspberry pi 3にTensorFlowを入れて画像認識させる
こいつの続き、ラズパイ3にTensorFlowを入れるところから。
これでわしもきゅうり判別機を作れるだろうかw 。
・TensorFlowを入れる
GitHub - samjabrahams/tensorflow-on-raspberry-pi: TensorFlow for Raspberry Pi
pi@raspberrypi:~ $ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
pi@raspberrypi:~ $ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
pi@raspberrypi:~ $ sudo pip uninstall mock
pi@raspberrypi:~ $ sudo pip install mock
・確認
pi@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a + b)
42
>>>
・kerasを入れる(かなり時間かかった。。)
pi@raspberrypi:~ $ sudo pip install keras
・学習済みのモデルを持ってくる
pi@raspberrypi:~ $ git clone https://github.com/fchollet/deep-learning-models
・実行 → 怒られた
pi@raspberrypi:~/deep-learning-models $ python inception_v3.py
Using TensorFlow backend.
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels.h5
Traceback (most recent call last):
File "inception_v3.py", line 399, in <module>
model = InceptionV3(include_top=True, weights='imagenet')
File "inception_v3.py", line 385, in InceptionV3
model.load_weights(weights_path)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 2531, in load_weights
raise ImportError('`load_weights` requires h5py.')
ImportError: `load_weights` requires h5py.
pi@raspberrypi:~/deep-learning-models $
・h5pyっていうのがいるの? → pipで入れる → 怒られた
pi@raspberrypi:~ $ sudo pip install h5py
※中略
In file included from /tmp/pip-build-1n231R/h5py/h5py/defs.c:470:0:
/tmp/pip-build-1n231R/h5py/h5py/api_compat.h:27:18: fatal error: hdf5.h: No such file or directory
#include "hdf5.h"
^
compilation terminated.
error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
・必要なものをいれる
pi@raspberrypi:~ $ sudo apt-get install -y libhdf5-dev
・とりあえずh5pyっていうのが入った
pi@raspberrypi:~ $ sudo pip install h5py
Collecting h5py
Using cached h5py-2.7.0.tar.gz
Requirement already satisfied: numpy>=1.7 in /usr/local/lib/python2.7/dist-packages (from h5py)
Requirement already satisfied: six in /usr/local/lib/python2.7/dist-packages (from h5py)
Building wheels for collected packages: h5py
Running setup.py bdist_wheel for h5py ... done
Stored in directory: /root/.cache/pip/wheels/3e/ff/67/d04f183c668c251c1bc737224584dec995715d486178f77ede
Successfully built h5py
Installing collected packages: h5py
Successfully installed h5py-2.7.0
pi@raspberrypi:~ $
・これで行けるか? → 失敗。。。
pi@raspberrypi:~/deep-learning-models $ python inception_v3.py
Using TensorFlow backend.
Traceback (most recent call last):
File "inception_v3.py", line 402, in <module>
img = image.load_img(img_path, target_size=(299, 299))
File "/usr/local/lib/python2.7/dist-packages/keras/preprocessing/image.py", line 318, in load_img
raise ImportError('Could not import PIL.Image. '
ImportError: Could not import PIL.Image. The use of `array_to_img` requires PIL.
pi@raspberrypi:~/deep-learning-models $
・これがいる模様 → pillow
pi@raspberrypi:~/deep-learning-models $ sudo pip install pillow
・必要なもの入ったんじゃね?
pi@raspberrypi:~/deep-learning-models $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>>
・来たーー!!???
pi@raspberrypi:~/deep-learning-models $ python inception_v3.py
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
Predicted: (u'n02504458', u'African_elephant', 0.58458394), (u'n01871265', u'tusker', 0.35385633), (u'n02504013', u'Indian_elephant', 0.01978549), (u'n02134084', u'ice_bear', 0.0005529598), (u'n02437312', u'Arabian_camel', 0.00053362496)
pi@raspberrypi:~/deep-learning-models $
※この画像
アフリカゾウ、あってそう!
pi@raspberrypi:~/deep-learning-models $ time python inception_v3.py apple.jpg
Using TensorFlow backend.
Predicted: (u'n07742313', u'Granny_Smith', 0.41690961), (u'n07720875', u'bell_pepper', 0.056339104), (u'n07745940', u'strawberry', 0.037945356), (u'n07747607', u'orange', 0.031627435), (u'n07768694', u'pomegranate', 0.027530219)
pi@raspberrypi:~/deep-learning-models $
なるほどりんごですか、色はちがうけど合ってるね。
※この画像
pi@raspberrypi:~/deep-learning-models $ time python inception_v3.py fi004.jpg
Using TensorFlow backend.
Predicted: (u'n07684084', u'French_loaf', 0.318775), (u'n07716358', u'zucchini', 0.17547932), (u'n07579787', u'plate', 0.1427407), (u'n07860988', u'dough', 0.07184507), (u'n07871810', u'meat_loaf', 0.067287661)
pi@raspberrypi:~/deep-learning-models $
んーフランスパンですかー??
※この画像
pi@raspberrypi:~/deep-learning-models $ python inception_v3.py
Using TensorFlow backend.
Predicted: (u'n04350905', u'suit', 0.14072829), (u'n03763968', u'military_uniform', 0.1166545), (u'n02916936', u'bulletproof_vest', 0.068024598), (u'n02883205', u'bow_tie', 0.037428539), (u'n04591157', u'Windsor_tie', 0.02336538)
pi@raspberrypi:~/deep-learning-models $
スーツ、軍服、防弾チョッキ、蝶ネクタイ!??!!!
※この画像
あっ(察し)。