2018年7月26日木曜日

STM32F103C8T6をスリープ状態にする

最近、天気が暑くて、「外の気温、何度かな?」と思う時が多くなりました。
そこで、外の気温を測って、室内に表示する「無線温度計」を自分で作ってみました。

STM32F103C8T6の開発ボードを使いましたが、一番の問題は、
「マイクロコントローラーをスリープ状態にする」ことです。

色々試してみました。
このstm32sleepというライブラリーも使ってみましたが、
どうもうまく行けませんでした。
そのライブラリーのもとをみて、更に探し、
tomtorさんのコードを見つかりました。
このコードの関数を使って、何とかできました!

使い方は簡単です。

Arduinoコードのloop()の一番最後のところに、
mdelay(1000);
を追加するだけで、1000ミリ秒をスリープさせます。
あ、Arduino IDEに使えるSTM32 Coreが必要ですけどね。
使っているのが、rogerclarkmelbourneさんのArduino_STM32です。
ちなみに、STMicroelectronics社の正式なものもあります。

ここから、tomtorさんのコードの抜粋です。

#include <libmaple/pwr.h>
#include <libmaple/scb.h>

#include <RTClock.h>

// Define the Base address of the RTC registers (battery backed up CMOS Ram), so we can use them for config of touch screen or whatever.
// See http://stm32duino.com/viewtopic.php?f=15&t=132&hilit=rtc&start=40 for a more details about the RTC NVRam
// 10x 16 bit registers are available on the STM32F103CXXX more on the higher density device.
#define BKP_REG_BASE   ((uint32_t *)(0x40006C00 + 0x04))

RTClock rt(RTCSEL_LSI, 39); // 1 milli second alarm

void storeBR(int i, uint32_t v) {
  BKP_REG_BASE[2*i]= (v << 16);
  BKP_REG_BASE[2*i+1]= (v & 0xFFFF);
}

uint32_t readBR(int i) {
  return ((BKP_REG_BASE[2*i] & 0xFFFF) >> 16) | (BKP_REG_BASE[2*i+1] & 0xFFFF);
}

void sleepMode(bool deepSleepFlag)
{ 
  // Clear PDDS and LPDS bits
  PWR_BASE->CR &= PWR_CR_LPDS | PWR_CR_PDDS | PWR_CR_CWUF;

  // Set PDDS and LPDS bits for standby mode, and set Clear WUF flag (required per datasheet):
  PWR_BASE->CR |= PWR_CR_CWUF;
  // Enable wakeup pin bit.
  PWR_BASE->CR |=  PWR_CSR_EWUP;
  
  SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP;

  // System Control Register Bits. See...
  // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Cihhjgdh.html
  if (deepSleepFlag) {
    // Set Power down deepsleep bit.
    PWR_BASE->CR |= PWR_CR_PDDS;
    // Unset Low-power deepsleep.
    PWR_BASE->CR &= ~PWR_CR_LPDS;
  } else {
    adc_disable(ADC1);
    adc_disable(ADC2);
#if STM32_HAVE_DAC
    dac_disable_channel(DAC, 1);
    dac_disable_channel(DAC, 2);
#endif
    //  Unset Power down deepsleep bit.
    PWR_BASE->CR &= ~PWR_CR_PDDS;
    // set Low-power deepsleep.
    PWR_BASE->CR |= PWR_CR_LPDS;
  }

  // Now go into stop mode, wake up on interrupt
  asm("    wfi");

  // Clear SLEEPDEEP bit so we can use SLEEP mode
  SCB_BASE->SCR &= ~SCB_SCR_SLEEPDEEP;
}

uint32 sleepTime;

void AlarmFunction () {
  // We always wake up with the 8Mhz HSI clock!
  // So adjust the clock if needed...

#if F_CPU == 8000000UL
  // nothing to do, using about 12 mA
#elif F_CPU == 16000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_2);
#elif F_CPU == 48000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_6);
#elif F_CPU == 72000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_9);   // 72MHz  => 48 mA  -- datasheet value           => between 40 and 41mA
#else
#error "Unknown F_CPU!?"
#endif
  
  extern volatile uint32 systick_uptime_millis;
  systick_uptime_millis+= sleepTime;
}

void mdelay(int n, bool mode= false)
{
  sleepTime= n;
  time_t nextAlarm = (rt.getTime() + n); // Calculate from time now.
  rt.createAlarm(&AlarmFunction, nextAlarm);
  sleepMode(mode);
}


#define   RCC_CFGR_HPRE_DIV1   0x00000000U
#define   RCC_CFGR_HPRE_DIV2   0x00000080U
#define   RCC_CFGR_HPRE_DIV4   0x00000090U
#define   RCC_CFGR_HPRE_DIV8   0x000000A0U
#define   RCC_CFGR_HPRE_DIV16   0x000000B0U
#define   RCC_CFGR_HPRE_DIV64   0x000000C0U
#define   RCC_CFGR_HPRE_DIV128   0x000000D0U
#define   RCC_CFGR_HPRE_DIV256   0x000000E0U
#define   RCC_CFGR_HPRE_DIV512   0x000000F0U


void msleep(uint32_t ms)
{
  uint32_t start= rt.getTime();
  
  while (rt.getTime() - start < ms) {
    asm("    wfi");
  }
}

2018年7月24日火曜日

イージス・アショア、増額!?

イージス・アショア
2基2500億円 2~3割増額

予算を組んでいる防衛省、何やってんのと言いたいです。
ありえません。
予算を立てた時の見積が甘かったのか、
それとも見落としたものがあったのか?
なんか原因があってこのような問題が起きます。

私も昔、予算にかかる仕事をしました。
だから言えます。
あり得ません。
税金を扱う公務員として、あとになって「予算が足りない」というものは罪とも言えます。
最初にコストが低いと思って、契約を交わし、
後からコストが増えたと言って。。。
実際のコストに対して意思決定していないから、
最終値段が適切なのか、受容できるのか、
誰が判断するの?

だれがミスを起こしたのか?
防衛省?ロッキード・マーチン?
防衛省の職員なら、重大過失で処分すべき。
ロッキードなら、契約を見直すべき。
簡単に容認するのがダメです。

ちなみに、ロッキードの顧問に、元航空自衛隊の空将がいます。
これが意思決定に影響を与えたら、また重大な事件になります。。。

2018年7月19日木曜日

DIY火炎センサーを購入

先日、Aliexpressから、DIY火炎センサーキットを購入しました。

取説など、何もないまま届きました。
一個ずつの部品なので、基盤を見れば何はどこに入るのがわかりますが、
抵抗は五つもあるので、どれがどことわかりません。
サイトを見ると、
R1: 10K
R2: 10K~30K
R3: 1K
R4: 10K
R5: 1K

とりあえずはんだ付けして、
こうなりました。

電源(5V)をつなげば、ブザーが鳴りました。
「起動しました」との印?
真ん中のボタンを押せば音は消えます。
でも、ストーブに火をつけても、音はならないから、
本当に正常に動いているかどうか、わかりません。
ま、今度時間あるとき、また色々試します。

購入したい人は:
https://www.aliexpress.com/item/DC-5V-Infrared-Flame-Sensor-Module-Suite-Warehouse-IR-Alarm-Kit-Electronic-DIY-Kits-Flame-Detection/32832557194.html

2018年7月13日金曜日

MPU9250付のM5Stack Grayを紹介

M5Stack Grayは先日紹介したM5Stack Basic CoreのV2です。

見た目は同じ、ただ色が灰色になっただけ。
中身もほぼ一緒ですが、
GrayはMPU9250モーションセンサーがついています。
後はBasicと同じです。

ちなみに、LoRAモジュールはこんな感じです。




最近はDRV8825ステッパードライバー(x3)のモジュールも出したみたいです。


2018年7月12日木曜日

ESP32 DevKitCクローン

今日はこのESP32の開発ボードを紹介します。
これは、一般的なESP32 DevKitCの中国クローンです。
一般的なESP32モジュールESP-WROOM-32が載っていて、
プラス4Mbのフラッシュメモリもあります。
ESP32の全てのIOピンにアクセスでき、
USB-to-serialのICもあり、USBでPCとつながり、Arduino IDEを使ってプログラムできます。

ESP32についての日本語情報は、ここから入手できます。

プログラムは、
ESP-IDF
Arduino-ESP32
MicroPython
で作れます。

ESP-IDFはESP32の機能を最大限活用できますが、
C/C++に慣れていない方にとってはちょっと難しいです。
Arduino-ESP32なら、Arduinoの開発環境でプログラム作れます。
開発は少ししやすくなります。
MicroPythonはPython言語の実装、
より「ハイレベル」のプログラミング言語で開発ができます。
でも、RAMが少ないと、ちょっと制限されている感じがします。
普通のESP32モジュールは320KbのRAMしかありません。
MicroPythonをもっと活用したいなら、PSRAM付のモジュールを使いましょう。

2018年7月11日水曜日

M5Stack Basic Coreを紹介

中国のスタートアップM5Stack社が出した初代ESP32製品がこのM5Stack Basic Coreです。
色は黒。

このようなケースで来ました。

簡単な取説書も入っています。

機能として、ESP32マイクロコントローラーに、
2インチTFT
1Wスピーカー
microSDカードリーダー
150mAhバッテリー
2x15のIOピン
Groveコネクター
3つのユーザボタン
がついています。ESP32はWiFiとBluetooth機能がついています。
基本的なArduinoスケッチもGitHubから入手できます。
https://github.com/m5stack/M5Stack
M5Stack用ライブラリーへのリンクも載っています。

Arduino IDEにESP32の設定が既に完了している方なら、そのまま使えます。
ボードマネージャーからM5Stackを選べば大丈夫です。

ESP32を使ってIoT開発を行う方なら、とても便利なものです。
TFTがありますから、PCなくても文字・絵の出力ができます。
microSDカードへの読み書きもでき、データの保存に困りません。
そして、バッテリーが付いていて、持ち運びやすいです。
基本的な入力としてボタンが使えます。
本当に便利です。

そして、色々な機能モジュールも別売りで、
自由に拡張できます。
例えば、LoRAを試したい時はLoRAモジュールを購入、
GPS機能が必要ならGPSモジュールを購入。

自分の試作を作るためのPCB(Prototypeモジュール)もあります。

購入を考えているかたは、スイッチサイエンスから購入できます。
macsbug様が色々作っているみたいです。試作品やスケッチを見るとかなり面白そうです。
一応、私もGPSモジュールを使って、自宅までの直線距離を分かるようなスケッチも試してみました。

M5Stack社が結構頻繁にM5Stack用の新モジュールを出しています。
公式SNSから新商品や開発中のものについての情報が入手できます。
M5Stack社のFacebookページ
M5Stack社のTwitter

2018年7月4日水曜日

M5StackのESP32カメラモジュール

M5Stack社が出しているESP32カメラモジュールを紹介します。

個人的に、ESP32を使って、カメラの画像をネットでストリーミングする仕組みをずっと勉強していました。
でも、なぜかうまく行きませんでした。
参考サイトはこちらです。
https://github.com/igrr/esp32-cam-demo
https://github.com/bitluni/ESP32CameraI2S

だから、このESP32カメラモジュールが出たとき、私は結構興味がありました。
すぐに購入しました。
表はOV2640カメラ。
裏はESP32やUSB関連など。
ファームウェア、ソースコードなどはこちらです。
https://github.com/m5stack/esp32-cam-demo

中身を見ると、igrr様のものを完コピーして、ただピンを変えただけです。
自分で基盤を作って、igrr様のファームウェアを焼けば、
同じでしょう。
でも、違います。
私は、何回も基盤を作り、igrr様のファームウェアを焼きましたが、
なぜうまく映りません。
でも、このESP32カメラモジュールを使うと、一発できました。
ま、自分のはんだ付けスキルの問題かもしれません。😅

だから、今度はちゃんとPCBを設計して、注文して挑戦します。
自分でPCBや基盤が作れる方なら、別に購入しなくてもいいと思います。
でも、「はんだ付け面倒くさいな」「小さいフットプリントがほしい」と思う方、これをお勧めします。
ちなみに、日本までの送料を入れて値段が約USD14なので、
そんなに高くないのです。

もう一つ買おうかな。。。😀

追記(2019年1月8日):
ESP32の新しいカメラモジュールがあります。
https://maplerain78.blogspot.com/2019/01/esp32.html