M5stickCで遊ぶ
遅ればせながらM5Stick-Cを購入しました。
・ESP32ベースでwifiにつながる
・0.96インチ液晶、6軸センサ、赤色LED、3つのボタン(うち一つは電源用)などを内蔵
・Groveコネクタ付きで面倒な配線なしに様々な周辺機器を接続可能
・80mAhのバッテリ内蔵
・Arduino IDEでプログラミング可能(ほかにもMicroPythonやUIFlowもOK)
・サイズは48mm×24mm×14mm
・価格が税抜1,800円(M5stack Grayが約4,000円だったので半額!)
という夢のような?デバイスです。
発売直後は秋葉原で売り切れていて買えませんでした。
M5Stick-CにはGroveコネクタがついているので、ENV UNITを接続して見ました。
このユニットはDHT12温湿度センサとBMP280気圧センサがついているものです。
約500円。安い。Groveケーブルがついているのでそのまま接続できる。便利。
M5Stick-Cの液晶に温度湿度気圧が表示されています。
電池内蔵なのでUSBケーブルやACアダプタなしでもうごいているんです!
ENV HATだと見た目もっとスマートにできると思います。こちらを買えばよかった!
スケッチは下のような感じです。
M5Stick-C クイックスタートを参考にArduino IDEにM5StickCをセットアップ、
さらにDHT12ライブラリをインストールした状態で動きます。
#include <M5StickC.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.
Adafruit_BMP280 bme;
void setup() {
M5.begin();
//groveコネクタのI2C使う
Wire.begin(32,33);
// DHTセンサー
dht12.begin();
//LCD向き変更
M5.Lcd.setRotation(1);
//シリアル通信
Serial.println(F("ENV Unit(DHT12 and BMP280) test..."));
while (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!");
}
M5.Lcd.println("ENV Unit test...");
}
void loop() {
float tmp = dht12.readTemperature();
float hum = dht12.readHumidity();
float pressure = bme.readPressure();
Serial.printf("Temperatura: %2.2f*C Humedad: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);
M5.Lcd.setCursor(0, 0);
M5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("Temp: %2.1f \r\nHumi: %2.0f%% \r\nPressure:%2.0fPa\r\n", tmp, hum, pressure);
delay(100);
}
Wio LTEとIFTTTをつかってGooglespreadsheetsに温湿度をおくる
Wio LTEとは
Wio LTEというSIMスロット付きのLTE通信可能なマイコンボードが発売されています。
今までマイコンでLTE通信をしようとすると安くても3万円前後していたのですが、こちらはなんと1万円ちょいで購入できちゃいます。
さらに!Arduino IDEでスケッチを記述して書き込むことが可能です!
Arduino IDEへのインストール
環境構築と書き込みはちょっと癖がありますが、下のリンク通りに行えば問題ないかと思います。
https://github.com/SeeedJP/WioLTEforArduino/wiki/Home-ja
とても分かりやすく書いてあるので届くまでに眺めておきましょう。
ポイントとして
・環境構築はボードの追加、ライブラリの追加、デバイスドライバー(書き込み用と通信用)をインストールすればOKです。
・書き込みについては書き込み実行時はBOOTボタンとRSTボタンを同時押しして書き込みモードにする必要があることと、書き込んだ後はRSTボタンを押す必要がある
ことくらいでしょうか。
シリアルモニタはArduino IDEのものだとポートを見失うことが多いので、別にTeratermをインストールしておいてそれを使うのがおすすめです。
SIMについて
LTEはバンドというものがあるらしく、通常docomo向け端末はauやソフトバンクのSIMでは使用できないとかそういった問題があります。
Wio LTE JP versionはFDD-LTE B1/B3/B8/B18/B19/B26に対応しているみたいです。
下のサイトを見る限りドコモ au ソフトバンク いずれも使えそうですね。
私はdocomo系の格安SIMであるBiglobe SIMで動作できました。
500MBまで無料な0simを持ってる人は結構面白いかも?
スケッチ
スケッチ例にはIFTTT(LTE通信でIFTTTに送信)とDHT11(温湿度センサDHT11で温度湿度を取得)があるのでこれを合体、IFTTTの設定を下のサイトを参考にgoogle spreadsheetに追加するようにしてみました。
https://tomosoft.jp/design/?p=7598
Wio LTE ⇒IFTTT⇒google spreadsheetと転送されていくイメージでしょうか。
---ここからスケッチ
#include <WioLTEforArduino.h>
#include <stdio.h>
#define APN "biglobe.jp" //ここはSIMに応じて変更
#define USERNAME "user" //ここもSIMに応じて変更
#define PASSWORD "0000" //ここもSIMに応じて変更
#define WEBHOOK_EVENTNAME "ここはIFTTTの設定に応じて入力"
#define WEBHOOK_KEY "ここもIFTTTの設定に応じて入力"
#define WEBHOOK_URL "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY
#define INTERVAL (60000)
//センサーピン
#define SENSOR_PIN (WIOLTE_D38)
WioLTE Wio;
void setup() {
delay(200);
//センサ初期化
TemperatureAndHumidityBegin(SENSOR_PIN);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------");
SerialUSB.println("### I/O Initialize.");
Wio.Init();
SerialUSB.println("### Power supply ON.");
Wio.PowerSupplyLTE(true);
delay(500);
SerialUSB.println("### Turn on or reset.");
if (!Wio.TurnOnOrReset()) {
SerialUSB.println("###TURN ON ERROR! ###");
return;
}
SerialUSB.println("### Connecting to \""APN"\".");
if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
SerialUSB.println("###LTE CONNECT ERROR! ###");
return;
}
SerialUSB.println("### Setup completed.");
}
void loop() {
char data[100];
int status;
//温湿度
float temp;
float humi;
if (!TemperatureAndHumidityRead(&temp, &humi)) {
SerialUSB.println("DHT11 ERROR!");
goto err;
}
//
SerialUSB.print(humi);
SerialUSB.print("% ");
SerialUSB.print("temperature = ");
SerialUSB.print(temp);
SerialUSB.println("C");
//
SerialUSB.println("### Post.");
sprintf(data, "{\"value1\":\"%.2f\",\"value2\":\"%.2f\"}", humi, temp);
SerialUSB.print("Post:");
SerialUSB.print(data);
SerialUSB.println("");
if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
SerialUSB.println("###POST ERROR! ###");
goto err;
}
SerialUSB.print("Status:");
SerialUSB.println(status);
err:
SerialUSB.println("### Wait.");
delay(INTERVAL);
}
////////////////////////////////////////////////////////////////////////////////////////
//
int TemperatureAndHumidityPin;
void TemperatureAndHumidityBegin(int pin)
{
TemperatureAndHumidityPin = pin;
DHT11Init(TemperatureAndHumidityPin);
}
bool TemperatureAndHumidityRead(float* temperature, float* humidity)
{
byte data[5];
DHT11Start(TemperatureAndHumidityPin);
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
DHT11Finish(TemperatureAndHumidityPin);
if(!DHT11Check(data, sizeof (data))) return false;
if (data[1] >= 10) return false;
if (data[3] >= 10) return false;
*humidity = (float)data[0] + (float)data[1] / 10.0f;
*temperature = (float)data[2] + (float)data[3] / 10.0f;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
//
void DHT11Init(int pin)
{
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
void DHT11Start(int pin)
{
// Host the start of signal
digitalWrite(pin, LOW);
delay(18);
// Pulled up to wait for
pinMode(pin, INPUT);
while (!digitalRead(pin)) ;
// Response signal
while (digitalRead(pin)) ;
// Pulled ready to output
while (!digitalRead(pin)) ;
}
byte DHT11ReadByte(int pin)
{
byte data = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(pin)) ;
while (!digitalRead(pin)) ;
unsigned long start = micros();
while (digitalRead(pin)) ;
unsigned long finish = micros();
if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
}
return data;
}
void DHT11Finish(int pin)
{
// Releases the bus
while (!digitalRead(pin)) ;
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
bool DHT11Check(const byte* data, int dataSize)
{
if (dataSize != 5) return false;
byte sum = 0;
for (int i = 0; i < dataSize - 1; i++) {
sum += data[i];
}
return data[dataSize - 1] == sum;
}
////////////////////////////////////////////////////////////////////////////////////////
---ここまで
APNの設定(SIMカードを使うときの設定みたいなものです。)は使うSIMカードの会社のウェブサイトから確認してください。
sprintfのところの形式は下のサイトをみてください。JSONとか正直よくわかってないです
IFTTTの設定は先ほどのサイトの通りですが
現在MakersはWebhookに、レシピはAppletsと名前?が変わっているようです。
Google DriveのところもGoogle SpreadsheetからAdd row to spreadsheetを選んでください。
これでたぶんgoogleドライブのマイドライブ>IFTTT>MakerWebhooks>にあるファイルに温度湿度が記録されていくと思います。
温度湿度の列を全体選択してグラフを作成しておくと、データが追加されていったときに自動でグラフも更新されていきますよ。
Eagle がAutodesk Eagleになってました
Kです。
定番の回路図作成ソフトであるEagleがAutodeskに買収されてAutodesk Eagle になっていました。
現在のバージョンは8.0です。
幸いFree版はまだ残されていました。ここからダウンロードできます。
Free版の制限は
- Includes 2 schematic sheets, 2 signal layers, and 80 cm2 board area.
Macでダウンロードしてみました。何が変わったのかな・・・?
ThingSpeakを使ってみる
Kです。今まではXivelyやEasy Iot Cloudを使っていました。
ThingSpeakというサービスも評判が良いようなので試してみました。
元ネタはここ
http://www.arduinesp.com/thingspeak
Thingspeakにサインアップしたら、Channelを作成します
下のように温度用(1)湿度用(2)のFieldを2つ作成します
Thingspeakの設定はこれでOKでした。
スケッチは
http://www.arduinesp.com/thingspeak
からコピペして
// replace with your channel’s thingspeak API key,
String apiKey = "XXX";
const char* ssid = "XXX";
const char* password = "XXX";
の部分を自分の環境に合わせて変更します。
apiKeyはWrite API Keyで大丈夫でした。
あと、私の場合はDHT22を5pinにつなげて使っていたので
#define DHTPIN 5 // what pin we’re connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
としておきました。
これでスケッチを書き込むと
温度と湿度がブラウザで見れるようになりました。
XivelyやEasyIoTに比べてちょっと使いやすい気がします
ラズペリーパイ用カメラモジュールを買ってみました
Kです。
ラズペリーパイ用カメラモジュールを購入してみました。
4,300円でソニー製CMOSセンサーのV2や赤外線LEDと併用すれば暗視もできるものもあるみたいですが安いのでこちらに。
1フラットケーブルを接続してラズパイを起動
2ターミナルに "sudo raspi-config"と入力してEnable Cameraからカメラを有効化、再起動
3 IDLEを起動して
import picamera
camera = camera.PiCamera()
camera.capture("./test.jpg")
と入力するとpiフォルダにtest.jpgという名前で画像が保存されます。
(フラットケーブルでブラブラしてたのでようわからんものが撮影された)
ラズベリーパイでCSVに時刻と温度湿度を記録する
Kです。
Pythonをゲームで学べるコードガールこれくしょんをプレイしていたら、
datetimeモジュールを使用して現在の西暦を取得する問題がでてきました。
さっそくこの記事のスケッチに現在時刻を追加しました。
-スケッチ-
import csv
from time import sleep
from datetime import datetime
import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = 4
cnt = 0
f = open("data.csv","w")
try:
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
time = datetime.now()
t = str(temperature)
h = str(humidity)
th = [time,t, h]
print(th)
writer = csv.writer(f, lineterminator="\n")
writer.writerow(th)
sleep(10)
except KeyboardInterrupt:
print("end")
f.close()
pass
-スケッチここまで-
赤色部分を追加しました。
これで動かしてみるとIDLE画面には下のように表示されました。
[datetime.datetime(年,月,日,時,分,秒,ミリ秒),温度,湿度]
datetime.datetimeって・・・?
csvファイルには
ちゃんと
年-月-日 時:分:秒.ミリ秒,温度,湿度で記録されていました。
2016-10-09 23:37:57.655273,25.0,43.0
2016-10-09 23:38:08.263556,25.0,44.0
2016-10-09 23:38:18.868142,25.0,44.0
2016-10-09 23:38:29.466246,25.0,43.0
2016-10-09 23:38:40.062200,25.0,43.0
ミリ秒はいらない気がしますが少し便利になった・・・?
Easy IoT Cloud 使用方法メモ
最近寒くなってきたので、
この記事で紹介したEasyIoT Cloudを久しぶりに使おうとしたらつまずいたのでメモです。
OSをクリーンインストールしてArduinoライブラリがすべて消えてしまったから?
・なぜかBuildのページにある最新のサンプルだとうまくいかない。
・こちらのサンプルだとうまく動く。
こちらのサンプルだと
1.モジュールを作る
2.モジュールにパラメーターを追加する(温度、湿度で二つ)
3.パラメーターのInstanceId/ParameterId/をスケッチに記入
という手間がふえました。
スケッチは こちらのページにあるものを使用する。
スケッチの前にページにあるようにEasyIoT Cloudの設定からモジュールを作成、
パラメータを作成する。
NameはそれぞれSensor.Parameter1、Sensor.Parameter2として置いて、
DescriptionにHUMIDITYなどわかりやすく名前を付けておく。
(こうしないとトップページに置いたときに数値が表示されない)
サンプルスケッチの17,18行目
#define AP_SSID "xxxxx"
#define AP_PASSWORD "xxxxx"
に無線LANのSSIDをパスワードをそれぞれ入力しておく。
サンプルスケッチの21,22行目
#define EIOT_CLOUD_TEMP_INSTANCE_PARAM_ID "xxxxx"
#define EIOT_CLOUD_HUM_INSTANCE_PARAM_ID "xxxxx"
に上の画像の黒塗り部分のインスタンスIDを丸々コピーする。温度・湿度でそれぞれ別物。
サンプルスケッチ49行目
dht.setup(2); // data pin 2
はDHT22を接続するピンに合わせて変更しておく。
スケッチを書き込んで数分するとトップぺージに数値が
">"を押すとグラフが表示される・・・
Webiopiを使ってブラウザからラズパイのGPIOを制御する
Kです。
ラズパイのWebiopiというものでブラウザからGPIOを制御できるようなので試してみました。
ラズパイのブラウザmidoriから
http://webiopi.trouch.com/DOWNLOADS.html
にアクセスしてwebiopiをダウンロードします。.gzファイルに圧縮されています。
installationのページにあるように、ターミナルを開いて
tar xvzf WebIOPi-x.y.z.tar.gz
cd WebIOPi-x.y.z
sudo ./setup.shと入力するとインストールが始まります。
途中Do you want to access WebIOPi over Internet? [y/n]と聞かれましたがnにしておきました。
インストールが終わったら一度再起動をしてターミナルを開いて
sudo /etc/init.d/webiopi startと入力するとスタートします。
ifconfigでラズパイのIPアドレスを調べて、(私の環境では192.168.0.6でした)
同じLANに接続したiphoneのブラウザに
192.168.0.6:8000
と入力すると、ユーザー名とパスワードを要求されるので
初期設定(installationのページにあります)の
ID:webiopi
PASS:raspberry
を入力すると下のような画面が出てきます。
GPIO Headerを選択すると下のような画面が出てきます。
GPIO11(23pin)にLEDを接続して、
23と書いてある部分をタップすると・・・
23の周りがオレンジ色になり、LEDが点灯しました!
ラズベリーパイでCSVに温度湿度を記録する
Qiita RaspberryPiで脈拍データをCSV出力(CSV出力)
というページを見かけたのでテストしてみました。
pythonにはcsvを扱うモジュールがあるようなのでそこそこ簡単にcsvファイルの操作ができるようです。
ただまだプログラミングに慣れておらずモジュールの扱いもわからないので・・・
とりあえず先ほどのQiitaのページのサンプルを改変してテストしました。
--スケッチ--
import csv
from time import sleep
import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = 4
cnt = 0
f = open("data.csv","w")
try:
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
t = str(temperature)
h = str(humidity)
th = [t, h]
print(th)
writer = csv.writer(f, lineterminator="\n")
writer.writerow(th)
sleep(10)
except KeyboardInterrupt:
print("end")
f.close()
pass
--終わり--
ハードはこの記事で使ったDHT11を使っています。
writer.writerow()で配列をcsvファイルに書き込んでいくようですね。
配列の作り方はもっと簡単にできるかもしれません・・・。
このスケッチを実行するとIDLEに下のように温度湿度が書き込まれて、

同じフォルダにdata.csvが作成されて
無事にカンマ区切りのデータで記録されていました。

あと、下の本によると
トランジスタ技術 2016年 9月号/CQ出版

¥1,000
Amazon.co.jp
ラズベリーパイに3Gドングルを刺せば3gで通信ができるようです。
現在雑誌トランジスタ技術のサイトから先着100セット限定で半額頒布しているようです。
もし昔雑誌についてきた500MBまで無料のsimカードが使えるのであればかなり遊べそうですね・・・
ラズベリーパイでシリアル通信
通信相手は秋月シリアル変換基板を接続したESP-WROOM02です。
今回はUSBシリアル変換でシリアル通信をします。
シリアル変換はFTDIチップを使っていたので、
街角のリブロガーさんの記事
http://ivis-mynikki.blogspot.jp/2015/02/raspberry-piftdi.html
を参考にインストールしました。
スケッチは
3DプリンターのJAPANESE MAKERSさん
http://www.japanese-makers.com/archives/633
のスケッチをそのまま使用しました。
ラズパイの操作は
c-bata webさん
http://nwpct1.hatenablog.com/entry/2013/10/18/124844
を参考にポートを変更して試しました。
WindowsではCOMxを選択していましたが、linux計ではttyACMx,ttyUSBxなどになるようです。
ポートの確認方法はUSBを接続した状態でターミナルにdmesgと入力すると出てきます。
dmesgだけだと長すぎるのでdmesg | tail でもよいようです。

c-bata webさんの記事を参考にして、
したの画像のように入力すると、
ser.write('o')
を入力したときにLEDがON、
ser.write('p')を入力するとLEDがoffになりました。

























