工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

概要

KiCadとFusion PCBで基板を作ってみた。


背景と目的

KiCadとFusion PCBで基板を作りたくなったので、やってみる。


詳細

0.方針

KiCadの使い方は、Web上にたくさんあるし、本も出ているのでそれを参考にするとして、とりあえず作ってちゃんとうごいたという記録をする。なお、手元にこちらの本があるので参考になった。


1.KiCadで設計

今回作成するのは、ESP-WROOM-32を使った簡単なダッシュボタンとする。

  • ESP-WROOM-32
  • 単3乾電池2本で駆動
  • ボタンは3つ

いきなりだが、作成した回路は以下。ESP-WROOM-32の部品データは、Web上に転がっていると思ったが、意外と見つけるのに苦労したので結局自分で作った。

少し説明しておくと、

  • J2、J4はジャンパ接続部だが、接続した状態でボタンを操作することで、EN、IO0のレベルが変化し、プログラム書き込みモードに入ることができるようになっている。
  • ボタンを押したときにL→Hとなるようにし、スリープ解除トリガになるようにしている。

という感じ。

sch

基板レイアウトは以下。基板設計の知識はないので、見様見真似だが、一般的注意は守ったつもり。

手はんだを想定しているがESP-WROOM-32モジュールの高さ以下で押さえたいので、トランジスタ、コンデンサなどの部品は表面実装型を選択。なので、トランジスタは(SC-59,JEITA)というパッケージのものが見当たらなかったので作成。抵抗はリード部品でも問題ない。タクトスイッチのボタン部分は背が高くてもいいので、手に入りやすいこちらを使用。

pcb


2.Fusion PCBに発注

Fusion PCBは、どうやらスイッチサイエンスPCBの委託先のようだが、かなり安い。今回作る基板は、10cm×5cmに収まり、10枚で十分なので、ただ、表面処理を一応鉛フリー半田レベラーを選択したので、$12.9となった。そして、悲しいことに配送料のほうが高く、$19.15を取られ、全部で$32.05ドル。

2018/7/30に発注したところ、31日には in Productionとメールが届いた。8/3には、出来上がって発送した旨のメールが届いた。というわけで、実質2,3日で発送される様子。ただ、海外から船便?で配送という感じなので、そこから1週間後の8/10に到着。まあ、2週間程度なのでよしとする。


3.出来上がった基板と動作確認

出来上がったものは、以下。当然ながら、目視の限りおかしなところはない。

DSC_0488

さっそく、部品実装してみたのが、以下。1.27mmピッチのESP-WROOM-32を手半田するのはうまくいくか不安だったが、大して難しくなかった。

DSC_0489

そして、Arduinoで、プログラムを書き込んで動作を確認したところ、所望の動作をした!というわけで、自作のIoTダッシュボタンが完成。家中に置いて使える。(ただし、Web側のシステム構築を何もしていない。IFTTTやMicrosoft Flowあたりを使うと簡単にできるかな。)


4.ケースに入れる

タカチのTW5-3-9を使うのを想定して基板を作成しているので、ケースに入れてみた。まずまずよい感じに収まっているのではないだろうか。ボタンが小さいのが少し気になるが、まあいいだろう。

DSC_0490


まとめ

KiCadとFusion PCBで基板を作り、ちゃんと出来上がった。今後も、Fusion PCBを使って基板づくりをしたい。

概要

ニューラルネットワークライブラリKerasを導入して動く環境を整えた。


背景と目的

ニューラルネットワークのプログラミングを素早く行える環境を整えたくなったので、やってみる。


詳細

0.準備

ニューラルネットワークのプログラミングを素早く行える環境としては、いろいろあるようだが今回はKerasを使うことにした。PCは以下。

  • Lenovo Idea Pad Yoga 13
  • Windows10


1.各種インストール

1.1 Anacondaのインストール

まず、https://www.anaconda.com/download/から、64ビット版、バージョン3.6をダウンロードしてインストールした。裸のPython環境に入れてもいいが、Web上で紹介されていることが多いのがAnacondaなのでそれに従った。

また、これに伴いpipが古いだの、msgpackがないと言われたのでAnaconda Promptを立ち上げて、以下のコマンドを実行してアップデート。

python -m pip install --upgrade pip
pip install msgpack


1.2 Tensorflowのインストール

Kerasでは、Tensorflowをテンソル計算ライブラリに使用しているため、Anaconda Promptで以下を実行し、インストール。

pip install tensorflow


1.3 Kerasのインストール

いよいよKeras。

pip install keras


2.autoencoderのプログラムを動かす

とりあえず、MNISTの学習と判別をしてみるということで、こちらそのままをコーディングし、実行した。

そのままなので、コードは省略。


3.結果

実行結果は以下。所要時間は5分くらいだろうか。とりあえず、環境は整った。

Epoch 50/50
60000/60000 [==============================] - 5s 88us/step - loss: 0.1059 - val_loss: 0.1041

10個だけ、入力と出力の比較をしてみる。上が入力、下が出力。

20180822231358


まとめ

Kerasを導入して動く環境を整えられた。ちょっとずつプログラミングに慣れようと思う。

概要

フリーソフトなどを使用し、ある領域をまたいで存在していた2つのドライブを1つに統合するパーティション変更を行った。


背景と目的

私の手持ちのPCでは、SSDのパーティションが約100GBのCドライブと、4GBのDドライブに分かれているのだが、別れている意味がほとんどないので、パーティションを変更し、連続した1領域にする。


詳細

0.情報収集

私のPCの場合、以下の図のようにCとDの間にOEMパーティションなるものがあるので、これをどうにかする必要がある。2つの隣接する領域であれば、Windows付属のディスクの管理ツールから作業が可能なのだが、いろいろ調べた結果、こちらなるフリーソフトを使って作業可能なようなのでやってみる。

20180817140223

1.AOMEI Partition Assistantのインストール

AOMEI Partition Assistantをダウンロードし、インストールした。


2.Dドライブの割り当て削除

ディスクの管理ツールで、Dドライブを選択し、ボリュームの削除を行った。なお、当該領域のデータはすべて失われるとのことだったので、必要なものはバックアップを実施しておいた。


3.OEMパーティションの移動

この作業は、AOMEI Partition Assistantを使う。OEMパーティションを選択し、ボリュームの移動を選択すると、以下のような画面が出るので、一番右側に寄せ、Cドライブのすぐ右隣に未割当領域ができるようにした。

20180817140657


4.Cドライブの拡張

ディスクの管理ツールで、Cドライブを選択し、ボリュームの拡張を行った。設定は以下に示す通り、先ほどCの右隣に確保した未割当領域すべてを使う。

20180817141023

この結果、以下のようにCドライブの容量がおよそ4GB増加した。無事完了。

20180817141100


まとめ

無事パーティション変更ができてよかった。

概要

Pythonのloggingモジュールを使った際のメモ。

背景と目的

Pythonのloggingモジュールを使った際のメモ。


詳細

1.基本

import logging
# ルートオブジェクトを取得
logger = logging.getLogger()
# 名前を指定してロガーオブジェクトを取得
logger = logging.getLogger("名前")

2.モジュール間で参照

まず、参照される側のモジュール(test.pyとする)では、__name__としてオブジェクトを作成してしておく。

import logging

# __name__としてオブジェクトを作成して
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # レベル設定を忘れない(呼び出し側でやってもいいけどとにかく忘れないこと)

def hoge():
    logger.debug("hogehoge")

次に、呼び出し側のスクリプトで、testをインポートし、"test"という名前のロガーを取得

import logging
import test # 参照モジュール

# testモジュールのオブジェクトを取得
testLogger = logging.getLogger("test")
logger = logging.getLogger(__name__)

def hoge2():
    logger.debug("hoge2hoge2")

if __name__ == "__main__":

    test.hoge()
    
    hoge2()

こうすれば、以下のような出力になる。

hogehoge
hoge2hoge2


3.コンソールとファイルに同時に出力、フォーマット、レベル設定など


# フォーマット
format_string = "%(asctime)s %(levelname)s %(message)s"
formatter = logging.Formatter(format_string)

# コンソール
hConsole = logging.StreamHandler()
hConsole.setFormatter(formatter)
hConsole.setLevel(logging.DEBUG)
logger.addHandler(hConsole)

# ファイル
hFile = logging.FileHandler(ファイルパス)
hFile.setFormatter(formatter)
hFile.setLevel(logging.DEBUG)
logger.addHandler(hFile)


まとめ

ざっくりこんな感じ。

概要

ESP-WROOM-32からデータをAmbientに送信して可視化することができた。


背景と目的

先日、ESP-WROOM-32にDHT22を接続して温度、湿度を計測することができた。そこで、計測データをWeb上に送信して可視化してみたい。


詳細

1.可視化手段=Ambient

可視化するには、有料、無料含めて様々なものがあるが、今回は無料で使えるAmbientというサービスを使ってみる。私は初めて使うのだが、Web上に情報がさまざまあるため、始めやすそうだ。


2.Ambientのユーザー登録

こちらから、メールアドレスとパスワードだけで登録ができた。ログインすると、コンソール画面になるので、Myチャネルから、チャネルの作成をしておく。そうすると、チャネルID、リードキー、ライトキーなどがもらえる。


3.ESP-WROOM-32のコーディング

3.1 ライブラリの準備

[[サンプル>]]などを参考に、進めてみた。まず、Ambient接続用のArudinoライブラリがあるので、こちらダウンロード。表示がESP8266とあるが、気にしない。Arduinoのライブラリフォルダに置く。


3.2 コーディング

こちらなどを参考に、書いてみた。1分間隔で、DHT22の計測値を送信している。また、注意が必要なのは、WiFiClientSecureは使えない。(Ambientのエンドポイントが、HTTPだからか?)

#include 
#include "Ambient.h"
#include "DHTesp.h"

unsigned int channelId = 数字;
const char* writeKey = "Ambientのコンソールで確認";
const int GPIO_DHT22 = 33;

WiFiClient client; // WiFiClientSecureではだめ
Ambient ambient; // Ambient
DHTesp dht; // DHT22

void setup() {
  
  Serial.begin(115200);
  
  Serial.println("Attempting to connect to SSID: " + String(YOUR_SSID));
  WiFi.begin(YOUR_SSID, PASSWORD); // Wi-Fiモジュールの初期化
  while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(1000); // 1秒ずつ待つ
  }
  Serial.println("Connected to " + String(YOUR_SSID)); // 接続成功通知
  
  // Ambientの初期化
  bool tf = ambient.begin(channelId, writeKey, &client);
  if (!tf) {
    Serial.println("ambient.begin failed.");
  }

  // DHT22初期化
  dht.setup(GPIO_DHT22, DHTesp::DHT22);

}

void loop() {

  // 計測
  TempAndHumidity newValues = dht.getTempAndHumidity();

  // 結果表示
  Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity));

  // データのセット
  ambient.set(1, newValues.temperature); // 温度
  ambient.set(2, newValues.humidity); // 湿度
  
  // 送信
  Serial.println("send...");
  bool tf = ambient.send();
  if (!tf) {
    Serial.println("ambient.send failed.");
  }
  delay(60 * 1000);

}


4.動作確認

コンソールで、送信先チャネルを選び、グラフを作成。今回は、湿度と温度それぞれを時系列で表示してみた。グラフの設定も、送信したデータが表示されている。※なお、途中から大きく数字が変わっているが、前半はダミーのいい加減な数値を送信したためで、後半は本物のセンサ計測値。

(どうでもいいけど、コンソールのデザインのBootstrap感がすごい。まあ、嫌いじゃないけど。)

20180712221733


まとめ

ESP-WROOM-32からデータをAmbientに送信して可視化することができた。非常に簡単なので、ぜひ今後も利用していきたい。

このページのトップヘ