WeMos (b7) PIR (Passive infrared sensor)

PIR (Passive infrared sensor)は、以前RPiで利用したが、WeMosにも試す。

動きがあったら、とりあえずLED 点灯する。

#define ESP8266_LED BUILTIN_LED
int pirPin = D7;
int val;

void setup() 
{
  Serial.begin(9600);
  pinMode(ESP8266_LED, OUTPUT);
  digitalWrite(ESP8266_LED, HIGH);
}
void loop() 
{
  val = digitalRead(pirPin);
  Serial.print(val);
  //low = no motion, high = motion
  if (val == LOW)
  {
    digitalWrite(ESP8266_LED, HIGH);
    Serial.println(" No motion");
  }
  else
  {
    digitalWrite(ESP8266_LED, LOW);
    Serial.println(" Motion detected  ALARM");
  }
 
  delay(1000);  
}

結線図

参考:

  • http://www.esp8266learning.com/wemos-mini-pir-sensor-example.php

WeMos (11) I2C OLED SH1106 (U8g2)

今まで使ったOLEDは0.96インチの製品。ちょっと大きめ1.3インチのOLEDを評価するため、一個購入して見る。WeMosがターゲット、直結できると考えて、適したピン配列を注文、その通りのぐつが届いた。

そのまま差し替えて動くと思ったけど、表示が乱れ、調べってみったら、1.3インチの製品は、SH1106というチップ使い、対応するドライバーは必要。

ArduinoのLibから検索すると、3点がヒット、簡単そうな一個が動かない、動いたのは複雑そうなU8g2でした。

このU8g2ライブラリは、SCLとSDAの差し替えてできないみたい、結局直結できなく、ジャンパーで繋ぐ。また対応するSSDは多数なので、SH1106のI2Cをコメントを外して、コンパイル。

一応表示ができた。

/*

  HelloWorld.ino

  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)

  Copyright (c) 2016, olikraus@gmail.com
  All rights reserved.


*/

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();					// clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");	// write something to the internal memory
  u8g2.sendBuffer();					// transfer internal memory to the display
  delay(1000);  
}

 

Wemos (d6) Weather Bureau 2

これまでWeather Station2回を制作、今回に合わせて三回の要点をリストする

  1. 一回目の Weather Stationはおもに気象情報の表示
  2. 二回のWeather Bureauは、気象情報の収集とクラウンに送信
  3. 今回はDeep sleep機能を利用して、節電する工夫

Deep sleepは、RST と GPIO16繋いたモード、Deep sleepに入ると消費電流は0.4〜0.8mA程度に下がる。

100均で購入した、ちゃんとしたケースに入れて、2個目のスイッチを追加した。

  1. Switch 1: 電源スイッチ
    これは主に使わないとき、バッテリ充電不足のときにOff
  2. Switch 2: Deep sleepスイッチ
    プログラムを書き込みするとき、Deep sleepスイッチOffしないと、書き込めない場合がある

試作品は太陽光で充電している様子。充電ボードのLEDが見える。

ソースコードは TinyWebDB-WeatherStation を参考してください。

PIXEL (4) Japanese Input

Raspberry Pi 設定ツールで日本語化する

ラズベリーパイメニューからPreferences → Raspberry Pi Configurationの順に選択します。

2017073001

LocalisationタブのSet Locale…ボタンを押します。
Language:にja (Japanese)を選択します。

Timezone:をJapanに設定します。

Keyboard:のSet Keyboard…を押して、CountryにJapan、Variantはご使用しているキーボードの種類を選択します。分からない場合はとりあえずJapaneseで大丈夫だと思います。

WiFi Country:のSet WiFi Country…を押してCountry:にJP Japanを設定します。

最後にRaspberry Pi ConfigurationのOKを押すと再起動するか尋ねられるのでYesボタンを押して再起動します。

コマンドで日本語化する

ターミナルを開いて言語とタイムゾーンを設定します。

[*] ja_JP.UTF-8 UTF-8 を選択

アジア / Tokyo を選択

日本語関連パッケージをインストールします。

いったんログアウトして、再度ログイン(ユーザー名 : pi、パスワード : raspberry)するとデスクトップは日本語になります。

日本語入力

ラズベリーパイで日本語入力を行うための方法はいくつかあります

  1. fcitx-mozc
  2. scim-anthy

fcitx-mozc

今回は、Google日本語入力のオープンソース版である「Mozc」を使った方法を試してみましょう。

  • 日本語入力:
    sudo apt-get install fcitx-mozc --install-recommends -y
    再起動後、CTRL+スペースで日本語入力できる。。ハズ..
  • ラズパイメニュー > 設定 > Fcitxの設定 で、入力メソッドのとこで一番上が、キーボード – 英語(UK) だったら、削除する(Mozcだけ)か、US配列キーの場合、”英語(US)”にする。
  • フォント:
    sudo apt-get install fonts-ipafont fonts-ipaexfont fonts-takao

scim-anthy

日本語が入力できるようにscim-anthyをインストールします

sudo apt-get install scim-anthy

Wemos (d4) WiFi sniffing

最近力を入れる所は、WiFi sniffingという技術。

Amazon bottonをIoT bottonに改造するのカギは、このWiFi sniffing技術。Amazon bottonから出るWiFi信号をキャッチし、botton押されたとわかった。

推進するIoT-Cloud-Mobile Kitもそれに対応すべく、しばらくsniffingとPOSTの共存、メモリの制限などと格闘して、何度も諦めかけて、遂に安定して動作するようになった。

(IoT-Cloud-Mobile Kit)ブレッドボード

Wemosが周りのMAC addressとRSSIは取得でき、TinyWebDB-APIでクラウドに蓄積できた。

ただブレッドボードは長時間運用はやはり不安定、下記の開発ボードも試作した。

(IoT-Cloud-Mobile Kit)開発ボード(5×7)

さらに小型化して、OLEDも省略して(コンセントが保留して接続は可能)、基盤に状態を表示するRGBのLEDを増設。

(IoT-Cloud-Mobile Kit)開発ボード(3×7)

透明ケースに入れて、試験する様子。

(IoT-Cloud-Mobile Kit)開発ボード(3×7 inside case)

蓄積されたMAC addressとRSSIは、出席確認などに活用でき、室内位置情報(Indoor Positioning)のシステムも作りたいね。

Wemos (c8) Weather Station

IoT-Cloud-Mobile Kitに、Weather Station機能を導入する。

オリジナルのコード ThingPulse Weather Station は、温度センサーは  DHT11 を利用する、IoT-Cloud-Mobile KitはBMP280内蔵のため、修正後のコードは TokyoEC Weather Station を参照する。

I2CのOLED端子配列

I2CのOLED端子配列2種類があり:

  1. VCC,GND,SCL,SDA (Wemos, BMP180, BMP280バス直結可能)
  2. GND,VCC,SCL,SDA (NodeMcu直結可能)

1番目は、Wemos直結に適するので、試してみる。

接線 (Wiring) Wemos –> OLED

  1. Wemos 5V —> OLED Vcc
  2. Wemos GND –> OLED GND
  3. Wemos D4 —-> OLED SCL
  4. Wemos D3 —-> OLED SDA

また下記のセッティングは、自分の環境に合わせて設定。

* Begin Settings
const char* WIFI_SSID = "xxxx"; // your ssid
const char* WIFI_PWD = "xxxx"; // your password
const int I2C_DISPLAY_ADDRESS = 0x3c; // OLED I2C address
const int SDA_PIN = 13; // I2C OLED SDA
const int SDC_PIN = 14; // I2C OLED SCL
const float UTC_OFFSET = 9; // JST = +9
const String WUNDERGRROUND_API_KEY = "xxxxx"; // WUNDERGROUND API KEY
const String WUNDERGROUND_COUNTRY = "JP"; // japan
const String WUNDERGROUND_CITY = "Tokyo"; // tokyo
const String THINGSPEAK_CHANNEL_ID = "xxxxx"; // ThingSpeak CHANNEL
const String THINGSPEAK_API_READ_KEY = "xxxxx"; // ThingSpaek API KEY

ESP8266 IoT Study Kit動作確認

ESP8266 IoT Study Kitでも動くようになった。ただし、I2CのSDA、SCLは、実際の結線に合わせて修正すること。

拡大する

Piggyback (おんぶ)動作確認

それから、Piggyback (おんぶ) する形で、OLED接続する方法も上手くいく。

OLEDだけ繋ぐなら、こちら方法はコンパクトでいいでしょう。ピン・ソケット使わない、OLEDとWemos直結すればもっと薄くコンパクトな実装になる。

ESP-WROOM-02 バッテリー付き動作

ESP-WROOM-02に、Weather Station機能を試した。( esp-wroom-02-2-weather-station/ )

内容は、こちら( Wemos (c11) Weather Station )と殆ど同じ、デジタルクロックを追加した。

WeMos (9) I2C OLED SSD1306 (ThingPulse)

WeMos (7) I2C OLED (Adafruit) では、Adafruitのライブラリを利用した実装でした。便利ですが、I2Cの場合、SDA、SCLはD1、D2固定になるらしい。(変更する方法がわからん)

それから探して、ThingPulseのライブラリは、SDA、SCLは自由に設定してできるので、これを試す。

Sketch -> Include Library -> Manage Libraries

上記順で、ssd1306を検索し、下記のライブラリをインストールしてください。

早速サンプルを実行する。スケッチ例から、Driver for the SSD1306 and SH1106 based 128×64 pixel OLED display を探し、

SSD1306SimpleDemoを動かしてみる。

SDA、SCLはGPIOの接続により、初期化コマンドの引数は変わりる。初期では、// D3 -> SDA、// D5 -> SCLになっている。

// Initialize the OLED display using brzo_i2c
// D3 -> SDA
// D5 -> SCL
// SSD1306Brzo display(0x3c, D3, D5);
// or
// SH1106Brzo display(0x3c, D3, D5);

// Initialize the OLED display using Wire library
SSD1306Wire display(0x3c, D3, D5);
// SH1106 display(0x3c, D3, D5);

実際のGPIO番号に合わせて修正して、ボードに書き込み、問題なく動くでしょう。

 

NodeMcu (2) Weather Station

この一週間Wemos miniのWiFi関連の開発中も頻繁にリブートしています。あまりにも回数が多いから、いつの間にchromeのたくさんの開いたタブも消えて復帰不能になりました。Macbook, Win10どちらも頻繁に発生。

原因がわからず、仕方なく開発中書き込み直前にUSBケーブル接続、書き込み終わったらすぐUSBケーブ抜く方法で運がよければリブート回避する状態が続て、悩んでいます。

気分転換に、IoT-Cloud-Mobile Kitに、Weather Station機能を組み入れると考えて、これも苦労の連続。

もともとWeather Station Kitは、NodeMcu V2とOLED, DHT11のセットになっている。IoT-Cloud-Mobile Kitは、Wemos MiniとOLED, BMP280のセットになっている。

IoT-Cloud-Mobile Kit Weather Station Kit
MPU Wemos Mini NodeMcu V2
OLED 128X64 OLED 128X64 OLED
Sensor BMP280  DHT11

最初は、WemosらしいのWeather Station ソースコードを改造して、IoT-Cloud-Mobile Kitで動くを考えたが、理由不明のリブートでやる気を無くされ、もうWeather Station Kitのまま部品を用意して、まず動かしてみることに。

I2CのOLED端子配列2種類があり:

  1. VCC,GND,SCL,SDA (Wemos, BMP180, BMP280バス直結可能)
  2. GND,VCC,SCL,SDA (NodeMcu直結可能)

IoT-Cloud-Mobile Kitでは、BMP280バス直結のため、1番目のOLED端子配列が欲しくて、商品写真見てこれだと、高めのOLED物を購入したが、結局送ってきたのは2番目のOLED物。

今度繋がってみたらわかった、2番目のOLED端子配列なら、嬉しいことに、NodeMcu直結可能。

つまり、1番目のOLED端子配列はWemos向き、2番目のOLED端子配列はNodeMcu向きと言える。

接線 (Wiring) NodeMCU –> OLED

  1. NodeMCU GND –> OLED GND
  2. NodeMCU 3.3V —> OLED Vcc
  3. NodeMCU D4 —-> OLED SCL
  4. NodeMCU D3 —-> OLED SDA

手元に余ってるはDHT22、それで試すことに。OLEDが邪魔で、D8に繋いで見た。

しかし上手くプログラム書き込めないので、DHT22を外したら、プログラム書き込めて、動いた。

また下記のセッティングは、自分の環境に合わせて設定。

* Begin Settings
const char* WIFI_SSID = "xxxx"; // your ssid
const char* WIFI_PWD = "xxxx"; // your password
const int I2C_DISPLAY_ADDRESS = 0x3c; // OLED I2C address
const int SDA_PIN = 13; // I2C OLED SDA
const int SDC_PIN = 14; // I2C OLED SCL
const float UTC_OFFSET = 9; // JST = +9
const String WUNDERGRROUND_API_KEY = "xxxxx"; // WUNDERGROUND API KEY
const String WUNDERGROUND_COUNTRY = "JP"; // japan
const String WUNDERGROUND_CITY = "Tokyo"; // tokyo
const String THINGSPEAK_CHANNEL_ID = "xxxxx"; // ThingSpeak CHANNEL
const String THINGSPEAK_API_READ_KEY = "xxxxx"; // ThingSpaek API KEY

OLEDの表示を上下逆にするには、void setup() の display.clear(); と ui.init(); の次にdisplay.flipScreenVertically(); を入れる。

ESP-WROOM-02 (1) Start

日本で認定されたESP8266を手元にあると、何にかいいかなと思って注文し、苦労の始まり。

電源なしで、長時間使えるもの、つまり太陽電池+バッテリーで運用を考えて、下記の品物を入手。

Wemos esp-wroom-02 Pocket 8266 D1 mini WIFI Module — ESP8266+18650 Battery

*その後の調べては、Flash Sizeは2Mしかない、Deep Sleep状態の消耗電流が大きいため、長時間運用向かないという情報が入り、時間があったら、確認して行きたい。

Wemos Pocketハードウェア

正面の左は充電回路。

背面はバッテリーホルダーになっている。

CP2102ドライバー

まずシリアル変換:CP2102のため、ドライバーのインストールが必要。

Silicon Labsの以下のURLから「Windows 7/8/8.1/10用」ドライバをダウンロード
USB – UART ブリッジ VCP ドライバ|Silicon Labs
ダウンロードしたZIP(CP210x_Windows_Drivers.zip)を展開し、CP210xVCPInstaller_x64.exeを実行し、ドライバインストールを開始する。

Arduino IDE 設定

それから、Wemosみたいな、メニューに専用設定選択肢がないため、Generic ESP8266 Moduleを選び、下記の様に細かく設定を変える。

設定項目 パラメーター
マイコンボード Generic ESP8266 Module
Flash Mode QIO
Flash Frequency 80MHz
Upload Using Serial
CPU Frequency 80MHz
Flash Size 4M (1M SPIFFS)
Debug port Disabled
Debug Level None
Reset Method nodemcu
Upload Speed 115200

Generic ESP8266 Moduleを選ぶ時のメニュー内容。

細かく設定を変えったあとの様子。

動作確認

簡単なスケッチで動作確認。WeMos の字の上にある 青色のLED ( GPIO 16 ) を点滅させる。

void setup() {
  pinMode(16, OUTPUT);
}
void loop() {
  digitalWrite( 16, HIGH );
  delay(25);
  digitalWrite( 16, LOW  );
  delay(250);
}

正面表記のピン番号とGPIOの対応は下記の通り:

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t D9   = 3;
static const uint8_t D10  = 1;

 

NodeMcu (1) LED Light Strips

クリスマスと新年の気分を出すため、LED Light Stripsを買った。しかし固定のパターンの点滅しかできないから厭きるね。

Raspberry Pi またはArduinoでコントルートできれば、何かいい物作れるではないからと考えた。

Arduinoできるなら安上がりなので、まず試す。LED Light Stripsは12V駆動なので、USB給電のWemosではなく、手元にあるNodeMcu V3 (電源拡張ボード付き)を活用することにした。

LED Light Stripsの電流が大きいので、GPIOの負荷能力を超え、直結できない。

Googleして、OmegaのLED lightstripsに繋ぐ回路があったので、それを真似してArduinoのつくる。

LED Probe2.png

手元に2N3904がないんで、ネットで購入。届くまで時間がかかるので、届いた頃も他の件で時間が取られ、半年以上棚上げ。

クリスマスも目の前だから、ハードウェアの回路を完成した。

プログラムの方は、簡単。

#define LEDR D7
#define LEDG D6
#define LEDB D8

void setup() 
{
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() 
{
  digitalWrite(LEDR, HIGH);
  delay(1000);
  digitalWrite(LEDG, HIGH);
  delay(1000);
  digitalWrite(LEDB, HIGH);
  delay(1000);
  digitalWrite(LEDR, LOW);
  delay(1000);
  digitalWrite(LEDG, LOW);
  delay(1000);
  digitalWrite(LEDB, LOW);
  delay(1000);
}

閃っている様子